diff --git a/editor/src/messages/portfolio/document/document_message.rs b/editor/src/messages/portfolio/document/document_message.rs index 4ed9de6d..cef013c9 100644 --- a/editor/src/messages/portfolio/document/document_message.rs +++ b/editor/src/messages/portfolio/document/document_message.rs @@ -32,9 +32,6 @@ pub enum DocumentMessage { Overlays(OverlaysMessage), #[remain::unsorted] #[child] - TransformLayer(TransformLayerMessage), - #[remain::unsorted] - #[child] PropertiesPanel(PropertiesPanelMessage), #[remain::unsorted] #[child] diff --git a/editor/src/messages/portfolio/document/document_message_handler.rs b/editor/src/messages/portfolio/document/document_message_handler.rs index 43921aa1..94a9251c 100644 --- a/editor/src/messages/portfolio/document/document_message_handler.rs +++ b/editor/src/messages/portfolio/document/document_message_handler.rs @@ -67,8 +67,6 @@ pub struct DocumentMessageHandler { #[serde(skip)] overlays_message_handler: OverlaysMessageHandler, pub artboard_message_handler: ArtboardMessageHandler, - #[serde(skip)] - transform_layer_handler: TransformLayerMessageHandler, properties_panel_message_handler: PropertiesPanelMessageHandler, #[serde(skip)] node_graph_handler: NodeGraphMessageHandler, @@ -98,7 +96,6 @@ impl Default for DocumentMessageHandler { navigation_handler: NavigationMessageHandler::default(), overlays_message_handler: OverlaysMessageHandler::default(), artboard_message_handler: ArtboardMessageHandler::default(), - transform_layer_handler: TransformLayerMessageHandler::default(), properties_panel_message_handler: PropertiesPanelMessageHandler::default(), node_graph_handler: Default::default(), } @@ -194,11 +191,6 @@ impl MessageHandler { - self.transform_layer_handler - .process_message(message, responses, (&mut self.layer_metadata, &mut self.document_legacy, ipp, &render_data)); - } - #[remain::unsorted] PropertiesPanel(message) => { let properties_panel_message_handler_data = PropertiesPanelMessageHandlerData { artwork_document: &self.document_legacy, @@ -1014,7 +1006,6 @@ impl MessageHandler for ToolMessageHandler { @@ -27,6 +28,11 @@ impl MessageHandler self + .transform_layer_handler + .process_message(message, responses, (document, input, &render_data, &self.tool_state.tool_data)), + #[remain::unsorted] ToolMessage::ActivateToolSelect => responses.push_front(ToolMessage::ActivateTool { tool_type: ToolType::Select }.into()), #[remain::unsorted] @@ -115,8 +121,18 @@ impl MessageHandler { let tool_data = &mut self.tool_state.tool_data; tool_data.tools.get(&tool_data.active_tool_type).unwrap().deactivate(responses); + + // Unsubscribe the transform layer to selection change events + let message = Box::new(TransformLayerMessage::SelectionChanged.into()); + let on = BroadcastEvent::SelectionChanged; + responses.push_back(BroadcastMessage::UnsubscribeEvent { message, on }.into()); } ToolMessage::InitTools => { + // Subscribe the transform layer to selection change events + let send = Box::new(TransformLayerMessage::SelectionChanged.into()); + let on = BroadcastEvent::SelectionChanged; + responses.push_back(BroadcastMessage::SubscribeEvent { send, on }.into()); + let tool_data = &mut self.tool_state.tool_data; let document_data = &self.tool_state.document_tool_data; let active_tool = &tool_data.active_tool_type; @@ -232,6 +248,7 @@ impl MessageHandlerG R and S keys for grabbing, rotating and scaling. +//! +//! Other features include +//! - Typing a number for a precise transformation +//! - Shift to slow transformation +//! - Ctrl to snap angles to 15° +//! - Escape or right click to cancel + +mod transform_layer_message; +mod transform_layer_message_handler; + +#[doc(inline)] +pub use transform_layer_message::{TransformLayerMessage, TransformLayerMessageDiscriminant}; +#[doc(inline)] +pub use transform_layer_message_handler::TransformLayerMessageHandler; diff --git a/editor/src/messages/portfolio/document/transform_layer/transform_layer_message.rs b/editor/src/messages/tool/transform_layer/transform_layer_message.rs similarity index 87% rename from editor/src/messages/portfolio/document/transform_layer/transform_layer_message.rs rename to editor/src/messages/tool/transform_layer/transform_layer_message.rs index d148dc84..fec67b52 100644 --- a/editor/src/messages/portfolio/document/transform_layer/transform_layer_message.rs +++ b/editor/src/messages/tool/transform_layer/transform_layer_message.rs @@ -4,7 +4,7 @@ use crate::messages::prelude::*; use serde::{Deserialize, Serialize}; #[remain::sorted] -#[impl_message(Message, DocumentMessage, TransformLayer)] +#[impl_message(Message, ToolMessage, TransformLayer)] #[derive(PartialEq, Eq, Clone, Debug, Serialize, Deserialize)] pub enum TransformLayerMessage { // Messages @@ -16,6 +16,7 @@ pub enum TransformLayerMessage { ConstrainX, ConstrainY, PointerMove { slow_key: Key, snap_key: Key }, + SelectionChanged, TypeBackspace, TypeDecimalPoint, TypeDigit { digit: u8 }, diff --git a/editor/src/messages/portfolio/document/transform_layer/transform_layer_message_handler.rs b/editor/src/messages/tool/transform_layer/transform_layer_message_handler.rs similarity index 84% rename from editor/src/messages/portfolio/document/transform_layer/transform_layer_message_handler.rs rename to editor/src/messages/tool/transform_layer/transform_layer_message_handler.rs index 78fb87d7..f10eb2c8 100644 --- a/editor/src/messages/portfolio/document/transform_layer/transform_layer_message_handler.rs +++ b/editor/src/messages/tool/transform_layer/transform_layer_message_handler.rs @@ -1,16 +1,15 @@ use crate::consts::SLOWING_DIVISOR; use crate::messages::input_mapper::utility_types::input_mouse::ViewportPosition; -use crate::messages::portfolio::document::utility_types::layer_panel::LayerMetadata; use crate::messages::portfolio::document::utility_types::transformation::{Axis, OriginalTransforms, Selected, TransformOperation, Typing}; use crate::messages::prelude::*; +use crate::messages::tool::common_functionality::shape_editor::ShapeEditor; +use crate::messages::tool::utility_types::{ToolData, ToolType}; -use document_legacy::document::Document; use document_legacy::layers::style::RenderData; -use document_legacy::LayerId; use glam::DVec2; -#[derive(Debug, Clone, Default, PartialEq)] +#[derive(Debug, Clone, Default)] pub struct TransformLayerMessageHandler { transform_operation: TransformOperation, @@ -23,16 +22,24 @@ pub struct TransformLayerMessageHandler { original_transforms: OriginalTransforms, pivot: DVec2, + + shape_editor: ShapeEditor, } -type TransformData<'a> = (&'a mut HashMap, LayerMetadata>, &'a mut Document, &'a InputPreprocessorMessageHandler, &'a RenderData<'a>); +type TransformData<'a> = (&'a DocumentMessageHandler, &'a InputPreprocessorMessageHandler, &'a RenderData<'a>, &'a ToolData); impl<'a> MessageHandler> for TransformLayerMessageHandler { #[remain::check] - fn process_message(&mut self, message: TransformLayerMessage, responses: &mut VecDeque, (layer_metadata, document, ipp, render_data): TransformData) { + fn process_message(&mut self, message: TransformLayerMessage, responses: &mut VecDeque, (document, ipp, render_data, tool_data): TransformData) { use TransformLayerMessage::*; - let selected_layers = layer_metadata.iter().filter_map(|(layer_path, data)| data.selected.then_some(layer_path)).collect::>(); - let mut selected = Selected::new(&mut self.original_transforms, &mut self.pivot, &selected_layers, responses, document); + // TODO: Transform individual points when using the path tool. + let _using_path_tool = tool_data.active_tool_type == ToolType::Path; + + // You may also want the shape editor here? If not, then feel free to remove. + let _shape_editor = &self.shape_editor; + + let selected_layers = document.layer_metadata.iter().filter_map(|(layer_path, data)| data.selected.then_some(layer_path)).collect::>(); + let mut selected = Selected::new(&mut self.original_transforms, &mut self.pivot, &selected_layers, responses, &document.document_legacy); let mut begin_operation = |operation: TransformOperation, typing: &mut Typing, mouse_position: &mut DVec2, start_mouse: &mut DVec2| { if operation != TransformOperation::None { @@ -71,6 +78,7 @@ impl<'a> MessageHandler> for TransformL self.transform_operation = TransformOperation::Grabbing(Default::default()); responses.push_back(BroadcastEvent::DocumentIsDirty.into()); + self.original_transforms.clear(); } BeginRotate => { if let TransformOperation::Rotating(_) = self.transform_operation { @@ -87,6 +95,7 @@ impl<'a> MessageHandler> for TransformL self.transform_operation = TransformOperation::Rotating(Default::default()); responses.push_back(BroadcastEvent::DocumentIsDirty.into()); + self.original_transforms.clear(); } BeginScale => { if let TransformOperation::Scaling(_) = self.transform_operation { @@ -104,6 +113,7 @@ impl<'a> MessageHandler> for TransformL self.transform_operation.apply_transform_operation(&mut selected, self.snap); responses.push_back(BroadcastEvent::DocumentIsDirty.into()); + self.original_transforms.clear(); } CancelTransformOperation => { selected.revert_operation(); @@ -166,6 +176,10 @@ impl<'a> MessageHandler> for TransformL } self.mouse_position = ipp.mouse.position; } + SelectionChanged => { + let layer_paths = document.selected_visible_layers().map(|layer_path| layer_path.to_vec()).collect(); + self.shape_editor.set_selected_layers(layer_paths); + } TypeBackspace => self.transform_operation.handle_typed(self.typing.type_backspace(), &mut selected, self.snap), TypeDecimalPoint => self.transform_operation.handle_typed(self.typing.type_decimal_point(), &mut selected, self.snap), TypeDigit { digit } => self.transform_operation.handle_typed(self.typing.type_number(digit), &mut selected, self.snap),