Handle window geometry with a new struct.

This commit is contained in:
Rowan Lewis 2018-03-18 11:00:57 +01:00 committed by Jordan Petridis
parent 524e0bb0a8
commit c458b27573
3 changed files with 94 additions and 33 deletions

View File

@ -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: &gtk::Window, app: &gtk::Application) {
window.activate();
app.connect_activate(move |_| ());
}
fn restore_window_geometry(window: &gtk::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: &gtk::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());
}

View File

@ -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;

View File

@ -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: &gtk::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: &gtk::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());
// }