hide dock popover menu on menu selection
This commit is contained in:
parent
f258a48ac9
commit
69b7ab5906
3 changed files with 44 additions and 5 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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 {}
|
||||
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue