PlayerWiget: refactor the seekbar connect signal.

This commit is contained in:
Jordan Petridis 2018-06-15 13:52:33 +03:00
parent 70ab0824f4
commit 135323a6ee

View File

@ -189,7 +189,8 @@ impl PlayerWidget {
})); }));
Self::connect_timers(s); let slider_update_signal_id = Self::connect_update_seekbar_signal(s);
Self::connect_timers(s, slider_update_signal_id);
} }
fn reveal(&self) { fn reveal(&self) {
@ -227,35 +228,32 @@ impl PlayerWidget {
// FIXME: Refactor to use gst_player::Player instead of raw pipeline. // FIXME: Refactor to use gst_player::Player instead of raw pipeline.
// FIXME: Refactor the labels to use some kind of Human™ time/values. // FIXME: Refactor the labels to use some kind of Human™ time/values.
// Adapted from https://github.com/sdroege/gstreamer-rs/blob/f4d57a66522183d4927b47af422e8f321182111f/tutorials/src/bin/basic-tutorial-5.rs#L131-L164 // Adapted from https://github.com/sdroege/gstreamer-rs/blob/f4d57a66522183d4927b47af422e8f321182111f/tutorials/src/bin/basic-tutorial-5.rs#L131-L164
fn connect_timers(s: &Rc<Self>) { fn connect_timers(s: &Rc<Self>, update_signal_id: SignalHandlerId) {
let slider_update_signal_id = s.timer.scalebar.connect_value_changed(
clone!(s => move |slider| {
let pipeline = &s.player.get_pipeline();
let value = slider.get_value() as u64;
if let Err(_) = pipeline.seek_simple(
gst::SeekFlags::FLUSH | gst::SeekFlags::KEY_UNIT,
value * gst::SECOND,
) {
error!("Seeking to {} failed", value);
}
}),
);
// Update the PlayerTimes // Update the PlayerTimes
gtk::timeout_add( gtk::timeout_add(
250, 250,
clone!(s => move || { clone!(s => move || {
// TODO: use Player::connect_duration_changed() instead // TODO: use Player::connect_duration_changed() instead
s.on_duration_changed(&slider_update_signal_id); s.on_duration_changed(&update_signal_id);
// TODO: use Player::connect_position_updated() instead // TODO: use Player::connect_position_updated() instead
s.on_position_changed(&slider_update_signal_id); s.on_position_changed(&update_signal_id);
Continue(true) Continue(true)
}), }),
); );
} }
fn connect_update_seekbar_signal(s: &Rc<Self>) -> SignalHandlerId {
s.timer
.scalebar
.connect_value_changed(clone!(s => move |slider| {
let player = &s.player;
let value = slider.get_value() as u64;
player.seek(gst::ClockTime::from_seconds(value as u64));
}))
}
/// Update the duration `gtk::Label` and the max range of the `gtk::SclaeBar`. /// Update the duration `gtk::Label` and the max range of the `gtk::SclaeBar`.
fn on_duration_changed(&self, slider_update: &SignalHandlerId) { fn on_duration_changed(&self, slider_update: &SignalHandlerId) {
let pipeline = &self.player.get_pipeline(); let pipeline = &self.player.get_pipeline();