@@ -14,10 +14,10 @@ use wayscriber::config::Config;
1414
1515use crate :: messages:: Message ;
1616use crate :: models:: {
17- BoardModeOption , ColorMode , ColorQuadInput , ColorTripletInput , ConfigDraft , FontStyleOption ,
18- FontWeightOption , NamedColorOption , OverrideOption , QuadField , SessionCompressionOption ,
19- SessionStorageModeOption , StatusPositionOption , TabId , TextField , ToggleField ,
20- ToolbarLayoutModeOption , ToolbarOverrideField , TripletField , UiTabId ,
17+ BoardModeOption , ColorMode , ColorQuadInput , ColorTripletInput , ConfigDraft , EraserModeOption ,
18+ FontStyleOption , FontWeightOption , NamedColorOption , OverrideOption , QuadField ,
19+ SessionCompressionOption , SessionStorageModeOption , StatusPositionOption , TabId , TextField ,
20+ ToggleField , ToolbarLayoutModeOption , ToolbarOverrideField , TripletField , UiTabId ,
2121} ;
2222
2323pub fn run ( ) -> iced:: Result {
@@ -271,6 +271,11 @@ impl Application for ConfiguratorApp {
271271 }
272272 self . refresh_dirty_flag ( ) ;
273273 }
274+ Message :: EraserModeChanged ( option) => {
275+ self . status = StatusMessage :: idle ( ) ;
276+ self . draft . drawing_default_eraser_mode = option;
277+ self . refresh_dirty_flag ( ) ;
278+ }
274279 Message :: StatusPositionChanged ( option) => {
275280 self . status = StatusMessage :: idle ( ) ;
276281 self . draft . ui_status_position = option;
@@ -428,12 +433,14 @@ impl ConfiguratorApp {
428433 let content: Element < ' _ , Message > = match self . active_tab {
429434 TabId :: Drawing => self . drawing_tab ( ) ,
430435 TabId :: Arrow => self . arrow_tab ( ) ,
436+ TabId :: History => self . history_tab ( ) ,
431437 TabId :: Performance => self . performance_tab ( ) ,
432438 TabId :: Ui => self . ui_tab ( ) ,
433439 TabId :: Board => self . board_tab ( ) ,
434440 TabId :: Capture => self . capture_tab ( ) ,
435441 TabId :: Session => self . session_tab ( ) ,
436442 TabId :: Keybindings => self . keybindings_tab ( ) ,
443+ TabId :: Tablet => self . tablet_tab ( ) ,
437444 } ;
438445
439446 let legend = self . defaults_legend ( ) ;
@@ -585,6 +592,12 @@ impl ConfiguratorApp {
585592 ]
586593 . spacing ( 8 ) ;
587594
595+ let eraser_mode_pick = pick_list (
596+ EraserModeOption :: list ( ) ,
597+ Some ( self . draft . drawing_default_eraser_mode ) ,
598+ Message :: EraserModeChanged ,
599+ ) ;
600+
588601 let column = column ! [
589602 text( "Drawing Defaults" ) . size( 20 ) ,
590603 color_block,
@@ -603,6 +616,55 @@ impl ConfiguratorApp {
603616 )
604617 ]
605618 . spacing( 12 ) ,
619+ row![
620+ labeled_input(
621+ "Eraser size (px)" ,
622+ & self . draft. drawing_default_eraser_size,
623+ & self . defaults. drawing_default_eraser_size,
624+ TextField :: DrawingEraserSize ,
625+ ) ,
626+ labeled_control(
627+ "Eraser mode" ,
628+ eraser_mode_pick. width( Length :: Fill ) . into( ) ,
629+ self . defaults
630+ . drawing_default_eraser_mode
631+ . label( )
632+ . to_string( ) ,
633+ self . draft. drawing_default_eraser_mode
634+ != self . defaults. drawing_default_eraser_mode,
635+ )
636+ ]
637+ . spacing( 12 ) ,
638+ row![
639+ labeled_input(
640+ "Marker opacity (0.05-0.9)" ,
641+ & self . draft. drawing_marker_opacity,
642+ & self . defaults. drawing_marker_opacity,
643+ TextField :: DrawingMarkerOpacity ,
644+ ) ,
645+ labeled_input(
646+ "Undo stack limit" ,
647+ & self . draft. drawing_undo_stack_limit,
648+ & self . defaults. drawing_undo_stack_limit,
649+ TextField :: DrawingUndoStackLimit ,
650+ )
651+ ]
652+ . spacing( 12 ) ,
653+ row![
654+ labeled_input(
655+ "Hit-test tolerance (px)" ,
656+ & self . draft. drawing_hit_test_tolerance,
657+ & self . defaults. drawing_hit_test_tolerance,
658+ TextField :: DrawingHitTestTolerance ,
659+ ) ,
660+ labeled_input(
661+ "Hit-test threshold" ,
662+ & self . draft. drawing_hit_test_linear_threshold,
663+ & self . defaults. drawing_hit_test_linear_threshold,
664+ TextField :: DrawingHitTestThreshold ,
665+ )
666+ ]
667+ . spacing( 12 ) ,
606668 row![
607669 labeled_input(
608670 "Font family" ,
@@ -672,6 +734,12 @@ impl ConfiguratorApp {
672734 self . draft. drawing_text_background_enabled,
673735 self . defaults. drawing_text_background_enabled,
674736 ToggleField :: DrawingTextBackground ,
737+ ) ,
738+ toggle_row(
739+ "Start shapes filled" ,
740+ self . draft. drawing_default_fill_enabled,
741+ self . defaults. drawing_default_fill_enabled,
742+ ToggleField :: DrawingFillEnabled ,
675743 )
676744 ]
677745 . spacing ( 12 )
@@ -711,6 +779,67 @@ impl ConfiguratorApp {
711779 . into ( )
712780 }
713781
782+ fn history_tab ( & self ) -> Element < ' _ , Message > {
783+ scrollable (
784+ column ! [
785+ text( "History" ) . size( 20 ) ,
786+ row![
787+ labeled_input(
788+ "Undo all delay (ms)" ,
789+ & self . draft. history_undo_all_delay_ms,
790+ & self . defaults. history_undo_all_delay_ms,
791+ TextField :: HistoryUndoAllDelayMs ,
792+ ) ,
793+ labeled_input(
794+ "Redo all delay (ms)" ,
795+ & self . draft. history_redo_all_delay_ms,
796+ & self . defaults. history_redo_all_delay_ms,
797+ TextField :: HistoryRedoAllDelayMs ,
798+ )
799+ ]
800+ . spacing( 12 ) ,
801+ toggle_row(
802+ "Enable custom undo/redo section" ,
803+ self . draft. history_custom_section_enabled,
804+ self . defaults. history_custom_section_enabled,
805+ ToggleField :: HistoryCustomSectionEnabled ,
806+ ) ,
807+ row![
808+ labeled_input(
809+ "Custom undo delay (ms)" ,
810+ & self . draft. history_custom_undo_delay_ms,
811+ & self . defaults. history_custom_undo_delay_ms,
812+ TextField :: HistoryCustomUndoDelayMs ,
813+ ) ,
814+ labeled_input(
815+ "Custom redo delay (ms)" ,
816+ & self . draft. history_custom_redo_delay_ms,
817+ & self . defaults. history_custom_redo_delay_ms,
818+ TextField :: HistoryCustomRedoDelayMs ,
819+ )
820+ ]
821+ . spacing( 12 ) ,
822+ row![
823+ labeled_input(
824+ "Custom undo steps" ,
825+ & self . draft. history_custom_undo_steps,
826+ & self . defaults. history_custom_undo_steps,
827+ TextField :: HistoryCustomUndoSteps ,
828+ ) ,
829+ labeled_input(
830+ "Custom redo steps" ,
831+ & self . draft. history_custom_redo_steps,
832+ & self . defaults. history_custom_redo_steps,
833+ TextField :: HistoryCustomRedoSteps ,
834+ )
835+ ]
836+ . spacing( 12 ) ,
837+ ]
838+ . spacing ( 12 ) ,
839+ )
840+ . into ( )
841+ }
842+
714843 fn performance_tab ( & self ) -> Element < ' _ , Message > {
715844 let buffer_pick = pick_list (
716845 vec ! [ 2u32 , 3 , 4 ] ,
@@ -776,7 +905,30 @@ impl ConfiguratorApp {
776905 UiTabId :: ClickHighlight => self . ui_click_highlight_tab ( ) ,
777906 } ;
778907
779- column ! [ text( "UI Settings" ) . size( 20 ) , tab_bar, content]
908+ let general = column ! [
909+ text( "General UI" ) . size( 18 ) ,
910+ labeled_input(
911+ "Preferred output (xdg fallback)" ,
912+ & self . draft. ui_preferred_output,
913+ & self . defaults. ui_preferred_output,
914+ TextField :: UiPreferredOutput ,
915+ ) ,
916+ toggle_row(
917+ "Use fullscreen xdg fallback" ,
918+ self . draft. ui_xdg_fullscreen,
919+ self . defaults. ui_xdg_fullscreen,
920+ ToggleField :: UiXdgFullscreen ,
921+ ) ,
922+ toggle_row(
923+ "Enable context menu" ,
924+ self . draft. ui_context_menu_enabled,
925+ self . defaults. ui_context_menu_enabled,
926+ ToggleField :: UiContextMenuEnabled ,
927+ )
928+ ]
929+ . spacing ( 12 ) ;
930+
931+ column ! [ text( "UI Settings" ) . size( 20 ) , general, tab_bar, content]
780932 . spacing ( 12 )
781933 . into ( )
782934 }
@@ -805,6 +957,30 @@ impl ConfiguratorApp {
805957 self . defaults. ui_toolbar_layout_mode. label( ) . to_string( ) ,
806958 self . draft. ui_toolbar_layout_mode != self . defaults. ui_toolbar_layout_mode,
807959 ) ,
960+ toggle_row(
961+ "Pin top toolbar" ,
962+ self . draft. ui_toolbar_top_pinned,
963+ self . defaults. ui_toolbar_top_pinned,
964+ ToggleField :: UiToolbarTopPinned ,
965+ ) ,
966+ toggle_row(
967+ "Pin side toolbar" ,
968+ self . draft. ui_toolbar_side_pinned,
969+ self . defaults. ui_toolbar_side_pinned,
970+ ToggleField :: UiToolbarSidePinned ,
971+ ) ,
972+ toggle_row(
973+ "Use icon-only buttons" ,
974+ self . draft. ui_toolbar_use_icons,
975+ self . defaults. ui_toolbar_use_icons,
976+ ToggleField :: UiToolbarUseIcons ,
977+ ) ,
978+ toggle_row(
979+ "Show extended colors" ,
980+ self . draft. ui_toolbar_show_more_colors,
981+ self . defaults. ui_toolbar_show_more_colors,
982+ ToggleField :: UiToolbarShowMoreColors ,
983+ ) ,
808984 toggle_row(
809985 "Show presets" ,
810986 self . draft. ui_toolbar_show_presets,
@@ -841,12 +1017,36 @@ impl ConfiguratorApp {
8411017 self . defaults. ui_toolbar_show_settings_section,
8421018 ToggleField :: UiToolbarShowSettingsSection ,
8431019 ) ,
1020+ toggle_row(
1021+ "Show delay sliders" ,
1022+ self . draft. ui_toolbar_show_delay_sliders,
1023+ self . defaults. ui_toolbar_show_delay_sliders,
1024+ ToggleField :: UiToolbarShowDelaySliders ,
1025+ ) ,
1026+ toggle_row(
1027+ "Show marker opacity controls" ,
1028+ self . draft. ui_toolbar_show_marker_opacity_section,
1029+ self . defaults. ui_toolbar_show_marker_opacity_section,
1030+ ToggleField :: UiToolbarShowMarkerOpacitySection ,
1031+ ) ,
1032+ toggle_row(
1033+ "Show tool preview bubble" ,
1034+ self . draft. ui_toolbar_show_tool_preview,
1035+ self . defaults. ui_toolbar_show_tool_preview,
1036+ ToggleField :: UiToolbarShowToolPreview ,
1037+ ) ,
8441038 toggle_row(
8451039 "Show preset action toasts" ,
8461040 self . draft. ui_toolbar_show_preset_toasts,
8471041 self . defaults. ui_toolbar_show_preset_toasts,
8481042 ToggleField :: UiToolbarPresetToasts ,
8491043 ) ,
1044+ toggle_row(
1045+ "Force inline toolbars" ,
1046+ self . draft. ui_toolbar_force_inline,
1047+ self . defaults. ui_toolbar_force_inline,
1048+ ToggleField :: UiToolbarForceInline ,
1049+ ) ,
8501050 text( "Mode overrides" ) . size( 16 ) ,
8511051 row![ text( "Edit mode:" ) , override_mode_pick]
8521052 . spacing( 12 )
@@ -873,6 +1073,37 @@ impl ConfiguratorApp {
8731073 ToolbarOverrideField :: ShowSettingsSection ,
8741074 overrides. show_settings_section,
8751075 ) ,
1076+ text( "Placement offsets" ) . size( 16 ) ,
1077+ row![
1078+ labeled_input(
1079+ "Top offset X" ,
1080+ & self . draft. ui_toolbar_top_offset,
1081+ & self . defaults. ui_toolbar_top_offset,
1082+ TextField :: ToolbarTopOffset ,
1083+ ) ,
1084+ labeled_input(
1085+ "Top offset Y" ,
1086+ & self . draft. ui_toolbar_top_offset_y,
1087+ & self . defaults. ui_toolbar_top_offset_y,
1088+ TextField :: ToolbarTopOffsetY ,
1089+ )
1090+ ]
1091+ . spacing( 12 ) ,
1092+ row![
1093+ labeled_input(
1094+ "Side offset Y" ,
1095+ & self . draft. ui_toolbar_side_offset,
1096+ & self . defaults. ui_toolbar_side_offset,
1097+ TextField :: ToolbarSideOffset ,
1098+ ) ,
1099+ labeled_input(
1100+ "Side offset X" ,
1101+ & self . draft. ui_toolbar_side_offset_x,
1102+ & self . defaults. ui_toolbar_side_offset_x,
1103+ TextField :: ToolbarSideOffsetX ,
1104+ )
1105+ ]
1106+ . spacing( 12 ) ,
8761107 ]
8771108 . spacing ( 12 ) ;
8781109
@@ -1189,6 +1420,12 @@ impl ConfiguratorApp {
11891420 self . defaults. session_persist_blackboard,
11901421 ToggleField :: SessionPersistBlackboard ,
11911422 ) ,
1423+ toggle_row(
1424+ "Persist undo/redo history" ,
1425+ self . draft. session_persist_history,
1426+ self . defaults. session_persist_history,
1427+ ToggleField :: SessionPersistHistory ,
1428+ ) ,
11921429 toggle_row(
11931430 "Restore tool state on startup" ,
11941431 self . draft. session_restore_tool_state,
@@ -1232,6 +1469,12 @@ impl ConfiguratorApp {
12321469 & self . defaults . session_max_shapes_per_frame ,
12331470 TextField :: SessionMaxShapesPerFrame ,
12341471 ) )
1472+ . push ( labeled_input (
1473+ "Max persisted undo depth (blank = runtime limit)" ,
1474+ & self . draft . session_max_persisted_undo_depth ,
1475+ & self . defaults . session_max_persisted_undo_depth ,
1476+ TextField :: SessionMaxPersistedUndoDepth ,
1477+ ) )
12351478 . push ( labeled_input (
12361479 "Max file size (MB)" ,
12371480 & self . draft . session_max_file_size_mb ,
@@ -1254,6 +1497,43 @@ impl ConfiguratorApp {
12541497 scrollable ( column) . into ( )
12551498 }
12561499
1500+ fn tablet_tab ( & self ) -> Element < ' _ , Message > {
1501+ scrollable (
1502+ column ! [
1503+ text( "Tablet / Stylus" ) . size( 20 ) ,
1504+ toggle_row(
1505+ "Enable tablet input" ,
1506+ self . draft. tablet_enabled,
1507+ self . defaults. tablet_enabled,
1508+ ToggleField :: TabletEnabled ,
1509+ ) ,
1510+ toggle_row(
1511+ "Enable pressure-to-thickness" ,
1512+ self . draft. tablet_pressure_enabled,
1513+ self . defaults. tablet_pressure_enabled,
1514+ ToggleField :: TabletPressureEnabled ,
1515+ ) ,
1516+ row![
1517+ labeled_input(
1518+ "Min thickness" ,
1519+ & self . draft. tablet_min_thickness,
1520+ & self . defaults. tablet_min_thickness,
1521+ TextField :: TabletMinThickness ,
1522+ ) ,
1523+ labeled_input(
1524+ "Max thickness" ,
1525+ & self . draft. tablet_max_thickness,
1526+ & self . defaults. tablet_max_thickness,
1527+ TextField :: TabletMaxThickness ,
1528+ )
1529+ ]
1530+ . spacing( 12 ) ,
1531+ ]
1532+ . spacing ( 12 ) ,
1533+ )
1534+ . into ( )
1535+ }
1536+
12571537 fn keybindings_tab ( & self ) -> Element < ' _ , Message > {
12581538 let mut column = Column :: new ( )
12591539 . spacing ( 8 )
0 commit comments