EpisodeWidget: Wire the cancel button.
This commit is contained in:
parent
1268fcf1cc
commit
9466c5ea10
@ -284,16 +284,46 @@ impl EpisodeWidget {
|
|||||||
|
|
||||||
// Check if the episode is being downloaded
|
// Check if the episode is being downloaded
|
||||||
let id = episode.rowid();
|
let id = episode.rowid();
|
||||||
let active_dl = || -> Result<Option<_>, Error> {
|
let active_dl = move || -> Result<Option<_>, Error> {
|
||||||
let m = manager::ACTIVE_DOWNLOADS
|
let m = manager::ACTIVE_DOWNLOADS
|
||||||
.read()
|
.read()
|
||||||
.map_err(|_| format_err!("Failed to get a lock on the mutex."))?;
|
.map_err(|_| format_err!("Failed to get a lock on the mutex."))?;
|
||||||
|
|
||||||
Ok(m.get(&id).cloned())
|
Ok(m.get(&id).cloned())
|
||||||
}()?;
|
};
|
||||||
|
|
||||||
|
if let Some(prog) = active_dl()? {
|
||||||
|
// FIXME: Add again the callback ugly hack that makes things work somehow
|
||||||
|
|
||||||
|
// Wire the cancel button
|
||||||
|
widget
|
||||||
|
.buttons
|
||||||
|
.cancel
|
||||||
|
.connect_clicked(clone!(prog, widget, sender => move |_| {
|
||||||
|
// Cancel the download
|
||||||
|
if let Ok(mut m) = prog.lock() {
|
||||||
|
m.cancel();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cancel is not instant so we have to wait a bit
|
||||||
|
timeout_add(50, clone!(widget, sender => move || {
|
||||||
|
if let Ok(thing) = active_dl() {
|
||||||
|
if thing.is_none() {
|
||||||
|
// Recalculate the widget state
|
||||||
|
dbqueries::get_episode_widget_from_rowid(id)
|
||||||
|
.map_err(From::from)
|
||||||
|
.and_then(|ep| Self::determine_buttons_state(&widget, &ep, &sender))
|
||||||
|
.map_err(|err| error!("Error: {}", err))
|
||||||
|
.ok();
|
||||||
|
|
||||||
|
return glib::Continue(false)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
glib::Continue(true)
|
||||||
|
}));
|
||||||
|
}));
|
||||||
|
|
||||||
if let Some(_dl) = active_dl {
|
|
||||||
// FIXME: Wire cancel button
|
|
||||||
// FIXME: Wire Total Size label
|
// FIXME: Wire Total Size label
|
||||||
|
|
||||||
// Change the widget layout/state
|
// Change the widget layout/state
|
||||||
@ -393,25 +423,6 @@ fn determine_media_state(
|
|||||||
});
|
});
|
||||||
gtk::timeout_add(250, callback);
|
gtk::timeout_add(250, callback);
|
||||||
|
|
||||||
lock.cancel_connect_clicked(clone!(prog, media_machine => move |_| {
|
|
||||||
if let Ok(mut m) = prog.lock() {
|
|
||||||
m.cancel();
|
|
||||||
}
|
|
||||||
|
|
||||||
if let Ok(mut lock) = media_machine.try_borrow_mut() {
|
|
||||||
if let Ok(episode) = dbqueries::get_episode_widget_from_rowid(id) {
|
|
||||||
take_mut::take(lock.deref_mut(), |media| {
|
|
||||||
media.determine_state(
|
|
||||||
episode.length(),
|
|
||||||
false,
|
|
||||||
episode.local_uri().is_some(),
|
|
||||||
)
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
drop(lock);
|
|
||||||
|
|
||||||
// Setup a callback that will update the progress bar.
|
// Setup a callback that will update the progress bar.
|
||||||
update_progressbar_callback(&prog, &media_machine, id);
|
update_progressbar_callback(&prog, &media_machine, id);
|
||||||
|
|
||||||
|
|||||||
@ -5,7 +5,6 @@
|
|||||||
// Wrap the types into Struct-tuples and imple deref so it won't be possible to pass
|
// Wrap the types into Struct-tuples and imple deref so it won't be possible to pass
|
||||||
// the wrong argument to the wrong position.
|
// the wrong argument to the wrong position.
|
||||||
|
|
||||||
use glib;
|
|
||||||
use gtk;
|
use gtk;
|
||||||
|
|
||||||
use gtk::prelude::*;
|
use gtk::prelude::*;
|
||||||
@ -190,10 +189,6 @@ impl<S> Progress<S> {
|
|||||||
self.local_size.set_text(local_size);
|
self.local_size.set_text(local_size);
|
||||||
self.bar.set_fraction(fraction);
|
self.bar.set_fraction(fraction);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn cancel_connect_clicked<F: Fn(>k::Button) + 'static>(&self, f: F) -> glib::SignalHandlerId {
|
|
||||||
self.cancel.connect_clicked(f)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
@ -354,17 +349,6 @@ impl ButtonsState {
|
|||||||
(PlayableWithoutSize(m), Some(s)) => Playable(m.into_playable(&s)),
|
(PlayableWithoutSize(m), Some(s)) => Playable(m.into_playable(&s)),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn cancel_connect_clicked<F: Fn(>k::Button) + 'static>(&self, f: F) -> glib::SignalHandlerId {
|
|
||||||
use self::ButtonsState::*;
|
|
||||||
|
|
||||||
match *self {
|
|
||||||
New(ref val) => val.progress.cancel_connect_clicked(f),
|
|
||||||
NewWithoutSize(ref val) => val.progress.cancel_connect_clicked(f),
|
|
||||||
Playable(ref val) => val.progress.cancel_connect_clicked(f),
|
|
||||||
PlayableWithoutSize(ref val) => val.progress.cancel_connect_clicked(f),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
@ -374,18 +358,6 @@ pub enum MediaMachine {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl MediaMachine {
|
impl MediaMachine {
|
||||||
pub fn cancel_connect_clicked<F: Fn(>k::Button) + 'static>(
|
|
||||||
&self,
|
|
||||||
f: F,
|
|
||||||
) -> glib::SignalHandlerId {
|
|
||||||
use self::MediaMachine::*;
|
|
||||||
|
|
||||||
match *self {
|
|
||||||
Initialized(ref val) => val.cancel_connect_clicked(f),
|
|
||||||
InProgress(ref val) => val.progress.cancel_connect_clicked(f),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn determine_state(self, bytes: Option<i32>, is_active: bool, is_downloaded: bool) -> Self {
|
pub fn determine_state(self, bytes: Option<i32>, is_active: bool, is_downloaded: bool) -> Self {
|
||||||
use self::ButtonsState::*;
|
use self::ButtonsState::*;
|
||||||
use self::MediaMachine::*;
|
use self::MediaMachine::*;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user