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.
168 lines
3.8 KiB
Rust
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()
|
|
}
|
|
}
|