use adw::prelude::{WidgetExt, PreferencesRowExt, PreferencesPageExt, PreferencesGroupExt, PreferencesWindowExt, GtkWindowExt, ComboRowExt, SettingsExt}; use gtk::gio::Settings; use relm4::*; use crate::config; #[derive(Debug)] pub enum PreferencesMsg { Show, Close, SetTheme(u32), } #[derive(Debug)] pub enum PreferencesOutput { } pub struct PreferencesModel { prefwindow: adw::PreferencesWindow, settings: Settings, style: adw::StyleManager, } #[relm4::component(pub)] impl SimpleComponent for PreferencesModel { type Widgets = PreferencesWidgets; type Init = gtk::Window; type Input = PreferencesMsg; type Output = (); view! { adw::PreferencesWindow { set_transient_for: Some(&parent_window), set_modal: true, set_search_enabled: false, set_width_request: 400, set_height_request: 600, connect_close_request[sender] => move |_| { sender.input(PreferencesMsg::Close); gtk::Inhibit(true) }, add = &adw::PreferencesPage { add = &adw::PreferencesGroup { /*add_suffix = >k::Switch { set_valign: gtk::Align::Center, connect_state_set[sender] => move |_, b| { sender.output(PreferencesOutput::SetDark(b)); gtk::Inhibit(true) }, },*/ add = &adw::ComboRow { set_title: "Theme", set_valign: gtk::Align::Center, set_model: Some(>k::StringList::new(&["Light", "Dark", "Default"])), set_selected: model.settings.uint("theme-selected"), connect_selected_notify[sender] => move |item| { sender.input(PreferencesMsg::SetTheme(item.selected())); }, } } } } } fn init( parent_window: Self::Init, root: &Self::Root, sender: ComponentSender, ) -> ComponentParts { let settings = Settings::new(config::APP_ID); let style = adw::StyleManager::default(); let model = PreferencesModel { prefwindow: root.clone(), settings, style}; let widgets = view_output!(); ComponentParts { model, widgets } } fn update(&mut self, msg: Self::Input, _sender: ComponentSender) { match msg { PreferencesMsg::Show => { self.prefwindow.show(); } PreferencesMsg::Close => { self.prefwindow.hide(); } PreferencesMsg::SetTheme(theme) => { self.settings.set_uint("theme-selected", theme).unwrap(); let theme = match theme { 0 => adw::ColorScheme::PreferLight, 1 => adw::ColorScheme::PreferDark, 2 => adw::ColorScheme::Default, _ => panic!(), }; self.style.set_color_scheme(theme); } } } }