Skip to content

Commit 132982f

Browse files
authored
Merge pull request #81 from devmobasa/configurator-sync
Expose full config surface in configurator
2 parents 6db8ad5 + 810d0ce commit 132982f

File tree

7 files changed

+848
-12
lines changed

7 files changed

+848
-12
lines changed

configurator/src/app.rs

Lines changed: 285 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@ use wayscriber::config::Config;
1414

1515
use crate::messages::Message;
1616
use 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

2323
pub 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

Comments
 (0)