diff --git a/hammond-gtk/resources/gtk/hamburger.ui b/hammond-gtk/resources/gtk/hamburger.ui index 55d2877..58decaa 100644 --- a/hammond-gtk/resources/gtk/hamburger.ui +++ b/hammond-gtk/resources/gtk/hamburger.ui @@ -21,6 +21,7 @@ _Preferences win.preferences + <primary>e
diff --git a/hammond-gtk/resources/gtk/help-overlay.ui b/hammond-gtk/resources/gtk/help-overlay.ui index 40b17da..2ae4b56 100644 --- a/hammond-gtk/resources/gtk/help-overlay.ui +++ b/hammond-gtk/resources/gtk/help-overlay.ui @@ -18,6 +18,13 @@ Check for new episodes + + + True + <primary>e + Preferences + + True diff --git a/hammond-gtk/resources/gtk/prefs.ui b/hammond-gtk/resources/gtk/prefs.ui new file mode 100644 index 0000000..164e450 --- /dev/null +++ b/hammond-gtk/resources/gtk/prefs.ui @@ -0,0 +1,282 @@ + + + + + + 1 + 100 + 1 + 1 + 10 + + + False + Preferences + dialog + + + False + vertical + 2 + + + True + True + 480 + 200 + True + True + + + True + False + none + + + True + False + center + center + vertical + + + True + False + start + 10 + 5 + Appearance + + + False + True + 0 + + + + + 450 + True + False + 0 + in + + + True + False + + + True + False + none + False + + + 50 + True + True + False + False + + + True + False + 5 + 5 + 5 + 5 + + + True + False + Dark Theme + + + False + True + 0 + + + + + True + True + center + + + False + False + end + 1 + + + + + + + + + + + + + + + + False + True + 1 + + + + + True + False + start + 20 + 5 + Delete played episodes + + + False + True + 2 + + + + + 300 + True + False + 0 + in + + + True + False + + + True + False + none + False + + + 100 + 50 + True + True + False + False + + + True + False + 5 + 5 + 5 + 5 + + + True + False + After + + + False + True + 0 + + + + + True + False + + + True + True + digits + cleanup_value_adj + 1 + 1 + + + False + True + 0 + + + + + True + False + + + False + True + 1 + + + + + + False + True + end + 1 + + + + + + + + + + + + + + + + False + True + 3 + + + + + + + + + True + True + 1 + + + + + + + True + False + Prefrences + True + + + + + + + + 1 + 100 + 1 + 1 + 10 + + diff --git a/hammond-gtk/resources/resources.xml b/hammond-gtk/resources/resources.xml index 0843719..ad41e44 100644 --- a/hammond-gtk/resources/resources.xml +++ b/hammond-gtk/resources/resources.xml @@ -17,6 +17,7 @@ gtk/player_toolbar.ui icons/skip-back-symbolic.svg icons/skip-forward-symbolic.svg + gtk/prefs.ui gtk/style.css \ No newline at end of file diff --git a/hammond-gtk/src/app.rs b/hammond-gtk/src/app.rs index 265c2ec..be09751 100644 --- a/hammond-gtk/src/app.rs +++ b/hammond-gtk/src/app.rs @@ -1,19 +1,16 @@ #![allow(new_without_default)] -use gio::{ - self, ActionMapExt, ApplicationExt, ApplicationExtManual, ApplicationFlags, SettingsExt, - SimpleAction, SimpleActionExt, -}; +use gio::{self, prelude::*, ApplicationFlags, SettingsBindFlags, SettingsExt, SimpleAction}; use glib; use gtk; use gtk::prelude::*; -use gtk::SettingsExt as GtkSettingsExt; use crossbeam_channel::{unbounded, Receiver, Sender}; use hammond_data::Show; use send_cell::SendCell; use headerbar::Header; +use prefs::Prefs; use settings::{self, WindowGeometry}; use stacks::{Content, PopulatedState}; use utils; @@ -149,9 +146,12 @@ impl App { fn setup_dark_theme(&self) { let gtk_settings = gtk::Settings::get_default().unwrap(); - let enabled = self.settings.get_boolean("dark-theme"); - - gtk_settings.set_property_gtk_application_prefer_dark_theme(enabled); + self.settings.bind( + "dark-theme", + >k_settings, + "gtk-application-prefer-dark-theme", + SettingsBindFlags::DEFAULT, + ); } fn setup_refresh_on_startup(&self) { @@ -186,6 +186,7 @@ impl App { let win = &self.window; let instance = &self.instance; let header = &self.headerbar; + let settings = &self.settings; // Create the `refresh` action. // @@ -211,6 +212,16 @@ impl App { action!(win, "quit", clone!(instance => move |_, _| instance.quit())); self.instance.set_accels_for_action("win.quit", &["q"]); + action!( + win, + "preferences", + clone!(win, settings => move |_, _| { + let dialog = Prefs::new(&settings); + dialog.show(&win); + }) + ); + self.instance.set_accels_for_action("win.preferences", &["e"]); + // Create the menu action action!(win, "menu",clone!(header => move |_, _| header.open_menu())); // Bind the hamburger menu button to `F10` diff --git a/hammond-gtk/src/main.rs b/hammond-gtk/src/main.rs index 0e92706..cf97e85 100644 --- a/hammond-gtk/src/main.rs +++ b/hammond-gtk/src/main.rs @@ -101,6 +101,7 @@ mod widgets; mod app; mod headerbar; +mod prefs; mod manager; mod settings; diff --git a/hammond-gtk/src/prefs.rs b/hammond-gtk/src/prefs.rs new file mode 100644 index 0000000..f075430 --- /dev/null +++ b/hammond-gtk/src/prefs.rs @@ -0,0 +1,84 @@ +use gio; +use gio::{Settings, SettingsExt}; +use gtk; +use gtk::prelude::*; + +#[derive(Debug, Clone)] +pub struct Prefs { + dialog: gtk::Window, + dark_toggle: gtk::Switch, + cleanup_value: gtk::SpinButton, + cleanup_type: gtk::ComboBox, +} + +impl Default for Prefs { + fn default() -> Prefs { + let builder = gtk::Builder::new_from_resource("/org/gnome/Hammond/gtk/prefs.ui"); + + let dialog = builder.get_object("prefs").unwrap(); + let dark_toggle = builder.get_object("dark_toggle").unwrap(); + let cleanup_value = builder.get_object("cleanup_value").unwrap(); + let cleanup_type = builder.get_object("cleanup_type").unwrap(); + + Prefs { + dialog, + dark_toggle, + cleanup_value, + cleanup_type, + } + } +} + +// TODO: Refactor components into smaller state machines +impl Prefs { + pub fn new(settings: &Settings) -> Prefs { + let h = Prefs::default(); + h.init(settings); + h + } + + pub fn init(&self, settings: &Settings) { + settings.bind( + "dark-theme", + &self.dark_toggle, + "active", + gio::SettingsBindFlags::DEFAULT, + ); + settings.bind( + "cleanup-age-time", + &self.cleanup_value, + "value", + gio::SettingsBindFlags::DEFAULT, + ); + let cleanup_p = settings.get_string("cleanup-age-period").unwrap(); + let mut cleanup_pos = 0; + let store = gtk::ListStore::new(&[gtk::Type::String]); + for (i, item) in ["Seconds", "Minutes", "Hours", "Days", "Weeks"] + .iter() + .enumerate() + { + let row: &[&ToValue] = &[item]; + if item.to_lowercase() == cleanup_p { + cleanup_pos = i as i32; + } + store.insert_with_values(None, &[0], &row); + } + self.cleanup_type.set_model(Some(&store)); + let renderer = gtk::CellRendererText::new(); + self.cleanup_type.pack_start(&renderer, true); + self.cleanup_type.add_attribute(&renderer, "text", 0); + self.cleanup_type.set_active(cleanup_pos); + self.cleanup_type + .connect_changed(clone!(settings, store => move |combo| { + let value = store.get_value(&combo.get_active_iter().unwrap(), 0); + let value: &str = value.get().unwrap(); + settings.set_string("cleanup-age-period", &value.to_lowercase()); + })); + } + + pub fn show(&self, parent: >k::ApplicationWindow) { + self.dialog.set_transient_for(Some(parent)); + self.dialog.set_modal(true); + self.dialog.show_all(); + } +}