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