@@ -17,7 +17,7 @@ use crate::models::{
1717 BoardModeOption , ColorMode , ColorQuadInput , ColorTripletInput , ConfigDraft , FontStyleOption ,
1818 FontWeightOption , NamedColorOption , OverrideOption , QuadField , SessionCompressionOption ,
1919 SessionStorageModeOption , StatusPositionOption , TabId , TextField , ToggleField ,
20- ToolbarLayoutModeOption , ToolbarOverrideField , TripletField ,
20+ ToolbarLayoutModeOption , ToolbarOverrideField , TripletField , UiTabId ,
2121} ;
2222
2323pub fn run ( ) -> iced:: Result {
@@ -35,6 +35,7 @@ pub struct ConfiguratorApp {
3535 defaults : ConfigDraft ,
3636 status : StatusMessage ,
3737 active_tab : TabId ,
38+ active_ui_tab : UiTabId ,
3839 override_mode : ToolbarLayoutModeOption ,
3940 is_loading : bool ,
4041 is_saving : bool ,
@@ -88,6 +89,7 @@ impl Application for ConfiguratorApp {
8889 defaults,
8990 status : StatusMessage :: info ( "Loading configuration..." ) ,
9091 active_tab : TabId :: Drawing ,
92+ active_ui_tab : UiTabId :: Toolbar ,
9193 override_mode,
9294 is_loading : true ,
9395 is_saving : false ,
@@ -194,6 +196,9 @@ impl Application for ConfiguratorApp {
194196 Message :: TabSelected ( tab) => {
195197 self . active_tab = tab;
196198 }
199+ Message :: UiTabSelected ( tab) => {
200+ self . active_ui_tab = tab;
201+ }
197202 Message :: ToggleChanged ( field, value) => {
198203 self . status = StatusMessage :: idle ( ) ;
199204 self . draft . set_toggle ( field, value) ;
@@ -716,11 +721,35 @@ impl ConfiguratorApp {
716721 }
717722
718723 fn ui_tab ( & self ) -> Element < ' _ , Message > {
719- let status_position = pick_list (
720- StatusPositionOption :: list ( ) ,
721- Some ( self . draft . ui_status_position ) ,
722- Message :: StatusPositionChanged ,
724+ let tab_bar = UiTabId :: ALL . iter ( ) . fold (
725+ Row :: new ( ) . spacing ( 8 ) . align_items ( iced:: Alignment :: Center ) ,
726+ |row, tab| {
727+ let label = tab. title ( ) ;
728+ let button = button ( label)
729+ . padding ( [ 4 , 10 ] )
730+ . style ( if * tab == self . active_ui_tab {
731+ theme:: Button :: Primary
732+ } else {
733+ theme:: Button :: Secondary
734+ } )
735+ . on_press ( Message :: UiTabSelected ( * tab) ) ;
736+ row. push ( button)
737+ } ,
723738 ) ;
739+
740+ let content = match self . active_ui_tab {
741+ UiTabId :: Toolbar => self . ui_toolbar_tab ( ) ,
742+ UiTabId :: StatusBar => self . ui_status_bar_tab ( ) ,
743+ UiTabId :: HelpOverlay => self . ui_help_overlay_tab ( ) ,
744+ UiTabId :: ClickHighlight => self . ui_click_highlight_tab ( ) ,
745+ } ;
746+
747+ column ! [ text( "UI Settings" ) . size( 20 ) , tab_bar, content]
748+ . spacing ( 12 )
749+ . into ( )
750+ }
751+
752+ fn ui_toolbar_tab ( & self ) -> Element < ' _ , Message > {
724753 let toolbar_layout = pick_list (
725754 ToolbarLayoutModeOption :: list ( ) ,
726755 Some ( self . draft . ui_toolbar_layout_mode ) ,
@@ -737,19 +766,6 @@ impl ConfiguratorApp {
737766 . for_mode ( self . override_mode ) ;
738767
739768 let column = column ! [
740- text( "UI Settings" ) . size( 20 ) ,
741- toggle_row(
742- "Show status bar" ,
743- self . draft. ui_show_status_bar,
744- self . defaults. ui_show_status_bar,
745- ToggleField :: UiShowStatusBar ,
746- ) ,
747- toggle_row(
748- "Show frozen badge" ,
749- self . draft. ui_show_frozen_badge,
750- self . defaults. ui_show_frozen_badge,
751- ToggleField :: UiShowFrozenBadge ,
752- ) ,
753769 text( "Toolbar" ) . size( 18 ) ,
754770 labeled_control(
755771 "Layout mode" ,
@@ -825,6 +841,33 @@ impl ConfiguratorApp {
825841 ToolbarOverrideField :: ShowSettingsSection ,
826842 overrides. show_settings_section,
827843 ) ,
844+ ]
845+ . spacing ( 12 ) ;
846+
847+ scrollable ( column) . into ( )
848+ }
849+
850+ fn ui_status_bar_tab ( & self ) -> Element < ' _ , Message > {
851+ let status_position = pick_list (
852+ StatusPositionOption :: list ( ) ,
853+ Some ( self . draft . ui_status_position ) ,
854+ Message :: StatusPositionChanged ,
855+ ) ;
856+
857+ let column = column ! [
858+ text( "Status Bar" ) . size( 18 ) ,
859+ toggle_row(
860+ "Show status bar" ,
861+ self . draft. ui_show_status_bar,
862+ self . defaults. ui_show_status_bar,
863+ ToggleField :: UiShowStatusBar ,
864+ ) ,
865+ toggle_row(
866+ "Show frozen badge" ,
867+ self . draft. ui_show_frozen_badge,
868+ self . defaults. ui_show_frozen_badge,
869+ ToggleField :: UiShowFrozenBadge ,
870+ ) ,
828871 labeled_control(
829872 "Status bar position" ,
830873 status_position. width( Length :: Fill ) . into( ) ,
@@ -865,6 +908,14 @@ impl ConfiguratorApp {
865908 )
866909 ]
867910 . spacing( 12 ) ,
911+ ]
912+ . spacing ( 12 ) ;
913+
914+ scrollable ( column) . into ( )
915+ }
916+
917+ fn ui_help_overlay_tab ( & self ) -> Element < ' _ , Message > {
918+ let column = column ! [
868919 text( "Help Overlay Style" ) . size( 18 ) ,
869920 color_quad_editor(
870921 "Background RGBA (0-1)" ,
@@ -911,6 +962,14 @@ impl ConfiguratorApp {
911962 )
912963 ]
913964 . spacing( 12 ) ,
965+ ]
966+ . spacing ( 12 ) ;
967+
968+ scrollable ( column) . into ( )
969+ }
970+
971+ fn ui_click_highlight_tab ( & self ) -> Element < ' _ , Message > {
972+ let column = column ! [
914973 text( "Click Highlight" ) . size( 18 ) ,
915974 toggle_row(
916975 "Enable click highlight" ,
0 commit comments