podcasts/hammond-gtk/src/widgets/player.rs
Jordan Petridis 0d22a2e53d
PlayerWidget: Wire the widget to the GUI.
This commit also removes the majority of the playback widget,
though most of it's code will make it to the PlayerWidget once
it starts to get wired to the gtreamer_plaer::Player.
2018-06-13 22:38:28 +03:00

168 lines
3.8 KiB
Rust

#![allow(warnings)]
use gstreamer_player as gst;
use gstreamer::ClockTime;
use gtk;
use gtk::prelude::*;
use failure::Error;
pub trait PlayerExt {
fn play(&self);
fn pause(&self);
fn seek(&self, position: ClockTime);
fn fast_forward(&self);
fn rewind(&self);
// TODO: change playback rate
// fn set_playback_rate(&self);
}
#[derive(Debug, Clone)]
struct PlayerInfo {
container: gtk::Box,
show: gtk::Label,
episode: gtk::Label,
cover: gtk::Image,
}
impl PlayerInfo {
fn init(&self) -> Result<(), Error> {
unimplemented!()
}
}
#[derive(Debug, Clone)]
struct PlayerTimes {
container: gtk::Box,
progressed: gtk::Label,
duration: gtk::Label,
separator: gtk::Label,
scalebar: gtk::Scale,
}
#[derive(Debug, Clone)]
// FIXME: This is a mock till stuff get sorted out.
enum PlayerState {
Playing,
Paused,
Ready,
}
#[derive(Debug, Clone)]
struct PlayerControls {
container: gtk::Box,
play: gtk::Button,
pause: gtk::Button,
forward: gtk::Button,
rewind: gtk::Button,
// state: PlayerState,
}
#[derive(Debug, Clone)]
pub struct PlayerWidget {
pub action_bar: gtk::ActionBar,
player: gst::Player,
controls: PlayerControls,
timer: PlayerTimes,
info: PlayerInfo,
}
impl Default for PlayerWidget {
fn default() -> Self {
let builder = gtk::Builder::new_from_resource("/org/gnome/Hammond/gtk/player_toolbar.ui");
let player = gst::Player::new(None, None);
let action_bar = builder.get_object("action_bar").unwrap();
let buttons = builder.get_object("buttons").unwrap();
let play = builder.get_object("play_button").unwrap();
let pause = builder.get_object("pause_button").unwrap();
let forward = builder.get_object("ff_button").unwrap();
let rewind = builder.get_object("rewind_button").unwrap();
let controls = PlayerControls {
container: buttons,
play,
pause,
forward,
rewind,
// state: PlayerState::Ready,
};
let timer_container = builder.get_object("timer").unwrap();
let progressed = builder.get_object("progress_time_label").unwrap();
let duration = builder.get_object("total_duration_label").unwrap();
let separator = builder.get_object("separator").unwrap();
let scalebar = builder.get_object("seek").unwrap();
let timer = PlayerTimes {
container: timer_container,
progressed,
duration,
separator,
scalebar,
};
let labels = builder.get_object("info").unwrap();
let show = builder.get_object("show_label").unwrap();
let episode = builder.get_object("episode_label").unwrap();
let cover = builder.get_object("show_cover").unwrap();
let info = PlayerInfo {
container: labels,
show,
episode,
cover,
};
PlayerWidget {
player,
action_bar,
controls,
timer,
info,
}
}
}
impl PlayerWidget {
fn reveal(&self) {
self.action_bar.show();
}
}
impl PlayerExt for PlayerWidget {
fn play(&self) {
// assert the state is either ready or paused
// TODO: assert!()
self.reveal();
self.controls.pause.hide();
self.controls.play.show();
self.player.play();
}
fn pause(&self) {
// assert the state is paused
// TODO: assert!()
self.controls.pause.show();
self.controls.play.hide();
self.player.pause();
}
fn seek(&self, position: ClockTime) {
self.player.seek(position);
}
// FIXME
fn rewind(&self) {
// self.seek()
}
// FIXME
fn fast_forward(&self) {
// self.seek()
}
}