Pass layer metadata to tools (#277)

This commit is contained in:
Henry Sloan 2021-07-16 02:38:46 -04:00 committed by Keavon Chambers
parent 3a14b38dfa
commit 546bb16480
10 changed files with 28 additions and 28 deletions

View File

@ -40,7 +40,7 @@ impl Dispatcher {
Global(message) => self.global_message_handler.process_action(message, (), &mut self.messages), Global(message) => self.global_message_handler.process_action(message, (), &mut self.messages),
Tool(message) => self Tool(message) => self
.tool_message_handler .tool_message_handler
.process_action(message, (&self.document_message_handler.active_document().document, &self.input_preprocessor), &mut self.messages), .process_action(message, (&self.document_message_handler.active_document(), &self.input_preprocessor), &mut self.messages),
Frontend(message) => self.frontend_message_handler.process_action(message, (), &mut self.messages), Frontend(message) => self.frontend_message_handler.process_action(message, (), &mut self.messages),
InputPreprocessor(message) => self.input_preprocessor.process_action(message, (), &mut self.messages), InputPreprocessor(message) => self.input_preprocessor.process_action(message, (), &mut self.messages),
InputMapper(message) => { InputMapper(message) => {

View File

@ -2,9 +2,9 @@ pub mod tool_message_handler;
pub mod tool_settings; pub mod tool_settings;
pub mod tools; pub mod tools;
use crate::document::Document;
use crate::input::InputPreprocessor; use crate::input::InputPreprocessor;
use crate::message_prelude::*; use crate::message_prelude::*;
use crate::SvgDocument;
use crate::{ use crate::{
communication::{message::Message, MessageHandler}, communication::{message::Message, MessageHandler},
Color, Color,
@ -25,12 +25,12 @@ pub mod tool_messages {
pub use super::tools::rectangle::{RectangleMessage, RectangleMessageDiscriminant}; pub use super::tools::rectangle::{RectangleMessage, RectangleMessageDiscriminant};
} }
pub type ToolActionHandlerData<'a> = (&'a SvgDocument, &'a DocumentToolData, &'a InputPreprocessor); pub type ToolActionHandlerData<'a> = (&'a Document, &'a DocumentToolData, &'a InputPreprocessor);
pub trait Fsm { pub trait Fsm {
type ToolData; type ToolData;
fn transition(self, message: ToolMessage, document: &SvgDocument, tool_data: &DocumentToolData, data: &mut Self::ToolData, input: &InputPreprocessor, messages: &mut VecDeque<Message>) -> Self; fn transition(self, message: ToolMessage, document: &Document, tool_data: &DocumentToolData, data: &mut Self::ToolData, input: &InputPreprocessor, messages: &mut VecDeque<Message>) -> Self;
} }
#[derive(Debug, Clone)] #[derive(Debug, Clone)]

View File

@ -3,8 +3,8 @@ use document_core::color::Color;
use crate::input::InputPreprocessor; use crate::input::InputPreprocessor;
use crate::{ use crate::{
document::Document,
tool::{ToolFsmState, ToolType}, tool::{ToolFsmState, ToolType},
SvgDocument,
}; };
use std::collections::VecDeque; use std::collections::VecDeque;
@ -44,8 +44,8 @@ pub enum ToolMessage {
pub struct ToolMessageHandler { pub struct ToolMessageHandler {
tool_state: ToolFsmState, tool_state: ToolFsmState,
} }
impl MessageHandler<ToolMessage, (&SvgDocument, &InputPreprocessor)> for ToolMessageHandler { impl MessageHandler<ToolMessage, (&Document, &InputPreprocessor)> for ToolMessageHandler {
fn process_action(&mut self, message: ToolMessage, data: (&SvgDocument, &InputPreprocessor), responses: &mut VecDeque<Message>) { fn process_action(&mut self, message: ToolMessage, data: (&Document, &InputPreprocessor), responses: &mut VecDeque<Message>) {
let (document, input) = data; let (document, input) = data;
use ToolMessage::*; use ToolMessage::*;
match message { match message {

View File

@ -1,6 +1,6 @@
use crate::input::{mouse::ViewportPosition, InputPreprocessor}; use crate::input::{mouse::ViewportPosition, InputPreprocessor};
use crate::tool::{DocumentToolData, Fsm, ToolActionHandlerData}; use crate::tool::{DocumentToolData, Fsm, ToolActionHandlerData};
use crate::{message_prelude::*, SvgDocument}; use crate::{document::Document, message_prelude::*};
use document_core::{layers::style, Operation}; use document_core::{layers::style, Operation};
use glam::{DAffine2, DVec2}; use glam::{DAffine2, DVec2};
@ -59,8 +59,8 @@ struct EllipseToolData {
impl Fsm for EllipseToolFsmState { impl Fsm for EllipseToolFsmState {
type ToolData = EllipseToolData; type ToolData = EllipseToolData;
fn transition(self, event: ToolMessage, document: &SvgDocument, tool_data: &DocumentToolData, data: &mut Self::ToolData, input: &InputPreprocessor, responses: &mut VecDeque<Message>) -> Self { fn transition(self, event: ToolMessage, document: &Document, tool_data: &DocumentToolData, data: &mut Self::ToolData, input: &InputPreprocessor, responses: &mut VecDeque<Message>) -> Self {
let transform = document.root.transform; let transform = document.document.root.transform;
use EllipseMessage::*; use EllipseMessage::*;
use EllipseToolFsmState::*; use EllipseToolFsmState::*;
if let ToolMessage::Ellipse(event) = event { if let ToolMessage::Ellipse(event) = event {

View File

@ -29,7 +29,7 @@ impl<'a> MessageHandler<ToolMessage, ToolActionHandlerData<'a>> for Fill {
DVec2::new(point_1.x, point_2.y), DVec2::new(point_1.x, point_2.y),
]; ];
if let Some(path) = data.0.intersects_quad_root(quad).last() { if let Some(path) = data.0.document.intersects_quad_root(quad).last() {
responses.push_back( responses.push_back(
Operation::FillLayer { Operation::FillLayer {
path: path.to_vec(), path: path.to_vec(),

View File

@ -1,6 +1,6 @@
use crate::input::{mouse::ViewportPosition, InputPreprocessor}; use crate::input::{mouse::ViewportPosition, InputPreprocessor};
use crate::tool::{DocumentToolData, Fsm, ToolActionHandlerData}; use crate::tool::{DocumentToolData, Fsm, ToolActionHandlerData};
use crate::{message_prelude::*, SvgDocument}; use crate::{document::Document, message_prelude::*};
use document_core::{layers::style, Operation}; use document_core::{layers::style, Operation};
use glam::{DAffine2, DVec2}; use glam::{DAffine2, DVec2};
@ -64,8 +64,8 @@ struct LineToolData {
impl Fsm for LineToolFsmState { impl Fsm for LineToolFsmState {
type ToolData = LineToolData; type ToolData = LineToolData;
fn transition(self, event: ToolMessage, document: &SvgDocument, tool_data: &DocumentToolData, data: &mut Self::ToolData, input: &InputPreprocessor, responses: &mut VecDeque<Message>) -> Self { fn transition(self, event: ToolMessage, document: &Document, tool_data: &DocumentToolData, data: &mut Self::ToolData, input: &InputPreprocessor, responses: &mut VecDeque<Message>) -> Self {
let transform = document.root.transform; let transform = document.document.root.transform;
use LineMessage::*; use LineMessage::*;
use LineToolFsmState::*; use LineToolFsmState::*;
if let ToolMessage::Line(event) = event { if let ToolMessage::Line(event) = event {

View File

@ -1,6 +1,6 @@
use crate::input::InputPreprocessor; use crate::input::InputPreprocessor;
use crate::tool::{DocumentToolData, Fsm, ToolActionHandlerData}; use crate::tool::{DocumentToolData, Fsm, ToolActionHandlerData};
use crate::{message_prelude::*, SvgDocument}; use crate::{document::Document, message_prelude::*};
use document_core::{layers::style, Operation}; use document_core::{layers::style, Operation};
use glam::DAffine2; use glam::DAffine2;
@ -54,8 +54,8 @@ struct PenToolData {
impl Fsm for PenToolFsmState { impl Fsm for PenToolFsmState {
type ToolData = PenToolData; type ToolData = PenToolData;
fn transition(self, event: ToolMessage, document: &SvgDocument, tool_data: &DocumentToolData, data: &mut Self::ToolData, input: &InputPreprocessor, responses: &mut VecDeque<Message>) -> Self { fn transition(self, event: ToolMessage, document: &Document, tool_data: &DocumentToolData, data: &mut Self::ToolData, input: &InputPreprocessor, responses: &mut VecDeque<Message>) -> Self {
let transform = document.root.transform; let transform = document.document.root.transform;
let pos = transform.inverse() * DAffine2::from_translation(input.mouse.position.to_dvec2()); let pos = transform.inverse() * DAffine2::from_translation(input.mouse.position.to_dvec2());
use PenMessage::*; use PenMessage::*;

View File

@ -1,6 +1,6 @@
use crate::input::{mouse::ViewportPosition, InputPreprocessor}; use crate::input::{mouse::ViewportPosition, InputPreprocessor};
use crate::tool::{DocumentToolData, Fsm, ToolActionHandlerData}; use crate::tool::{DocumentToolData, Fsm, ToolActionHandlerData};
use crate::{message_prelude::*, SvgDocument}; use crate::{document::Document, message_prelude::*};
use document_core::{layers::style, Operation}; use document_core::{layers::style, Operation};
use glam::{DAffine2, DVec2}; use glam::{DAffine2, DVec2};
@ -58,8 +58,8 @@ struct RectangleToolData {
impl Fsm for RectangleToolFsmState { impl Fsm for RectangleToolFsmState {
type ToolData = RectangleToolData; type ToolData = RectangleToolData;
fn transition(self, event: ToolMessage, document: &SvgDocument, tool_data: &DocumentToolData, data: &mut Self::ToolData, input: &InputPreprocessor, responses: &mut VecDeque<Message>) -> Self { fn transition(self, event: ToolMessage, document: &Document, tool_data: &DocumentToolData, data: &mut Self::ToolData, input: &InputPreprocessor, responses: &mut VecDeque<Message>) -> Self {
let transform = document.root.transform; let transform = document.document.root.transform;
use RectangleMessage::*; use RectangleMessage::*;
use RectangleToolFsmState::*; use RectangleToolFsmState::*;
if let ToolMessage::Rectangle(event) = event { if let ToolMessage::Rectangle(event) = event {

View File

@ -7,7 +7,7 @@ use glam::{DAffine2, DVec2};
use crate::input::{mouse::ViewportPosition, InputPreprocessor}; use crate::input::{mouse::ViewportPosition, InputPreprocessor};
use crate::tool::{DocumentToolData, Fsm, ToolActionHandlerData}; use crate::tool::{DocumentToolData, Fsm, ToolActionHandlerData};
use crate::{consts::SELECTION_TOLERANCE, message_prelude::*, SvgDocument}; use crate::{consts::SELECTION_TOLERANCE, document::Document, message_prelude::*};
#[derive(Default)] #[derive(Default)]
pub struct Select { pub struct Select {
@ -58,8 +58,8 @@ struct SelectToolData {
impl Fsm for SelectToolFsmState { impl Fsm for SelectToolFsmState {
type ToolData = SelectToolData; type ToolData = SelectToolData;
fn transition(self, event: ToolMessage, document: &SvgDocument, tool_data: &DocumentToolData, data: &mut Self::ToolData, input: &InputPreprocessor, responses: &mut VecDeque<Message>) -> Self { fn transition(self, event: ToolMessage, document: &Document, tool_data: &DocumentToolData, data: &mut Self::ToolData, input: &InputPreprocessor, responses: &mut VecDeque<Message>) -> Self {
let transform = document.root.transform; let transform = document.document.root.transform;
use SelectMessage::*; use SelectMessage::*;
use SelectToolFsmState::*; use SelectToolFsmState::*;
if let ToolMessage::Select(event) = event { if let ToolMessage::Select(event) = event {
@ -105,13 +105,13 @@ impl Fsm for SelectToolFsmState {
responses.push_back(Operation::DiscardWorkingFolder.into()); responses.push_back(Operation::DiscardWorkingFolder.into());
if data.drag_start == data.drag_current { if data.drag_start == data.drag_current {
if let Some(intersection) = document.intersects_quad_root(quad).last() { if let Some(intersection) = document.document.intersects_quad_root(quad).last() {
responses.push_back(DocumentMessage::SelectLayers(vec![intersection.clone()]).into()); responses.push_back(DocumentMessage::SelectLayers(vec![intersection.clone()]).into());
} else { } else {
responses.push_back(DocumentMessage::SelectLayers(vec![]).into()); responses.push_back(DocumentMessage::SelectLayers(vec![]).into());
} }
} else { } else {
responses.push_back(DocumentMessage::SelectLayers(document.intersects_quad_root(quad)).into()); responses.push_back(DocumentMessage::SelectLayers(document.document.intersects_quad_root(quad)).into());
} }
Ready Ready

View File

@ -1,6 +1,6 @@
use crate::input::{mouse::ViewportPosition, InputPreprocessor}; use crate::input::{mouse::ViewportPosition, InputPreprocessor};
use crate::tool::{DocumentToolData, Fsm, ToolActionHandlerData}; use crate::tool::{DocumentToolData, Fsm, ToolActionHandlerData};
use crate::{message_prelude::*, SvgDocument}; use crate::{document::Document, message_prelude::*};
use document_core::{layers::style, Operation}; use document_core::{layers::style, Operation};
use glam::{DAffine2, DVec2}; use glam::{DAffine2, DVec2};
@ -60,8 +60,8 @@ struct ShapeToolData {
impl Fsm for ShapeToolFsmState { impl Fsm for ShapeToolFsmState {
type ToolData = ShapeToolData; type ToolData = ShapeToolData;
fn transition(self, event: ToolMessage, document: &SvgDocument, tool_data: &DocumentToolData, data: &mut Self::ToolData, input: &InputPreprocessor, responses: &mut VecDeque<Message>) -> Self { fn transition(self, event: ToolMessage, document: &Document, tool_data: &DocumentToolData, data: &mut Self::ToolData, input: &InputPreprocessor, responses: &mut VecDeque<Message>) -> Self {
let transform = document.root.transform; let transform = document.document.root.transform;
use ShapeMessage::*; use ShapeMessage::*;
use ShapeToolFsmState::*; use ShapeToolFsmState::*;
if let ToolMessage::Shape(event) = event { if let ToolMessage::Shape(event) = event {