WIP show notification

This commit is contained in:
Ian Douglas Scott 2021-09-09 07:38:18 -07:00
parent 17df83e611
commit cc8da887e6
3 changed files with 35 additions and 19 deletions

View file

@ -214,12 +214,12 @@ impl NotificationId {
#[derive(Debug)] #[derive(Debug)]
#[allow(dead_code)] #[allow(dead_code)]
pub struct Notification { pub struct Notification {
id: NotificationId, pub id: NotificationId,
app_name: String, pub app_name: String,
app_icon: String, // decode? pub app_icon: String, // decode?
summary: String, pub summary: String,
body: String, pub body: String,
actions: Vec<String>, // enum? pub actions: Vec<String>, // enum?
hints: Hints, hints: Hints,
} }

View file

@ -6,9 +6,11 @@ use gtk4::{
subclass::prelude::*, subclass::prelude::*,
}; };
use crate::application::PanelApp;
use crate::deref_cell::DerefCell; use crate::deref_cell::DerefCell;
use crate::mpris::MprisControls; use crate::mpris::MprisControls;
use crate::notification_popover::NotificationPopover; use crate::notification_popover::NotificationPopover;
use crate::notifications::Notification;
use crate::popover_container::PopoverContainer; use crate::popover_container::PopoverContainer;
#[derive(Default)] #[derive(Default)]
@ -97,8 +99,18 @@ glib::wrapper! {
} }
impl TimeButton { impl TimeButton {
pub fn new() -> Self { pub fn new(app: &PanelApp) -> Self {
glib::Object::new(&[]).unwrap() let obj = glib::Object::new::<Self>(&[]).unwrap();
let notifications = app.notifications().clone();
app.notifications()
.connect_notification_recieved(clone!(@weak obj => move |id| {
if let Some(notification) = notifications.get(id) {
obj.handle_notification(&notification);
}
}));
obj
} }
fn inner(&self) -> &TimeButtonInner { fn inner(&self) -> &TimeButtonInner {
@ -119,4 +131,12 @@ impl TimeButton {
.set_label(&time.format("%b %-d %-I:%M %p").to_string()); .set_label(&time.format("%b %-d %-I:%M %p").to_string());
// time.format("%B %-d %Y") // time.format("%B %-d %Y")
} }
fn handle_notification(&self, notification: &Notification) {
println!("{:?}", notification);
let popover = &self.inner().notification_popover;
popover.set_body(&notification.body);
popover.popup();
}
} }

View file

@ -31,6 +31,7 @@ fn button(text: &str) -> gtk4::Button {
pub struct PanelWindowInner { pub struct PanelWindowInner {
size: Cell<Option<(i32, i32)>>, size: Cell<Option<(i32, i32)>>,
monitor: DerefCell<gdk::Monitor>, monitor: DerefCell<gdk::Monitor>,
box_: DerefCell<gtk4::CenterBox>,
} }
#[glib::object_subclass] #[glib::object_subclass]
@ -49,7 +50,6 @@ impl ObjectImpl for PanelWindowInner {
..append(&button("Workspaces")); ..append(&button("Workspaces"));
..append(&button("Applications")); ..append(&button("Applications"));
})); }));
..set_center_widget(Some(&TimeButton::new()));
..set_end_widget(Some(&StatusArea::new())); ..set_end_widget(Some(&StatusArea::new()));
}; };
@ -58,6 +58,8 @@ impl ObjectImpl for PanelWindowInner {
..set_decorated(false); ..set_decorated(false);
..set_child(Some(&box_)); ..set_child(Some(&box_));
}; };
self.box_.set(box_);
} }
} }
@ -130,17 +132,11 @@ impl PanelWindow {
obj.set_size_request(monitor.geometry().width, 0); obj.set_size_request(monitor.geometry().width, 0);
obj.inner().monitor.set(monitor); obj.inner().monitor.set(monitor);
app.add_window(&obj); obj.inner()
.box_
.set_center_widget(Some(&TimeButton::new(app)));
let notifications = app.notifications().clone(); app.add_window(&obj);
app.notifications()
.connect_notification_recieved(clone!(@weak obj => move |id| {
let notification = notifications.get(id);
println!(
"{:?}",
notification
);
}));
obj obj
} }