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();
};
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);

View file

@ -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<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 {}

View file

@ -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::<Option<DesktopAppInfo>>().expect("Failed to convert value to DesktopAppInfo").unwrap();
let window = self_.root().unwrap().downcast::<Window>().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::<BoxedWindowList>().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::<BoxedWindowList>().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();
}));
}
}