feat: popup positioning depending on panel anchor

This commit is contained in:
Ashley Wulber 2022-08-24 15:55:53 -04:00
parent ac0b555946
commit 59a112523d
No known key found for this signature in database
GPG key ID: 5216D4F46A90A820
7 changed files with 34 additions and 14 deletions

1
Cargo.lock generated
View file

@ -421,6 +421,7 @@ name = "cosmic-applet-notifications"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"cascade", "cascade",
"cosmic-panel-config",
"futures", "futures",
"gtk4", "gtk4",
"libadwaita", "libadwaita",

View file

@ -2,7 +2,7 @@
use crate::dock_list::DockList; use crate::dock_list::DockList;
use crate::dock_list::DockListType; use crate::dock_list::DockListType;
use cascade::cascade; use cascade::cascade;
use cosmic_panel_config::{CosmicPanelConfig, PanelAnchor}; use cosmic_panel_config::{PanelAnchor};
use gtk4::prelude::*; use gtk4::prelude::*;
use gtk4::subclass::prelude::*; use gtk4::subclass::prelude::*;
use gtk4::Orientation; use gtk4::Orientation;

View file

@ -17,3 +17,4 @@ serde = "1"
zbus = "2.0.1" zbus = "2.0.1"
zbus_names = "2" zbus_names = "2"
zvariant = "3" zvariant = "3"
cosmic-panel-config = {git = "https://github.com/pop-os/cosmic-panel", features = ["gtk4"] }

View file

@ -1,5 +1,6 @@
use gtk4::{glib, prelude::*}; use gtk4::{glib, prelude::*, PositionType};
use relm4_macros::view; use relm4_macros::view;
use cosmic_panel_config::PanelAnchor;
mod dbus_service; mod dbus_service;
mod deref_cell; mod deref_cell;
@ -31,7 +32,16 @@ fn main() {
window.show(); window.show();
// XXX show in correct place // XXX show in correct place
let notification_popover = NotificationPopover::new(&notifications); let position = std::env::var("COSMIC_PANEL_ANCHOR")
.ok()
.and_then(|anchor| anchor.parse::<PanelAnchor>().ok())
.map(|anchor| match anchor {
PanelAnchor::Left => PositionType::Right,
PanelAnchor::Right => PositionType::Left,
PanelAnchor::Top => PositionType::Bottom,
PanelAnchor::Bottom => PositionType::Top,
});
let notification_popover = NotificationPopover::new(&notifications, position);
notification_popover.set_parent(&applet_button); notification_popover.set_parent(&applet_button);
let main_loop = glib::MainLoop::new(None, false); let main_loop = glib::MainLoop::new(None, false);

View file

@ -2,7 +2,7 @@ use cascade::cascade;
use gtk4::{ use gtk4::{
glib::{self, clone}, glib::{self, clone},
prelude::*, prelude::*,
subclass::prelude::*, subclass::prelude::*, PositionType,
}; };
use std::cell::RefCell; use std::cell::RefCell;
@ -75,9 +75,11 @@ glib::wrapper! {
} }
impl NotificationPopover { impl NotificationPopover {
pub fn new(notifications: &Notifications) -> Self { pub fn new(notifications: &Notifications, position: Option<PositionType>) -> Self {
let obj = glib::Object::new::<Self>(&[]).unwrap(); let obj = glib::Object::new::<Self>(&[]).unwrap();
if let Some(position) = position {
obj.set_position(position);
}
let notification_widget = cascade! { let notification_widget = cascade! {
NotificationWidget::new(notifications); NotificationWidget::new(notifications);
}; };

View file

@ -1,5 +1,5 @@
use cosmic_panel_config::{CosmicPanelConfig, PanelSize}; use cosmic_panel_config::{PanelSize, PanelAnchor};
use gtk4::{glib, prelude::*, subclass::prelude::*}; use gtk4::{glib, prelude::*, subclass::prelude::*, PositionType};
use relm4_macros::view; use relm4_macros::view;
use crate::deref_cell::DerefCell; use crate::deref_cell::DerefCell;
@ -18,7 +18,6 @@ button.cosmic_applet_button {
#[derive(Default)] #[derive(Default)]
pub struct AppletButtonInner { pub struct AppletButtonInner {
menu_button: DerefCell<gtk4::MenuButton>, menu_button: DerefCell<gtk4::MenuButton>,
panel_config: DerefCell<CosmicPanelConfig>,
popover: DerefCell<gtk4::Popover>, popover: DerefCell<gtk4::Popover>,
} }
@ -31,6 +30,15 @@ impl ObjectSubclass for AppletButtonInner {
impl ObjectImpl for AppletButtonInner { impl ObjectImpl for AppletButtonInner {
fn constructed(&self, obj: &AppletButton) { fn constructed(&self, obj: &AppletButton) {
let position = std::env::var("COSMIC_PANEL_ANCHOR")
.ok()
.and_then(|anchor| anchor.parse::<PanelAnchor>().ok())
.map(|anchor| match anchor {
PanelAnchor::Left => PositionType::Right,
PanelAnchor::Right => PositionType::Left,
PanelAnchor::Top => PositionType::Bottom,
PanelAnchor::Bottom => PositionType::Top,
});
view! { view! {
menu_button = gtk4::MenuButton { menu_button = gtk4::MenuButton {
set_parent: obj, set_parent: obj,
@ -38,7 +46,6 @@ impl ObjectImpl for AppletButtonInner {
set_has_frame: false, set_has_frame: false,
#[wrap(Some)] #[wrap(Some)]
set_popover: popover = &gtk4::Popover { set_popover: popover = &gtk4::Popover {
// TODO: change if it can be positioned correctly?
set_has_arrow: false, set_has_arrow: false,
} }
}, },
@ -46,6 +53,9 @@ impl ObjectImpl for AppletButtonInner {
load_from_data: STYLE.as_bytes(), load_from_data: STYLE.as_bytes(),
} }
} }
if let Some(position) = position {
popover.set_position(position);
}
obj.set_layout_manager(Some(&gtk4::BinLayout::new())); obj.set_layout_manager(Some(&gtk4::BinLayout::new()));
obj.style_context() obj.style_context()
.add_provider(&provider, gtk4::STYLE_PROVIDER_PRIORITY_APPLICATION); .add_provider(&provider, gtk4::STYLE_PROVIDER_PRIORITY_APPLICATION);

View file

@ -1,7 +1,3 @@
use cosmic_panel_config::CosmicPanelConfig;
use gtk4::{glib, prelude::*, subclass::prelude::*};
use relm4_macros::view;
mod button; mod button;
pub use button::AppletButton; pub use button::AppletButton;
mod deref_cell; mod deref_cell;