From 524e0bb0a8423ff74cc7e236d014c07b6200cf43 Mon Sep 17 00:00:00 2001 From: Rowan Lewis Date: Sun, 18 Mar 2018 08:54:33 +0100 Subject: [PATCH] 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()); +}