X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fwx%2Fswaroop_controls.cc;h=909cb0dc46a8554d0eccff68785934f3bddcbe38;hb=e81d3bb9857d9de7ec9468a3efcb812042f5cef9;hp=538d349425f4b61dee7a965a0df4f39d7ac67b90;hpb=6349c88c4fb9d4ac76ef14b277d455e3a2b006a6;p=dcpomatic.git diff --git a/src/wx/swaroop_controls.cc b/src/wx/swaroop_controls.cc index 538d34942..909cb0dc4 100644 --- a/src/wx/swaroop_controls.cc +++ b/src/wx/swaroop_controls.cc @@ -22,9 +22,12 @@ #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 +#include using std::string; using std::cout; @@ -35,9 +38,10 @@ using boost::optional; SwaroopControls::SwaroopControls (wxWindow* parent, shared_ptr 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); @@ -49,10 +53,34 @@ SwaroopControls::SwaroopControls (wxWindow* parent, shared_ptr viewe 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); @@ -70,7 +98,9 @@ SwaroopControls::SwaroopControls (wxWindow* parent, shared_ptr viewe _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 (); @@ -105,9 +135,9 @@ SwaroopControls::setup_sensitivity () 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 @@ -136,30 +166,6 @@ SwaroopControls::log (wxString s) _log->SetValue(_log->GetValue() + ts + s + "\n"); } -void -SwaroopControls::image_changed (boost::weak_ptr weak_pv) -{ - shared_ptr pv = weak_pv.lock (); - if (!pv) { - return; - } - - shared_ptr c = pv->content().lock(); - if (!c) { - return; - } - - shared_ptr dc = dynamic_pointer_cast (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) { @@ -168,7 +174,11 @@ 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); } @@ -205,10 +215,24 @@ SwaroopControls::spl_selection_changed () 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 (new Film(optional())); + 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()) { @@ -217,10 +241,20 @@ SwaroopControls::spl_selection_changed () 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 (new Film(optional())); + film->add_content (_playlists[*_selected_playlist].get()[_selected_playlist_position].content); ResetFilm (film); } @@ -240,9 +274,24 @@ void SwaroopControls::set_film (shared_ptr 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 (); + } }