From 6283a8dbec408f9cc4804b4f953ea1b2fddf92c0 Mon Sep 17 00:00:00 2001 From: Rubén Beltrán del Río Date: Mon, 30 Mar 2026 13:45:09 +0200 Subject: Propagate preferences import / export. --- src/actions.rs | 1 + src/components/preference_pages/editor.rs | 1 + src/components/preference_pages/templates.rs | 7 +++- src/components/preferences_window.rs | 60 +++++++++++++++++++--------- src/handlers/preferences.rs | 9 +++++ src/main.rs | 1 + 6 files changed, 59 insertions(+), 20 deletions(-) (limited to 'src') 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) { + sender.output(Action::ReloadPreferencesWindow).ok(); + } fn handle_add_template(&mut self, name: String, sender: &ComponentSender) { 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.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.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.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) { + 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), } } } -- cgit