game-of-life-gui/src/widgets/preferences.rs

99 lines
3.2 KiB
Rust

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 = &gtk::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(&gtk::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<Self>,
) -> ComponentParts<Self> {
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<Self>) {
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);
}
}
}
}