@@ -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