From b937a64c37b7503e38737a94725b9a4fb3cc0566 Mon Sep 17 00:00:00 2001 From: Dhruv Date: Sat, 17 Jun 2023 23:00:33 +0530 Subject: [PATCH] Conditionally enable align and pivot buttons (#1313) * feat: conditionally enable align buttons - enable select tool align buttons if selected layer count > 1 * wip: conditionally render pivot button * [wip] feat: conditionally enable select tools' pivot button * fix: prevent repeated UI updates on layer selection - set bool flag to false after first UI update --- .../tool/tool_messages/select_tool.rs | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/editor/src/messages/tool/tool_messages/select_tool.rs b/editor/src/messages/tool/tool_messages/select_tool.rs index bd562082..58519b09 100644 --- a/editor/src/messages/tool/tool_messages/select_tool.rs +++ b/editor/src/messages/tool/tool_messages/select_tool.rs @@ -126,6 +126,10 @@ impl PropertyHolder for SelectTool { }) .collect(); + let selected_layers_count = self.tool_data.selected_layers_count; + let deactivate_alignment = selected_layers_count < 2; + let deactivate_pivot = selected_layers_count < 1; + Layout::WidgetLayout(WidgetLayout::new(vec![LayoutGroup::Row { widgets: vec![ DropdownInput::new(vec![layer_selection_behavior_entries]) @@ -135,11 +139,13 @@ impl PropertyHolder for SelectTool { WidgetHolder::related_separator(), // We'd like this widget to hide and show itself whenever the transformation cage is active or inactive (i.e. when no layers are selected) PivotAssist::new(self.tool_data.pivot.to_pivot_position()) + .disabled(deactivate_pivot) .on_update(|pivot_assist: &PivotAssist| SelectToolMessage::SetPivot { position: pivot_assist.position }.into()) .widget_holder(), WidgetHolder::section_separator(), IconButton::new("AlignLeft", 24) .tooltip("Align Left") + .disabled(deactivate_alignment) .on_update(|_| { DocumentMessage::AlignSelectedLayers { axis: AlignAxis::X, @@ -150,6 +156,7 @@ impl PropertyHolder for SelectTool { .widget_holder(), IconButton::new("AlignHorizontalCenter", 24) .tooltip("Align Horizontal Center") + .disabled(deactivate_alignment) .on_update(|_| { DocumentMessage::AlignSelectedLayers { axis: AlignAxis::X, @@ -160,6 +167,7 @@ impl PropertyHolder for SelectTool { .widget_holder(), IconButton::new("AlignRight", 24) .tooltip("Align Right") + .disabled(deactivate_alignment) .on_update(|_| { DocumentMessage::AlignSelectedLayers { axis: AlignAxis::X, @@ -171,6 +179,7 @@ impl PropertyHolder for SelectTool { WidgetHolder::unrelated_separator(), IconButton::new("AlignTop", 24) .tooltip("Align Top") + .disabled(deactivate_alignment) .on_update(|_| { DocumentMessage::AlignSelectedLayers { axis: AlignAxis::Y, @@ -181,6 +190,7 @@ impl PropertyHolder for SelectTool { .widget_holder(), IconButton::new("AlignVerticalCenter", 24) .tooltip("Align Vertical Center") + .disabled(deactivate_alignment) .on_update(|_| { DocumentMessage::AlignSelectedLayers { axis: AlignAxis::Y, @@ -191,6 +201,7 @@ impl PropertyHolder for SelectTool { .widget_holder(), IconButton::new("AlignBottom", 24) .tooltip("Align Bottom") + .disabled(deactivate_alignment) .on_update(|_| { DocumentMessage::AlignSelectedLayers { axis: AlignAxis::Y, @@ -253,9 +264,10 @@ impl<'a> MessageHandler> for SelectT self.fsm_state.process_event(message, &mut self.tool_data, tool_data, &(), responses, false); - if self.tool_data.pivot.should_refresh_pivot_position() { + if self.tool_data.pivot.should_refresh_pivot_position() || self.tool_data.selected_layers_changed { // Notify the frontend about the updated pivot position (a bit ugly to do it here not in the fsm but that doesn't have SelectTool) self.register_properties(responses, LayoutTarget::ToolOptions); + self.tool_data.selected_layers_changed = false; } } @@ -318,6 +330,8 @@ struct SelectToolData { cursor: MouseCursorIcon, pivot: Pivot, nested_selection_behavior: NestedSelectionBehavior, + selected_layers_count: usize, + selected_layers_changed: bool, } impl SelectToolData { @@ -434,6 +448,16 @@ impl Fsm for SelectToolFsmState { if let ToolMessage::Select(event) = event { match (self, event) { (_, DocumentIsDirty | SelectionChanged) => { + let selected_layers_count = document.selected_layers().count(); + let selected_layers_changed = selected_layers_count != tool_data.selected_layers_count; + + if selected_layers_changed { + tool_data.selected_layers_count = selected_layers_count; + tool_data.selected_layers_changed = true; + } else { + tool_data.selected_layers_changed = false; + } + match (document.selected_visible_layers_bounding_box(render_data), tool_data.bounding_box_overlays.take()) { (None, Some(bounding_box_overlays)) => bounding_box_overlays.delete(responses), (Some(bounds), paths) => {