diff --git a/hammond-gtk/resources/gtk/show_widget.ui b/hammond-gtk/resources/gtk/show_widget.ui index 4e71bf5..5bd1c86 100644 --- a/hammond-gtk/resources/gtk/show_widget.ui +++ b/hammond-gtk/resources/gtk/show_widget.ui @@ -68,167 +68,250 @@ Tobias Bernard - - 600 + True False - 32 - 32 - 32 - 32 - False - vertical - 24 + 600 True False - center - 12 - - - True - False - 128 - image-x-generic-symbolic - - - False - False - 0 - - + 32 + 32 + 32 + 32 + False + vertical + 24 True False - end - True - vertical - 6 - - + center + 12 + + True False - start - end - Show description - True - word-char - 100 - - - + 128 + image-x-generic-symbolic False False - 1 + 0 True False + end + True + vertical 6 - - + + True - True - True - - - True - False - center - center - emblem-system-symbolic - - + False + start + end + Show description + True + word-char + 100 + + + False - True - 0 - - - - - Website - True - True - True - center - center - - - False - True - 5 + False 1 - - Unsubscribe + True - True - True - center - center - + False + 6 + + + True + True + True + + + True + False + center + center + emblem-system-symbolic + + + + + False + True + 0 + + + + + Website + True + True + True + center + center + + + False + True + 5 + 1 + + + + + Unsubscribe + True + True + True + center + center + + + + False + True + 5 + end + 2 + + False - True - 5 + False end - 2 + 0 False - False - end - 0 + True + 1 False - True + False 1 + + + True + False + True + 0 + in + + + + + + + + + False + False + 2 + + - False - False - 0 + -1 - - + + True False - True - 0 - in + center + start - - - - + + True + False + + + True + False + center + center + 0 + none + + + True + False + center + center + 6 + 6 + 12 + + + True + False + center + center + An in-app action notification + + + False + False + 0 + + + + + Undo + True + True + True + center + center + + + False + False + end + 1 + + + + + + + + + + + + + -1 + - - False - False - 1 - diff --git a/hammond-gtk/src/widgets/show.rs b/hammond-gtk/src/widgets/show.rs index 2805907..bdd9ee0 100644 --- a/hammond-gtk/src/widgets/show.rs +++ b/hammond-gtk/src/widgets/show.rs @@ -1,5 +1,6 @@ use dissolve; use failure::Error; +use glib; use gtk; use gtk::prelude::*; use open; @@ -12,6 +13,8 @@ use app::Action; use utils::get_pixbuf_from_path; use widgets::episode::episodes_listbox; +use std::cell::RefCell; +use std::rc::Rc; use std::sync::Arc; use std::sync::mpsc::Sender; use std::thread; @@ -26,6 +29,9 @@ pub struct ShowWidget { settings: gtk::MenuButton, unsub: gtk::Button, episodes: gtk::Frame, + notif: gtk::Revealer, + notif_label: gtk::Label, + notif_undo: gtk::Button, } impl Default for ShowWidget { @@ -41,6 +47,10 @@ impl Default for ShowWidget { let link: gtk::Button = builder.get_object("link_button").unwrap(); let settings: gtk::MenuButton = builder.get_object("settings_button").unwrap(); + let notif: gtk::Revealer = builder.get_object("notif_revealer").unwrap(); + let notif_label: gtk::Label = builder.get_object("notif_label").unwrap(); + let notif_undo: gtk::Button = builder.get_object("undo_button").unwrap(); + ShowWidget { container, scrolled_window, @@ -50,6 +60,9 @@ impl Default for ShowWidget { link, settings, episodes, + notif, + notif_label, + notif_undo, } } } @@ -94,10 +107,11 @@ impl ShowWidget { let show_menu: gtk::Popover = builder.get_object("show_menu").unwrap(); let mark_all: gtk::ModelButton = builder.get_object("mark_all_watched").unwrap(); + let notif = self.notif.clone(); + let notif_label = self.notif_label.clone(); + let notif_undo = self.notif_undo.clone(); mark_all.connect_clicked(clone!(pd, sender => move |_| { - if let Err(err) = on_played_button_clicked(&pd, sender.clone()) { - error!("Failed to mark all episodes as watched: {}", err); - } + on_played_button_clicked(pd.clone(), ¬if, ¬if_label, ¬if_undo, sender.clone()) })); self.settings.set_popover(&show_menu); } @@ -154,7 +168,38 @@ fn on_unsub_button_clicked( Ok(()) } -fn on_played_button_clicked(pd: &Podcast, sender: Sender) -> Result<(), Error> { +fn on_played_button_clicked( + pd: Arc, + notif: >k::Revealer, + label: >k::Label, + undo: >k::Button, + sender: Sender, +) { + label.set_text("All episodes where marked as watched."); + notif.set_reveal_child(true); + + let id = timeout_add_seconds(10, move || { + if let Err(err) = wrap(&pd, sender.clone()) { + error!( + "Something went horribly wrong with the notif callback: {}", + err + ); + } + glib::Continue(false) + }); + + let id = Rc::new(RefCell::new(Some(id))); + + undo.connect_clicked(clone!(id, notif => move |_| { + let foo = id.borrow_mut().take(); + if let Some(id) = foo { + glib::source::source_remove(id); + notif.set_reveal_child(false); + } + })); +} + +fn wrap(pd: &Podcast, sender: Sender) -> Result<(), Error> { dbqueries::update_none_to_played_now(pd)?; sender.send(Action::RefreshWidget)?; Ok(())