From b3b1b8ab43bca675f9d1c9093db60952da1da19c Mon Sep 17 00:00:00 2001 From: Ayush Amawate Date: Sat, 7 Feb 2026 13:39:17 +0530 Subject: [PATCH 1/3] persist Shape tool dropdown selection --- editor/src/messages/tool/tool_message_handler.rs | 5 +++-- .../src/messages/tool/tool_messages/shape_tool.rs | 15 ++++++++------- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/editor/src/messages/tool/tool_message_handler.rs b/editor/src/messages/tool/tool_message_handler.rs index 0a263e1996..d4b109a144 100644 --- a/editor/src/messages/tool/tool_message_handler.rs +++ b/editor/src/messages/tool/tool_message_handler.rs @@ -1,5 +1,5 @@ use super::common_functionality::shape_editor::ShapeState; -use super::common_functionality::shapes::shape_utility::ShapeType::{self, Ellipse, Line, Rectangle}; +use super::common_functionality::shapes::shape_utility::ShapeType::{Ellipse, Line, Rectangle}; use super::utility_types::{ToolActionMessageContext, ToolFsmState, tool_message_to_tool_type}; use crate::application::generate_uuid; use crate::messages::layout::utility_types::widget_prelude::*; @@ -75,9 +75,10 @@ impl MessageHandler> for ToolMessageHandler if self.tool_state.tool_data.active_shape_type.is_some() { self.tool_state.tool_data.active_shape_type = None; self.tool_state.tool_data.active_tool_type = ToolType::Shape; + // Restore current_shape from the preserved dropdown selection (options.shape_type) + responses.add(ShapeToolMessage::RestoreShapeFromOptions); } responses.add_front(ToolMessage::ActivateTool { tool_type: ToolType::Shape }); - responses.add(ShapeToolMessage::SetShape { shape: ShapeType::Polygon }); responses.add(ShapeToolMessage::HideShapeTypeWidget { hide: false }) } ToolMessage::ActivateToolBrush => responses.add_front(ToolMessage::ActivateTool { tool_type: ToolType::Brush }), diff --git a/editor/src/messages/tool/tool_messages/shape_tool.rs b/editor/src/messages/tool/tool_messages/shape_tool.rs index e459c9cb11..c812c9df27 100644 --- a/editor/src/messages/tool/tool_messages/shape_tool.rs +++ b/editor/src/messages/tool/tool_messages/shape_tool.rs @@ -94,6 +94,8 @@ pub enum ShapeToolMessage { PointerOutsideViewport { modifier: ShapeToolModifierKey }, UpdateOptions { options: ShapeOptionsUpdate }, SetShape { shape: ShapeType }, + /// Restores current_shape from the dropdown selection (options.shape_type) + RestoreShapeFromOptions, IncreaseSides, DecreaseSides, @@ -1090,16 +1092,15 @@ impl Fsm for ShapeToolFsmState { (_, ShapeToolMessage::SetShape { shape }) => { responses.add(DocumentMessage::AbortTransaction); tool_data.data.cleanup(responses); + // Only update current_shape for drawing, preserve options.shape_type (dropdown selection) tool_data.current_shape = shape; - responses.add(ShapeToolMessage::UpdateOptions { - options: ShapeOptionsUpdate::ShapeType(shape), - }); - - responses.add(ShapeToolMessage::UpdateOptions { - options: ShapeOptionsUpdate::ShapeType(shape), - }); ShapeToolFsmState::Ready(shape) } + (_, ShapeToolMessage::RestoreShapeFromOptions) => { + // Restore current_shape from the dropdown selection when returning from Line/Rectangle/Ellipse aliases + tool_data.current_shape = tool_options.shape_type; + ShapeToolFsmState::Ready(tool_options.shape_type) + } (_, ShapeToolMessage::HideShapeTypeWidget { hide }) => { tool_data.hide_shape_option_widget = hide; responses.add(ToolMessage::RefreshToolOptions); From 18a72f7aed8f5829602b662e14eb7f62b4188100 Mon Sep 17 00:00:00 2001 From: Ayush Amawate Date: Sat, 7 Feb 2026 14:19:33 +0530 Subject: [PATCH 2/3] formatting changes --- .../messages/tool/tool_messages/shape_tool.rs | 31 ++++++++++++++----- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/editor/src/messages/tool/tool_messages/shape_tool.rs b/editor/src/messages/tool/tool_messages/shape_tool.rs index c812c9df27..bd622c85d5 100644 --- a/editor/src/messages/tool/tool_messages/shape_tool.rs +++ b/editor/src/messages/tool/tool_messages/shape_tool.rs @@ -82,25 +82,42 @@ pub enum ShapeOptionsUpdate { #[derive(PartialEq, Clone, Debug, serde::Serialize, serde::Deserialize, specta::Type)] pub enum ShapeToolMessage { // Standard messages - Overlays { context: OverlayContext }, + Overlays { + context: OverlayContext, + }, Abort, WorkingColorChanged, // Tool-specific messages DragStart, DragStop, - HideShapeTypeWidget { hide: bool }, - PointerMove { modifier: ShapeToolModifierKey }, - PointerOutsideViewport { modifier: ShapeToolModifierKey }, - UpdateOptions { options: ShapeOptionsUpdate }, - SetShape { shape: ShapeType }, + HideShapeTypeWidget { + hide: bool, + }, + PointerMove { + modifier: ShapeToolModifierKey, + }, + PointerOutsideViewport { + modifier: ShapeToolModifierKey, + }, + UpdateOptions { + options: ShapeOptionsUpdate, + }, + SetShape { + shape: ShapeType, + }, /// Restores current_shape from the dropdown selection (options.shape_type) RestoreShapeFromOptions, IncreaseSides, DecreaseSides, - NudgeSelectedLayers { delta_x: f64, delta_y: f64, resize: Key, resize_opposite_corner: Key }, + NudgeSelectedLayers { + delta_x: f64, + delta_y: f64, + resize: Key, + resize_opposite_corner: Key, + }, } fn create_sides_widget(vertices: u32) -> WidgetInstance { From b43b8cc37d4865c72b69f778c193f71d768da2cf Mon Sep 17 00:00:00 2001 From: Ayush Amawate Date: Mon, 9 Feb 2026 10:12:01 +0530 Subject: [PATCH 3/3] remove Line, Rectangle, and Ellipse from Shape tool dropdown --- .../shapes/shape_utility.rs | 5 ++-- .../messages/tool/tool_messages/shape_tool.rs | 27 ++++++------------- 2 files changed, 11 insertions(+), 21 deletions(-) diff --git a/editor/src/messages/tool/common_functionality/shapes/shape_utility.rs b/editor/src/messages/tool/common_functionality/shapes/shape_utility.rs index aa9c215449..f71f695429 100644 --- a/editor/src/messages/tool/common_functionality/shapes/shape_utility.rs +++ b/editor/src/messages/tool/common_functionality/shapes/shape_utility.rs @@ -32,10 +32,11 @@ pub enum ShapeType { Arc, Spiral, Grid, - Rectangle, - Ellipse, Arrow, + // These have dedicated tools and don't appear in the Shape tool's dropdown Line, + Rectangle, + Ellipse, } impl ShapeType { diff --git a/editor/src/messages/tool/tool_messages/shape_tool.rs b/editor/src/messages/tool/tool_messages/shape_tool.rs index bd622c85d5..aba7f78940 100644 --- a/editor/src/messages/tool/tool_messages/shape_tool.rs +++ b/editor/src/messages/tool/tool_messages/shape_tool.rs @@ -151,6 +151,7 @@ fn create_turns_widget(turns: f64) -> WidgetInstance { } fn create_shape_option_widget(shape_type: ShapeType) -> WidgetInstance { + // Line, Rectangle, and Ellipse have dedicated tools, so they're excluded from this dropdown let entries = vec![vec![ MenuListEntry::new("Polygon").label("Polygon").on_commit(move |_| { ShapeToolMessage::UpdateOptions { @@ -188,32 +189,20 @@ fn create_shape_option_widget(shape_type: ShapeType) -> WidgetInstance { } .into() }), - MenuListEntry::new("Rectangle").label("Rectangle").on_commit(move |_| { - ShapeToolMessage::UpdateOptions { - options: ShapeOptionsUpdate::ShapeType(ShapeType::Rectangle), - } - .into() - }), - MenuListEntry::new("Ellipse").label("Ellipse").on_commit(move |_| { - ShapeToolMessage::UpdateOptions { - options: ShapeOptionsUpdate::ShapeType(ShapeType::Ellipse), - } - .into() - }), MenuListEntry::new("Arrow").label("Arrow").on_commit(move |_| { ShapeToolMessage::UpdateOptions { options: ShapeOptionsUpdate::ShapeType(ShapeType::Arrow), } .into() }), - MenuListEntry::new("Line").label("Line").on_commit(move |_| { - ShapeToolMessage::UpdateOptions { - options: ShapeOptionsUpdate::ShapeType(ShapeType::Line), - } - .into() - }), ]]; - DropdownInput::new(entries).selected_index(Some(shape_type as u32)).widget_instance() + // Line, Rectangle, Ellipse have dedicated tools (and higher enum values), so shape_type as u32 works for the rest + let selected_index = if matches!(shape_type, ShapeType::Line | ShapeType::Rectangle | ShapeType::Ellipse) { + Some(0) // Default to Polygon if somehow one of these is selected + } else { + Some(shape_type as u32) + }; + DropdownInput::new(entries).selected_index(selected_index).widget_instance() } fn create_arc_type_widget(arc_type: ArcType) -> WidgetInstance {