From 6349c88c4fb9d4ac76ef14b277d455e3a2b006a6 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Tue, 20 Nov 2018 22:21:38 +0000 Subject: [PATCH] Separate Controls into standard/swaroop. --- src/lib/spl.cc | 2 + src/lib/spl.h | 5 + src/tools/dcpomatic_player.cc | 23 ++- src/wx/content_view.cc | 5 + src/wx/controls.cc | 257 ++-------------------------------- src/wx/controls.h | 62 +++----- src/wx/film_viewer.cc | 2 - src/wx/film_viewer.h | 1 - src/wx/standard_controls.cc | 76 ++++++++++ src/wx/standard_controls.h | 36 +++++ src/wx/swaroop_controls.cc | 248 ++++++++++++++++++++++++++++++++ src/wx/swaroop_controls.h | 63 +++++++++ src/wx/wscript | 2 + 13 files changed, 485 insertions(+), 297 deletions(-) create mode 100644 src/wx/standard_controls.cc create mode 100644 src/wx/standard_controls.h create mode 100644 src/wx/swaroop_controls.cc create mode 100644 src/wx/swaroop_controls.h diff --git a/src/lib/spl.cc b/src/lib/spl.cc index 544706694..74538aa99 100644 --- a/src/lib/spl.cc +++ b/src/lib/spl.cc @@ -23,7 +23,9 @@ #include #include #include +#include +using std::cout; using boost::shared_ptr; bool diff --git a/src/lib/spl.h b/src/lib/spl.h index b93a93041..a0b754f04 100644 --- a/src/lib/spl.h +++ b/src/lib/spl.h @@ -18,6 +18,9 @@ */ +#ifndef DCPOMATIC_SPL_H +#define DCPOMATIC_SPL_H + #include "spl_entry.h" class ContentStore; @@ -56,3 +59,5 @@ private: std::string _name; std::vector _spl; }; + +#endif diff --git a/src/tools/dcpomatic_player.cc b/src/tools/dcpomatic_player.cc index d00129a4c..40e386e07 100644 --- a/src/tools/dcpomatic_player.cc +++ b/src/tools/dcpomatic_player.cc @@ -27,7 +27,8 @@ #include "wx/update_dialog.h" #include "wx/player_config_dialog.h" #include "wx/verify_dcp_dialog.h" -#include "wx/controls.h" +#include "wx/standard_controls.h" +#include "wx/swaroop_controls.h" #include "lib/cross.h" #include "lib/config.h" #include "lib/util.h" @@ -80,6 +81,7 @@ using std::list; using std::exception; using std::vector; using boost::shared_ptr; +using boost::weak_ptr; using boost::scoped_array; using boost::optional; using boost::dynamic_pointer_cast; @@ -174,7 +176,13 @@ public: _overall_panel = new wxPanel (this, wxID_ANY); _viewer.reset (new FilmViewer (_overall_panel)); - _controls = new Controls (_overall_panel, _viewer, false); +#ifdef DCPOMATIC_VARIANT_SWAROOP + SwaroopControls* sc = new SwaroopControls (_overall_panel, _viewer); + _controls = sc; + sc->ResetFilm.connect (bind(&DOMFrame::reset_film_weak, this, _1)); +#else + _controls = new StandardControls (_overall_panel, _viewer, false); +#endif _viewer->set_dcp_decode_reduction (Config::instance()->decode_reduction ()); _viewer->PlaybackPermitted.connect (bind(&DOMFrame::playback_permitted, this)); _viewer->Started.connect (bind(&DOMFrame::playback_started, this, _1)); @@ -459,11 +467,21 @@ public: return optional(); } + void reset_film_weak (weak_ptr weak_film) + { + shared_ptr film = weak_film.lock (); + if (film) { + reset_film (film); + } + } + void reset_film (shared_ptr film = shared_ptr(new Film(optional()))) { _film = film; _viewer->set_film (_film); + _controls->set_film (_film); _film->Change.connect (bind(&DOMFrame::film_changed, this, _1, _2)); + _info->triggered_update (); } void film_changed (ChangeType type, Film::Property property) @@ -796,7 +814,6 @@ private: void setup_screen () { _controls->Show (_mode != Config::PLAYER_MODE_FULL); - _controls->show_extended_player_controls (_mode == Config::PLAYER_MODE_DUAL); _info->Show (_mode != Config::PLAYER_MODE_FULL); _overall_panel->SetBackgroundColour (_mode == Config::PLAYER_MODE_FULL ? wxColour(0, 0, 0) : wxNullColour); ShowFullScreen (_mode == Config::PLAYER_MODE_FULL); diff --git a/src/wx/content_view.cc b/src/wx/content_view.cc index f2117fc20..51473cb86 100644 --- a/src/wx/content_view.cc +++ b/src/wx/content_view.cc @@ -171,5 +171,10 @@ ContentView::get (string digest) const void ContentView::set_film (weak_ptr film) { + if (_film.lock() == film.lock()) { + return; + } + _film = film; + update (); } diff --git a/src/wx/controls.cc b/src/wx/controls.cc index cc9817b15..9fcdbd645 100644 --- a/src/wx/controls.cc +++ b/src/wx/controls.cc @@ -52,25 +52,18 @@ using boost::dynamic_pointer_cast; Controls::Controls (wxWindow* parent, shared_ptr viewer, bool editor_controls) : wxPanel (parent) + , _slider (new wxSlider (this, wxID_ANY, 0, 0, 4096)) , _viewer (viewer) , _slider_being_moved (false) , _was_running_before_slider (false) , _outline_content (0) , _eye (0) , _jump_to_selected (0) - , _slider (new wxSlider (this, wxID_ANY, 0, 0, 4096)) , _rewind_button (new wxButton (this, wxID_ANY, wxT("|<"))) , _back_button (new wxButton (this, wxID_ANY, wxT("<"))) , _forward_button (new wxButton (this, wxID_ANY, wxT(">"))) , _frame_number (new wxStaticText (this, wxID_ANY, wxT(""))) , _timecode (new wxStaticText (this, wxID_ANY, wxT(""))) -#ifdef DCPOMATIC_VARIANT_SWAROOP - , _play_button (new wxButton(this, wxID_ANY, _("Play"))) - , _pause_button (new wxButton(this, wxID_ANY, _("Pause"))) - , _stop_button (new wxButton(this, wxID_ANY, _("Stop"))) -#else - , _play_button (new wxToggleButton(this, wxID_ANY, _("Play"))) -#endif { _v_sizer = new wxBoxSizer (wxVERTICAL); SetSizer (_v_sizer); @@ -90,33 +83,6 @@ Controls::Controls (wxWindow* parent, shared_ptr viewer, bool editor _v_sizer->Add (view_options, 0, wxALL, DCPOMATIC_SIZER_GAP); - wxBoxSizer* left_sizer = new wxBoxSizer (wxVERTICAL); - - _spl_view = new wxListCtrl (this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLC_REPORT | wxLC_NO_HEADER); - _spl_view->AppendColumn (wxT(""), wxLIST_FORMAT_LEFT, 740); - left_sizer->Add (_spl_view, 1, wxALL | wxEXPAND, DCPOMATIC_SIZER_GAP); - - _content_view = new ContentView (this, _film); - left_sizer->Add (_content_view, 1, wxALL | wxEXPAND, DCPOMATIC_SIZER_GAP); - - wxBoxSizer* e_sizer = new wxBoxSizer (wxHORIZONTAL); - e_sizer->Add (left_sizer, 1, wxALL | 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); - _current_spl_view->AppendColumn (wxT(""), wxLIST_FORMAT_LEFT, 80); - e_sizer->Add (_current_spl_view, 1, wxALL | wxEXPAND, DCPOMATIC_SIZER_GAP); - - _v_sizer->Add (e_sizer, 1, wxEXPAND); - - _log = new wxTextCtrl (this, wxID_ANY, wxT(""), wxDefaultPosition, wxSize(-1, 200), wxTE_READONLY | wxTE_MULTILINE); - _v_sizer->Add (_log, 0, wxALL | wxEXPAND, DCPOMATIC_SIZER_GAP); - - _content_view->Show (false); - _spl_view->Show (false); - _current_spl_view->Show (false); - _log->Show (false); - wxBoxSizer* h_sizer = new wxBoxSizer (wxHORIZONTAL); wxBoxSizer* time_sizer = new wxBoxSizer (wxVERTICAL); @@ -127,11 +93,10 @@ Controls::Controls (wxWindow* parent, shared_ptr viewer, bool editor h_sizer->Add (_back_button, 0, wxALL, 2); h_sizer->Add (time_sizer, 0, wxEXPAND); h_sizer->Add (_forward_button, 0, wxALL, 2); - h_sizer->Add (_play_button, 0, wxEXPAND); -#ifdef DCPOMATIC_VARIANT_SWAROOP - h_sizer->Add (_pause_button, 0, wxEXPAND); - h_sizer->Add (_stop_button, 0, wxEXPAND); -#endif + + _button_sizer = new wxBoxSizer (wxHORIZONTAL); + h_sizer->Add (_button_sizer, 0, wxEXPAND); + h_sizer->Add (_slider, 1, wxEXPAND); _v_sizer->Add (h_sizer, 0, wxEXPAND | wxALL, 6); @@ -152,13 +117,6 @@ Controls::Controls (wxWindow* parent, shared_ptr viewer, bool editor _slider->Bind (wxEVT_SCROLL_PAGEUP, boost::bind(&Controls::slider_moved, this, true)); _slider->Bind (wxEVT_SCROLL_PAGEDOWN, boost::bind(&Controls::slider_moved, this, true)); _slider->Bind (wxEVT_SCROLL_CHANGED, boost::bind(&Controls::slider_released, this)); -#ifdef DCPOMATIC_VARIANT_SWAROOP - _play_button->Bind (wxEVT_BUTTON, boost::bind(&Controls::play_clicked, this)); - _pause_button->Bind (wxEVT_BUTTON, boost::bind(&Controls::pause_clicked, this)); - _stop_button->Bind (wxEVT_BUTTON, boost::bind(&Controls::stop_clicked, this)); -#else - _play_button->Bind (wxEVT_TOGGLEBUTTON, boost::bind(&Controls::play_clicked, this)); -#endif _rewind_button->Bind (wxEVT_LEFT_DOWN, boost::bind(&Controls::rewind_clicked, this, _1)); _back_button->Bind (wxEVT_LEFT_DOWN, boost::bind(&Controls::back_clicked, this, _1)); _forward_button->Bind (wxEVT_LEFT_DOWN, boost::bind(&Controls::forward_clicked, this, _1)); @@ -168,19 +126,14 @@ Controls::Controls (wxWindow* parent, shared_ptr viewer, bool editor _jump_to_selected->Bind (wxEVT_CHECKBOX, boost::bind (&Controls::jump_to_selected_clicked, this)); _jump_to_selected->SetValue (Config::instance()->jump_to_selected ()); } - _spl_view->Bind (wxEVT_LIST_ITEM_SELECTED, boost::bind(&Controls::spl_selection_changed, this)); - _spl_view->Bind (wxEVT_LIST_ITEM_DESELECTED, boost::bind(&Controls::spl_selection_changed, this)); _viewer->PositionChanged.connect (boost::bind(&Controls::position_changed, this)); _viewer->Started.connect (boost::bind(&Controls::started, this)); _viewer->Stopped.connect (boost::bind(&Controls::stopped, this)); - _viewer->FilmChanged.connect (boost::bind(&Controls::film_changed, this)); - _viewer->ImageChanged.connect (boost::bind(&Controls::image_changed, this, _1)); - film_changed (); + set_film (_viewer->film()); setup_sensitivity (); - update_playlist_directory (); JobManager::instance()->ActiveJobsChanged.connect ( bind (&Controls::active_jobs_changed, this, _2) @@ -191,63 +144,20 @@ Controls::Controls (wxWindow* parent, shared_ptr viewer, bool editor } void -Controls::spl_selection_changed () +Controls::config_changed (int) { - long int selected = _spl_view->GetNextItem (-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); - if (selected == -1) { - _current_spl_view->DeleteAllItems (); - return; - } - - shared_ptr film (new Film(optional())); - - int N = 0; - BOOST_FOREACH (SPLEntry i, _playlists[selected].get()) { - wxListItem it; - it.SetId (N); - it.SetColumn (0); - it.SetText (std_to_wx(i.name)); - _current_spl_view->InsertItem (it); - film->add_content (i.content); - ++N; - } - - _viewer->set_film (film); -} - -void -Controls::config_changed (int property) -{ - if (property == Config::PLAYER_CONTENT_DIRECTORY) { - _content_view->update (); - } else if (property == Config::PLAYER_PLAYLIST_DIRECTORY) { - update_playlist_directory (); - } else { - setup_sensitivity (); - } + setup_sensitivity (); } void Controls::started () { -#ifdef DCPOMATIC_VARIANT_SWAROOP - _play_button->Enable (false); - _pause_button->Enable (true); -#else - _play_button->SetValue (true); -#endif setup_sensitivity (); } void Controls::stopped () { -#ifdef DCPOMATIC_VARIANT_SWAROOP - _play_button->Enable (true); - _pause_button->Enable (false); -#else - _play_button->SetValue (false); -#endif setup_sensitivity (); } @@ -306,33 +216,6 @@ Controls::slider_released () _slider_being_moved = false; } -void -Controls::play_clicked () -{ -#ifdef DCPOMATIC_VARIANT_SWAROOP - _viewer->start (); -#else - check_play_state (); -#endif -} - - -#ifndef DCPOMATIC_VARIANT_SWAROOP -void -Controls::check_play_state () -{ - if (!_film || _film->video_frame_rate() == 0) { - return; - } - - if (_play_button->GetValue()) { - _viewer->start (); - } else { - _viewer->stop (); - } -} -#endif - void Controls::update_position_slider () { @@ -431,14 +314,6 @@ Controls::setup_sensitivity () _rewind_button->Enable (c); _back_button->Enable (c); _forward_button->Enable (c); -#ifdef DCPOMATIC_VARIANT_SWAROOP - _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)); -#else - _play_button->Enable (c); -#endif if (_outline_content) { _outline_content->Enable (c); } @@ -480,10 +355,8 @@ Controls::jump_to_selected_clicked () } void -Controls::film_changed () +Controls::set_film (shared_ptr film) { - shared_ptr film = _viewer->film (); - if (_film == film) { return; } @@ -494,9 +367,6 @@ Controls::film_changed () update_position_slider (); update_position_label (); - - _content_view->set_film (film); - _content_view->update (); } shared_ptr @@ -504,112 +374,3 @@ Controls::film () const { return _film; } - -void -Controls::show_extended_player_controls (bool s) -{ - _content_view->Show (s); - _spl_view->Show (s); - if (s) { - _content_view->update (); - update_playlist_directory (); - } - _current_spl_view->Show (s); - _log->Show (s); - _v_sizer->Layout (); -} - -void -Controls::add_playlist_to_list (SPL spl) -{ - int const N = _spl_view->GetItemCount(); - - wxListItem it; - it.SetId(N); - it.SetColumn(0); - it.SetText (std_to_wx(spl.name())); - _spl_view->InsertItem (it); -} - -void -Controls::update_playlist_directory () -{ - if (!_spl_view->IsShown()) { - return; - } - - using namespace boost::filesystem; - - _spl_view->DeleteAllItems (); - optional dir = Config::instance()->player_playlist_directory(); - if (!dir) { - return; - } - - for (directory_iterator i = directory_iterator(*dir); i != directory_iterator(); ++i) { - try { - if (is_regular_file(i->path()) && i->path().extension() == ".xml") { - SPL spl; - spl.read (i->path(), _content_view); - _playlists.push_back (spl); - add_playlist_to_list (spl); - } - } catch (exception& e) { - /* Never mind */ - } - } -} - -#ifdef DCPOMATIC_VARIANT_SWAROOP -void -Controls::pause_clicked () -{ - _viewer->stop (); -} - -void -Controls::stop_clicked () -{ - _viewer->stop (); - _viewer->seek (DCPTime(), true); -} -#endif - -void -Controls::log (wxString s) -{ - struct timeval time; - gettimeofday (&time, 0); - char buffer[64]; - time_t const sec = time.tv_sec; - struct tm* t = localtime (&sec); - strftime (buffer, 64, "%c", t); - wxString ts = std_to_wx(string(buffer)) + N_(": "); - _log->SetValue(_log->GetValue() + ts + s + "\n"); -} - -void -Controls::image_changed (boost::weak_ptr weak_pv) -{ -#ifdef DCPOMATIC_VARIANT_SWAROOP - 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 (); - } -#endif -} diff --git a/src/wx/controls.h b/src/wx/controls.h index 7cdd4a0d2..d70eb9432 100644 --- a/src/wx/controls.h +++ b/src/wx/controls.h @@ -18,6 +18,9 @@ */ +#ifndef DCPOMATIC_CONTROLS_H +#define DCPOMATIC_CONTROLS_H + #include "lib/dcpomatic_time.h" #include "lib/types.h" #include "lib/film.h" @@ -34,7 +37,6 @@ class PlayerVideo; class wxToggleButton; class wxListCtrl; class ContentView; -class SPL; namespace dcp { class CPL; @@ -49,14 +51,26 @@ public: bool editor_controls = true ); + virtual void set_film (boost::shared_ptr film); boost::shared_ptr film () const; void back_frame (); void forward_frame (); - void show_extended_player_controls (bool s); - void log (wxString s); +protected: + virtual void started (); + virtual void stopped (); + virtual void setup_sensitivity (); + virtual void config_changed (int property); + + wxSizer* _v_sizer; + wxBoxSizer* _button_sizer; + boost::shared_ptr _film; + wxSlider* _slider; + boost::shared_ptr _viewer; + boost::optional _active_job; private: + void update_position_label (); void update_position_slider (); void rewind_clicked (wxMouseEvent &); @@ -64,71 +78,33 @@ private: void forward_clicked (wxKeyboardState &); void slider_moved (bool page); void slider_released (); - void play_clicked (); void frame_number_clicked (); void jump_to_selected_clicked (); - void setup_sensitivity (); void timecode_clicked (); -#ifndef DCPOMATIC_PLAYER_SWAROOP - void check_play_state (); -#endif void active_jobs_changed (boost::optional); DCPTime nudge_amount (wxKeyboardState& ev); void image_changed (boost::weak_ptr); void outline_content_changed (); void eye_changed (); void position_changed (); - void started (); - void stopped (); - void film_changed (); - void update_content_directory (); - void update_playlist_directory (); - void config_changed (int property); - void spl_selection_changed (); typedef std::pair, boost::filesystem::path> CPL; -#ifdef DCPOMATIC_VARIANT_SWAROOP - void pause_clicked (); - void stop_clicked (); -#endif - void add_playlist_to_list (SPL spl); - - boost::shared_ptr _film; - boost::shared_ptr _viewer; - - wxSizer* _v_sizer; bool _slider_being_moved; bool _was_running_before_slider; wxCheckBox* _outline_content; wxChoice* _eye; wxCheckBox* _jump_to_selected; - ContentView* _content_view; - wxListCtrl* _spl_view; - wxListCtrl* _current_spl_view; - wxTextCtrl* _log; - std::vector _playlists; - wxSlider* _slider; wxButton* _rewind_button; wxButton* _back_button; wxButton* _forward_button; wxStaticText* _frame_number; wxStaticText* _timecode; -#ifdef DCPOMATIC_VARIANT_SWAROOP - wxButton* _play_button; - wxButton* _pause_button; - wxButton* _stop_button; -#else - wxToggleButton* _play_button; -#endif - boost::optional _active_job; ClosedCaptionsDialog* _closed_captions_dialog; -#ifdef DCPOMATIC_VARIANT_SWAROOP - boost::optional _current_kind; -#endif - boost::signals2::scoped_connection _config_changed_connection; }; + +#endif diff --git a/src/wx/film_viewer.cc b/src/wx/film_viewer.cc index b7227b59d..35b0663b0 100644 --- a/src/wx/film_viewer.cc +++ b/src/wx/film_viewer.cc @@ -122,8 +122,6 @@ FilmViewer::set_film (shared_ptr film) _film = film; - FilmChanged (); - _frame.reset (); _closed_captions_dialog->clear (); diff --git a/src/wx/film_viewer.h b/src/wx/film_viewer.h index 6f5df7e49..8b45048a7 100644 --- a/src/wx/film_viewer.h +++ b/src/wx/film_viewer.h @@ -93,7 +93,6 @@ public: boost::signals2::signal Started; boost::signals2::signal Stopped; boost::signals2::signal Seeked; - boost::signals2::signal FilmChanged; boost::signals2::signal PlaybackPermitted; diff --git a/src/wx/standard_controls.cc b/src/wx/standard_controls.cc new file mode 100644 index 000000000..956f82c96 --- /dev/null +++ b/src/wx/standard_controls.cc @@ -0,0 +1,76 @@ +/* + Copyright (C) 2018 Carl Hetherington + + This file is part of DCP-o-matic. + + DCP-o-matic is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + DCP-o-matic is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with DCP-o-matic. If not, see . + +*/ + +#include "standard_controls.h" +#include "film_viewer.h" +#include +#include + +using boost::shared_ptr; + +StandardControls::StandardControls (wxWindow* parent, shared_ptr viewer, bool editor_controls) + : Controls (parent, viewer, editor_controls) + , _play_button (new wxToggleButton(this, wxID_ANY, _("Play"))) +{ + _button_sizer->Add (_play_button, 0, wxEXPAND); + _play_button->Bind (wxEVT_TOGGLEBUTTON, boost::bind(&StandardControls::play_clicked, this)); +} + +void +StandardControls::started () +{ + Controls::started (); + _play_button->SetValue (true); +} + +void +StandardControls::stopped () +{ + Controls::stopped (); + _play_button->SetValue (false); +} + +void +StandardControls::play_clicked () +{ + check_play_state (); +} + +void +StandardControls::check_play_state () +{ + if (!_film || _film->video_frame_rate() == 0) { + return; + } + + if (_play_button->GetValue()) { + _viewer->start (); + } else { + _viewer->stop (); + } +} + +void +StandardControls::setup_sensitivity () +{ + Controls::setup_sensitivity (); + bool const active_job = _active_job && *_active_job != "examine_content"; + _play_button->Enable (_film && !_film->content().empty() && !active_job); +} diff --git a/src/wx/standard_controls.h b/src/wx/standard_controls.h new file mode 100644 index 000000000..b485c48cc --- /dev/null +++ b/src/wx/standard_controls.h @@ -0,0 +1,36 @@ +/* + Copyright (C) 2018 Carl Hetherington + + This file is part of DCP-o-matic. + + DCP-o-matic is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + DCP-o-matic is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with DCP-o-matic. If not, see . + +*/ + +#include "controls.h" + +class StandardControls : public Controls +{ +public: + StandardControls (wxWindow* parent, boost::shared_ptr viewer, bool editor_controls); + +private: + void check_play_state (); + void play_clicked (); + void started (); + void stopped (); + void setup_sensitivity (); + + wxToggleButton* _play_button; +}; diff --git a/src/wx/swaroop_controls.cc b/src/wx/swaroop_controls.cc new file mode 100644 index 000000000..538d34942 --- /dev/null +++ b/src/wx/swaroop_controls.cc @@ -0,0 +1,248 @@ +/* + Copyright (C) 2018 Carl Hetherington + + This file is part of DCP-o-matic. + + DCP-o-matic is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + DCP-o-matic is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with DCP-o-matic. If not, see . + +*/ + +#include "swaroop_controls.h" +#include "film_viewer.h" +#include "wx_util.h" +#include "content_view.h" +#include "lib/player_video.h" +#include "lib/dcp_content.h" +#include + +using std::string; +using std::cout; +using std::exception; +using boost::shared_ptr; +using boost::dynamic_pointer_cast; +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"))) +{ + _button_sizer->Add (_play_button, 0, wxEXPAND); + _button_sizer->Add (_pause_button, 0, wxEXPAND); + _button_sizer->Add (_stop_button, 0, wxEXPAND); + + _spl_view = new wxListCtrl (this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLC_REPORT | wxLC_NO_HEADER); + _spl_view->AppendColumn (wxT(""), wxLIST_FORMAT_LEFT, 740); + + wxBoxSizer* left_sizer = new wxBoxSizer (wxVERTICAL); + wxBoxSizer* e_sizer = new wxBoxSizer (wxHORIZONTAL); + + left_sizer->Add (_spl_view, 1, wxALL | wxEXPAND, DCPOMATIC_SIZER_GAP); + + _content_view = new ContentView (this, _film); + left_sizer->Add (_content_view, 1, wxALL | 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); + _current_spl_view->AppendColumn (wxT(""), wxLIST_FORMAT_LEFT, 80); + e_sizer->Add (left_sizer, 0, wxALL | wxEXPAND, DCPOMATIC_SIZER_GAP); + e_sizer->Add (_current_spl_view, 1, wxALL | wxEXPAND, DCPOMATIC_SIZER_GAP); + + _v_sizer->Add (e_sizer, 1, wxEXPAND); + + _log = new wxTextCtrl (this, wxID_ANY, wxT(""), wxDefaultPosition, wxSize(-1, 200), wxTE_READONLY | wxTE_MULTILINE); + _v_sizer->Add (_log, 0, wxALL | wxEXPAND, DCPOMATIC_SIZER_GAP); + + _play_button->Bind (wxEVT_BUTTON, boost::bind(&SwaroopControls::play_clicked, this)); + _pause_button->Bind (wxEVT_BUTTON, boost::bind(&SwaroopControls::pause_clicked, this)); + _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)); + + _content_view->update (); + update_playlist_directory (); +} + +void +SwaroopControls::started () +{ + Controls::started (); + _play_button->Enable (false); + _pause_button->Enable (true); +} + +void +SwaroopControls::stopped () +{ + Controls::stopped (); + _play_button->Enable (true); + _pause_button->Enable (false); +} + +void +SwaroopControls::play_clicked () +{ + _viewer->start (); +} + +void +SwaroopControls::setup_sensitivity () +{ + Controls::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)); +} + +void +SwaroopControls::pause_clicked () +{ + _viewer->stop (); +} + +void +SwaroopControls::stop_clicked () +{ + _viewer->stop (); + _viewer->seek (DCPTime(), true); +} + +void +SwaroopControls::log (wxString s) +{ + struct timeval time; + gettimeofday (&time, 0); + char buffer[64]; + time_t const sec = time.tv_sec; + struct tm* t = localtime (&sec); + strftime (buffer, 64, "%c", t); + wxString ts = std_to_wx(string(buffer)) + N_(": "); + _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) +{ + int const N = _spl_view->GetItemCount(); + + wxListItem it; + it.SetId(N); + it.SetColumn(0); + it.SetText (std_to_wx(spl.name())); + _spl_view->InsertItem (it); +} + +void +SwaroopControls::update_playlist_directory () +{ + using namespace boost::filesystem; + + _spl_view->DeleteAllItems (); + optional dir = Config::instance()->player_playlist_directory(); + if (!dir) { + return; + } + + _playlists.clear (); + + for (directory_iterator i = directory_iterator(*dir); i != directory_iterator(); ++i) { + try { + if (is_regular_file(i->path()) && i->path().extension() == ".xml") { + SPL spl; + spl.read (i->path(), _content_view); + _playlists.push_back (spl); + add_playlist_to_list (spl); + } + } catch (exception& e) { + /* Never mind */ + } + } +} + +void +SwaroopControls::spl_selection_changed () +{ + long int selected = _spl_view->GetNextItem (-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); + if (selected == -1) { + _current_spl_view->DeleteAllItems (); + return; + } + + shared_ptr film (new Film(optional())); + + int N = 0; + BOOST_FOREACH (SPLEntry i, _playlists[selected].get()) { + wxListItem it; + it.SetId (N); + it.SetColumn (0); + it.SetText (std_to_wx(i.name)); + _current_spl_view->InsertItem (it); + film->add_content (i.content); + ++N; + } + + ResetFilm (film); +} + +void +SwaroopControls::config_changed (int property) +{ + Controls::config_changed (property); + + if (property == Config::PLAYER_CONTENT_DIRECTORY) { + _content_view->update (); + } else if (property == Config::PLAYER_PLAYLIST_DIRECTORY) { + update_playlist_directory (); + } +} + +void +SwaroopControls::set_film (shared_ptr film) +{ + Controls::set_film (film); + + _content_view->set_film (film); + update_playlist_directory (); + + setup_sensitivity (); +} diff --git a/src/wx/swaroop_controls.h b/src/wx/swaroop_controls.h new file mode 100644 index 000000000..fae54ea0a --- /dev/null +++ b/src/wx/swaroop_controls.h @@ -0,0 +1,63 @@ +/* + Copyright (C) 2018 Carl Hetherington + + This file is part of DCP-o-matic. + + DCP-o-matic is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + DCP-o-matic is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with DCP-o-matic. If not, see . + +*/ + +#include "controls.h" + +class SwaroopControls : public Controls +{ +public: + SwaroopControls (wxWindow* parent, boost::shared_ptr viewer); + + void log (wxString s); + void set_film (boost::shared_ptr film); + + /** This is so that we can tell our parent player to reset the film + when we have created one from a SPL. We could call a method + in the player's DOMFrame but we don't have that in a header. + */ + boost::signals2::signal)> ResetFilm; + +private: + void play_clicked (); + void pause_clicked (); + void stop_clicked (); + void add_playlist_to_list (SPL spl); + void update_content_directory (); + void update_playlist_directory (); + void spl_selection_changed (); + void started (); + void stopped (); + void setup_sensitivity (); + void image_changed (boost::weak_ptr weak_pv); + void config_changed (int); + + wxButton* _play_button; + wxButton* _pause_button; + wxButton* _stop_button; + + ContentView* _content_view; + wxListCtrl* _spl_view; + wxListCtrl* _current_spl_view; + wxTextCtrl* _log; + + boost::optional _current_kind; + + std::vector _playlists; +}; diff --git a/src/wx/wscript b/src/wx/wscript index 865122a69..bec58a353 100644 --- a/src/wx/wscript +++ b/src/wx/wscript @@ -108,6 +108,8 @@ sources = """ self_dkdm_dialog.cc server_dialog.cc servers_list_dialog.cc + standard_controls.cc + swaroop_controls.cc system_font_dialog.cc table_dialog.cc templates_dialog.cc -- 2.30.2