@@ -299,7 +299,17 @@ impl MessageHandler<DocumentMessage, DocumentMessageData<'_>> for DocumentMessag
299
299
// Clear the control bar
300
300
responses. add ( LayoutMessage :: SendLayout {
301
301
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 ,
303
313
} ) ;
304
314
}
305
315
DocumentMessage :: CreateEmptyFolder => {
@@ -344,6 +354,7 @@ impl MessageHandler<DocumentMessage, DocumentMessageData<'_>> for DocumentMessag
344
354
DocumentMessage :: DocumentHistoryForward => self . redo_with_history ( ipp, responses) ,
345
355
DocumentMessage :: DocumentStructureChanged => {
346
356
self . update_layers_panel_control_bar_widgets ( responses) ;
357
+ self . update_layers_panel_bottom_bar_widgets ( responses) ;
347
358
348
359
self . network_interface . load_structure ( ) ;
349
360
let data_buffer: RawBuffer = self . serialize_root ( ) ;
@@ -2509,12 +2520,14 @@ impl DocumentMessageHandler {
2509
2520
. selected_index( blend_mode. and_then( |blend_mode| blend_mode. index_in_list_svg_subset( ) ) . map( |index| index as u32 ) )
2510
2521
. disabled( disabled)
2511
2522
. draw_icon( false )
2523
+ . max_width( 100 )
2524
+ . tooltip( "Blend Mode" )
2512
2525
. widget_holder( ) ,
2513
2526
Separator :: new( SeparatorType :: Related ) . widget_holder( ) ,
2514
2527
NumberInput :: new( opacity)
2515
2528
. label( "Opacity" )
2516
2529
. unit( "%" )
2517
- . display_decimal_places( 2 )
2530
+ . display_decimal_places( 0 )
2518
2531
. disabled( disabled)
2519
2532
. min( 0. )
2520
2533
. max( 100. )
@@ -2529,15 +2542,71 @@ impl DocumentMessageHandler {
2529
2542
}
2530
2543
} )
2531
2544
. on_commit( |_| DocumentMessage :: AddTransaction . into( ) )
2545
+ . max_width( 100 )
2546
+ . tooltip( "Opacity" )
2532
2547
. 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)
2540
2558
. 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( ) ,
2541
2610
IconButton :: new( "Folder" , 24 )
2542
2611
. tooltip( "Group Selected" )
2543
2612
. tooltip_shortcut( action_keys!( DocumentMessageDiscriminant :: GroupSelectedLayers ) )
@@ -2547,35 +2616,23 @@ impl DocumentMessageHandler {
2547
2616
} )
2548
2617
. disabled( !has_selection)
2549
2618
. 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( ) ,
2550
2624
IconButton :: new( "Trash" , 24 )
2551
2625
. tooltip( "Delete Selected" )
2552
2626
. tooltip_shortcut( action_keys!( DocumentMessageDiscriminant :: DeleteSelectedLayers ) )
2553
2627
. on_update( |_| DocumentMessage :: DeleteSelectedLayers . into( ) )
2554
2628
. disabled( !has_selection)
2555
2629
. 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( ) ,
2573
2630
] ;
2574
- let layers_panel_control_bar = WidgetLayout :: new ( vec ! [ LayoutGroup :: Row { widgets } ] ) ;
2631
+ let layers_panel_bottom_bar = WidgetLayout :: new ( vec ! [ LayoutGroup :: Row { widgets } ] ) ;
2575
2632
2576
2633
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 ,
2579
2636
} ) ;
2580
2637
}
2581
2638
0 commit comments