@@ -299,7 +299,17 @@ impl MessageHandler<DocumentMessage, DocumentMessageData<'_>> for DocumentMessag
299299 // Clear the control bar
300300 responses. add ( LayoutMessage :: SendLayout {
301301 layout : Layout :: WidgetLayout ( Default :: default ( ) ) ,
302- layout_target : LayoutTarget :: LayersPanelControlBar ,
302+ layout_target : LayoutTarget :: LayersPanelControlLeftBar ,
303+ } ) ;
304+ responses. add ( LayoutMessage :: SendLayout {
305+ layout : Layout :: WidgetLayout ( Default :: default ( ) ) ,
306+ layout_target : LayoutTarget :: LayersPanelControlRightBar ,
307+ } ) ;
308+
309+ // Clear the bottom bar
310+ responses. add ( LayoutMessage :: SendLayout {
311+ layout : Layout :: WidgetLayout ( Default :: default ( ) ) ,
312+ layout_target : LayoutTarget :: LayersPanelBottomBar ,
303313 } ) ;
304314 }
305315 DocumentMessage :: CreateEmptyFolder => {
@@ -344,6 +354,7 @@ impl MessageHandler<DocumentMessage, DocumentMessageData<'_>> for DocumentMessag
344354 DocumentMessage :: DocumentHistoryForward => self . redo_with_history ( ipp, responses) ,
345355 DocumentMessage :: DocumentStructureChanged => {
346356 self . update_layers_panel_control_bar_widgets ( responses) ;
357+ self . update_layers_panel_bottom_bar_widgets ( responses) ;
347358
348359 self . network_interface . load_structure ( ) ;
349360 let data_buffer: RawBuffer = self . serialize_root ( ) ;
@@ -2509,12 +2520,14 @@ impl DocumentMessageHandler {
25092520 . selected_index( blend_mode. and_then( |blend_mode| blend_mode. index_in_list_svg_subset( ) ) . map( |index| index as u32 ) )
25102521 . disabled( disabled)
25112522 . draw_icon( false )
2523+ . max_width( 100 )
2524+ . tooltip( "Blend Mode" )
25122525 . widget_holder( ) ,
25132526 Separator :: new( SeparatorType :: Related ) . widget_holder( ) ,
25142527 NumberInput :: new( opacity)
25152528 . label( "Opacity" )
25162529 . unit( "%" )
2517- . display_decimal_places( 2 )
2530+ . display_decimal_places( 0 )
25182531 . disabled( disabled)
25192532 . min( 0. )
25202533 . max( 100. )
@@ -2529,15 +2542,71 @@ impl DocumentMessageHandler {
25292542 }
25302543 } )
25312544 . on_commit( |_| DocumentMessage :: AddTransaction . into( ) )
2545+ . max_width( 100 )
2546+ . tooltip( "Opacity" )
25322547 . widget_holder( ) ,
2533- //
2534- Separator :: new( SeparatorType :: Unrelated ) . widget_holder( ) ,
2535- //
2536- IconButton :: new( "NewLayer" , 24 )
2537- . tooltip( "New Layer" )
2538- . tooltip_shortcut( action_keys!( DocumentMessageDiscriminant :: CreateEmptyFolder ) )
2539- . on_update( |_| DocumentMessage :: CreateEmptyFolder . into( ) )
2548+ ] ;
2549+ let layers_panel_control_bar_left = WidgetLayout :: new ( vec ! [ LayoutGroup :: Row { widgets } ] ) ;
2550+
2551+ let widgets = vec ! [
2552+ IconButton :: new( if selection_all_locked { "PadlockLocked" } else { "PadlockUnlocked" } , 24 )
2553+ . hover_icon( Some ( ( if selection_all_locked { "PadlockUnlocked" } else { "PadlockLocked" } ) . into( ) ) )
2554+ . tooltip( if selection_all_locked { "Unlock Selected" } else { "Lock Selected" } )
2555+ . tooltip_shortcut( action_keys!( DocumentMessageDiscriminant :: ToggleSelectedLocked ) )
2556+ . on_update( |_| NodeGraphMessage :: ToggleSelectedLocked . into( ) )
2557+ . disabled( !has_selection)
25402558 . widget_holder( ) ,
2559+ IconButton :: new( if selection_all_visible { "EyeVisible" } else { "EyeHidden" } , 24 )
2560+ . hover_icon( Some ( ( if selection_all_visible { "EyeHide" } else { "EyeShow" } ) . into( ) ) )
2561+ . tooltip( if selection_all_visible { "Hide Selected" } else { "Show Selected" } )
2562+ . tooltip_shortcut( action_keys!( DocumentMessageDiscriminant :: ToggleSelectedVisibility ) )
2563+ . on_update( |_| DocumentMessage :: ToggleSelectedVisibility . into( ) )
2564+ . disabled( !has_selection)
2565+ . widget_holder( ) ,
2566+ ] ;
2567+ let layers_panel_control_bar_right = WidgetLayout :: new ( vec ! [ LayoutGroup :: Row { widgets } ] ) ;
2568+
2569+ responses. add ( LayoutMessage :: SendLayout {
2570+ layout : Layout :: WidgetLayout ( layers_panel_control_bar_left) ,
2571+ layout_target : LayoutTarget :: LayersPanelControlLeftBar ,
2572+ } ) ;
2573+ responses. add ( LayoutMessage :: SendLayout {
2574+ layout : Layout :: WidgetLayout ( layers_panel_control_bar_right) ,
2575+ layout_target : LayoutTarget :: LayersPanelControlRightBar ,
2576+ } ) ;
2577+ }
2578+
2579+ pub fn update_layers_panel_bottom_bar_widgets ( & self , responses : & mut VecDeque < Message > ) {
2580+ let selected_nodes = self . network_interface . selected_nodes ( ) ;
2581+ let mut selected_layers = selected_nodes. selected_layers ( self . metadata ( ) ) ;
2582+ let selected_layer = selected_layers. next ( ) ;
2583+ let has_selection = selected_layer. is_some ( ) ;
2584+ let has_multiple_selection = selected_layers. next ( ) . is_some ( ) ;
2585+
2586+ let widgets = vec ! [
2587+ PopoverButton :: new( )
2588+ . icon( Some ( "Node" . to_string( ) ) )
2589+ . menu_direction( Some ( MenuDirection :: Top ) )
2590+ . tooltip( "Add an operation to the end of this layer's chain of nodes" )
2591+ . disabled( !has_selection || has_multiple_selection)
2592+ . popover_layout( {
2593+ let node_chooser = NodeCatalog :: new( )
2594+ . on_update( move |node_type| {
2595+ if let Some ( layer) = selected_layer {
2596+ NodeGraphMessage :: CreateNodeInLayerWithTransaction {
2597+ node_type: node_type. clone( ) ,
2598+ layer: LayerNodeIdentifier :: new_unchecked( layer. to_node( ) ) ,
2599+ }
2600+ . into( )
2601+ } else {
2602+ Message :: NoOp
2603+ }
2604+ } )
2605+ . widget_holder( ) ;
2606+ vec![ LayoutGroup :: Row { widgets: vec![ node_chooser] } ]
2607+ } )
2608+ . widget_holder( ) ,
2609+ Separator :: new( SeparatorType :: Unrelated ) . widget_holder( ) ,
25412610 IconButton :: new( "Folder" , 24 )
25422611 . tooltip( "Group Selected" )
25432612 . tooltip_shortcut( action_keys!( DocumentMessageDiscriminant :: GroupSelectedLayers ) )
@@ -2547,35 +2616,23 @@ impl DocumentMessageHandler {
25472616 } )
25482617 . disabled( !has_selection)
25492618 . widget_holder( ) ,
2619+ IconButton :: new( "NewLayer" , 24 )
2620+ . tooltip( "New Layer" )
2621+ . tooltip_shortcut( action_keys!( DocumentMessageDiscriminant :: CreateEmptyFolder ) )
2622+ . on_update( |_| DocumentMessage :: CreateEmptyFolder . into( ) )
2623+ . widget_holder( ) ,
25502624 IconButton :: new( "Trash" , 24 )
25512625 . tooltip( "Delete Selected" )
25522626 . tooltip_shortcut( action_keys!( DocumentMessageDiscriminant :: DeleteSelectedLayers ) )
25532627 . on_update( |_| DocumentMessage :: DeleteSelectedLayers . into( ) )
25542628 . disabled( !has_selection)
25552629 . widget_holder( ) ,
2556- //
2557- Separator :: new( SeparatorType :: Unrelated ) . widget_holder( ) ,
2558- //
2559- IconButton :: new( if selection_all_locked { "PadlockLocked" } else { "PadlockUnlocked" } , 24 )
2560- . hover_icon( Some ( ( if selection_all_locked { "PadlockUnlocked" } else { "PadlockLocked" } ) . into( ) ) )
2561- . tooltip( if selection_all_locked { "Unlock Selected" } else { "Lock Selected" } )
2562- . tooltip_shortcut( action_keys!( DocumentMessageDiscriminant :: ToggleSelectedLocked ) )
2563- . on_update( |_| NodeGraphMessage :: ToggleSelectedLocked . into( ) )
2564- . disabled( !has_selection)
2565- . widget_holder( ) ,
2566- IconButton :: new( if selection_all_visible { "EyeVisible" } else { "EyeHidden" } , 24 )
2567- . hover_icon( Some ( ( if selection_all_visible { "EyeHide" } else { "EyeShow" } ) . into( ) ) )
2568- . tooltip( if selection_all_visible { "Hide Selected" } else { "Show Selected" } )
2569- . tooltip_shortcut( action_keys!( DocumentMessageDiscriminant :: ToggleSelectedVisibility ) )
2570- . on_update( |_| DocumentMessage :: ToggleSelectedVisibility . into( ) )
2571- . disabled( !has_selection)
2572- . widget_holder( ) ,
25732630 ] ;
2574- let layers_panel_control_bar = WidgetLayout :: new ( vec ! [ LayoutGroup :: Row { widgets } ] ) ;
2631+ let layers_panel_bottom_bar = WidgetLayout :: new ( vec ! [ LayoutGroup :: Row { widgets } ] ) ;
25752632
25762633 responses. add ( LayoutMessage :: SendLayout {
2577- layout : Layout :: WidgetLayout ( layers_panel_control_bar ) ,
2578- layout_target : LayoutTarget :: LayersPanelControlBar ,
2634+ layout : Layout :: WidgetLayout ( layers_panel_bottom_bar ) ,
2635+ layout_target : LayoutTarget :: LayersPanelBottomBar ,
25792636 } ) ;
25802637 }
25812638
0 commit comments