From 524e0bb0a8423ff74cc7e236d014c07b6200cf43 Mon Sep 17 00:00:00 2001 From: Rowan Lewis Date: Sun, 18 Mar 2018 08:54:33 +0100 Subject: [PATCH 1/2] Persist window geometry including maximized state for issue #50. --- .../resources/org.gnome.Hammond.gschema.xml | 21 +++++++++ hammond-gtk/src/app.rs | 43 +++++++++++++++++-- 2 files changed, 61 insertions(+), 3 deletions(-) diff --git a/hammond-gtk/resources/org.gnome.Hammond.gschema.xml b/hammond-gtk/resources/org.gnome.Hammond.gschema.xml index a55659c..9979d5e 100644 --- a/hammond-gtk/resources/org.gnome.Hammond.gschema.xml +++ b/hammond-gtk/resources/org.gnome.Hammond.gschema.xml @@ -10,6 +10,27 @@ + + -1 + Top position of the last open main window + + + -1 + Left position of the last open main window + + + 640 + Height of the last open main window + + + 860 + Width of the last open main window + + + false + Maximized state of the last open main window + + false Enable or disable dark theme diff --git a/hammond-gtk/src/app.rs b/hammond-gtk/src/app.rs index 4fa1b83..132779f 100644 --- a/hammond-gtk/src/app.rs +++ b/hammond-gtk/src/app.rs @@ -57,6 +57,7 @@ pub struct App { impl App { pub fn new() -> App { + let settings = Settings::new("org.gnome.Hammond"); let application = gtk::Application::new("org.gnome.Hammond", ApplicationFlags::empty()) .expect("Application Initialization failed..."); @@ -66,10 +67,14 @@ impl App { // Create the main window let window = gtk::Window::new(gtk::WindowType::Toplevel); - window.set_default_size(860, 640); + window.set_title("Hammond"); + let app_clone = application.clone(); + let window_clone = window.clone(); + let settings_clone = settings.clone(); window.connect_delete_event(move |_, _| { + store_window_geometry(&window_clone, &settings_clone); app_clone.quit(); Inhibit(false) }); @@ -90,8 +95,6 @@ impl App { // Add the overlay to the main window window.add(&overlay); - let settings = Settings::new("org.gnome.Hammond"); - App { app_instance: application, window, @@ -149,7 +152,10 @@ impl App { } pub fn run(self) { + restore_window_geometry(&self.window, &self.settings); + let window = self.window.clone(); + self.app_instance.connect_startup(move |app| { build_ui(&window, app); }); @@ -258,3 +264,34 @@ fn build_ui(window: >k::Window, app: >k::Application) { window.activate(); app.connect_activate(move |_| ()); } + +fn restore_window_geometry(window: >k::Window, settings: &Settings) { + let top = settings.get_int("persist-window-geometry-top"); + let left = settings.get_int("persist-window-geometry-left"); + let width = settings.get_int("persist-window-geometry-width"); + let height = settings.get_int("persist-window-geometry-height"); + let is_maximized = settings.get_boolean("persist-window-geometry-maximized"); + + if width > 0 && height > 0 { + window.resize(width, height); + } + + if is_maximized { + window.maximize(); + } + + else if top > 0 && left > 0 { + window.move_(left, top); + } +} + +fn store_window_geometry(window: >k::Window, settings: &Settings) { + let position = window.get_position(); + let size = window.get_size(); + + settings.set_int("persist-window-geometry-left", position.0); + settings.set_int("persist-window-geometry-top", position.1); + settings.set_int("persist-window-geometry-width", size.0); + settings.set_int("persist-window-geometry-height", size.1); + settings.set_boolean("persist-window-geometry-maximized", window.is_maximized()); +} From c458b27573ff0ffa84a350dc48e46262dc2f11ed Mon Sep 17 00:00:00 2001 From: Rowan Lewis Date: Sun, 18 Mar 2018 11:00:57 +0100 Subject: [PATCH 2/2] Handle window geometry with a new struct. --- hammond-gtk/src/app.rs | 36 ++------------- hammond-gtk/src/main.rs | 1 + hammond-gtk/src/settings.rs | 90 +++++++++++++++++++++++++++++++++++++ 3 files changed, 94 insertions(+), 33 deletions(-) create mode 100644 hammond-gtk/src/settings.rs diff --git a/hammond-gtk/src/app.rs b/hammond-gtk/src/app.rs index 132779f..06a5602 100644 --- a/hammond-gtk/src/app.rs +++ b/hammond-gtk/src/app.rs @@ -13,6 +13,7 @@ use hammond_data::utils::delete_show; use appnotif::*; use headerbar::Header; +use settings::WindowGeometry; use stacks::Content; use utils; use widgets::mark_all_watched; @@ -74,7 +75,7 @@ impl App { let window_clone = window.clone(); let settings_clone = settings.clone(); window.connect_delete_event(move |_, _| { - store_window_geometry(&window_clone, &settings_clone); + WindowGeometry::from_window(&window_clone).write(&settings_clone); app_clone.quit(); Inhibit(false) }); @@ -152,7 +153,7 @@ impl App { } pub fn run(self) { - restore_window_geometry(&self.window, &self.settings); + WindowGeometry::from_settings(&self.settings).apply(&self.window); let window = self.window.clone(); @@ -264,34 +265,3 @@ fn build_ui(window: >k::Window, app: >k::Application) { window.activate(); app.connect_activate(move |_| ()); } - -fn restore_window_geometry(window: >k::Window, settings: &Settings) { - let top = settings.get_int("persist-window-geometry-top"); - let left = settings.get_int("persist-window-geometry-left"); - let width = settings.get_int("persist-window-geometry-width"); - let height = settings.get_int("persist-window-geometry-height"); - let is_maximized = settings.get_boolean("persist-window-geometry-maximized"); - - if width > 0 && height > 0 { - window.resize(width, height); - } - - if is_maximized { - window.maximize(); - } - - else if top > 0 && left > 0 { - window.move_(left, top); - } -} - -fn store_window_geometry(window: >k::Window, settings: &Settings) { - let position = window.get_position(); - let size = window.get_size(); - - settings.set_int("persist-window-geometry-left", position.0); - settings.set_int("persist-window-geometry-top", position.1); - settings.set_int("persist-window-geometry-width", size.0); - settings.set_int("persist-window-geometry-height", size.1); - settings.set_boolean("persist-window-geometry-maximized", window.is_maximized()); -} diff --git a/hammond-gtk/src/main.rs b/hammond-gtk/src/main.rs index 991358e..d865cfb 100644 --- a/hammond-gtk/src/main.rs +++ b/hammond-gtk/src/main.rs @@ -67,6 +67,7 @@ pub mod stacks; pub mod headerbar; pub mod app; +pub mod settings; pub mod utils; pub mod manager; pub mod static_resource; diff --git a/hammond-gtk/src/settings.rs b/hammond-gtk/src/settings.rs new file mode 100644 index 0000000..781caa5 --- /dev/null +++ b/hammond-gtk/src/settings.rs @@ -0,0 +1,90 @@ +use gio; +use gio::SettingsExt; +use gtk; +use gtk::GtkWindowExt; + +pub struct WindowGeometry { + left: i32, + top: i32, + width: i32, + height: i32, + is_maximized: bool, +} + +impl WindowGeometry { + pub fn from_window(window: >k::Window) -> WindowGeometry { + let position = window.get_position(); + let size = window.get_size(); + let left = position.0; + let top = position.1; + let width = size.0; + let height = size.1; + let is_maximized = window.is_maximized(); + + WindowGeometry { + left, + top, + width, + height, + is_maximized, + } + } + + pub fn from_settings(settings: &gio::Settings) -> WindowGeometry { + let top = settings.get_int("persist-window-geometry-top"); + let left = settings.get_int("persist-window-geometry-left"); + let width = settings.get_int("persist-window-geometry-width"); + let height = settings.get_int("persist-window-geometry-height"); + let is_maximized = settings.get_boolean("persist-window-geometry-maximized"); + + WindowGeometry { + left, + top, + width, + height, + is_maximized, + } + } + + pub fn apply(&self, window: >k::Window) { + if self.width > 0 && self.height > 0 { + window.resize(self.width, self.height); + } + + if self.is_maximized { + window.maximize(); + } else if self.top > 0 && self.left > 0 { + window.move_(self.left, self.top); + } + } + + pub fn write(&self, settings: &gio::Settings) { + settings.set_int("persist-window-geometry-left", self.left); + settings.set_int("persist-window-geometry-top", self.top); + settings.set_int("persist-window-geometry-width", self.width); + settings.set_int("persist-window-geometry-height", self.height); + settings.set_boolean("persist-window-geometry-maximized", self.is_maximized); + } +} + +// #[test] +// fn test_apply_window_geometry() { +// gtk::init().expect("Error initializing gtk."); + +// let window = gtk::Window::new(gtk::WindowType::Toplevel); +// let _geometry = WindowGeometry { +// left: 0, +// top: 0, +// width: 100, +// height: 100, +// is_maximized: true +// }; + +// assert!(!window.is_maximized()); + +// window.show(); +// window.activate(); +// geometry.apply(&window); + +// assert!(window.is_maximized()); +// }