99 lines
3.2 KiB
Rust
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 = >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<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);
|
|
}
|
|
|
|
|
|
}
|
|
}
|
|
}
|