add actual settings that get saved (not yet loaded)

This commit is contained in:
2024-08-04 19:50:00 +02:00
parent 308374396b
commit 56acda7aae
3 changed files with 45 additions and 8 deletions

View File

@@ -2,6 +2,7 @@ use crate::gtk::Align;
use crate::util::prerequisit::get_installed_terminals; use crate::util::prerequisit::get_installed_terminals;
use crate::util::prerequisit::is_toolbox_installed; use crate::util::prerequisit::is_toolbox_installed;
use crate::modals::settings::SettingsMsg;
use crate::util::toolbox::ToolbxContainer; use crate::util::toolbox::ToolbxContainer;
use relm4::adw::prelude::PreferencesGroupExt; use relm4::adw::prelude::PreferencesGroupExt;
use relm4::factory::FactoryHashMap; use relm4::factory::FactoryHashMap;
@@ -180,7 +181,7 @@ impl Component for App {
let preference_action = { let preference_action = {
let settings = model.settings_dialog.sender().clone(); let settings = model.settings_dialog.sender().clone();
RelmAction::<PreferencesAction>::new_stateless(move |_| { RelmAction::<PreferencesAction>::new_stateless(move |_| {
settings.send(()).unwrap(); settings.send(SettingsMsg::OpenSettings).unwrap();
}) })
}; };

View File

@@ -2,18 +2,30 @@ use crate::util::prerequisit::get_installed_terminals;
use relm4::adw::prelude::{ use relm4::adw::prelude::{
ComboRowExt, PreferencesGroupExt, PreferencesPageExt, PreferencesRowExt, PreferencesWindowExt, ComboRowExt, PreferencesGroupExt, PreferencesPageExt, PreferencesRowExt, PreferencesWindowExt,
}; };
use relm4::gtk::prelude::WidgetExt;
use relm4::gtk::prelude::GtkWindowExt; use relm4::gtk::prelude::GtkWindowExt;
use relm4::gtk::prelude::ListModelExt;
use relm4::view; use relm4::view;
use relm4::{adw, gtk, ComponentParts, ComponentSender, SimpleComponent}; use relm4::{adw, gtk, ComponentParts, ComponentSender, SimpleComponent};
pub struct SettingsDialog {} pub struct SettingsDialog {
hidden: bool,
terminal: String,
}
use crate::APP_ID; use crate::APP_ID;
use gtk::gio; use gtk::gio;
use relm4::gtk::prelude::CastNone;
use relm4::gtk::prelude::SettingsExt; use relm4::gtk::prelude::SettingsExt;
#[derive(Debug)]
pub enum SettingsMsg {
OpenSettings,
TerminalSelectionChanged(String),
}
impl SimpleComponent for SettingsDialog { impl SimpleComponent for SettingsDialog {
type Init = (); type Init = ();
type Widgets = adw::PreferencesWindow; type Widgets = adw::PreferencesWindow;
type Input = (); type Input = SettingsMsg;
type Output = (); type Output = ();
type Root = adw::PreferencesWindow; type Root = adw::PreferencesWindow;
@@ -24,9 +36,12 @@ impl SimpleComponent for SettingsDialog {
fn init( fn init(
_: Self::Init, _: Self::Init,
root: Self::Root, root: Self::Root,
_sender: ComponentSender<Self>, sender: ComponentSender<Self>,
) -> ComponentParts<Self> { ) -> ComponentParts<Self> {
let model = Self {}; let model = Self {
hidden: true,
terminal: "".to_string(),
};
let terminal_selection_model = gtk::gio::ListStore::new::<gtk::StringObject>(); let terminal_selection_model = gtk::gio::ListStore::new::<gtk::StringObject>();
let sort_function = |to_insert: &gtk::glib::Object, let sort_function = |to_insert: &gtk::glib::Object,
@@ -49,10 +64,16 @@ impl SimpleComponent for SettingsDialog {
.find_with_equal_func(|obj| obj == &gtk::StringObject::new(terminal.as_str())) .find_with_equal_func(|obj| obj == &gtk::StringObject::new(terminal.as_str()))
.unwrap_or(0); .unwrap_or(0);
// TODO: save settings on drop down change let str_object: String = terminal_selection_model
.item(terminal_selection)
.and_downcast::<gtk::StringObject>()
.expect("The item has to be an `StringObject`.")
.into();
sender.input(SettingsMsg::TerminalSelectionChanged(str_object));
view! { view! {
widgets = root.clone() { widgets = root.clone() {
add = &adw::PreferencesPage::new() { add = &adw::PreferencesPage::new() {
add = &adw::PreferencesGroup::new() { add = &adw::PreferencesGroup::new() {
set_title: "Terminal settings", set_title: "Terminal settings",
@@ -62,6 +83,10 @@ impl SimpleComponent for SettingsDialog {
set_model = &gtk::SingleSelection::new(Some(terminal_selection_model)), set_model = &gtk::SingleSelection::new(Some(terminal_selection_model)),
#[watch] #[watch]
set_selected: terminal_selection, set_selected: terminal_selection,
connect_selected_item_notify[sender] => move |combo_row| {
let str_object: String = combo_row.selected_item().and_downcast::<gtk::StringObject>().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<Self>) { fn update_view(&self, dialog: &mut Self::Widgets, _sender: ComponentSender<Self>) {
dialog.present(); dialog.show();
}
fn update(&mut self, msg: Self::Input, _sender: ComponentSender<Self>) {
match msg {
SettingsMsg::OpenSettings => { }
SettingsMsg::TerminalSelectionChanged(terminal) => {
let settings = gio::Settings::new(APP_ID);
settings.set_string("terminal", &terminal);
}
}
} }
} }

View File

@@ -1,8 +1,10 @@
use crate::util::toolbox::ToolbxError; use crate::util::toolbox::ToolbxError;
use std::process::Command; use std::process::Command;
#[derive(Debug)]
pub enum TerminalType { pub enum TerminalType {
GnomeTerminal, GnomeTerminal,
Konsole,
} }
pub fn get_installed_terminals() -> Result<Vec<TerminalType>, ToolbxError> { pub fn get_installed_terminals() -> Result<Vec<TerminalType>, ToolbxError> {
@@ -20,7 +22,7 @@ pub fn get_installed_terminals() -> Result<Vec<TerminalType>, ToolbxError> {
let output = output.unwrap(); let output = output.unwrap();
if output.status.code() == Some(0) { if output.status.code() == Some(0) {
Ok(vec![TerminalType::GnomeTerminal]) Ok(vec![TerminalType::GnomeTerminal, TerminalType::Konsole])
} else { } else {
Err(ToolbxError::CommandUnsuccessfulError( Err(ToolbxError::CommandUnsuccessfulError(
String::from_utf8_lossy(&output.stderr).into_owned(), String::from_utf8_lossy(&output.stderr).into_owned(),