1 use glib::clone; 2 use gtk::prelude::*; 3 use gtk::subclass::prelude::*; 4 use gtk::{gio, glib}; 5 6 use crate::config::VERSION; 7 use crate::{{PreFix}}Window; 8 9 mod imp { 10 use super::*; 11 12 #[derive(Debug, Default)] 13 pub struct {{PreFix}}Application {} 14 15 #[glib::object_subclass] 16 impl ObjectSubclass for {{PreFix}}Application { 17 const NAME: &'static str = "{{PreFix}}Application"; 18 type Type = super::{{PreFix}}Application; 19 type ParentType = gtk::Application; 20 } 21 22 impl ObjectImpl for {{PreFix}}Application { constructed(&self, obj: &Self::Type)23 fn constructed(&self, obj: &Self::Type) { 24 self.parent_constructed(obj); 25 26 obj.setup_gactions(); 27 obj.set_accels_for_action("app.quit", &["<primary>q"]); 28 } 29 } 30 31 impl ApplicationImpl for {{PreFix}}Application { 32 // We connect to the activate callback to create a window when the application 33 // has been launched. Additionally, this callback notifies us when the user 34 // tries to launch a "second instance" of the application. When they try 35 // to do that, we'll just present any existing window. activate(&self, application: &Self::Type)36 fn activate(&self, application: &Self::Type) { 37 // Get the current window or create one if necessary 38 let window = if let Some(window) = application.active_window() { 39 window 40 } else { 41 let window = {{PreFix}}Window::new(application); 42 window.set_default_size(600, 300); 43 window.upcast() 44 }; 45 46 // Ask the window manager/compositor to present the window 47 window.present(); 48 } 49 } 50 51 impl GtkApplicationImpl for {{PreFix}}Application {} 52 } 53 54 glib::wrapper! { 55 pub struct {{PreFix}}Application(ObjectSubclass<imp::{{PreFix}}Application>) 56 @extends gio::Application, gtk::Application, 57 @implements gio::ActionGroup, gio::ActionMap; 58 } 59 60 impl {{PreFix}}Application { new(application_id: &str, flags: &gio::ApplicationFlags) -> Self61 pub fn new(application_id: &str, flags: &gio::ApplicationFlags) -> Self { 62 glib::Object::new(&[("application-id", &application_id), ("flags", flags)]) 63 .expect("Failed to create {{PreFix}}Application") 64 } 65 setup_gactions(&self)66 fn setup_gactions(&self) { 67 let quit_action = gio::SimpleAction::new("quit", None); 68 quit_action.connect_activate(clone!(@weak self as app => move |_, _| { 69 app.quit(); 70 })); 71 self.add_action(&quit_action); 72 73 let about_action = gio::SimpleAction::new("about", None); 74 about_action.connect_activate(clone!(@weak self as app => move |_, _| { 75 app.show_about(); 76 })); 77 self.add_action(&about_action); 78 } 79 show_about(&self)80 fn show_about(&self) { 81 let window = self.active_window().unwrap(); 82 let dialog = gtk::AboutDialogBuilder::new() 83 .transient_for(&window) 84 .modal(true) 85 .program_name("{{name}}") 86 .version(VERSION) 87 .authors(vec!["{{author}}".into()]) 88 .build(); 89 90 dialog.present(); 91 } 92 } 93