diff options
| author | Rubén Beltrán del Río <jj@r.bdr.sh> | 2026-03-30 13:45:09 +0200 |
|---|---|---|
| committer | Rubén Beltrán del Río <jj@r.bdr.sh> | 2026-03-30 14:29:59 +0200 |
| commit | 6283a8dbec408f9cc4804b4f953ea1b2fddf92c0 (patch) | |
| tree | 8cde70a40d83d59d219f535a68500c1f2df66946 /src | |
| parent | 9b988989ec3dc1316c5bdfa162b6ef8cfd21beff (diff) | |
Propagate preferences import / export.
Diffstat (limited to 'src')
| -rw-r--r-- | src/actions.rs | 1 | ||||
| -rw-r--r-- | src/components/preference_pages/editor.rs | 1 | ||||
| -rw-r--r-- | src/components/preference_pages/templates.rs | 7 | ||||
| -rw-r--r-- | src/components/preferences_window.rs | 60 | ||||
| -rw-r--r-- | src/handlers/preferences.rs | 9 | ||||
| -rw-r--r-- | src/main.rs | 1 |
6 files changed, 59 insertions, 20 deletions
diff --git a/src/actions.rs b/src/actions.rs index e5ea0e5..de4c763 100644 --- a/src/actions.rs +++ b/src/actions.rs @@ -71,6 +71,7 @@ pub enum Action { // Preferences ShowPreferences, + ReloadPreferencesWindow, PreferencesChanged(UserPreferences), PreferencesWindowClosed, ReloadPreferences, diff --git a/src/components/preference_pages/editor.rs b/src/components/preference_pages/editor.rs index 8fe40f0..0c6bda6 100644 --- a/src/components/preference_pages/editor.rs +++ b/src/components/preference_pages/editor.rs @@ -52,6 +52,7 @@ pub enum EditorAction { ChangeFontDescription(gtk::FontDialogButton), } +#[allow(clippy::cast_possible_truncation)] #[relm4::component(pub)] impl SimpleComponent for Editor { type Init = EditorInit; diff --git a/src/components/preference_pages/templates.rs b/src/components/preference_pages/templates.rs index 0ad4799..4682ab9 100644 --- a/src/components/preference_pages/templates.rs +++ b/src/components/preference_pages/templates.rs @@ -101,6 +101,7 @@ impl SimpleComponent for Templates { add_css_class: "boxed-list", connect_row_selected[sender] => move |_, row| { if let Some(row) = row { + #[allow(clippy::cast_sign_loss)] let index = row.index() as usize; sender.input(TemplatesAction::SelectTemplate(index)); } @@ -433,7 +434,9 @@ impl Templates { guard.drop(); let widget = self.template_rows.widget(); - let potential_row_widget = widget.row_at_index(index as i32); - widget.select_row(potential_row_widget.as_ref()); + if let Ok(gtk_index) = i32::try_from(index) { + let potential_row_widget = widget.row_at_index(gtk_index); + widget.select_row(potential_row_widget.as_ref()); + } } } diff --git a/src/components/preferences_window.rs b/src/components/preferences_window.rs index 0fb7d63..29e42fe 100644 --- a/src/components/preferences_window.rs +++ b/src/components/preferences_window.rs @@ -146,8 +146,8 @@ impl SimpleComponent for PreferencesWindow { } PreferencesAction::ImportFromFile(path) => { if storage::import_from_file(&mut self.preferences, &path).is_ok() { - self.sync_ui_from_preferences(); self.save_and_notify(&sender); + Self::sync_ui_from_preferences(&sender); } } PreferencesAction::ExportToFile(path) => { @@ -155,8 +155,8 @@ impl SimpleComponent for PreferencesWindow { } PreferencesAction::ResetToDefaults => { self.preferences = UserPreferences::default(); - self.sync_ui_from_preferences(); self.save_and_notify(&sender); + Self::sync_ui_from_preferences(&sender); } PreferencesAction::SetShowMapBackground(show_background) => { self.preferences.show_map_background = show_background; @@ -207,24 +207,13 @@ impl SimpleComponent for PreferencesWindow { self.save_and_notify(&sender); } PreferencesAction::SetCustomEditorFontName(font_name) => { - self.preferences - .custom_editor_font_name - .clone_from(&font_name); - self.editor_page - .emit(preference_pages::EditorAction::SetCustomFont(font_name)); - self.save_and_notify(&sender); + self.handle_set_custom_editor_font_name(font_name, &sender); } PreferencesAction::SetEditorFontSize(font_size) => { - self.preferences.editor_font_size = font_size; - self.editor_page - .emit(preference_pages::EditorAction::SetFontSize(font_size)); - self.save_and_notify(&sender); + self.handle_set_editor_font_size(font_size, &sender); } PreferencesAction::SetSoftWrapLines(soft_wrap_lines) => { - self.preferences.soft_wrap_lines = soft_wrap_lines; - self.editor_page - .emit(preference_pages::EditorAction::SetSoftWrap(soft_wrap_lines)); - self.save_and_notify(&sender); + self.handle_set_soft_wrap_lines(soft_wrap_lines, &sender); } PreferencesAction::AddTemplate(name) => self.handle_add_template(name, &sender), PreferencesAction::RemoveTemplate(id) => self.handle_remove_template(id, &sender), @@ -259,8 +248,12 @@ impl PreferencesWindow { .ok(); } - // TODO: Figure out how to best do this with messages. - fn sync_ui_from_preferences(&mut self) {} + // This is a lazy placeholder. I'd love if these values were easy + // to cascade, maybe they can but I don't know how yet. Anyway, + // closing and re-opening the window works just as well. + fn sync_ui_from_preferences(sender: &ComponentSender<Self>) { + sender.output(Action::ReloadPreferencesWindow).ok(); + } fn handle_add_template(&mut self, name: String, sender: &ComponentSender<Self>) { let template = Template::new(name, String::new(), false); @@ -391,6 +384,37 @@ impl PreferencesWindow { } } + fn handle_set_soft_wrap_lines( + &mut self, + soft_wrap_lines: bool, + sender: &ComponentSender<Self>, + ) { + self.preferences.soft_wrap_lines = soft_wrap_lines; + self.editor_page + .emit(preference_pages::EditorAction::SetSoftWrap(soft_wrap_lines)); + self.save_and_notify(sender); + } + + fn handle_set_editor_font_size(&mut self, font_size: f64, sender: &ComponentSender<Self>) { + self.preferences.editor_font_size = font_size; + self.editor_page + .emit(preference_pages::EditorAction::SetFontSize(font_size)); + self.save_and_notify(sender); + } + + fn handle_set_custom_editor_font_name( + &mut self, + font_name: String, + sender: &ComponentSender<Self>, + ) { + self.preferences + .custom_editor_font_name + .clone_from(&font_name); + self.editor_page + .emit(preference_pages::EditorAction::SetCustomFont(font_name)); + self.save_and_notify(sender); + } + // Initializes the breakpoint logic fn init_breakpoints(root: &adw::Window, widgets: &PreferencesWindowWidgets) { let breakpoint = adw::Breakpoint::new(adw::BreakpointCondition::new_length( diff --git a/src/handlers/preferences.rs b/src/handlers/preferences.rs index 9fb3638..604c3a5 100644 --- a/src/handlers/preferences.rs +++ b/src/handlers/preferences.rs @@ -45,6 +45,15 @@ pub fn close(model: &mut AppModel) { model.preferences_window = None; } +/// Closes and reopens the preferences window. +pub fn reload_window(model: &mut AppModel, sender: &ComponentSender<AppModel>) { + if let Some(controller) = model.preferences_window.take() { + controller.widget().destroy(); + } + model.preferences_window = None; + show(model, sender); +} + /// Reloads the preferences. pub fn reload(model: &mut AppModel) { model.preferences = storage::load(); diff --git a/src/main.rs b/src/main.rs index 06c4943..344a30d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -622,6 +622,7 @@ impl SimpleComponent for AppModel { } Action::PreferencesWindowClosed => handlers::preferences::close(self), Action::ReloadPreferences => handlers::preferences::reload(self), + Action::ReloadPreferencesWindow => handlers::preferences::reload_window(self, &sender), } } } |