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.
This commit is contained in:
parent
1455772d4e
commit
0d22a2e53d
@ -31,241 +31,219 @@
|
|||||||
<property name="icon_name">media-seek-backward-symbolic</property>
|
<property name="icon_name">media-seek-backward-symbolic</property>
|
||||||
<property name="icon_size">1</property>
|
<property name="icon_size">1</property>
|
||||||
</object>
|
</object>
|
||||||
<object class="GtkRevealer" id="revealer">
|
<object class="GtkActionBar" id="action_bar">
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
<property name="transition_type">slide-up</property>
|
<property name="no_show_all">True</property>
|
||||||
|
<property name="valign">end</property>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkFrame" id="frame">
|
<object class="GtkBox" id="buttons">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
<property name="label_xalign">0.5</property>
|
<property name="halign">center</property>
|
||||||
<property name="label_yalign">0</property>
|
|
||||||
<property name="shadow_type">in</property>
|
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkActionBar" id="action_bar">
|
<object class="GtkButton" id="rewind_button">
|
||||||
|
<property name="width_request">42</property>
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="sensitive">False</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="receives_default">True</property>
|
||||||
|
<property name="tooltip_text" translatable="yes">Previous</property>
|
||||||
|
<property name="image">previous_image</property>
|
||||||
|
<property name="always_show_image">True</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">False</property>
|
||||||
|
<property name="position">0</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkButton" id="play_button">
|
||||||
|
<property name="width_request">60</property>
|
||||||
|
<property name="sensitive">False</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="receives_default">True</property>
|
||||||
|
<property name="tooltip_text" translatable="yes">Play</property>
|
||||||
|
<property name="image">play_image</property>
|
||||||
|
<property name="always_show_image">True</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">False</property>
|
||||||
|
<property name="position">1</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkButton" id="pause_button">
|
||||||
|
<property name="width_request">60</property>
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="sensitive">False</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="receives_default">True</property>
|
||||||
|
<property name="tooltip_text" translatable="yes">Play</property>
|
||||||
|
<property name="image">pause_image</property>
|
||||||
|
<property name="always_show_image">True</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">False</property>
|
||||||
|
<property name="position">2</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkButton" id="ff_button">
|
||||||
|
<property name="width_request">42</property>
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="sensitive">False</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="receives_default">True</property>
|
||||||
|
<property name="tooltip_text" translatable="yes">Next</property>
|
||||||
|
<property name="image">ff_image</property>
|
||||||
|
<property name="always_show_image">True</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">False</property>
|
||||||
|
<property name="position">3</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<style>
|
||||||
|
<class name="linked"/>
|
||||||
|
</style>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="position">0</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkBox" id="info">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="spacing">6</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkImage" id="show_cover">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
<property name="valign">end</property>
|
<property name="pixel_size">42</property>
|
||||||
|
<property name="icon_name">image-x-generic-symbolic</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">True</property>
|
||||||
|
<property name="position">0</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkBox">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="orientation">vertical</property>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkBox" id="buttons">
|
<object class="GtkLabel" id="show_label">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
<property name="halign">center</property>
|
<property name="label" translatable="yes">Show Title</property>
|
||||||
<child>
|
|
||||||
<object class="GtkButton" id="rewind_button">
|
|
||||||
<property name="width_request">42</property>
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="sensitive">False</property>
|
|
||||||
<property name="can_focus">True</property>
|
|
||||||
<property name="receives_default">True</property>
|
|
||||||
<property name="tooltip_text" translatable="yes">Previous</property>
|
|
||||||
<property name="image">previous_image</property>
|
|
||||||
<property name="always_show_image">True</property>
|
|
||||||
</object>
|
|
||||||
<packing>
|
|
||||||
<property name="expand">False</property>
|
|
||||||
<property name="fill">False</property>
|
|
||||||
<property name="position">0</property>
|
|
||||||
</packing>
|
|
||||||
</child>
|
|
||||||
<child>
|
|
||||||
<object class="GtkButton" id="play_button">
|
|
||||||
<property name="width_request">60</property>
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="sensitive">False</property>
|
|
||||||
<property name="can_focus">True</property>
|
|
||||||
<property name="receives_default">True</property>
|
|
||||||
<property name="tooltip_text" translatable="yes">Play</property>
|
|
||||||
<property name="image">play_image</property>
|
|
||||||
<property name="always_show_image">True</property>
|
|
||||||
</object>
|
|
||||||
<packing>
|
|
||||||
<property name="expand">False</property>
|
|
||||||
<property name="fill">False</property>
|
|
||||||
<property name="position">1</property>
|
|
||||||
</packing>
|
|
||||||
</child>
|
|
||||||
<child>
|
|
||||||
<object class="GtkButton" id="pause_button">
|
|
||||||
<property name="width_request">60</property>
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="sensitive">False</property>
|
|
||||||
<property name="can_focus">True</property>
|
|
||||||
<property name="receives_default">True</property>
|
|
||||||
<property name="tooltip_text" translatable="yes">Play</property>
|
|
||||||
<property name="image">pause_image</property>
|
|
||||||
<property name="always_show_image">True</property>
|
|
||||||
</object>
|
|
||||||
<packing>
|
|
||||||
<property name="expand">False</property>
|
|
||||||
<property name="fill">False</property>
|
|
||||||
<property name="position">2</property>
|
|
||||||
</packing>
|
|
||||||
</child>
|
|
||||||
<child>
|
|
||||||
<object class="GtkButton" id="ff_button">
|
|
||||||
<property name="width_request">42</property>
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="sensitive">False</property>
|
|
||||||
<property name="can_focus">True</property>
|
|
||||||
<property name="receives_default">True</property>
|
|
||||||
<property name="tooltip_text" translatable="yes">Next</property>
|
|
||||||
<property name="image">ff_image</property>
|
|
||||||
<property name="always_show_image">True</property>
|
|
||||||
</object>
|
|
||||||
<packing>
|
|
||||||
<property name="expand">False</property>
|
|
||||||
<property name="fill">False</property>
|
|
||||||
<property name="position">3</property>
|
|
||||||
</packing>
|
|
||||||
</child>
|
|
||||||
<style>
|
|
||||||
<class name="linked"/>
|
|
||||||
</style>
|
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">True</property>
|
||||||
<property name="position">0</property>
|
<property name="position">0</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkBox" id="info">
|
<object class="GtkLabel" id="episode_label">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
<property name="spacing">6</property>
|
<property name="label" translatable="yes">Episode Title</property>
|
||||||
<child>
|
|
||||||
<object class="GtkImage" id="show_cover">
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="can_focus">False</property>
|
|
||||||
<property name="pixel_size">42</property>
|
|
||||||
<property name="icon_name">image-x-generic-symbolic</property>
|
|
||||||
</object>
|
|
||||||
<packing>
|
|
||||||
<property name="expand">False</property>
|
|
||||||
<property name="fill">True</property>
|
|
||||||
<property name="position">0</property>
|
|
||||||
</packing>
|
|
||||||
</child>
|
|
||||||
<child>
|
|
||||||
<object class="GtkBox">
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="can_focus">False</property>
|
|
||||||
<property name="orientation">vertical</property>
|
|
||||||
<child>
|
|
||||||
<object class="GtkLabel" id="show_label">
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="can_focus">False</property>
|
|
||||||
<property name="label" translatable="yes">Show Title</property>
|
|
||||||
</object>
|
|
||||||
<packing>
|
|
||||||
<property name="expand">False</property>
|
|
||||||
<property name="fill">True</property>
|
|
||||||
<property name="position">0</property>
|
|
||||||
</packing>
|
|
||||||
</child>
|
|
||||||
<child>
|
|
||||||
<object class="GtkLabel" id="episode_label">
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="can_focus">False</property>
|
|
||||||
<property name="label" translatable="yes">Episode Title</property>
|
|
||||||
</object>
|
|
||||||
<packing>
|
|
||||||
<property name="expand">False</property>
|
|
||||||
<property name="fill">True</property>
|
|
||||||
<property name="position">1</property>
|
|
||||||
</packing>
|
|
||||||
</child>
|
|
||||||
</object>
|
|
||||||
<packing>
|
|
||||||
<property name="expand">False</property>
|
|
||||||
<property name="fill">True</property>
|
|
||||||
<property name="position">1</property>
|
|
||||||
</packing>
|
|
||||||
</child>
|
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">True</property>
|
||||||
<property name="position">1</property>
|
<property name="position">1</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
|
||||||
<object class="GtkScale" id="seek">
|
|
||||||
<property name="height_request">0</property>
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="can_focus">True</property>
|
|
||||||
<property name="valign">end</property>
|
|
||||||
<property name="hexpand">True</property>
|
|
||||||
<property name="show_fill_level">True</property>
|
|
||||||
<property name="restrict_to_fill_level">False</property>
|
|
||||||
<property name="fill_level">-1</property>
|
|
||||||
<property name="digits">0</property>
|
|
||||||
<property name="draw_value">False</property>
|
|
||||||
<property name="has_origin">False</property>
|
|
||||||
<property name="value_pos">right</property>
|
|
||||||
</object>
|
|
||||||
<packing>
|
|
||||||
<property name="position">3</property>
|
|
||||||
</packing>
|
|
||||||
</child>
|
|
||||||
<child>
|
|
||||||
<object class="GtkBox" id="timer">
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="can_focus">False</property>
|
|
||||||
<property name="halign">start</property>
|
|
||||||
<property name="valign">center</property>
|
|
||||||
<property name="spacing">6</property>
|
|
||||||
<child>
|
|
||||||
<object class="GtkLabel" id="progress_time_label">
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="can_focus">False</property>
|
|
||||||
<property name="halign">start</property>
|
|
||||||
<property name="valign">center</property>
|
|
||||||
<property name="label">0:00</property>
|
|
||||||
</object>
|
|
||||||
<packing>
|
|
||||||
<property name="expand">False</property>
|
|
||||||
<property name="fill">False</property>
|
|
||||||
<property name="position">0</property>
|
|
||||||
</packing>
|
|
||||||
</child>
|
|
||||||
<child>
|
|
||||||
<object class="GtkLabel" id="separator">
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="can_focus">False</property>
|
|
||||||
<property name="halign">start</property>
|
|
||||||
<property name="valign">center</property>
|
|
||||||
<property name="label">/</property>
|
|
||||||
</object>
|
|
||||||
<packing>
|
|
||||||
<property name="expand">False</property>
|
|
||||||
<property name="fill">False</property>
|
|
||||||
<property name="position">1</property>
|
|
||||||
</packing>
|
|
||||||
</child>
|
|
||||||
<child>
|
|
||||||
<object class="GtkLabel" id="total_duration_label">
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="can_focus">False</property>
|
|
||||||
<property name="halign">start</property>
|
|
||||||
<property name="valign">center</property>
|
|
||||||
<property name="label">0:00</property>
|
|
||||||
</object>
|
|
||||||
<packing>
|
|
||||||
<property name="expand">False</property>
|
|
||||||
<property name="fill">False</property>
|
|
||||||
<property name="position">2</property>
|
|
||||||
</packing>
|
|
||||||
</child>
|
|
||||||
</object>
|
|
||||||
<packing>
|
|
||||||
<property name="position">4</property>
|
|
||||||
</packing>
|
|
||||||
</child>
|
|
||||||
</object>
|
</object>
|
||||||
</child>
|
<packing>
|
||||||
<child type="label_item">
|
<property name="expand">False</property>
|
||||||
<placeholder/>
|
<property name="fill">True</property>
|
||||||
|
<property name="position">1</property>
|
||||||
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="position">1</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkScale" id="seek">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="hexpand">True</property>
|
||||||
|
<property name="show_fill_level">True</property>
|
||||||
|
<property name="restrict_to_fill_level">False</property>
|
||||||
|
<property name="fill_level">-1</property>
|
||||||
|
<property name="digits">0</property>
|
||||||
|
<property name="draw_value">False</property>
|
||||||
|
<property name="has_origin">False</property>
|
||||||
|
<property name="value_pos">right</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="position">3</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkBox" id="timer">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="halign">start</property>
|
||||||
|
<property name="valign">center</property>
|
||||||
|
<property name="spacing">6</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel" id="progress_time_label">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="halign">start</property>
|
||||||
|
<property name="valign">center</property>
|
||||||
|
<property name="label">0:00</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">False</property>
|
||||||
|
<property name="position">0</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel" id="separator">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="halign">start</property>
|
||||||
|
<property name="valign">center</property>
|
||||||
|
<property name="label">/</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">False</property>
|
||||||
|
<property name="position">1</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel" id="total_duration_label">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="halign">start</property>
|
||||||
|
<property name="valign">center</property>
|
||||||
|
<property name="label">0:00</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">False</property>
|
||||||
|
<property name="position">2</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="position">4</property>
|
||||||
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
</interface>
|
</interface>
|
||||||
|
|||||||
@ -13,7 +13,7 @@
|
|||||||
<file compressed="true" preprocess="xml-stripblanks">gtk/inapp_notif.ui</file>
|
<file compressed="true" preprocess="xml-stripblanks">gtk/inapp_notif.ui</file>
|
||||||
<file compressed="true" preprocess="xml-stripblanks">gtk/menus.ui</file>
|
<file compressed="true" preprocess="xml-stripblanks">gtk/menus.ui</file>
|
||||||
<file compressed="true" preprocess="xml-stripblanks">gtk/help-overlay.ui</file>
|
<file compressed="true" preprocess="xml-stripblanks">gtk/help-overlay.ui</file>
|
||||||
<file compressed="true" preprocess="xml-stripblanks">gtk/playback.ui</file>
|
<file compressed="true" preprocess="xml-stripblanks">gtk/player_toolbar.ui</file>
|
||||||
<file compressed="true">gtk/style.css</file>
|
<file compressed="true">gtk/style.css</file>
|
||||||
</gresource>
|
</gresource>
|
||||||
</gresources>
|
</gresources>
|
||||||
|
|||||||
@ -5,8 +5,6 @@ use gio::{
|
|||||||
SimpleAction, SimpleActionExt,
|
SimpleAction, SimpleActionExt,
|
||||||
};
|
};
|
||||||
use glib;
|
use glib;
|
||||||
use gstreamer_player as gst;
|
|
||||||
use gstreamer::ClockTime;
|
|
||||||
use gtk;
|
use gtk;
|
||||||
use gtk::prelude::*;
|
use gtk::prelude::*;
|
||||||
use gtk::SettingsExt as GtkSettingsExt;
|
use gtk::SettingsExt as GtkSettingsExt;
|
||||||
@ -19,7 +17,7 @@ use settings::{self, WindowGeometry};
|
|||||||
use stacks::{Content, PopulatedState};
|
use stacks::{Content, PopulatedState};
|
||||||
use utils;
|
use utils;
|
||||||
use widgets::appnotif::{InAppNotification, UndoState};
|
use widgets::appnotif::{InAppNotification, UndoState};
|
||||||
use widgets::{about_dialog, mark_all_notif, remove_show_notif, Playback};
|
use widgets::{about_dialog, mark_all_notif, remove_show_notif, PlayerWidget};
|
||||||
|
|
||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
@ -56,9 +54,6 @@ pub enum Action {
|
|||||||
RemoveShow(Arc<Podcast>),
|
RemoveShow(Arc<Podcast>),
|
||||||
ErrorNotification(String),
|
ErrorNotification(String),
|
||||||
PlayEpisode(String),
|
PlayEpisode(String),
|
||||||
PlayerStateChanged(gst::PlayerState),
|
|
||||||
PlayerMediaChanged(Option<String>, ClockTime),
|
|
||||||
PlayerPositionChanged(ClockTime),
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
@ -103,8 +98,6 @@ impl App {
|
|||||||
Inhibit(false)
|
Inhibit(false)
|
||||||
}));
|
}));
|
||||||
|
|
||||||
let wrap = gtk::Box::new(gtk::Orientation::Vertical, 0);
|
|
||||||
window.add(&wrap);
|
|
||||||
|
|
||||||
// Create a content instance
|
// Create a content instance
|
||||||
let content =
|
let content =
|
||||||
@ -122,11 +115,17 @@ impl App {
|
|||||||
let overlay = gtk::Overlay::new();
|
let overlay = gtk::Overlay::new();
|
||||||
overlay.add(&content.get_stack());
|
overlay.add(&content.get_stack());
|
||||||
|
|
||||||
// Add the overlay to the main window
|
let wrap = gtk::Box::new(gtk::Orientation::Vertical, 0);
|
||||||
|
// Add the overlay to the main Box
|
||||||
wrap.add(&overlay);
|
wrap.add(&overlay);
|
||||||
|
|
||||||
let playback = Rc::new(Playback::new());
|
// FIXME: this should have a ::new() method instead.
|
||||||
wrap.add(playback.get_widget());
|
let player = PlayerWidget::default();
|
||||||
|
// Add the player to the main Box
|
||||||
|
wrap.add(&player.action_bar);
|
||||||
|
// player.reveal();
|
||||||
|
|
||||||
|
window.add(&wrap);
|
||||||
|
|
||||||
WindowGeometry::from_settings(&settings).apply(&window);
|
WindowGeometry::from_settings(&settings).apply(&window);
|
||||||
|
|
||||||
@ -135,23 +134,22 @@ impl App {
|
|||||||
window.show_all();
|
window.show_all();
|
||||||
window.activate();
|
window.activate();
|
||||||
|
|
||||||
let player = gst::Player::new(None, None);
|
// player.connect_error(clone!(sender => move |_,err| {
|
||||||
player.connect_error(clone!(sender => move |_,err| {
|
|
||||||
// Not the most user friendly...
|
// Not the most user friendly...
|
||||||
sender.send(Action::ErrorNotification(format!("Playback: {}", err))).ok();
|
// sender.send(Action::ErrorNotification(format!("Playback: {}", err))).ok();
|
||||||
}));
|
// }));
|
||||||
|
|
||||||
player.connect_state_changed(clone!(sender => move |_,state| {
|
// player.connect_state_changed(clone!(sender => move |_,state| {
|
||||||
sender.send(Action::PlayerStateChanged(state)).ok();
|
// sender.send(Action::PlayerStateChanged(state)).ok();
|
||||||
}));
|
// }));
|
||||||
|
|
||||||
player.connect_media_info_updated(clone!(sender => move |_,info| {
|
// player.connect_media_info_updated(clone!(sender => move |_,info| {
|
||||||
sender.send(Action::PlayerMediaChanged(info.get_title(), info.get_duration())).ok();
|
// sender.send(Action::PlayerMediaChanged(info.get_title(), info.get_duration())).ok();
|
||||||
}));
|
// }));
|
||||||
|
|
||||||
player.connect_property_position_notify(clone!(sender => move |p| {
|
// player.connect_property_position_notify(clone!(sender => move |p| {
|
||||||
sender.send(Action::PlayerPositionChanged(p.get_position())).ok();
|
// sender.send(Action::PlayerPositionChanged(p.get_position())).ok();
|
||||||
}));
|
// }));
|
||||||
|
|
||||||
gtk::timeout_add(50, clone!(sender, receiver => move || {
|
gtk::timeout_add(50, clone!(sender, receiver => move || {
|
||||||
// Uses receiver, content, header, sender, overlay, playback
|
// Uses receiver, content, header, sender, overlay, playback
|
||||||
@ -210,14 +208,7 @@ impl App {
|
|||||||
|| {}, UndoState::Hidden);
|
|| {}, UndoState::Hidden);
|
||||||
notif.show(&overlay);
|
notif.show(&overlay);
|
||||||
},
|
},
|
||||||
Ok(Action::PlayEpisode(uri)) => {
|
Ok(Action::PlayEpisode(_uri)) => (),
|
||||||
// This must be a 'real' (file://) uri not a path
|
|
||||||
player.set_uri(&uri);
|
|
||||||
player.play();
|
|
||||||
},
|
|
||||||
Ok(Action::PlayerStateChanged(state)) => playback.state_changed(state),
|
|
||||||
Ok(Action::PlayerMediaChanged(t, l)) => playback.media_changed(t, l),
|
|
||||||
Ok(Action::PlayerPositionChanged(t)) => playback.position_changed(t),
|
|
||||||
Err(_) => (),
|
Err(_) => (),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -5,7 +5,6 @@ mod episode;
|
|||||||
mod home_view;
|
mod home_view;
|
||||||
mod show;
|
mod show;
|
||||||
mod shows_view;
|
mod shows_view;
|
||||||
mod playback;
|
|
||||||
mod player;
|
mod player;
|
||||||
|
|
||||||
pub use self::aboutdialog::about_dialog;
|
pub use self::aboutdialog::about_dialog;
|
||||||
@ -15,4 +14,4 @@ pub use self::home_view::HomeView;
|
|||||||
pub use self::show::ShowWidget;
|
pub use self::show::ShowWidget;
|
||||||
pub use self::show::{mark_all_notif, remove_show_notif};
|
pub use self::show::{mark_all_notif, remove_show_notif};
|
||||||
pub use self::shows_view::ShowsView;
|
pub use self::shows_view::ShowsView;
|
||||||
pub use self::playback::Playback;
|
pub use self::player::PlayerWidget;
|
||||||
|
|||||||
@ -1,94 +0,0 @@
|
|||||||
use gstreamer::ClockTime;
|
|
||||||
use gstreamer_player as gst;
|
|
||||||
use gtk;
|
|
||||||
use gtk::prelude::*;
|
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
|
||||||
pub struct Playback {
|
|
||||||
reveal: gtk::Revealer,
|
|
||||||
container: gtk::Grid,
|
|
||||||
play: gtk::Button,
|
|
||||||
seek: gtk::Scale,
|
|
||||||
title: gtk::Label,
|
|
||||||
time: gtk::Label,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Default for Playback {
|
|
||||||
fn default() -> Self {
|
|
||||||
let builder = gtk::Builder::new_from_resource("/org/gnome/Hammond/gtk/playback.ui");
|
|
||||||
let container = builder.get_object("wrapper").unwrap();
|
|
||||||
let play = builder.get_object("play").unwrap();
|
|
||||||
let seek = builder.get_object("seek").unwrap();
|
|
||||||
let title = builder.get_object("title").unwrap();
|
|
||||||
let time = builder.get_object("time").unwrap();
|
|
||||||
|
|
||||||
let reveal = gtk::Revealer::new();
|
|
||||||
reveal.set_no_show_all(true);
|
|
||||||
reveal.add(&container);
|
|
||||||
|
|
||||||
Playback { reveal, container, play, seek, title, time }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Playback {
|
|
||||||
pub fn new() -> Playback {
|
|
||||||
Playback::default()
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn set_icon(&self, icon: &str) {
|
|
||||||
let image = gtk::Image::new_from_icon_name(icon, gtk::IconSize::Button.into());
|
|
||||||
self.play.set_image(Some(&image));
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn get_widget(&self) -> >k::Revealer {
|
|
||||||
&self.reveal
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn state_changed(&self, state: gst::PlayerState) {
|
|
||||||
// Once the playback controls are shown they don't go
|
|
||||||
// away again so show them unconditionally
|
|
||||||
self.reveal.show();
|
|
||||||
self.reveal.set_reveal_child(true);
|
|
||||||
match state {
|
|
||||||
gst::PlayerState::Buffering => {
|
|
||||||
println!("Buffering!!!!!!!");
|
|
||||||
},
|
|
||||||
gst::PlayerState::Stopped | gst::PlayerState::Paused => {
|
|
||||||
println!("Stopped/Paused");
|
|
||||||
self.set_icon("media-playback-start-symbolic");
|
|
||||||
},
|
|
||||||
gst::PlayerState::Playing => {
|
|
||||||
println!("Playing");
|
|
||||||
self.set_icon("media-playback-pause-symbolic");
|
|
||||||
},
|
|
||||||
_ => {
|
|
||||||
println!("Weird stuff");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn media_changed(&self, title: Option<String>, length: ClockTime) {
|
|
||||||
self.reveal.show();
|
|
||||||
self.reveal.set_reveal_child(true);
|
|
||||||
if let Some(title) = title {
|
|
||||||
self.title.set_label(&title);
|
|
||||||
} else {
|
|
||||||
self.title.set_label("");
|
|
||||||
}
|
|
||||||
if let Some(s) = length.seconds() {
|
|
||||||
let hours = s / 3600;
|
|
||||||
let s = s - (hours * 3600);
|
|
||||||
let mins = s / 60;
|
|
||||||
let s = s - (mins * 60);
|
|
||||||
// This is a little nasty
|
|
||||||
let t = format!("{}:{}:{}", hours, mins, s);
|
|
||||||
self.time.set_label(&t);
|
|
||||||
} else {
|
|
||||||
self.time.set_label("");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn position_changed(&self, _pos: ClockTime) {
|
|
||||||
println!("Tada!");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -25,6 +25,12 @@ struct PlayerInfo {
|
|||||||
cover: gtk::Image,
|
cover: gtk::Image,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl PlayerInfo {
|
||||||
|
fn init(&self) -> Result<(), Error> {
|
||||||
|
unimplemented!()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
struct PlayerTimes {
|
struct PlayerTimes {
|
||||||
container: gtk::Box,
|
container: gtk::Box,
|
||||||
@ -54,9 +60,8 @@ struct PlayerControls {
|
|||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct PlayerWidget {
|
pub struct PlayerWidget {
|
||||||
|
pub action_bar: gtk::ActionBar,
|
||||||
player: gst::Player,
|
player: gst::Player,
|
||||||
revealer: gtk::Revealer,
|
|
||||||
action_bar: gtk::ActionBar,
|
|
||||||
controls: PlayerControls,
|
controls: PlayerControls,
|
||||||
timer: PlayerTimes,
|
timer: PlayerTimes,
|
||||||
info: PlayerInfo,
|
info: PlayerInfo,
|
||||||
@ -66,7 +71,6 @@ impl Default for PlayerWidget {
|
|||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
let builder = gtk::Builder::new_from_resource("/org/gnome/Hammond/gtk/player_toolbar.ui");
|
let builder = gtk::Builder::new_from_resource("/org/gnome/Hammond/gtk/player_toolbar.ui");
|
||||||
let player = gst::Player::new(None, None);
|
let player = gst::Player::new(None, None);
|
||||||
let revealer = builder.get_object("revealer").unwrap();
|
|
||||||
let action_bar = builder.get_object("action_bar").unwrap();
|
let action_bar = builder.get_object("action_bar").unwrap();
|
||||||
|
|
||||||
let buttons = builder.get_object("buttons").unwrap();
|
let buttons = builder.get_object("buttons").unwrap();
|
||||||
@ -86,7 +90,7 @@ impl Default for PlayerWidget {
|
|||||||
|
|
||||||
let timer_container = builder.get_object("timer").unwrap();
|
let timer_container = builder.get_object("timer").unwrap();
|
||||||
let progressed = builder.get_object("progress_time_label").unwrap();
|
let progressed = builder.get_object("progress_time_label").unwrap();
|
||||||
let duration = builder.get_object("total_duration").unwrap();
|
let duration = builder.get_object("total_duration_label").unwrap();
|
||||||
let separator = builder.get_object("separator").unwrap();
|
let separator = builder.get_object("separator").unwrap();
|
||||||
let scalebar = builder.get_object("seek").unwrap();
|
let scalebar = builder.get_object("seek").unwrap();
|
||||||
let timer = PlayerTimes {
|
let timer = PlayerTimes {
|
||||||
@ -110,7 +114,6 @@ impl Default for PlayerWidget {
|
|||||||
|
|
||||||
PlayerWidget {
|
PlayerWidget {
|
||||||
player,
|
player,
|
||||||
revealer,
|
|
||||||
action_bar,
|
action_bar,
|
||||||
controls,
|
controls,
|
||||||
timer,
|
timer,
|
||||||
@ -121,8 +124,7 @@ impl Default for PlayerWidget {
|
|||||||
|
|
||||||
impl PlayerWidget {
|
impl PlayerWidget {
|
||||||
fn reveal(&self) {
|
fn reveal(&self) {
|
||||||
self.revealer.show();
|
self.action_bar.show();
|
||||||
self.revealer.set_reveal_child(true);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user