From 911dcbac9fa7982eb7466007888add47147c95f0 Mon Sep 17 00:00:00 2001 From: Jordan Petridis Date: Tue, 14 Aug 2018 06:22:02 +0300 Subject: [PATCH] InAppNotif: Pass revealer to the callback Let the callback handle if/when the visibility of the notification --- podcasts-gtk/src/app.rs | 5 ++++- podcasts-gtk/src/widgets/appnotif.rs | 5 ++--- podcasts-gtk/src/widgets/show_menu.rs | 27 +++++++++++++++++---------- 3 files changed, 23 insertions(+), 14 deletions(-) diff --git a/podcasts-gtk/src/app.rs b/podcasts-gtk/src/app.rs index 68d946d..fe8051a 100644 --- a/podcasts-gtk/src/app.rs +++ b/podcasts-gtk/src/app.rs @@ -305,7 +305,10 @@ impl App { } Action::ErrorNotification(err) => { error!("An error notification was triggered: {}", err); - let callback = || glib::Continue(false); + let callback = |revealer: gtk::Revealer| { + revealer.set_reveal_child(false); + glib::Continue(false) + }; let undo_cb: Option = None; let notif = InAppNotification::new(&err, 6, callback, undo_cb); notif.show(&self.overlay); diff --git a/podcasts-gtk/src/widgets/appnotif.rs b/podcasts-gtk/src/widgets/appnotif.rs index 71981e7..3b350ea 100644 --- a/podcasts-gtk/src/widgets/appnotif.rs +++ b/podcasts-gtk/src/widgets/appnotif.rs @@ -46,7 +46,7 @@ impl InAppNotification { undo_callback: Option, ) -> Self where - F: FnMut() -> glib::Continue + 'static, + F: FnMut(gtk::Revealer) -> glib::Continue + 'static, U: Fn() + 'static, { let notif = InAppNotification::default(); @@ -65,8 +65,7 @@ impl InAppNotification { None => return glib::Continue(false), }; - revealer.set_reveal_child(false); - callback() + callback(revealer) }); let id = Rc::new(RefCell::new(Some(id))); diff --git a/podcasts-gtk/src/widgets/show_menu.rs b/podcasts-gtk/src/widgets/show_menu.rs index 3407b38..95ef3a3 100644 --- a/podcasts-gtk/src/widgets/show_menu.rs +++ b/podcasts-gtk/src/widgets/show_menu.rs @@ -137,11 +137,14 @@ fn mark_all_watched(pd: &Show, sender: &Sender) -> Result<(), Error> { pub(crate) fn mark_all_notif(pd: Arc, sender: &Sender) -> InAppNotification { let id = pd.id(); - let callback = clone!(sender => move || { - let res = mark_all_watched(&pd, &sender); + let sender_ = sender.clone(); + let callback = move |revealer: gtk::Revealer| { + let res = mark_all_watched(&pd, &sender_); debug_assert!(res.is_ok()); + + revealer.set_reveal_child(false); glib::Continue(false) - }); + }; let undo_callback = clone!(sender => move || sender.send(Action::RefreshWidgetIfSame(id))); let text = i18n("Marked all episodes as listened"); @@ -154,21 +157,25 @@ pub(crate) fn remove_show_notif(pd: Arc, sender: Sender) -> InAppN let res = utils::ignore_show(pd.id()); debug_assert!(res.is_ok()); - let callback = clone!(pd, sender => move || { - let res = utils::uningore_show(pd.id()); + let sender_ = sender.clone(); + let pd_ = pd.clone(); + let callback = move |revealer: gtk::Revealer| { + let res = utils::uningore_show(pd_.id()); debug_assert!(res.is_ok()); // Spawn a thread so it won't block the ui. - rayon::spawn(clone!(pd, sender => move || { - delete_show(&pd) + rayon::spawn(clone!(pd_, sender_ => move || { + delete_show(&pd_) .map_err(|err| error!("Error: {}", err)) - .map_err(|_| error!("Failed to delete {}", pd.title())) + .map_err(|_| error!("Failed to delete {}", pd_.title())) .ok(); - sender.send(Action::RefreshEpisodesView); + sender_.send(Action::RefreshEpisodesView); })); + + revealer.set_reveal_child(false); glib::Continue(false) - }); + }; let undo_callback = move || { let res = utils::uningore_show(pd.id());