91 lines
2.4 KiB
Rust
91 lines
2.4 KiB
Rust
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());
|
|
// }
|