From 69b7ab5906dbbc9fa22411f5477160a5ad25ee31 Mon Sep 17 00:00:00 2001 From: Ashley Wulber Date: Tue, 4 Jan 2022 15:46:43 -0500 Subject: [PATCH] hide dock popover menu on menu selection --- examples/dock/dock_item/mod.rs | 10 ++++++++++ examples/dock/dock_popover/imp.rs | 20 +++++++++++++++++++- examples/dock/dock_popover/mod.rs | 19 +++++++++++++++---- 3 files changed, 44 insertions(+), 5 deletions(-) diff --git a/examples/dock/dock_item/mod.rs b/examples/dock/dock_item/mod.rs index 19776f5b..78440f71 100644 --- a/examples/dock/dock_item/mod.rs +++ b/examples/dock/dock_item/mod.rs @@ -66,6 +66,16 @@ impl DockItem { DockPopover::new(); }; popover.set_child(Some(&popover_menu)); + popover_menu + .connect_local( + "menu-hide", + false, + glib::clone!(@weak popover => @default-return None, move |_| { + popover.popdown(); + None + }), + ) + .unwrap(); let imp = imp::DockItem::from_instance(&self_); imp.image.replace(image); diff --git a/examples/dock/dock_popover/imp.rs b/examples/dock/dock_popover/imp.rs index 9e234dcf..ce349f6a 100644 --- a/examples/dock/dock_popover/imp.rs +++ b/examples/dock/dock_popover/imp.rs @@ -1,9 +1,12 @@ use std::cell::RefCell; use std::rc::Rc; +use glib::subclass::Signal; use gtk4::glib; +use gtk4::prelude::*; use gtk4::subclass::prelude::*; use gtk4::{Box, Button, ListBox, Revealer}; +use once_cell::sync::Lazy; use crate::dock_object::DockObject; @@ -27,7 +30,22 @@ impl ObjectSubclass for DockPopover { type ParentType = Box; } -impl ObjectImpl for DockPopover {} +impl ObjectImpl for DockPopover { + fn signals() -> &'static [Signal] { + static SIGNALS: Lazy> = Lazy::new(|| { + vec![Signal::builder( + // Signal name + "menu-hide", + // Types of the values which will be sent to the signal handler + &[], + // Type of the value the signal handler sends back + <()>::static_type().into(), + ) + .build()] + }); + SIGNALS.as_ref() + } +} impl WidgetImpl for DockPopover {} diff --git a/examples/dock/dock_popover/mod.rs b/examples/dock/dock_popover/mod.rs index d5634ea6..6233ed1f 100644 --- a/examples/dock/dock_popover/mod.rs +++ b/examples/dock/dock_popover/mod.rs @@ -194,6 +194,10 @@ impl DockPopover { imp.menu_handle.replace(menu_handle); } + fn emit_hide(&self) { + self.emit_by_name::<&str>("menu-hide", &[]).unwrap(); + } + fn setup_handlers(&self) { let imp = imp::DockPopover::from_instance(&self); let dock_object = imp.dock_object.borrow(); @@ -206,7 +210,8 @@ impl DockPopover { if let Some(dock_object) = dock_object.as_ref() { println!("setting up popover menu handlers"); - launch_new_item.connect_clicked(glib::clone!(@weak dock_object => move |self_| { + let self_ = self.clone(); + launch_new_item.connect_clicked(glib::clone!(@weak dock_object, => move |_| { let app_info = dock_object.property("appinfo").expect("DockObject must have appinfo property").get::>().expect("Failed to convert value to DesktopAppInfo").unwrap(); let window = self_.root().unwrap().downcast::().unwrap(); @@ -221,9 +226,11 @@ impl DockPopover { .build() .show(); } + self_.emit_hide(); })); - quit_all_item.connect_clicked(glib::clone!(@weak dock_object => move |self_| { + let self_ = self.clone(); + quit_all_item.connect_clicked(glib::clone!(@weak dock_object => move |_| { let active = dock_object.property("active").expect("DockObject must have active property").get::().expect("Failed to convert value to WindowList").0; for w in active { let entity = w.entity.clone(); @@ -233,10 +240,13 @@ impl DockPopover { } }); } + self_.emit_hide(); })); - favorite_item.connect_clicked(glib::clone!(@weak dock_object => move |self_| { + let self_ = self.clone(); + favorite_item.connect_clicked(glib::clone!(@weak dock_object => move |_| { println!("TODO handling favorite"); + self_.emit_hide(); })); all_windows_header.connect_clicked( @@ -247,6 +257,7 @@ impl DockPopover { }), ); + let self_ = self.clone(); window_listbox.connect_row_activated(glib::clone!(@weak dock_object => move |_, item| { let active = dock_object.property("active").expect("DockObject must have active property").get::().expect("Failed to convert value to WindowList").0; let entity = active[usize::try_from(item.index()).unwrap()].entity.clone(); @@ -255,7 +266,7 @@ impl DockPopover { let _ = tx.send(Event::Activate(entity)).await; } }); - + self_.emit_hide(); })); } }