Set up an application quit action group

This ties together a menu item, closing the main window, and Ctrl-Q into
the same action, which is to quit the application.
This commit is contained in:
Savanni D'Gerinel 2024-02-19 11:58:01 -05:00
parent 56ff5527ba
commit c14b20b79e
2 changed files with 25 additions and 4 deletions

View File

@ -56,9 +56,8 @@ impl AppWindow {
.width_request(800) .width_request(800)
.height_request(746) .height_request(746)
.build(); .build();
window.connect_destroy({ window.connect_destroy(|s| {
let adw_app = adw_app.clone(); let _ = gtk::prelude::WidgetExt::activate_action(s, "app.quit", None);
move |_| adw_app.quit()
}); });
let stylesheet = String::from_utf8( let stylesheet = String::from_utf8(
@ -87,10 +86,22 @@ impl AppWindow {
let initial_view = View::Placeholder(PlaceholderView::default().upcast()); let initial_view = View::Placeholder(PlaceholderView::default().upcast());
let header_bar = adw::HeaderBar::new();
let main_menu = gio::Menu::new();
main_menu.append(Some("Quit"), Some("app.quit"));
let main_menu_button = gtk::MenuButton::builder()
.icon_name("open-menu")
.direction(gtk::ArrowType::Down)
.halign(gtk::Align::End)
.menu_model(&main_menu)
.build();
header_bar.pack_end(&main_menu_button);
layout.append(&initial_view.widget()); layout.append(&initial_view.widget());
let nav_layout = gtk::Box::new(gtk::Orientation::Vertical, 0); let nav_layout = gtk::Box::new(gtk::Orientation::Vertical, 0);
nav_layout.append(&adw::HeaderBar::new()); nav_layout.append(&header_bar);
nav_layout.append(&layout); nav_layout.append(&layout);
navigation.push( navigation.push(
&adw::NavigationPage::builder() &adw::NavigationPage::builder()

View File

@ -25,6 +25,8 @@ mod views;
use adw::prelude::*; use adw::prelude::*;
use app_window::AppWindow; use app_window::AppWindow;
use components::ActionGroup;
use gio::{Action, ActionEntry};
use std::{env, path::PathBuf}; use std::{env, path::PathBuf};
const APP_ID_DEV: &str = "com.luminescent-dreams.fitnesstrax.dev"; const APP_ID_DEV: &str = "com.luminescent-dreams.fitnesstrax.dev";
@ -65,6 +67,14 @@ fn main() {
let icon_theme = gtk::IconTheme::for_display(&gdk::Display::default().unwrap()); let icon_theme = gtk::IconTheme::for_display(&gdk::Display::default().unwrap());
icon_theme.add_resource_path(&(RESOURCE_BASE_PATH.to_owned() + "/icons/scalable/actions")); icon_theme.add_resource_path(&(RESOURCE_BASE_PATH.to_owned() + "/icons/scalable/actions"));
let app_close_action = ActionEntry::builder("quit")
.activate(|app: &adw::Application, _, _| {
app.quit();
})
.build();
adw_app.add_action_entries([app_close_action]);
adw_app.set_accels_for_action("app.quit", &["<Ctrl>Q"]);
AppWindow::new(app_id, RESOURCE_BASE_PATH, adw_app, ft_app.clone()); AppWindow::new(app_id, RESOURCE_BASE_PATH, adw_app, ft_app.clone());
}); });