aboutsummaryrefslogtreecommitdiff
path: root/src/preferences/pages/general.rs
diff options
context:
space:
mode:
authorRubén Beltrán del Río <jj@r.bdr.sh>2026-01-16 08:26:35 +0100
committerRubén Beltrán del Río <jj@r.bdr.sh>2026-01-16 11:57:13 +0100
commit81cd06b3334f2f91f6a1ab62a28e11c7d0c677eb (patch)
treef0b0cf37b406eda2dec8db4382aeb5f606cd1f0d /src/preferences/pages/general.rs
parent4211b2ae06777d5bbe8261a1ab5c0dd057829a35 (diff)
Add preferences
Diffstat (limited to 'src/preferences/pages/general.rs')
-rw-r--r--src/preferences/pages/general.rs155
1 files changed, 155 insertions, 0 deletions
diff --git a/src/preferences/pages/general.rs b/src/preferences/pages/general.rs
new file mode 100644
index 0000000..9c71bd4
--- /dev/null
+++ b/src/preferences/pages/general.rs
@@ -0,0 +1,155 @@
+// Copyright (C) 2024 Rubén Beltrán del Río
+
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see https://map.tranquil.systems.
+
+use gtk::FileFilter;
+use gtk::prelude::*;
+use relm4::Sender;
+use relm4::gtk;
+
+use super::super::window::PreferencesInput;
+
+pub struct GeneralPage {
+ container: gtk::Box,
+}
+
+impl GeneralPage {
+ pub fn new(sender: Sender<PreferencesInput>) -> Self {
+ let container = gtk::Box::new(gtk::Orientation::Vertical, 20);
+ container.set_margin_top(20);
+ container.set_margin_bottom(20);
+ container.set_margin_start(20);
+ container.set_margin_end(20);
+ container.set_valign(gtk::Align::Start);
+
+ // Preferences section
+ let prefs_label = gtk::Label::new(Some("Preferences"));
+ prefs_label.add_css_class("heading");
+ prefs_label.set_halign(gtk::Align::Start);
+ container.append(&prefs_label);
+
+ let button_box = gtk::Box::new(gtk::Orientation::Horizontal, 10);
+
+ // Export button
+ let export_button = gtk::Button::with_label("Export...");
+ {
+ let sender = sender.clone();
+ export_button.connect_clicked(move |_| {
+ sender.emit(PreferencesInput::Export);
+ });
+ }
+ button_box.append(&export_button);
+
+ // Import button
+ let import_button = gtk::Button::with_label("Import...");
+ {
+ let sender = sender.clone();
+ import_button.connect_clicked(move |_| {
+ sender.emit(PreferencesInput::Import);
+ });
+ }
+ button_box.append(&import_button);
+
+ // Reset button
+ let reset_button = gtk::Button::with_label("Reset to Defaults");
+ reset_button.add_css_class("destructive-action");
+ {
+ let sender = sender.clone();
+ reset_button.connect_clicked(move |_| {
+ sender.emit(PreferencesInput::ResetToDefaults);
+ });
+ }
+ button_box.append(&reset_button);
+
+ container.append(&button_box);
+
+ // Help text
+ let help_label = gtk::Label::new(Some(
+ "Export your preferences to share with others or back up your settings.\nImport preferences from a file to restore settings.",
+ ));
+ help_label.add_css_class("dim-label");
+ help_label.set_halign(gtk::Align::Start);
+ help_label.set_wrap(true);
+ container.append(&help_label);
+
+ Self { container }
+ }
+
+ pub fn widget(&self) -> gtk::Box {
+ self.container.clone()
+ }
+}
+
+pub fn show_export_dialog(sender: &Sender<PreferencesInput>, window: &gtk::Window) {
+ let filter = FileFilter::new();
+ filter.add_pattern("*.json");
+ filter.set_name(Some("JSON files"));
+
+ let dialog = gtk::FileChooserDialog::new(
+ Some("Export Preferences"),
+ Some(window),
+ gtk::FileChooserAction::Save,
+ &[
+ ("Cancel", gtk::ResponseType::Cancel),
+ ("Save", gtk::ResponseType::Accept),
+ ],
+ );
+ dialog.set_current_name("preferences.json");
+ dialog.add_filter(&filter);
+ dialog.set_modal(true);
+
+ let sender = sender.clone();
+ dialog.connect_response(move |dialog, response| {
+ if response == gtk::ResponseType::Accept
+ && let Some(file) = dialog.file()
+ && let Some(path) = file.path()
+ {
+ sender.emit(PreferencesInput::ExportToFile(path));
+ }
+ dialog.close();
+ });
+
+ dialog.present();
+}
+
+pub fn show_import_dialog(sender: &Sender<PreferencesInput>, window: &gtk::Window) {
+ let filter = FileFilter::new();
+ filter.add_pattern("*.json");
+ filter.set_name(Some("JSON files"));
+
+ let dialog = gtk::FileChooserDialog::new(
+ Some("Import Preferences"),
+ Some(window),
+ gtk::FileChooserAction::Open,
+ &[
+ ("Cancel", gtk::ResponseType::Cancel),
+ ("Open", gtk::ResponseType::Accept),
+ ],
+ );
+ dialog.add_filter(&filter);
+ dialog.set_modal(true);
+
+ let sender = sender.clone();
+ dialog.connect_response(move |dialog, response| {
+ if response == gtk::ResponseType::Accept
+ && let Some(file) = dialog.file()
+ && let Some(path) = file.path()
+ {
+ sender.emit(PreferencesInput::ImportFromFile(path));
+ }
+ dialog.close();
+ });
+
+ dialog.present();
+}