diff --git a/src/app.rs b/src/app.rs index fd53da9..5a60d4a 100644 --- a/src/app.rs +++ b/src/app.rs @@ -2,6 +2,7 @@ use crate::gtk::Align; use crate::util::prerequisit::get_installed_terminals; use crate::util::prerequisit::is_toolbox_installed; +use crate::modals::settings::SettingsMsg; use crate::util::toolbox::ToolbxContainer; use relm4::adw::prelude::PreferencesGroupExt; use relm4::factory::FactoryHashMap; @@ -180,7 +181,7 @@ impl Component for App { let preference_action = { let settings = model.settings_dialog.sender().clone(); RelmAction::::new_stateless(move |_| { - settings.send(()).unwrap(); + settings.send(SettingsMsg::OpenSettings).unwrap(); }) }; diff --git a/src/modals/settings.rs b/src/modals/settings.rs index 7f72bf5..8d07152 100644 --- a/src/modals/settings.rs +++ b/src/modals/settings.rs @@ -2,18 +2,30 @@ use crate::util::prerequisit::get_installed_terminals; use relm4::adw::prelude::{ ComboRowExt, PreferencesGroupExt, PreferencesPageExt, PreferencesRowExt, PreferencesWindowExt, }; +use relm4::gtk::prelude::WidgetExt; use relm4::gtk::prelude::GtkWindowExt; +use relm4::gtk::prelude::ListModelExt; use relm4::view; use relm4::{adw, gtk, ComponentParts, ComponentSender, SimpleComponent}; -pub struct SettingsDialog {} +pub struct SettingsDialog { + hidden: bool, + terminal: String, +} use crate::APP_ID; use gtk::gio; +use relm4::gtk::prelude::CastNone; use relm4::gtk::prelude::SettingsExt; +#[derive(Debug)] +pub enum SettingsMsg { + OpenSettings, + TerminalSelectionChanged(String), +} + impl SimpleComponent for SettingsDialog { type Init = (); type Widgets = adw::PreferencesWindow; - type Input = (); + type Input = SettingsMsg; type Output = (); type Root = adw::PreferencesWindow; @@ -24,9 +36,12 @@ impl SimpleComponent for SettingsDialog { fn init( _: Self::Init, root: Self::Root, - _sender: ComponentSender, + sender: ComponentSender, ) -> ComponentParts { - let model = Self {}; + let model = Self { + hidden: true, + terminal: "".to_string(), + }; let terminal_selection_model = gtk::gio::ListStore::new::(); let sort_function = |to_insert: >k::glib::Object, @@ -49,10 +64,16 @@ impl SimpleComponent for SettingsDialog { .find_with_equal_func(|obj| obj == >k::StringObject::new(terminal.as_str())) .unwrap_or(0); - // TODO: save settings on drop down change + let str_object: String = terminal_selection_model + .item(terminal_selection) + .and_downcast::() + .expect("The item has to be an `StringObject`.") + .into(); + sender.input(SettingsMsg::TerminalSelectionChanged(str_object)); view! { widgets = root.clone() { + add = &adw::PreferencesPage::new() { add = &adw::PreferencesGroup::new() { set_title: "Terminal settings", @@ -62,6 +83,10 @@ impl SimpleComponent for SettingsDialog { set_model = >k::SingleSelection::new(Some(terminal_selection_model)), #[watch] set_selected: terminal_selection, + connect_selected_item_notify[sender] => move |combo_row| { + let str_object: String = combo_row.selected_item().and_downcast::().expect("The item has to be an `StringObject`.").into(); + sender.input(SettingsMsg::TerminalSelectionChanged(str_object)); + }, }, }, }, @@ -71,6 +96,15 @@ impl SimpleComponent for SettingsDialog { } fn update_view(&self, dialog: &mut Self::Widgets, _sender: ComponentSender) { - dialog.present(); + dialog.show(); + } + fn update(&mut self, msg: Self::Input, _sender: ComponentSender) { + match msg { + SettingsMsg::OpenSettings => { } + SettingsMsg::TerminalSelectionChanged(terminal) => { + let settings = gio::Settings::new(APP_ID); + settings.set_string("terminal", &terminal); + } + } } } diff --git a/src/util/prerequisit.rs b/src/util/prerequisit.rs index 5213ce1..0df03da 100644 --- a/src/util/prerequisit.rs +++ b/src/util/prerequisit.rs @@ -1,8 +1,10 @@ use crate::util::toolbox::ToolbxError; use std::process::Command; +#[derive(Debug)] pub enum TerminalType { GnomeTerminal, + Konsole, } pub fn get_installed_terminals() -> Result, ToolbxError> { @@ -20,7 +22,7 @@ pub fn get_installed_terminals() -> Result, ToolbxError> { let output = output.unwrap(); if output.status.code() == Some(0) { - Ok(vec![TerminalType::GnomeTerminal]) + Ok(vec![TerminalType::GnomeTerminal, TerminalType::Konsole]) } else { Err(ToolbxError::CommandUnsuccessfulError( String::from_utf8_lossy(&output.stderr).into_owned(),