117 lines
3.2 KiB
Rust
117 lines
3.2 KiB
Rust
use adw::subclass::prelude::*;
|
|
use gtk::prelude::*;
|
|
use gtk::subclass::prelude::*;
|
|
use gtk::{gio, glib};
|
|
|
|
use crate::application::MutinyApp;
|
|
use crate::config::{APP_ID, PROFILE};
|
|
|
|
mod imp {
|
|
use super::*;
|
|
|
|
use gtk::CompositeTemplate;
|
|
|
|
#[derive(Debug, CompositeTemplate)]
|
|
#[template(resource = "/chat/revolt/Mutiny/ui/window.ui")]
|
|
pub struct MutinyAppWindow {
|
|
#[template_child]
|
|
pub headerbar: TemplateChild<adw::HeaderBar>,
|
|
pub settings: gio::Settings,
|
|
}
|
|
|
|
impl Default for MutinyAppWindow {
|
|
fn default() -> Self {
|
|
Self {
|
|
headerbar: TemplateChild::default(),
|
|
settings: gio::Settings::new(APP_ID),
|
|
}
|
|
}
|
|
}
|
|
|
|
#[glib::object_subclass]
|
|
impl ObjectSubclass for MutinyAppWindow {
|
|
const NAME: &'static str = "MutinyAppWindow";
|
|
type Type = super::MutinyAppWindow;
|
|
type ParentType = adw::ApplicationWindow;
|
|
|
|
fn class_init(klass: &mut Self::Class) {
|
|
Self::bind_template(klass);
|
|
}
|
|
|
|
// You must call `Widget`'s `init_template()` within `instance_init()`.
|
|
fn instance_init(obj: &glib::subclass::InitializingObject<Self>) {
|
|
obj.init_template();
|
|
}
|
|
}
|
|
|
|
impl ObjectImpl for MutinyAppWindow {
|
|
fn constructed(&self, obj: &Self::Type) {
|
|
self.parent_constructed(obj);
|
|
|
|
// Devel Profile
|
|
if PROFILE == "Devel" {
|
|
obj.add_css_class("devel");
|
|
}
|
|
|
|
// Load latest window state
|
|
obj.load_window_size();
|
|
}
|
|
}
|
|
|
|
impl WidgetImpl for MutinyAppWindow {}
|
|
impl WindowImpl for MutinyAppWindow {
|
|
// Save window state on delete event
|
|
fn close_request(&self, window: &Self::Type) -> gtk::Inhibit {
|
|
if let Err(err) = window.save_window_size() {
|
|
log::warn!("Failed to save window state, {}", &err);
|
|
}
|
|
|
|
// Pass close request on to the parent
|
|
self.parent_close_request(window)
|
|
}
|
|
}
|
|
|
|
impl ApplicationWindowImpl for MutinyAppWindow {}
|
|
impl AdwApplicationWindowImpl for MutinyAppWindow {}
|
|
}
|
|
|
|
glib::wrapper! {
|
|
pub struct MutinyAppWindow(ObjectSubclass<imp::MutinyAppWindow>)
|
|
@extends gtk::Widget, gtk::Window, gtk::ApplicationWindow,
|
|
@implements gio::ActionMap, gio::ActionGroup, gtk::Root;
|
|
}
|
|
|
|
impl MutinyAppWindow {
|
|
pub fn new(app: &MutinyApp) -> Self {
|
|
glib::Object::new(&[("application", app)]).expect("Failed to create MutinyAppWindow")
|
|
}
|
|
|
|
fn save_window_size(&self) -> Result<(), glib::BoolError> {
|
|
let imp = self.imp();
|
|
|
|
let (width, height) = self.default_size();
|
|
|
|
imp.settings.set_int("window-width", width)?;
|
|
imp.settings.set_int("window-height", height)?;
|
|
|
|
imp.settings
|
|
.set_boolean("is-maximized", self.is_maximized())?;
|
|
|
|
Ok(())
|
|
}
|
|
|
|
fn load_window_size(&self) {
|
|
let imp = self.imp();
|
|
|
|
let width = imp.settings.int("window-width");
|
|
let height = imp.settings.int("window-height");
|
|
let is_maximized = imp.settings.boolean("is-maximized");
|
|
|
|
self.set_default_size(width, height);
|
|
|
|
if is_maximized {
|
|
self.maximize();
|
|
}
|
|
}
|
|
}
|