X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fwx%2Fcontent_menu.cc;h=6c635db0b02c7ac6e5c29de9cea8aa95433aad1e;hb=e72a69ac2ebf24df05ba4b6de65bfa338a58b0ec;hp=e9b6c32409cebe8e43f647bc7b64a340675c024d;hpb=d9ab996fa416ba27b69bb65f047a1a1aa4063f1b;p=dcpomatic.git diff --git a/src/wx/content_menu.cc b/src/wx/content_menu.cc index e9b6c3240..6c635db0b 100644 --- a/src/wx/content_menu.cc +++ b/src/wx/content_menu.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2013-2020 Carl Hetherington + Copyright (C) 2013-2021 Carl Hetherington This file is part of DCP-o-matic. @@ -18,6 +18,7 @@ */ + #include "content_menu.h" #include "repeat_dialog.h" #include "wx_util.h" @@ -40,18 +41,25 @@ #include "lib/copy_dcp_details_to_film.h" #include #include +#include #include #include -#include #include + using std::cout; using std::vector; using std::exception; using std::list; -using boost::shared_ptr; -using boost::weak_ptr; -using boost::dynamic_pointer_cast; +using std::shared_ptr; +using std::weak_ptr; +using std::dynamic_pointer_cast; +using std::make_shared; +using boost::optional; +#if BOOST_VERSION >= 106100 +using namespace boost::placeholders; +#endif + enum { /* Start at 256 so we can have IDs on _cpl_menu from 1 to 255 */ @@ -68,6 +76,7 @@ enum { ID_remove }; + ContentMenu::ContentMenu (wxWindow* p) : _menu (new wxMenu) , _parent (p) @@ -116,7 +125,7 @@ ContentMenu::popup (weak_ptr film, ContentList c, TimelineContentViewList _repeat->Enable (!_content.empty ()); int n = 0; - BOOST_FOREACH (shared_ptr i, _content) { + for (auto i: _content) { if (dynamic_pointer_cast (i)) { ++n; } @@ -130,23 +139,23 @@ ContentMenu::popup (weak_ptr film, ContentList c, TimelineContentViewList _re_examine->Enable (!_content.empty ()); if (_content.size() == 1) { - shared_ptr dcp = dynamic_pointer_cast (_content.front ()); + auto dcp = dynamic_pointer_cast (_content.front()); if (dcp) { _kdm->Enable (dcp->encrypted ()); _ov->Enable (dcp->needs_assets ()); _set_dcp_settings->Enable (static_cast(dcp)); try { DCPExaminer ex (dcp, true); - list > cpls = ex.cpls (); + auto cpls = ex.cpls (); _choose_cpl->Enable (cpls.size() > 1); /* We can't have 0 as a menu item ID on OS X */ int id = 1; - BOOST_FOREACH (shared_ptr i, cpls) { - wxMenuItem* item = _cpl_menu->AppendRadioItem ( + for (auto i: cpls) { + auto item = _cpl_menu->AppendRadioItem ( id++, wxString::Format ( "%s (%s)", - std_to_wx(i->annotation_text()).data(), + std_to_wx(i->annotation_text().get_value_or("")).data(), std_to_wx(i->id()).data() ) ); @@ -181,13 +190,13 @@ ContentMenu::popup (weak_ptr film, ContentList c, TimelineContentViewList void ContentMenu::set_dcp_settings () { - shared_ptr film = _film.lock (); + auto film = _film.lock (); if (!film) { return; } DCPOMATIC_ASSERT (_content.size() == 1); - shared_ptr dcp = dynamic_pointer_cast(_content.front()); + auto dcp = dynamic_pointer_cast(_content.front()); DCPOMATIC_ASSERT (dcp); copy_dcp_details_to_film (dcp, film); } @@ -200,13 +209,13 @@ ContentMenu::repeat () return; } - RepeatDialog* d = new RepeatDialog (_parent); + auto d = new RepeatDialog (_parent); if (d->ShowModal() != wxID_OK) { d->Destroy (); return; } - shared_ptr film = _film.lock (); + auto film = _film.lock (); if (!film) { return; } @@ -218,12 +227,13 @@ ContentMenu::repeat () _views.clear (); } + void ContentMenu::join () { - vector > fc; - BOOST_FOREACH (shared_ptr i, _content) { - shared_ptr f = dynamic_pointer_cast (i); + vector> fc; + for (auto i: _content) { + auto f = dynamic_pointer_cast (i); if (f) { fc.push_back (f); } @@ -231,13 +241,13 @@ ContentMenu::join () DCPOMATIC_ASSERT (fc.size() > 1); - shared_ptr film = _film.lock (); + auto film = _film.lock (); if (!film) { return; } try { - shared_ptr joined (new FFmpegContent(fc)); + auto joined = make_shared(fc); film->remove_content (_content); film->examine_and_add_content (joined); } catch (JoinError& e) { @@ -245,6 +255,7 @@ ContentMenu::join () } } + void ContentMenu::remove () { @@ -252,7 +263,7 @@ ContentMenu::remove () return; } - shared_ptr film = _film.lock (); + auto film = _film.lock (); if (!film) { return; } @@ -263,8 +274,8 @@ ContentMenu::remove () /* Special case: we only remove FFmpegContent if its video view is selected; if not, and its audio view is selected, we unmap the audio. */ - BOOST_FOREACH (shared_ptr i, _content) { - shared_ptr fc = dynamic_pointer_cast (i); + for (auto i: _content) { + auto fc = dynamic_pointer_cast (i); if (!fc) { continue; } @@ -272,9 +283,9 @@ ContentMenu::remove () shared_ptr video; shared_ptr audio; - BOOST_FOREACH (shared_ptr j, _views) { - shared_ptr v = dynamic_pointer_cast (j); - shared_ptr a = dynamic_pointer_cast (j); + for (auto j: _views) { + auto v = dynamic_pointer_cast(j); + auto a = dynamic_pointer_cast(j); if (v && v->content() == fc) { video = v; } else if (a && a->content() == fc) { @@ -283,7 +294,7 @@ ContentMenu::remove () } if (!video && audio) { - AudioMapping m = fc->audio->mapping (); + auto m = fc->audio->mapping (); m.unmap_all (); fc->audio->set_mapping (m); handled = true; @@ -299,6 +310,7 @@ ContentMenu::remove () _views.clear (); } + void ContentMenu::find_missing () { @@ -306,35 +318,35 @@ ContentMenu::find_missing () return; } - shared_ptr film = _film.lock (); + auto film = _film.lock (); if (!film) { return; } /* XXX: a bit nasty */ - shared_ptr ic = dynamic_pointer_cast (_content.front ()); - shared_ptr dc = dynamic_pointer_cast (_content.front ()); + auto ic = dynamic_pointer_cast (_content.front()); + auto dc = dynamic_pointer_cast (_content.front()); int r = wxID_CANCEL; boost::filesystem::path path; if ((ic && !ic->still ()) || dc) { - wxDirDialog* d = new wxDirDialog (0, _("Choose a folder"), wxT (""), wxDD_DIR_MUST_EXIST); + auto d = new wxDirDialog (0, _("Choose a folder"), wxT (""), wxDD_DIR_MUST_EXIST); r = d->ShowModal (); path = wx_to_std (d->GetPath ()); d->Destroy (); } else { - wxFileDialog* d = new wxFileDialog (0, _("Choose a file"), wxT (""), wxT (""), wxT ("*.*"), wxFD_MULTIPLE); + auto d = new wxFileDialog (0, _("Choose a file"), wxT (""), wxT (""), wxT ("*.*")); r = d->ShowModal (); path = wx_to_std (d->GetPath ()); d->Destroy (); } - list > content; + list> content; if (r == wxID_OK) { if (dc) { - content.push_back (shared_ptr(new DCPContent(path))); + content.push_back (make_shared(path)); } else { content = content_factory (path); } @@ -344,16 +356,16 @@ ContentMenu::find_missing () return; } - BOOST_FOREACH (shared_ptr i, content) { - shared_ptr j (new ExamineContentJob (film, i)); + for (auto i: content) { + auto j = make_shared(film, i); j->Finished.connect ( bind ( &ContentMenu::maybe_found_missing, this, - boost::weak_ptr (j), - boost::weak_ptr (_content.front ()), - boost::weak_ptr (i) + std::weak_ptr (j), + std::weak_ptr (_content.front ()), + std::weak_ptr (i) ) ); @@ -364,12 +376,12 @@ ContentMenu::find_missing () void ContentMenu::re_examine () { - shared_ptr film = _film.lock (); + auto film = _film.lock (); if (!film) { return; } - BOOST_FOREACH (shared_ptr i, _content) { + for (auto i: _content) { JobManager::instance()->add (shared_ptr (new ExamineContentJob (film, i))); } } @@ -377,13 +389,13 @@ ContentMenu::re_examine () void ContentMenu::maybe_found_missing (weak_ptr j, weak_ptr oc, weak_ptr nc) { - shared_ptr job = j.lock (); + auto job = j.lock (); if (!job || !job->finished_ok ()) { return; } - shared_ptr old_content = oc.lock (); - shared_ptr new_content = nc.lock (); + auto old_content = oc.lock (); + auto new_content = nc.lock (); DCPOMATIC_ASSERT (old_content); DCPOMATIC_ASSERT (new_content); @@ -399,23 +411,57 @@ void ContentMenu::kdm () { DCPOMATIC_ASSERT (!_content.empty ()); - shared_ptr dcp = dynamic_pointer_cast (_content.front ()); + auto dcp = dynamic_pointer_cast (_content.front()); DCPOMATIC_ASSERT (dcp); - wxFileDialog* d = new wxFileDialog (_parent, _("Select KDM")); + auto d = new wxFileDialog (_parent, _("Select KDM")); if (d->ShowModal() == wxID_OK) { + optional kdm; try { - dcp->add_kdm (dcp::EncryptedKDM (dcp::file_to_string (wx_to_std (d->GetPath ()), MAX_KDM_SIZE))); + kdm = dcp::EncryptedKDM (dcp::file_to_string(wx_to_std(d->GetPath()), MAX_KDM_SIZE)); } catch (exception& e) { error_dialog (_parent, _("Could not load KDM"), std_to_wx(e.what())); d->Destroy (); return; } - shared_ptr film = _film.lock (); + /* Try to decrypt it to get an early preview of any errors */ + try { + decrypt_kdm_with_helpful_error (*kdm); + } catch (KDMError& e) { + error_dialog (_parent, std_to_wx(e.summary()), std_to_wx(e.detail())); + return; + } catch (exception& e) { + error_dialog (_parent, e.what()); + return; + } + + DCPExaminer ex (dcp, true); + + bool kdm_matches_any_cpl = false; + for (auto i: ex.cpls()) { + if (i->id() == kdm->cpl_id()) { + kdm_matches_any_cpl = true; + } + } + + bool kdm_matches_selected_cpl = dcp->cpl() || kdm->cpl_id() == dcp->cpl().get(); + + if (!kdm_matches_any_cpl) { + error_dialog (_parent, _("This KDM was not made for this DCP. You will need a different one.")); + return; + } + + if (!kdm_matches_selected_cpl && kdm_matches_any_cpl) { + message_dialog (_parent, _("This KDM was made for one of the CPLs in this DCP, but not the currently selected one. To play the currently-selected CPL you will need a different KDM.")); + } + + dcp->add_kdm (*kdm); + + auto film = _film.lock (); DCPOMATIC_ASSERT (film); - JobManager::instance()->add (shared_ptr (new ExamineContentJob (film, dcp))); + JobManager::instance()->add (make_shared(film, dcp)); } d->Destroy (); @@ -425,16 +471,16 @@ void ContentMenu::ov () { DCPOMATIC_ASSERT (!_content.empty ()); - shared_ptr dcp = dynamic_pointer_cast (_content.front ()); + auto dcp = dynamic_pointer_cast (_content.front()); DCPOMATIC_ASSERT (dcp); - wxDirDialog* d = new wxDirDialog (_parent, _("Select OV")); + auto d = new wxDirDialog (_parent, _("Select OV")); if (d->ShowModal() == wxID_OK) { - dcp->add_ov (wx_to_std (d->GetPath ())); + dcp->add_ov (wx_to_std (d->GetPath())); shared_ptr film = _film.lock (); DCPOMATIC_ASSERT (film); - JobManager::instance()->add (shared_ptr (new ExamineContentJob (film, dcp))); + JobManager::instance()->add (make_shared(film, dcp)); } d->Destroy (); @@ -443,9 +489,9 @@ ContentMenu::ov () void ContentMenu::properties () { - shared_ptr film = _film.lock (); + auto film = _film.lock (); DCPOMATIC_ASSERT (film); - ContentPropertiesDialog* d = new ContentPropertiesDialog (_parent, film, _content.front()); + auto d = new ContentPropertiesDialog (_parent, film, _content.front()); d->ShowModal (); d->Destroy (); } @@ -454,7 +500,7 @@ ContentMenu::properties () void ContentMenu::advanced () { - ContentAdvancedDialog* d = new ContentAdvancedDialog (_parent, _content.front()); + auto d = new ContentAdvancedDialog (_parent, _content.front()); d->ShowModal (); d->Destroy (); } @@ -468,21 +514,21 @@ ContentMenu::cpl_selected (wxCommandEvent& ev) } DCPOMATIC_ASSERT (!_content.empty ()); - shared_ptr dcp = dynamic_pointer_cast (_content.front ()); + auto dcp = dynamic_pointer_cast (_content.front()); DCPOMATIC_ASSERT (dcp); DCPExaminer ex (dcp, true); - list > cpls = ex.cpls (); + auto cpls = ex.cpls (); DCPOMATIC_ASSERT (ev.GetId() > 0); DCPOMATIC_ASSERT (ev.GetId() <= int (cpls.size())); - list >::const_iterator i = cpls.begin (); + auto i = cpls.begin (); for (int j = 0; j < ev.GetId() - 1; ++j) { ++i; } dcp->set_cpl ((*i)->id ()); - shared_ptr film = _film.lock (); + auto film = _film.lock (); DCPOMATIC_ASSERT (film); - JobManager::instance()->add (shared_ptr (new ExamineContentJob (film, dcp))); + JobManager::instance()->add (make_shared(film, dcp)); }