hide dock popover menu on menu selection

This commit is contained in:
Ashley Wulber 2022-01-04 15:46:43 -05:00
parent f258a48ac9
commit 69b7ab5906
3 changed files with 44 additions and 5 deletions

View file

@ -66,6 +66,16 @@ impl DockItem {
DockPopover::new(); DockPopover::new();
}; };
popover.set_child(Some(&popover_menu)); 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_); let imp = imp::DockItem::from_instance(&self_);
imp.image.replace(image); imp.image.replace(image);

View file

@ -1,9 +1,12 @@
use std::cell::RefCell; use std::cell::RefCell;
use std::rc::Rc; use std::rc::Rc;
use glib::subclass::Signal;
use gtk4::glib; use gtk4::glib;
use gtk4::prelude::*;
use gtk4::subclass::prelude::*; use gtk4::subclass::prelude::*;
use gtk4::{Box, Button, ListBox, Revealer}; use gtk4::{Box, Button, ListBox, Revealer};
use once_cell::sync::Lazy;
use crate::dock_object::DockObject; use crate::dock_object::DockObject;
@ -27,7 +30,22 @@ impl ObjectSubclass for DockPopover {
type ParentType = Box; type ParentType = Box;
} }
impl ObjectImpl for DockPopover {} impl ObjectImpl for DockPopover {
fn signals() -> &'static [Signal] {
static SIGNALS: Lazy<Vec<Signal>> = 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 {} impl WidgetImpl for DockPopover {}

View file

@ -194,6 +194,10 @@ impl DockPopover {
imp.menu_handle.replace(menu_handle); imp.menu_handle.replace(menu_handle);
} }
fn emit_hide(&self) {
self.emit_by_name::<&str>("menu-hide", &[]).unwrap();
}
fn setup_handlers(&self) { fn setup_handlers(&self) {
let imp = imp::DockPopover::from_instance(&self); let imp = imp::DockPopover::from_instance(&self);
let dock_object = imp.dock_object.borrow(); let dock_object = imp.dock_object.borrow();
@ -206,7 +210,8 @@ impl DockPopover {
if let Some(dock_object) = dock_object.as_ref() { if let Some(dock_object) = dock_object.as_ref() {
println!("setting up popover menu handlers"); 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::<Option<DesktopAppInfo>>().expect("Failed to convert value to DesktopAppInfo").unwrap(); let app_info = dock_object.property("appinfo").expect("DockObject must have appinfo property").get::<Option<DesktopAppInfo>>().expect("Failed to convert value to DesktopAppInfo").unwrap();
let window = self_.root().unwrap().downcast::<Window>().unwrap(); let window = self_.root().unwrap().downcast::<Window>().unwrap();
@ -221,9 +226,11 @@ impl DockPopover {
.build() .build()
.show(); .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::<BoxedWindowList>().expect("Failed to convert value to WindowList").0; let active = dock_object.property("active").expect("DockObject must have active property").get::<BoxedWindowList>().expect("Failed to convert value to WindowList").0;
for w in active { for w in active {
let entity = w.entity.clone(); 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"); println!("TODO handling favorite");
self_.emit_hide();
})); }));
all_windows_header.connect_clicked( 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| { 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::<BoxedWindowList>().expect("Failed to convert value to WindowList").0; let active = dock_object.property("active").expect("DockObject must have active property").get::<BoxedWindowList>().expect("Failed to convert value to WindowList").0;
let entity = active[usize::try_from(item.index()).unwrap()].entity.clone(); let entity = active[usize::try_from(item.index()).unwrap()].entity.clone();
@ -255,7 +266,7 @@ impl DockPopover {
let _ = tx.send(Event::Activate(entity)).await; let _ = tx.send(Event::Activate(entity)).await;
} }
}); });
self_.emit_hide();
})); }));
} }
} }