ShowWidget: Initial prototype of an undo notification.
This commit is contained in:
@@ -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<Action>) -> Result<(), Error> {
|
||||
fn on_played_button_clicked(
|
||||
pd: Arc<Podcast>,
|
||||
notif: >k::Revealer,
|
||||
label: >k::Label,
|
||||
undo: >k::Button,
|
||||
sender: Sender<Action>,
|
||||
) {
|
||||
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<Action>) -> Result<(), Error> {
|
||||
dbqueries::update_none_to_played_now(pd)?;
|
||||
sender.send(Action::RefreshWidget)?;
|
||||
Ok(())
|
||||
|
||||
Reference in New Issue
Block a user