diff options
| author | Carl Hetherington <cth@carlh.net> | 2018-09-28 01:14:23 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2018-09-28 01:14:23 +0100 |
| commit | 73461f719bfb3ee91644b84f4bffd91df0e6559f (patch) | |
| tree | d90a5eacbbe4ff995abbafa998b49d9007e765b5 | |
| parent | 60cc177d58b875de472a65a65c274ad1656aedc2 (diff) | |
Add info (time/type) to CPL/SPL lists.
| -rw-r--r-- | src/lib/spl_entry.h | 12 | ||||
| -rw-r--r-- | src/tools/dcpomatic_player.cc | 11 | ||||
| -rw-r--r-- | src/wx/controls.cc | 90 | ||||
| -rw-r--r-- | src/wx/controls.h | 14 |
4 files changed, 97 insertions, 30 deletions
diff --git a/src/lib/spl_entry.h b/src/lib/spl_entry.h index b7fdaa2e0..033cab6a0 100644 --- a/src/lib/spl_entry.h +++ b/src/lib/spl_entry.h @@ -18,14 +18,20 @@ */ +namespace dcp { + class CPL; +} + class SPLEntry { public: - SPLEntry (boost::filesystem::path p) - : dcp (p) + SPLEntry (boost::shared_ptr<dcp::CPL> cpl_, boost::filesystem::path directory_) + : cpl (cpl_) + , directory (directory_) {} /* Length of black before this DCP */ DCPTime black_before; - boost::filesystem::path dcp; + boost::shared_ptr<dcp::CPL> cpl; + boost::filesystem::path directory; }; diff --git a/src/tools/dcpomatic_player.cc b/src/tools/dcpomatic_player.cc index 3be884e03..3eec00e51 100644 --- a/src/tools/dcpomatic_player.cc +++ b/src/tools/dcpomatic_player.cc @@ -47,6 +47,7 @@ #include "lib/server.h" #include "lib/dcpomatic_socket.h" #include "lib/scoped_temporary.h" +#include <dcp/dcp.h> #include <wx/wx.h> #include <wx/stdpaths.h> #include <wx/splash.h> @@ -294,8 +295,12 @@ public: void load_dcp (boost::filesystem::path dir) { + dcp::DCP dcp (dir); + dcp.read (); list<SPLEntry> spl; - spl.push_back (SPLEntry(dir)); + BOOST_FOREACH (shared_ptr<dcp::CPL> j, dcp.cpls()) { + spl.push_back (SPLEntry(j, dir)); + } set_spl (spl); Config::instance()->add_to_player_history (dir); } @@ -366,7 +371,7 @@ public: BOOST_FOREACH (SPLEntry i, spl) { shared_ptr<DCPContent> dcp; try { - dcp.reset (new DCPContent (_film, i.dcp)); + dcp.reset (new DCPContent (_film, i.directory)); } catch (boost::filesystem::filesystem_error& e) { error_dialog (this, _("Could not load DCP"), std_to_wx (e.what())); return; @@ -424,7 +429,7 @@ public: _info->triggered_update (); set_menu_sensitivity (); - _controls->log (wxString::Format(_("Load DCP %s"), i.dcp.filename().string().c_str())); + _controls->log (wxString::Format(_("Load DCP %s"), i.directory.filename().string().c_str())); } wxMenuItemList old = _cpl_menu->GetMenuItems(); diff --git a/src/wx/controls.cc b/src/wx/controls.cc index 6fa5d39e8..df2c16134 100644 --- a/src/wx/controls.cc +++ b/src/wx/controls.cc @@ -24,11 +24,17 @@ #include "playhead_to_timecode_dialog.h" #include "playhead_to_frame_dialog.h" #include "lib/job_manager.h" +#include <dcp/dcp.h> +#include <dcp/cpl.h> +#include <dcp/reel.h> +#include <dcp/reel_picture_asset.h> #include <wx/wx.h> #include <wx/tglbtn.h> #include <wx/listctrl.h> using std::string; +using std::list; +using std::make_pair; using boost::optional; using boost::shared_ptr; using boost::weak_ptr; @@ -75,11 +81,18 @@ Controls::Controls (wxWindow* parent, shared_ptr<FilmViewer> viewer, bool editor wxBoxSizer* e_sizer = new wxBoxSizer (wxHORIZONTAL); - _dcp_directory = new wxListCtrl (this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLC_REPORT | wxLC_NO_HEADER); - _dcp_directory->AppendColumn (wxT(""), wxLIST_FORMAT_LEFT, 580); - e_sizer->Add (_dcp_directory, 1, wxALL | wxEXPAND, DCPOMATIC_SIZER_GAP); + _cpl = new wxListCtrl (this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLC_REPORT | wxLC_NO_HEADER); + /* time */ + _cpl->AppendColumn (wxT(""), wxLIST_FORMAT_LEFT, 80); + /* type */ + _cpl->AppendColumn (wxT(""), wxLIST_FORMAT_LEFT, 80); + /* annotation text */ + _cpl->AppendColumn (wxT(""), wxLIST_FORMAT_LEFT, 580); + e_sizer->Add (_cpl, 1, wxALL | wxEXPAND, DCPOMATIC_SIZER_GAP); _spl_view = new wxListCtrl (this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLC_REPORT | wxLC_NO_HEADER); + _spl_view->AppendColumn (wxT(""), wxLIST_FORMAT_LEFT, 80); + _spl_view->AppendColumn (wxT(""), wxLIST_FORMAT_LEFT, 80); _spl_view->AppendColumn (wxT(""), wxLIST_FORMAT_LEFT, 580); e_sizer->Add (_spl_view, 1, wxALL | wxEXPAND, DCPOMATIC_SIZER_GAP); @@ -93,7 +106,7 @@ Controls::Controls (wxWindow* parent, shared_ptr<FilmViewer> viewer, bool editor _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); - _dcp_directory->Show (false); + _cpl->Show (false); _spl_view->Show (false); _add_button->Show (false); _log->Show (false); @@ -145,8 +158,8 @@ Controls::Controls (wxWindow* parent, shared_ptr<FilmViewer> viewer, bool editor _forward_button->Bind (wxEVT_LEFT_DOWN, boost::bind(&Controls::forward_clicked, this, _1)); _frame_number->Bind (wxEVT_LEFT_DOWN, boost::bind(&Controls::frame_number_clicked, this)); _timecode->Bind (wxEVT_LEFT_DOWN, boost::bind(&Controls::timecode_clicked, this)); - _dcp_directory->Bind (wxEVT_LIST_ITEM_SELECTED, boost::bind(&Controls::setup_sensitivity, this)); - _dcp_directory->Bind (wxEVT_LIST_ITEM_DESELECTED, boost::bind(&Controls::setup_sensitivity, this)); + _cpl->Bind (wxEVT_LIST_ITEM_SELECTED, boost::bind(&Controls::setup_sensitivity, this)); + _cpl->Bind (wxEVT_LIST_ITEM_DESELECTED, boost::bind(&Controls::setup_sensitivity, this)); if (_jump_to_selected) { _jump_to_selected->Bind (wxEVT_CHECKBOX, boost::bind (&Controls::jump_to_selected_clicked, this)); _jump_to_selected->SetValue (Config::instance()->jump_to_selected ()); @@ -173,10 +186,10 @@ Controls::Controls (wxWindow* parent, shared_ptr<FilmViewer> viewer, bool editor void Controls::add_clicked () { - optional<boost::filesystem::path> sel = selected_dcp (); + optional<CPL> sel = selected_cpl (); DCPOMATIC_ASSERT (sel); - _spl.push_back (SPLEntry(*sel)); - _spl_view->InsertItem(_spl_view->GetItemCount(), std_to_wx(sel->filename().string())); + _spl.push_back (SPLEntry(sel->first, sel->second)); + add_cpl_to_list (sel->first, _spl_view); SPLChanged (_spl); setup_sensitivity (); } @@ -425,19 +438,19 @@ Controls::setup_sensitivity () _eye->Enable (c && _film->three_d ()); } - _add_button->Enable (static_cast<bool>(selected_dcp())); + _add_button->Enable (static_cast<bool>(selected_cpl())); } -optional<boost::filesystem::path> -Controls::selected_dcp () const +optional<Controls::CPL> +Controls::selected_cpl () const { - long int s = _dcp_directory->GetNextItem (-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); + long int s = _cpl->GetNextItem (-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); if (s == -1) { - return optional<boost::filesystem::path>(); + return optional<CPL>(); } - DCPOMATIC_ASSERT (s < int(_dcp_directories.size())); - return _dcp_directories[s]; + DCPOMATIC_ASSERT (s < int(_cpls.size())); + return _cpls[s]; } void @@ -496,7 +509,7 @@ Controls::film () const void Controls::show_extended_player_controls (bool s) { - _dcp_directory->Show (s); + _cpl->Show (s); _spl_view->Show (s); _log->Show (s); _add_button->Show (s); @@ -504,12 +517,43 @@ Controls::show_extended_player_controls (bool s) } void +Controls::add_cpl_to_list (shared_ptr<dcp::CPL> cpl, wxListCtrl* ctrl) +{ + list<shared_ptr<dcp::Reel> > reels = cpl->reels (); + + int const N = ctrl->GetItemCount(); + + wxListItem it; + if (!reels.empty() && reels.front()->main_picture()) { + it.SetId(N); + it.SetColumn(0); + int seconds = rint(double(cpl->duration()) / reels.front()->main_picture()->frame_rate().as_float()); + 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); + } + + it.SetId(N); + it.SetColumn(1); + it.SetText(std_to_wx(dcp::content_kind_to_string(cpl->content_kind()))); + ctrl->SetItem(it); + + it.SetId(N); + it.SetColumn(2); + it.SetText(std_to_wx(cpl->annotation_text())); + ctrl->SetItem(it); +} + +void Controls::update_dcp_directory () { using namespace boost::filesystem; - _dcp_directory->DeleteAllItems (); - _dcp_directories.clear (); + _cpl->DeleteAllItems (); + _cpls.clear (); optional<path> dir = Config::instance()->player_dcp_directory(); if (!dir) { return; @@ -519,8 +563,12 @@ Controls::update_dcp_directory () try { if (is_directory(*i) && (is_regular_file(*i / "ASSETMAP") || is_regular_file(*i / "ASSETMAP.xml"))) { string const x = i->path().string().substr(dir->string().length() + 1); - _dcp_directory->InsertItem(_dcp_directory->GetItemCount(), std_to_wx(x)); - _dcp_directories.push_back(*i); + dcp::DCP dcp (*i); + dcp.read (); + BOOST_FOREACH (shared_ptr<dcp::CPL> j, dcp.cpls()) { + add_cpl_to_list (j, _cpl); + _cpls.push_back (make_pair(j, *i)); + } } } catch (boost::filesystem::filesystem_error& e) { /* Never mind */ diff --git a/src/wx/controls.h b/src/wx/controls.h index 968ffa921..a49f16595 100644 --- a/src/wx/controls.h +++ b/src/wx/controls.h @@ -34,6 +34,10 @@ class PlayerVideo; class wxToggleButton; class wxListCtrl; +namespace dcp { + class CPL; +} + class Controls : public wxPanel { public: @@ -81,12 +85,16 @@ private: void update_dcp_directory (); void dcp_directory_changed (); void config_changed (int property); - boost::optional<boost::filesystem::path> selected_dcp () const; + + typedef std::pair<boost::shared_ptr<dcp::CPL>, boost::filesystem::path> CPL; + + boost::optional<CPL> selected_cpl () const; #ifdef DCPOMATIC_VARIANT_SWAROOP void pause_clicked (); void stop_clicked (); #endif void add_clicked (); + void add_cpl_to_list (boost::shared_ptr<dcp::CPL> cpl, wxListCtrl* list); boost::shared_ptr<Film> _film; boost::shared_ptr<FilmViewer> _viewer; @@ -98,11 +106,11 @@ private: wxCheckBox* _outline_content; wxChoice* _eye; wxCheckBox* _jump_to_selected; - wxListCtrl* _dcp_directory; + wxListCtrl* _cpl; wxListCtrl* _spl_view; wxTextCtrl* _log; wxButton* _add_button; - std::vector<boost::filesystem::path> _dcp_directories; + std::vector<CPL> _cpls; wxSlider* _slider; wxButton* _rewind_button; wxButton* _back_button; |
