diff --git a/applets/cosmic-applet-status-area/src/main.rs b/applets/cosmic-applet-status-area/src/main.rs index e9d763bd..1e8283ba 100644 --- a/applets/cosmic-applet-status-area/src/main.rs +++ b/applets/cosmic-applet-status-area/src/main.rs @@ -2,7 +2,6 @@ use gtk4::{glib, prelude::*}; mod dbus_service; mod deref_cell; -mod popover_container; mod status_area; mod status_menu; mod status_notifier_watcher; diff --git a/applets/cosmic-applet-status-area/src/popover_container.rs b/applets/cosmic-applet-status-area/src/popover_container.rs deleted file mode 100644 index 2e551294..00000000 --- a/applets/cosmic-applet-status-area/src/popover_container.rs +++ /dev/null @@ -1,89 +0,0 @@ -use cascade::cascade; -use gtk4::{glib, prelude::*, subclass::prelude::*}; - -use crate::deref_cell::DerefCell; - -/// Unlike gtk4's `MenuButton`, this supports a custom child. -#[derive(Default)] -pub struct PopoverContainerInner { - child: DerefCell, - popover: DerefCell, -} - -#[glib::object_subclass] -impl ObjectSubclass for PopoverContainerInner { - const NAME: &'static str = "S76PopoverContainer"; - type ParentType = gtk4::Widget; - type Type = PopoverContainer; -} - -impl ObjectImpl for PopoverContainerInner { - fn constructed(&self, obj: &PopoverContainer) { - let popover = cascade! { - gtk4::Popover::new(); - ..set_parent(obj); - }; - - self.popover.set(popover); - } - - fn dispose(&self, _obj: &PopoverContainer) { - self.child.unparent(); - self.popover.unparent(); - } -} - -impl WidgetImpl for PopoverContainerInner { - fn measure( - &self, - _obj: &PopoverContainer, - orientation: gtk4::Orientation, - for_size: i32, - ) -> (i32, i32, i32, i32) { - self.child.measure(orientation, for_size) - } - - fn size_allocate(&self, _obj: &PopoverContainer, width: i32, height: i32, baseline: i32) { - self.child - .size_allocate(>k4::Allocation::new(0, 0, width, height), baseline); - self.popover.present(); - } - - fn focus(&self, _obj: &PopoverContainer, direction: gtk4::DirectionType) -> bool { - if self.popover.is_visible() { - self.popover.child_focus(direction) - } else { - self.child.child_focus(direction) - } - } -} - -glib::wrapper! { - pub struct PopoverContainer(ObjectSubclass) - @extends gtk4::Widget; -} - -impl PopoverContainer { - pub fn new>(child: &T) -> Self { - let obj = glib::Object::new::(&[]).unwrap(); - child.set_parent(&obj); - obj.inner().child.set(child.clone().upcast()); - obj - } - - fn inner(&self) -> &PopoverContainerInner { - PopoverContainerInner::from_instance(self) - } - - pub fn popover(&self) -> >k4::Popover { - &self.inner().popover - } - - pub fn popup(&self) { - self.popover().popup(); - } - - pub fn popdown(&self) { - self.popover().popdown(); - } -} diff --git a/applets/cosmic-applet-status-area/src/status_menu.rs b/applets/cosmic-applet-status-area/src/status_menu.rs index 7505ad17..83541a03 100644 --- a/applets/cosmic-applet-status-area/src/status_menu.rs +++ b/applets/cosmic-applet-status-area/src/status_menu.rs @@ -11,7 +11,6 @@ use zbus::dbus_proxy; use zvariant::OwnedValue; use crate::deref_cell::DerefCell; -use crate::popover_container::PopoverContainer; struct Menu { box_: gtk4::Box, @@ -20,8 +19,7 @@ struct Menu { #[derive(Default)] pub struct StatusMenuInner { - button: DerefCell, - popover_container: DerefCell, + menu_button: DerefCell, vbox: DerefCell, item: DerefCell>, dbus_menu: DerefCell>, @@ -45,25 +43,24 @@ impl ObjectImpl for StatusMenuInner { gtk4::Box::new(gtk4::Orientation::Vertical, 0); }; - let button = cascade! { - gtk4::ToggleButton::new(); + let popover = cascade! { + gtk4::Popover::new(); + ..set_child(Some(&vbox)); + }; + + let menu_button = cascade! { + gtk4::MenuButton::new(); ..set_has_frame(false); - }; - - let popover_container = cascade! { - PopoverContainer::new(&button); ..set_parent(obj); - ..popover().set_child(Some(&vbox)); - ..popover().bind_property("visible", &button, "active").flags(glib::BindingFlags::BIDIRECTIONAL).build(); + ..set_popover(Some(&popover)); }; - self.button.set(button); - self.popover_container.set(popover_container); + self.menu_button.set(menu_button); self.vbox.set(vbox); } fn dispose(&self, _obj: &StatusMenu) { - self.button.unparent(); + self.menu_button.unparent(); } } @@ -90,7 +87,7 @@ impl StatusMenu { .await?; let obj = glib::Object::new::(&[]).unwrap(); let icon_name = item.icon_name().await?; - obj.inner().button.set_icon_name(&icon_name); + obj.inner().menu_button.set_icon_name(&icon_name); let menu = item.menu().await?; let menu = DBusMenuProxy::builder(&connection) @@ -205,7 +202,7 @@ impl StatusMenu { ..connect_clicked(clone!(@weak self as self_ => move |_| { // XXX data, timestamp if close_on_click { - self_.inner().popover_container.popdown(); + self_.inner().menu_button.popdown(); } glib::MainContext::default().spawn_local(clone!(@strong self_ => async move { let _ = self_.inner().dbus_menu.event(id, "clicked", &0.into(), 0).await;