Skip to content

Commit f5b4e4c

Browse files
committed
Add new settings over measurements, hover and selection overlays
1 parent 9a62c1c commit f5b4e4c

File tree

9 files changed

+360
-112
lines changed

9 files changed

+360
-112
lines changed

editor/src/messages/layout/utility_types/layout_widget.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ pub enum LayoutTarget {
4949
WorkingColors,
5050

5151
// KEEP THIS ENUM LAST
52-
// This is a marker that is used to define an array that is used to hold widgets
52+
// This is a marker that is used to define an array to hold widgets
5353
LayoutTargetLength,
5454
}
5555

editor/src/messages/portfolio/document/document_message_handler.rs

Lines changed: 250 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -1014,6 +1014,10 @@ impl MessageHandler<DocumentMessage, DocumentMessageData<'_>> for DocumentMessag
10141014
}
10151015
}
10161016
DocumentMessage::SelectAllLayers => {
1017+
if !self.overlays_visibility_settings.selection_outline {
1018+
return;
1019+
}
1020+
10171021
let metadata = self.metadata();
10181022
let all_layers_except_artboards_invisible_and_locked = metadata.all_layers().filter(|&layer| !self.network_interface.is_artboard(&layer.to_node(), &[])).filter(|&layer| {
10191023
self.network_interface.selected_nodes().layer_visible(layer, &self.network_interface) && !self.network_interface.selected_nodes().layer_locked(layer, &self.network_interface)
@@ -1133,8 +1137,21 @@ impl MessageHandler<DocumentMessage, DocumentMessageData<'_>> for DocumentMessag
11331137
responses.add(GraphOperationMessage::OpacitySet { layer, opacity });
11341138
}
11351139
}
1136-
DocumentMessage::SetOverlaysVisibility { visible } => {
1137-
self.overlays_visible = visible;
1140+
DocumentMessage::SetOverlaysVisibility { visible, overlays_type } => {
1141+
match overlays_type {
1142+
OverlaysType::All => self.overlays_visibility_settings.all = visible,
1143+
OverlaysType::ArtboardName => self.overlays_visibility_settings.artboard_name = visible,
1144+
OverlaysType::CompassRose => self.overlays_visibility_settings.compass_rose = visible,
1145+
OverlaysType::QuickMeasurement => self.overlays_visibility_settings.quick_measurement = visible,
1146+
OverlaysType::TransformMeasurement => self.overlays_visibility_settings.transform_measurement = visible,
1147+
OverlaysType::TransformCage => self.overlays_visibility_settings.transform_cage = visible,
1148+
OverlaysType::HoverOutline => self.overlays_visibility_settings.hover_outline = visible,
1149+
OverlaysType::SelectionOutline => self.overlays_visibility_settings.selection_outline = visible,
1150+
OverlaysType::Pivot => self.overlays_visibility_settings.pivot = visible,
1151+
OverlaysType::Path => self.overlays_visibility_settings.path = visible,
1152+
OverlaysType::Anchors => self.overlays_visibility_settings.anchors = visible,
1153+
OverlaysType::Handles => self.overlays_visibility_settings.handles = visible,
1154+
}
11381155
responses.add(BroadcastEvent::ToolAbort);
11391156
responses.add(OverlaysMessage::Draw);
11401157
}
@@ -2063,7 +2080,169 @@ impl DocumentMessageHandler {
20632080
widgets: vec![TextLabel::new("Overlays").bold(true).widget_holder()],
20642081
},
20652082
LayoutGroup::Row {
2066-
widgets: vec![TextLabel::new("Granular settings in this menu are coming soon").widget_holder()],
2083+
widgets: vec![
2084+
CheckboxInput::new(self.overlays_visibility_settings.artboard_name)
2085+
.tooltip("Enable or disable the artboard names overlay")
2086+
.on_update(|optional_input: &CheckboxInput| {
2087+
DocumentMessage::SetOverlaysVisibility {
2088+
visible: optional_input.checked,
2089+
overlays_type: OverlaysType::ArtboardName,
2090+
}
2091+
.into()
2092+
})
2093+
.widget_holder(),
2094+
TextLabel::new("Artboard Name".to_string()).widget_holder(),
2095+
],
2096+
},
2097+
LayoutGroup::Row {
2098+
widgets: vec![
2099+
CheckboxInput::new(self.overlays_visibility_settings.compass_rose)
2100+
.tooltip("Enable or disable the compass rose overlay")
2101+
.on_update(|optional_input: &CheckboxInput| {
2102+
DocumentMessage::SetOverlaysVisibility {
2103+
visible: optional_input.checked,
2104+
overlays_type: OverlaysType::CompassRose,
2105+
}
2106+
.into()
2107+
})
2108+
.widget_holder(),
2109+
TextLabel::new("Compass Rose".to_string()).widget_holder(),
2110+
],
2111+
},
2112+
LayoutGroup::Row {
2113+
widgets: vec![
2114+
CheckboxInput::new(self.overlays_visibility_settings.quick_measurement)
2115+
.tooltip("Enable or disable the quick measurement overlay")
2116+
.on_update(|optional_input: &CheckboxInput| {
2117+
DocumentMessage::SetOverlaysVisibility {
2118+
visible: optional_input.checked,
2119+
overlays_type: OverlaysType::QuickMeasurement,
2120+
}
2121+
.into()
2122+
})
2123+
.widget_holder(),
2124+
TextLabel::new("Quick Measurement".to_string()).widget_holder(),
2125+
],
2126+
},
2127+
LayoutGroup::Row {
2128+
widgets: vec![
2129+
CheckboxInput::new(self.overlays_visibility_settings.transform_measurement)
2130+
.tooltip("Enable or disable the transform measurement overlay")
2131+
.on_update(|optional_input: &CheckboxInput| {
2132+
DocumentMessage::SetOverlaysVisibility {
2133+
visible: optional_input.checked,
2134+
overlays_type: OverlaysType::TransformMeasurement,
2135+
}
2136+
.into()
2137+
})
2138+
.widget_holder(),
2139+
TextLabel::new("Transform Measurement".to_string()).widget_holder(),
2140+
],
2141+
},
2142+
LayoutGroup::Row {
2143+
widgets: vec![
2144+
CheckboxInput::new(self.overlays_visibility_settings.transform_cage)
2145+
.tooltip("Enable or disable the transform cage overlay")
2146+
.on_update(|optional_input: &CheckboxInput| {
2147+
DocumentMessage::SetOverlaysVisibility {
2148+
visible: optional_input.checked,
2149+
overlays_type: OverlaysType::TransformCage,
2150+
}
2151+
.into()
2152+
})
2153+
.widget_holder(),
2154+
TextLabel::new("Transform Cage".to_string()).widget_holder(),
2155+
],
2156+
},
2157+
LayoutGroup::Row {
2158+
widgets: vec![
2159+
CheckboxInput::new(self.overlays_visibility_settings.hover_outline)
2160+
.tooltip("Enable or disable the hover outline overlay")
2161+
.on_update(|optional_input: &CheckboxInput| {
2162+
DocumentMessage::SetOverlaysVisibility {
2163+
visible: optional_input.checked,
2164+
overlays_type: OverlaysType::HoverOutline,
2165+
}
2166+
.into()
2167+
})
2168+
.widget_holder(),
2169+
TextLabel::new("Hover Outline".to_string()).widget_holder(),
2170+
],
2171+
},
2172+
LayoutGroup::Row {
2173+
widgets: vec![
2174+
CheckboxInput::new(self.overlays_visibility_settings.selection_outline)
2175+
.tooltip("Enable or disable the selection outline overlay")
2176+
.on_update(|optional_input: &CheckboxInput| {
2177+
DocumentMessage::SetOverlaysVisibility {
2178+
visible: optional_input.checked,
2179+
overlays_type: OverlaysType::SelectionOutline,
2180+
}
2181+
.into()
2182+
})
2183+
.widget_holder(),
2184+
TextLabel::new("Selection Outline".to_string()).widget_holder(),
2185+
],
2186+
},
2187+
LayoutGroup::Row {
2188+
widgets: vec![
2189+
CheckboxInput::new(self.overlays_visibility_settings.pivot)
2190+
.tooltip("Enable or disable the pivot overlay")
2191+
.on_update(|optional_input: &CheckboxInput| {
2192+
DocumentMessage::SetOverlaysVisibility {
2193+
visible: optional_input.checked,
2194+
overlays_type: OverlaysType::Pivot,
2195+
}
2196+
.into()
2197+
})
2198+
.widget_holder(),
2199+
TextLabel::new("Pivot".to_string()).widget_holder(),
2200+
],
2201+
},
2202+
LayoutGroup::Row {
2203+
widgets: vec![
2204+
CheckboxInput::new(self.overlays_visibility_settings.path)
2205+
.tooltip("Enable or disable the path overlay")
2206+
.on_update(|optional_input: &CheckboxInput| {
2207+
DocumentMessage::SetOverlaysVisibility {
2208+
visible: optional_input.checked,
2209+
overlays_type: OverlaysType::Path,
2210+
}
2211+
.into()
2212+
})
2213+
.widget_holder(),
2214+
TextLabel::new("Path".to_string()).widget_holder(),
2215+
],
2216+
},
2217+
LayoutGroup::Row {
2218+
widgets: vec![
2219+
CheckboxInput::new(self.overlays_visibility_settings.anchors)
2220+
.tooltip("Enable or disable the anchors overlay")
2221+
.on_update(|optional_input: &CheckboxInput| {
2222+
DocumentMessage::SetOverlaysVisibility {
2223+
visible: optional_input.checked,
2224+
overlays_type: OverlaysType::Anchors,
2225+
}
2226+
.into()
2227+
})
2228+
.widget_holder(),
2229+
TextLabel::new("Anchors".to_string()).widget_holder(),
2230+
],
2231+
},
2232+
LayoutGroup::Row {
2233+
widgets: vec![
2234+
CheckboxInput::new(self.overlays_visibility_settings.handles)
2235+
.tooltip("Enable or disable the handles overlay")
2236+
.on_update(|optional_input: &CheckboxInput| {
2237+
DocumentMessage::SetOverlaysVisibility {
2238+
visible: optional_input.checked,
2239+
overlays_type: OverlaysType::Handles,
2240+
}
2241+
.into()
2242+
})
2243+
.widget_holder(),
2244+
TextLabel::new("Handles".to_string()).widget_holder(),
2245+
],
20672246
},
20682247
])
20692248
.widget_holder(),
@@ -2278,75 +2457,74 @@ impl DocumentMessageHandler {
22782457
.selected_layers(self.metadata())
22792458
.all(|layer| self.network_interface.is_locked(&layer.to_node(), &[]));
22802459

2281-
let layers_panel_control_bar = WidgetLayout::new(vec![LayoutGroup::Row {
2282-
widgets: vec![
2283-
DropdownInput::new(blend_mode_menu_entries)
2284-
.selected_index(blend_mode.and_then(|blend_mode| blend_mode.index_in_list_svg_subset()).map(|index| index as u32))
2285-
.disabled(disabled)
2286-
.draw_icon(false)
2287-
.widget_holder(),
2288-
Separator::new(SeparatorType::Related).widget_holder(),
2289-
NumberInput::new(opacity)
2290-
.label("Opacity")
2291-
.unit("%")
2292-
.display_decimal_places(2)
2293-
.disabled(disabled)
2294-
.min(0.)
2295-
.max(100.)
2296-
.range_min(Some(0.))
2297-
.range_max(Some(100.))
2298-
.mode_range()
2299-
.on_update(|number_input: &NumberInput| {
2300-
if let Some(value) = number_input.value {
2301-
DocumentMessage::SetOpacityForSelectedLayers { opacity: value / 100. }.into()
2302-
} else {
2303-
Message::NoOp
2304-
}
2305-
})
2306-
.on_commit(|_| DocumentMessage::AddTransaction.into())
2307-
.widget_holder(),
2308-
//
2309-
Separator::new(SeparatorType::Unrelated).widget_holder(),
2310-
//
2311-
IconButton::new("NewLayer", 24)
2312-
.tooltip("New Layer")
2313-
.tooltip_shortcut(action_keys!(DocumentMessageDiscriminant::CreateEmptyFolder))
2314-
.on_update(|_| DocumentMessage::CreateEmptyFolder.into())
2315-
.widget_holder(),
2316-
IconButton::new("Folder", 24)
2317-
.tooltip("Group Selected")
2318-
.tooltip_shortcut(action_keys!(DocumentMessageDiscriminant::GroupSelectedLayers))
2319-
.on_update(|_| {
2320-
let group_folder_type = GroupFolderType::Layer;
2321-
DocumentMessage::GroupSelectedLayers { group_folder_type }.into()
2322-
})
2323-
.disabled(!has_selection)
2324-
.widget_holder(),
2325-
IconButton::new("Trash", 24)
2326-
.tooltip("Delete Selected")
2327-
.tooltip_shortcut(action_keys!(DocumentMessageDiscriminant::DeleteSelectedLayers))
2328-
.on_update(|_| DocumentMessage::DeleteSelectedLayers.into())
2329-
.disabled(!has_selection)
2330-
.widget_holder(),
2331-
//
2332-
Separator::new(SeparatorType::Unrelated).widget_holder(),
2333-
//
2334-
IconButton::new(if selection_all_locked { "PadlockLocked" } else { "PadlockUnlocked" }, 24)
2335-
.hover_icon(Some((if selection_all_locked { "PadlockUnlocked" } else { "PadlockLocked" }).into()))
2336-
.tooltip(if selection_all_locked { "Unlock Selected" } else { "Lock Selected" })
2337-
.tooltip_shortcut(action_keys!(DocumentMessageDiscriminant::ToggleSelectedLocked))
2338-
.on_update(|_| NodeGraphMessage::ToggleSelectedLocked.into())
2339-
.disabled(!has_selection)
2340-
.widget_holder(),
2341-
IconButton::new(if selection_all_visible { "EyeVisible" } else { "EyeHidden" }, 24)
2342-
.hover_icon(Some((if selection_all_visible { "EyeHide" } else { "EyeShow" }).into()))
2343-
.tooltip(if selection_all_visible { "Hide Selected" } else { "Show Selected" })
2344-
.tooltip_shortcut(action_keys!(DocumentMessageDiscriminant::ToggleSelectedVisibility))
2345-
.on_update(|_| DocumentMessage::ToggleSelectedVisibility.into())
2346-
.disabled(!has_selection)
2347-
.widget_holder(),
2348-
],
2349-
}]);
2460+
let widgets = vec![
2461+
DropdownInput::new(blend_mode_menu_entries)
2462+
.selected_index(blend_mode.and_then(|blend_mode| blend_mode.index_in_list_svg_subset()).map(|index| index as u32))
2463+
.disabled(disabled)
2464+
.draw_icon(false)
2465+
.widget_holder(),
2466+
Separator::new(SeparatorType::Related).widget_holder(),
2467+
NumberInput::new(opacity)
2468+
.label("Opacity")
2469+
.unit("%")
2470+
.display_decimal_places(2)
2471+
.disabled(disabled)
2472+
.min(0.)
2473+
.max(100.)
2474+
.range_min(Some(0.))
2475+
.range_max(Some(100.))
2476+
.mode_range()
2477+
.on_update(|number_input: &NumberInput| {
2478+
if let Some(value) = number_input.value {
2479+
DocumentMessage::SetOpacityForSelectedLayers { opacity: value / 100. }.into()
2480+
} else {
2481+
Message::NoOp
2482+
}
2483+
})
2484+
.on_commit(|_| DocumentMessage::AddTransaction.into())
2485+
.widget_holder(),
2486+
//
2487+
Separator::new(SeparatorType::Unrelated).widget_holder(),
2488+
//
2489+
IconButton::new("NewLayer", 24)
2490+
.tooltip("New Layer")
2491+
.tooltip_shortcut(action_keys!(DocumentMessageDiscriminant::CreateEmptyFolder))
2492+
.on_update(|_| DocumentMessage::CreateEmptyFolder.into())
2493+
.widget_holder(),
2494+
IconButton::new("Folder", 24)
2495+
.tooltip("Group Selected")
2496+
.tooltip_shortcut(action_keys!(DocumentMessageDiscriminant::GroupSelectedLayers))
2497+
.on_update(|_| {
2498+
let group_folder_type = GroupFolderType::Layer;
2499+
DocumentMessage::GroupSelectedLayers { group_folder_type }.into()
2500+
})
2501+
.disabled(!has_selection)
2502+
.widget_holder(),
2503+
IconButton::new("Trash", 24)
2504+
.tooltip("Delete Selected")
2505+
.tooltip_shortcut(action_keys!(DocumentMessageDiscriminant::DeleteSelectedLayers))
2506+
.on_update(|_| DocumentMessage::DeleteSelectedLayers.into())
2507+
.disabled(!has_selection)
2508+
.widget_holder(),
2509+
//
2510+
Separator::new(SeparatorType::Unrelated).widget_holder(),
2511+
//
2512+
IconButton::new(if selection_all_locked { "PadlockLocked" } else { "PadlockUnlocked" }, 24)
2513+
.hover_icon(Some((if selection_all_locked { "PadlockUnlocked" } else { "PadlockLocked" }).into()))
2514+
.tooltip(if selection_all_locked { "Unlock Selected" } else { "Lock Selected" })
2515+
.tooltip_shortcut(action_keys!(DocumentMessageDiscriminant::ToggleSelectedLocked))
2516+
.on_update(|_| NodeGraphMessage::ToggleSelectedLocked.into())
2517+
.disabled(!has_selection)
2518+
.widget_holder(),
2519+
IconButton::new(if selection_all_visible { "EyeVisible" } else { "EyeHidden" }, 24)
2520+
.hover_icon(Some((if selection_all_visible { "EyeHide" } else { "EyeShow" }).into()))
2521+
.tooltip(if selection_all_visible { "Hide Selected" } else { "Show Selected" })
2522+
.tooltip_shortcut(action_keys!(DocumentMessageDiscriminant::ToggleSelectedVisibility))
2523+
.on_update(|_| DocumentMessage::ToggleSelectedVisibility.into())
2524+
.disabled(!has_selection)
2525+
.widget_holder(),
2526+
];
2527+
let layers_panel_control_bar = WidgetLayout::new(vec![LayoutGroup::Row { widgets }]);
23502528

23512529
responses.add(LayoutMessage::SendLayout {
23522530
layout: Layout::WidgetLayout(layers_panel_control_bar),

0 commit comments

Comments
 (0)