#include "film_viewer.h"
#include "wx_util.h"
#include "content_view.h"
+#include "dcpomatic_button.h"
+#include "static_text.h"
#include "lib/player_video.h"
#include "lib/dcp_content.h"
#include <wx/listctrl.h>
+#include <wx/progdlg.h>
using std::string;
using std::cout;
SwaroopControls::SwaroopControls (wxWindow* parent, shared_ptr<FilmViewer> viewer)
: Controls (parent, viewer, false)
- , _play_button (new wxButton(this, wxID_ANY, _("Play")))
- , _pause_button (new wxButton(this, wxID_ANY, _("Pause")))
- , _stop_button (new wxButton(this, wxID_ANY, _("Stop")))
+ , _play_button (new Button(this, _("Play")))
+ , _pause_button (new Button(this, _("Pause")))
+ , _stop_button (new Button(this, _("Stop")))
+ , _current_disable_timeline (false)
{
_button_sizer->Add (_play_button, 0, wxEXPAND);
_button_sizer->Add (_pause_button, 0, wxEXPAND);
wxBoxSizer* left_sizer = new wxBoxSizer (wxVERTICAL);
wxBoxSizer* e_sizer = new wxBoxSizer (wxHORIZONTAL);
- left_sizer->Add (_spl_view, 1, wxALL | wxEXPAND, DCPOMATIC_SIZER_GAP);
+ wxFont subheading_font (*wxNORMAL_FONT);
+ subheading_font.SetWeight (wxFONTWEIGHT_BOLD);
- _content_view = new ContentView (this, _film);
- left_sizer->Add (_content_view, 1, wxALL | wxEXPAND, DCPOMATIC_SIZER_GAP);
+ wxBoxSizer* spl_header = new wxBoxSizer (wxHORIZONTAL);
+ {
+ wxStaticText* m = new StaticText (this, "Playlists");
+ m->SetFont (subheading_font);
+ spl_header->Add (m, 1, wxALIGN_CENTER_VERTICAL);
+ }
+ _refresh_spl_view = new Button (this, "Refresh");
+ spl_header->Add (_refresh_spl_view, 0, wxBOTTOM, DCPOMATIC_SIZER_GAP / 2);
+
+ left_sizer->Add (spl_header, 0, wxLEFT | wxRIGHT | wxEXPAND, DCPOMATIC_SIZER_GAP);
+ left_sizer->Add (_spl_view, 1, wxLEFT | wxRIGHT | wxBOTTOM | wxEXPAND, DCPOMATIC_SIZER_GAP);
+
+ _content_view = new ContentView (this);
+
+ wxBoxSizer* content_header = new wxBoxSizer (wxHORIZONTAL);
+ {
+ wxStaticText* m = new StaticText (this, "Content");
+ m->SetFont (subheading_font);
+ content_header->Add (m, 1, wxALIGN_CENTER_VERTICAL);
+ }
+ _refresh_content_view = new Button (this, "Refresh");
+ content_header->Add (_refresh_content_view, 0, wxBOTTOM, DCPOMATIC_SIZER_GAP / 2);
+
+ left_sizer->Add (content_header, 0, wxTOP | wxLEFT | wxRIGHT | wxEXPAND, DCPOMATIC_SIZER_GAP);
+ left_sizer->Add (_content_view, 1, wxLEFT | wxRIGHT | wxBOTTOM | wxEXPAND, DCPOMATIC_SIZER_GAP);
_current_spl_view = new wxListCtrl (this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLC_REPORT | wxLC_NO_HEADER);
_current_spl_view->AppendColumn (wxT(""), wxLIST_FORMAT_LEFT, 500);
_stop_button->Bind (wxEVT_BUTTON, boost::bind(&SwaroopControls::stop_clicked, this));
_spl_view->Bind (wxEVT_LIST_ITEM_SELECTED, boost::bind(&SwaroopControls::spl_selection_changed, this));
_spl_view->Bind (wxEVT_LIST_ITEM_DESELECTED, boost::bind(&SwaroopControls::spl_selection_changed, this));
- _viewer->ImageChanged.connect (boost::bind(&SwaroopControls::image_changed, this, _1));
+ _viewer->Finished.connect (boost::bind(&SwaroopControls::viewer_finished, this));
+ _refresh_spl_view->Bind (wxEVT_BUTTON, boost::bind(&SwaroopControls::update_playlist_directory, this));
+ _refresh_content_view->Bind (wxEVT_BUTTON, boost::bind(&ContentView::update, _content_view));
_content_view->update ();
update_playlist_directory ();
bool const active_job = _active_job && *_active_job != "examine_content";
bool const c = _film && !_film->content().empty() && !active_job;
_play_button->Enable (c && !_viewer->playing());
- _pause_button->Enable (c && (!_current_kind || _current_kind != dcp::ADVERTISEMENT) && _viewer->playing());
- _stop_button->Enable (c && (!_current_kind || _current_kind != dcp::ADVERTISEMENT));
- _slider->Enable (c && (!_current_kind || _current_kind != dcp::ADVERTISEMENT));
+ _pause_button->Enable (_viewer->playing());
+ _slider->Enable (!_current_disable_timeline);
+ _spl_view->Enable (!_viewer->playing());
}
void
_log->SetValue(_log->GetValue() + ts + s + "\n");
}
-void
-SwaroopControls::image_changed (boost::weak_ptr<PlayerVideo> weak_pv)
-{
- shared_ptr<PlayerVideo> pv = weak_pv.lock ();
- if (!pv) {
- return;
- }
-
- shared_ptr<Content> c = pv->content().lock();
- if (!c) {
- return;
- }
-
- shared_ptr<DCPContent> dc = dynamic_pointer_cast<DCPContent> (c);
- if (!dc) {
- return;
- }
-
- if (!_current_kind || *_current_kind != dc->content_kind()) {
- _current_kind = dc->content_kind ();
- setup_sensitivity ();
- }
-}
-
void
SwaroopControls::add_playlist_to_list (SPL spl)
{
wxListItem it;
it.SetId(N);
it.SetColumn(0);
- it.SetText (std_to_wx(spl.name()));
+ string t = spl.name();
+ if (spl.missing()) {
+ t += " (content missing)";
+ }
+ it.SetText (std_to_wx(t));
_spl_view->InsertItem (it);
}
long int selected = _spl_view->GetNextItem (-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
if (selected == -1) {
_current_spl_view->DeleteAllItems ();
+ _selected_playlist = boost::none;
return;
}
- shared_ptr<Film> film (new Film(optional<boost::filesystem::path>()));
+ if (_playlists[selected].missing()) {
+ error_dialog (this, "This playlist cannot be loaded as some content is missing.");
+ _selected_playlist = boost::none;
+ _spl_view->SetItemState (selected, 0, wxLIST_STATE_SELECTED);
+ return;
+ }
+
+ if (_playlists[selected].get().empty()) {
+ error_dialog (this, "This playlist is empty.");
+ return;
+ }
+
+
+ _current_spl_view->DeleteAllItems ();
int N = 0;
BOOST_FOREACH (SPLEntry i, _playlists[selected].get()) {
it.SetColumn (0);
it.SetText (std_to_wx(i.name));
_current_spl_view->InsertItem (it);
- film->add_content (i.content);
++N;
}
+ _selected_playlist = selected;
+ _selected_playlist_position = 0;
+ reset_film ();
+}
+
+void
+SwaroopControls::reset_film ()
+{
+ DCPOMATIC_ASSERT (_selected_playlist);
+ shared_ptr<Film> film (new Film(optional<boost::filesystem::path>()));
+ film->add_content (_playlists[*_selected_playlist].get()[_selected_playlist_position].content);
ResetFilm (film);
}
SwaroopControls::set_film (shared_ptr<Film> film)
{
Controls::set_film (film);
+ setup_sensitivity ();
+}
- _content_view->set_film (film);
- update_playlist_directory ();
+void
+SwaroopControls::viewer_finished ()
+{
+ if (!_selected_playlist) {
+ return;
+ }
- setup_sensitivity ();
+ ++_selected_playlist_position;
+
+ SPL const & playlist = _playlists[*_selected_playlist];
+
+ if (_selected_playlist_position < int(playlist.get().size())) {
+ _current_disable_timeline = playlist.get()[_selected_playlist_position].disable_timeline;
+ setup_sensitivity ();
+ reset_film ();
+ _viewer->start ();
+ }
}