From 079ae0e1f3cee8d5f7259dc330f613861ddb42f9 Mon Sep 17 00:00:00 2001 From: Zander Brown Date: Mon, 21 May 2018 13:01:06 +0100 Subject: [PATCH] Fallback to hamburger when the environment doesn't like app menus --- hammond-gtk/resources/gtk/headerbar.ui | 123 +------------------------ hammond-gtk/src/app.rs | 3 +- hammond-gtk/src/headerbar.rs | 27 ++++-- 3 files changed, 25 insertions(+), 128 deletions(-) diff --git a/hammond-gtk/resources/gtk/headerbar.ui b/hammond-gtk/resources/gtk/headerbar.ui index 8ad7d0b..b5306db 100644 --- a/hammond-gtk/resources/gtk/headerbar.ui +++ b/hammond-gtk/resources/gtk/headerbar.ui @@ -258,7 +258,8 @@ Tobias Bernard - True + False + True True False center @@ -284,125 +285,5 @@ Tobias Bernard False menu_toggle - - - True - False - 10 - 10 - 10 - 10 - vertical - - - True - False - True - False - Preferences - - - False - True - 0 - - - - - True - True - True - Check for new episodes - app.refresh - - - False - True - 1 - - - - - True - True - True - Import Shows - app.import - - - False - True - 2 - - - - - True - False - True - False - Export Shows - - - False - True - 3 - - - - - True - False - - - False - True - 4 - - - - - True - True - False - About - app.about - - - False - True - 6 - - - - - True - False - True - False - Help - - - False - True - 7 - - - - - True - False - True - False - Keyboard Shortcuts - - - False - True - 8 - - - - diff --git a/hammond-gtk/src/app.rs b/hammond-gtk/src/app.rs index 482eff3..f9ef7f1 100644 --- a/hammond-gtk/src/app.rs +++ b/hammond-gtk/src/app.rs @@ -118,7 +118,8 @@ impl App { "Content Initialization failed.")); // Create the headerbar - let header = Rc::new(Header::new(&content, &window, &sender)); + let local_menu = !app.prefers_app_menu(); + let header = Rc::new(Header::new(&content, &window, &sender, local_menu)); // Add the content main stack to the overlay. let overlay = gtk::Overlay::new(); diff --git a/hammond-gtk/src/headerbar.rs b/hammond-gtk/src/headerbar.rs index 6c98485..7632fe0 100644 --- a/hammond-gtk/src/headerbar.rs +++ b/hammond-gtk/src/headerbar.rs @@ -1,6 +1,7 @@ use glib; use gtk; use gtk::prelude::*; +use gio::MenuModel; use failure::Error; use failure::ResultExt; @@ -22,10 +23,12 @@ pub struct Header { switch: gtk::StackSwitcher, back: gtk::Button, show_title: gtk::Label, - export: gtk::ModelButton, update_box: gtk::Box, update_label: gtk::Label, update_spinner: gtk::Spinner, + menu_button: gtk::Button, + menu_popover: gtk::Popover, + app_menu: MenuModel } impl Default for Header { @@ -37,10 +40,13 @@ impl Default for Header { let switch = builder.get_object("switch").unwrap(); let back = builder.get_object("back").unwrap(); let show_title = builder.get_object("show_title").unwrap(); - let export = builder.get_object("export").unwrap(); let update_box = builder.get_object("update_notification").unwrap(); let update_label = builder.get_object("update_label").unwrap(); let update_spinner = builder.get_object("update_spinner").unwrap(); + let menu_button = builder.get_object("menu_toggle").unwrap(); + let menu_popover = builder.get_object("menu_popover").unwrap(); + let menus = gtk::Builder::new_from_resource("/org/gnome/Hammond/gtk/menus.ui"); + let app_menu = menus.get_object("app-menu").unwrap(); Header { container: header, @@ -48,23 +54,27 @@ impl Default for Header { switch, back, show_title, - export, update_box, update_label, update_spinner, + menu_button, + menu_popover, + app_menu, } } } // TODO: Refactor components into smaller state machines impl Header { - pub fn new(content: &Content, window: >k::ApplicationWindow, sender: &Sender) -> Header { + pub fn new(content: &Content, window: >k::ApplicationWindow, + sender: &Sender, local_menu: bool) -> Header { let h = Header::default(); - h.init(content, window, &sender); + h.init(content, window, &sender, local_menu); h } - pub fn init(&self, content: &Content, window: >k::ApplicationWindow, sender: &Sender) { + pub fn init(&self, content: &Content, window: >k::ApplicationWindow, + sender: &Sender, local_menu: bool) { let builder = gtk::Builder::new_from_resource("/org/gnome/Hammond/gtk/headerbar.ui"); let add_popover: gtk::Popover = builder.get_object("add_popover").unwrap(); @@ -105,6 +115,11 @@ impl Header { .ok(); }), ); + + if local_menu { + self.menu_popover.bind_model(Some(&self.app_menu), None); + self.menu_button.set_visible(true); + } } pub fn switch_to_back(&self, title: &str) {