aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRubén Beltrán del Río <jj@r.bdr.sh>2026-03-30 13:45:09 +0200
committerRubén Beltrán del Río <jj@r.bdr.sh>2026-03-30 14:29:59 +0200
commit6283a8dbec408f9cc4804b4f953ea1b2fddf92c0 (patch)
tree8cde70a40d83d59d219f535a68500c1f2df66946 /src
parent9b988989ec3dc1316c5bdfa162b6ef8cfd21beff (diff)
Propagate preferences import / export.
Diffstat (limited to 'src')
-rw-r--r--src/actions.rs1
-rw-r--r--src/components/preference_pages/editor.rs1
-rw-r--r--src/components/preference_pages/templates.rs7
-rw-r--r--src/components/preferences_window.rs60
-rw-r--r--src/handlers/preferences.rs9
-rw-r--r--src/main.rs1
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),
}
}
}