diff options
| author | Rubén Beltrán del Río <jj@r.bdr.sh> | 2026-01-16 08:26:35 +0100 |
|---|---|---|
| committer | Rubén Beltrán del Río <jj@r.bdr.sh> | 2026-01-16 11:57:13 +0100 |
| commit | 81cd06b3334f2f91f6a1ab62a28e11c7d0c677eb (patch) | |
| tree | f0b0cf37b406eda2dec8db4382aeb5f606cd1f0d /src/preferences/pages/general.rs | |
| parent | 4211b2ae06777d5bbe8261a1ab5c0dd057829a35 (diff) | |
Add preferences
Diffstat (limited to 'src/preferences/pages/general.rs')
| -rw-r--r-- | src/preferences/pages/general.rs | 155 |
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: >k::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: >k::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(); +} |