swaroop: remove SPL editing from player UI.
[dcpomatic.git] / src / wx / controls.cc
index cf805e8f78cf9171562b30f04fe43cc44db9db05..5fa8d7176761e0e3090bc43971d0923ecde5fcce 100644 (file)
@@ -23,6 +23,7 @@
 #include "wx_util.h"
 #include "playhead_to_timecode_dialog.h"
 #include "playhead_to_frame_dialog.h"
+#include "content_view.h"
 #include "lib/job_manager.h"
 #include "lib/player_video.h"
 #include "lib/dcp_content.h"
@@ -41,6 +42,7 @@
 
 using std::string;
 using std::list;
+using std::cout;
 using std::make_pair;
 using std::exception;
 using boost::optional;
@@ -94,13 +96,7 @@ Controls::Controls (wxWindow* parent, shared_ptr<FilmViewer> viewer, bool editor
        _spl_view->AppendColumn (wxT(""), wxLIST_FORMAT_LEFT, 740);
        left_sizer->Add (_spl_view, 1, wxALL | wxEXPAND, DCPOMATIC_SIZER_GAP);
 
-       _content_view = new wxListCtrl (this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLC_REPORT | wxLC_NO_HEADER);
-       /* time */
-       _content_view->AppendColumn (wxT(""), wxLIST_FORMAT_LEFT, 80);
-       /* type */
-       _content_view->AppendColumn (wxT(""), wxLIST_FORMAT_LEFT, 80);
-       /* annotation text */
-       _content_view->AppendColumn (wxT(""), wxLIST_FORMAT_LEFT, 580);
+       _content_view = new ContentView (this, _film);
        left_sizer->Add (_content_view, 1, wxALL | wxEXPAND, DCPOMATIC_SIZER_GAP);
 
        wxBoxSizer* e_sizer = new wxBoxSizer (wxHORIZONTAL);
@@ -112,15 +108,6 @@ Controls::Controls (wxWindow* parent, shared_ptr<FilmViewer> viewer, bool editor
        _current_spl_view->AppendColumn (wxT(""), wxLIST_FORMAT_LEFT, 580);
        e_sizer->Add (_current_spl_view, 1, wxALL | wxEXPAND, DCPOMATIC_SIZER_GAP);
 
-       wxBoxSizer* buttons_sizer = new wxBoxSizer (wxVERTICAL);
-       _add_button = new wxButton(this, wxID_ANY, _("Add"));
-       buttons_sizer->Add (_add_button);
-       _save_button = new wxButton(this, wxID_ANY, _("Save..."));
-       buttons_sizer->Add (_save_button);
-       _load_button = new wxButton(this, wxID_ANY, _("Load..."));
-       buttons_sizer->Add (_load_button);
-       e_sizer->Add (buttons_sizer, 0, 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);
@@ -129,9 +116,6 @@ Controls::Controls (wxWindow* parent, shared_ptr<FilmViewer> viewer, bool editor
        _content_view->Show (false);
        _spl_view->Show (false);
        _current_spl_view->Show (false);
-       _add_button->Show (false);
-       _save_button->Show (false);
-       _load_button->Show (false);
        _log->Show (false);
 
        wxBoxSizer* h_sizer = new wxBoxSizer (wxHORIZONTAL);
@@ -187,9 +171,6 @@ Controls::Controls (wxWindow* parent, shared_ptr<FilmViewer> 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 ());
        }
-       _add_button->Bind       (wxEVT_BUTTON,              boost::bind(&Controls::add_clicked, this));
-       _save_button->Bind      (wxEVT_BUTTON,              boost::bind(&Controls::save_clicked, this));
-       _load_button->Bind      (wxEVT_BUTTON,              boost::bind(&Controls::load_clicked, this));
 
        _viewer->PositionChanged.connect (boost::bind(&Controls::position_changed, this));
        _viewer->Started.connect (boost::bind(&Controls::started, this));
@@ -200,7 +181,6 @@ Controls::Controls (wxWindow* parent, shared_ptr<FilmViewer> viewer, bool editor
        film_changed ();
 
        setup_sensitivity ();
-       update_content_directory ();
        update_playlist_directory ();
 
        JobManager::instance()->ActiveJobsChanged.connect (
@@ -211,61 +191,11 @@ Controls::Controls (wxWindow* parent, shared_ptr<FilmViewer> viewer, bool editor
        config_changed (Config::OTHER);
 }
 
-void
-Controls::add_clicked ()
-{
-       shared_ptr<Content> sel = selected_content()->clone();
-       DCPOMATIC_ASSERT (sel);
-       _film->examine_and_add_content (sel);
-       bool const ok = display_progress (_("DCP-o-matic"), _("Loading DCP"));
-       if (!ok || !report_errors_from_last_job(this)) {
-               return;
-       }
-       add_content_to_list (sel, _current_spl_view);
-       setup_sensitivity ();
-}
-
-void
-Controls::save_clicked ()
-{
-       wxFileDialog* d = new wxFileDialog (
-               this, _("Select playlist file"), wxEmptyString, wxEmptyString, wxT ("XML files (*.xml)|*.xml"),
-               wxFD_SAVE | wxFD_OVERWRITE_PROMPT
-               );
-
-       if (d->ShowModal() == wxID_OK) {
-               boost::filesystem::path p(wx_to_std(d->GetPath()));
-               _film->set_name(p.stem().string());
-               _film->write_metadata(p);
-       }
-
-       d->Destroy ();
-}
-
-void
-Controls::load_clicked ()
-{
-       wxFileDialog* d = new wxFileDialog (
-               this, _("Select playlist file"), wxEmptyString, wxEmptyString, wxT ("XML files (*.xml)|*.xml")
-               );
-
-       if (d->ShowModal() == wxID_OK) {
-               _film->read_metadata (boost::filesystem::path(wx_to_std(d->GetPath())));
-               _current_spl_view->DeleteAllItems ();
-               BOOST_FOREACH (shared_ptr<Content> i, _film->content()) {
-                       shared_ptr<DCPContent> dcp = dynamic_pointer_cast<DCPContent>(i);
-                       add_content_to_list (dcp, _current_spl_view);
-               }
-       }
-
-       d->Destroy ();
-}
-
 void
 Controls::config_changed (int property)
 {
        if (property == Config::PLAYER_CONTENT_DIRECTORY) {
-               update_content_directory ();
+               _content_view->update ();
        } else if (property == Config::PLAYER_PLAYLIST_DIRECTORY) {
                update_playlist_directory ();
        } else {
@@ -509,21 +439,6 @@ Controls::setup_sensitivity ()
        if (_eye) {
                _eye->Enable (c && _film->three_d ());
        }
-
-       _add_button->Enable (Config::instance()->allow_spl_editing() && static_cast<bool>(selected_content()));
-       _save_button->Enable (Config::instance()->allow_spl_editing());
-}
-
-shared_ptr<Content>
-Controls::selected_content () const
-{
-       long int s = _content_view->GetNextItem (-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
-       if (s == -1) {
-               return shared_ptr<Content>();
-       }
-
-       DCPOMATIC_ASSERT (s < int(_content.size()));
-       return _content[s];
 }
 
 void
@@ -571,6 +486,9 @@ Controls::film_changed ()
        if (_film) {
                _film->Change.connect (boost::bind (&Controls::film_change, this, _1, _2));
        }
+
+       _content_view->set_film (film);
+       _content_view->update ();
 }
 
 shared_ptr<Film>
@@ -585,48 +503,14 @@ Controls::show_extended_player_controls (bool s)
        _content_view->Show (s);
        _spl_view->Show (s);
        if (s) {
-               update_content_directory ();
+               _content_view->update ();
                update_playlist_directory ();
        }
        _current_spl_view->Show (s);
        _log->Show (s);
-       _add_button->Show (s);
-       _save_button->Show (s);
-       _load_button->Show (s);
        _v_sizer->Layout ();
 }
 
-void
-Controls::add_content_to_list (shared_ptr<Content> content, wxListCtrl* ctrl)
-{
-       int const N = ctrl->GetItemCount();
-
-       wxListItem it;
-       it.SetId(N);
-       it.SetColumn(0);
-       DCPTime length = content->length_after_trim ();
-       int seconds = length.seconds();
-       int minutes = seconds / 60;
-       seconds -= minutes * 60;
-       int hours = minutes / 60;
-       minutes -= hours * 60;
-       it.SetText(wxString::Format("%02d:%02d:%02d", hours, minutes, seconds));
-       ctrl->InsertItem(it);
-
-       shared_ptr<DCPContent> dcp = dynamic_pointer_cast<DCPContent>(content);
-       if (dcp && dcp->content_kind()) {
-               it.SetId(N);
-               it.SetColumn(1);
-               it.SetText(std_to_wx(dcp::content_kind_to_string(*dcp->content_kind())));
-               ctrl->SetItem(it);
-       }
-
-       it.SetId(N);
-       it.SetColumn(2);
-       it.SetText(std_to_wx(content->summary()));
-       ctrl->SetItem(it);
-}
-
 void
 Controls::add_playlist_to_list (shared_ptr<Film> film)
 {
@@ -639,59 +523,6 @@ Controls::add_playlist_to_list (shared_ptr<Film> film)
        _spl_view->InsertItem (it);
 }
 
-void
-Controls::update_content_directory ()
-{
-       if (!_content_view->IsShown()) {
-               return;
-       }
-
-       using namespace boost::filesystem;
-
-       _content_view->DeleteAllItems ();
-       _content.clear ();
-       optional<path> dir = Config::instance()->player_content_directory();
-       if (!dir) {
-               return;
-       }
-
-       wxProgressDialog progress (_("DCP-o-matic"), _("Reading content directory"));
-       JobManager* jm = JobManager::instance ();
-
-       for (directory_iterator i = directory_iterator(*dir); i != directory_iterator(); ++i) {
-               try {
-                       shared_ptr<Content> content;
-                       if (is_directory(*i) && (is_regular_file(*i / "ASSETMAP") || is_regular_file(*i / "ASSETMAP.xml"))) {
-                               content.reset (new DCPContent(_film, *i));
-                       } else if (i->path().extension() == ".mp4" || i->path().extension() == ".ecinema") {
-                               content = content_factory(_film, *i).front();
-                       }
-
-                       if (content) {
-                               jm->add (shared_ptr<Job>(new ExamineContentJob(_film, content)));
-                               while (jm->work_to_do()) {
-                                       if (!progress.Pulse()) {
-                                               /* user pressed cancel */
-                                               BOOST_FOREACH (shared_ptr<Job> i, jm->get()) {
-                                                       i->cancel();
-                                               }
-                                               return;
-                                       }
-                                       dcpomatic_sleep (1);
-                               }
-                               if (report_errors_from_last_job (this)) {
-                                       add_content_to_list (content, _content_view);
-                                       _content.push_back (content);
-                               }
-                       }
-               } catch (boost::filesystem::filesystem_error& e) {
-                       /* Never mind */
-               } catch (dcp::DCPReadError& e) {
-                       /* Never mind */
-               }
-       }
-}
-
 void
 Controls::update_playlist_directory ()
 {