X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fwx%2Fcontent_menu.cc;h=c5dc1606d790bb577a0a5ba5382b218febc45867;hb=1f88a38a2a607c21988a403e76f315444c4be36b;hp=de3aceac0ff574c2e4d0c9ce81712eeab4217d0f;hpb=894d6e4cbfab5217adf6f39b1c097cec2a8f948c;p=dcpomatic.git diff --git a/src/wx/content_menu.cc b/src/wx/content_menu.cc index de3aceac0..c5dc1606d 100644 --- a/src/wx/content_menu.cc +++ b/src/wx/content_menu.cc @@ -35,7 +35,9 @@ #include "lib/dcp_examiner.h" #include "lib/ffmpeg_content.h" #include "lib/audio_content.h" +#include "lib/config.h" #include +#include #include #include #include @@ -50,7 +52,7 @@ using boost::weak_ptr; using boost::dynamic_pointer_cast; enum { - /* Start at 256 so we can have IDs on _cpl_menu from 0 to 255 */ + /* Start at 256 so we can have IDs on _cpl_menu from 1 to 255 */ ID_repeat = 256, ID_join, ID_find_missing, @@ -65,6 +67,7 @@ enum { ContentMenu::ContentMenu (wxWindow* p) : _menu (new wxMenu) , _parent (p) + , _pop_up_open (false) { _repeat = _menu->Append (ID_repeat, _("Repeat...")); _join = _menu->Append (ID_join, _("Join")); @@ -79,25 +82,15 @@ ContentMenu::ContentMenu (wxWindow* p) _menu->AppendSeparator (); _remove = _menu->Append (ID_remove, _("Remove")); - _parent->Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&ContentMenu::repeat, this), ID_repeat); - _parent->Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&ContentMenu::join, this), ID_join); - _parent->Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&ContentMenu::find_missing, this), ID_find_missing); - _parent->Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&ContentMenu::properties, this), ID_properties); - _parent->Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&ContentMenu::re_examine, this), ID_re_examine); - _parent->Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&ContentMenu::kdm, this), ID_kdm); - _parent->Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&ContentMenu::ov, this), ID_ov); - _parent->Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&ContentMenu::remove, this), ID_remove); - - _parent->Bind (wxEVT_MENU, boost::bind (&ContentMenu::cpl_selected, this, _1), 0, ID_repeat); -} - -ContentMenu::~ContentMenu () -{ - delete _menu; - - BOOST_FOREACH (boost::signals2::connection& i, _job_connections) { - i.disconnect (); - } + _parent->Bind (wxEVT_MENU, boost::bind (&ContentMenu::repeat, this), ID_repeat); + _parent->Bind (wxEVT_MENU, boost::bind (&ContentMenu::join, this), ID_join); + _parent->Bind (wxEVT_MENU, boost::bind (&ContentMenu::find_missing, this), ID_find_missing); + _parent->Bind (wxEVT_MENU, boost::bind (&ContentMenu::properties, this), ID_properties); + _parent->Bind (wxEVT_MENU, boost::bind (&ContentMenu::re_examine, this), ID_re_examine); + _parent->Bind (wxEVT_MENU, boost::bind (&ContentMenu::kdm, this), ID_kdm); + _parent->Bind (wxEVT_MENU, boost::bind (&ContentMenu::ov, this), ID_ov); + _parent->Bind (wxEVT_MENU, boost::bind (&ContentMenu::remove, this), ID_remove); + _parent->Bind (wxEVT_MENU, boost::bind (&ContentMenu::cpl_selected, this, _1), 1, ID_repeat - 1); } void @@ -108,7 +101,7 @@ ContentMenu::popup (weak_ptr film, ContentList c, TimelineContentViewList _views = v; int const N = _cpl_menu->GetMenuItemCount(); - for (int i = 0; i < N; ++i) { + for (int i = 1; i <= N; ++i) { _cpl_menu->Delete (i); } @@ -132,20 +125,29 @@ ContentMenu::popup (weak_ptr film, ContentList c, TimelineContentViewList if (dcp) { _kdm->Enable (dcp->encrypted ()); _ov->Enable (dcp->needs_assets ()); - DCPExaminer ex (dcp); - list > cpls = ex.cpls (); - _choose_cpl->Enable (cpls.size() > 1); - int id = 0; - BOOST_FOREACH (shared_ptr i, cpls) { - wxMenuItem* item = _cpl_menu->AppendCheckItem ( - id++, - wxString::Format ( - "%s (%s)", - std_to_wx(i->annotation_text()).data(), - std_to_wx(i->id()).data() - ) - ); - item->Check (dcp->cpl() && dcp->cpl() == i->id()); + try { + DCPExaminer ex (dcp, true); + list > 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 ( + id++, + wxString::Format ( + "%s (%s)", + std_to_wx(i->annotation_text()).data(), + std_to_wx(i->id()).data() + ) + ); + item->Check (dcp->cpl() && dcp->cpl() == i->id()); + } + } catch (dcp::DCPReadError &) { + /* The DCP is probably missing */ + } catch (dcp::KDMDecryptionError &) { + /* We have an incorrect KDM */ + } catch (KDMError &) { + /* We have an incorrect KDM */ } } else { _kdm->Enable (false); @@ -158,7 +160,9 @@ ContentMenu::popup (weak_ptr film, ContentList c, TimelineContentViewList _remove->Enable (!_content.empty ()); + _pop_up_open = true; _parent->PopupMenu (_menu, p); + _pop_up_open = false; } void @@ -205,7 +209,7 @@ ContentMenu::join () } try { - shared_ptr joined (new FFmpegContent (film, fc)); + shared_ptr joined (new FFmpegContent(fc)); film->remove_content (_content); film->examine_and_add_content (joined); } catch (JoinError& e) { @@ -279,8 +283,6 @@ ContentMenu::find_missing () return; } - shared_ptr content; - /* XXX: a bit nasty */ shared_ptr ic = dynamic_pointer_cast (_content.front ()); shared_ptr dc = dynamic_pointer_cast (_content.front ()); @@ -300,29 +302,35 @@ ContentMenu::find_missing () d->Destroy (); } + list > content; + if (r == wxID_OK) { - content = content_factory (film, path); + if (dc) { + content.push_back (shared_ptr(new DCPContent(path))); + } else { + content = content_factory (path); + } } - if (!content) { + if (content.empty ()) { return; } - shared_ptr j (new ExamineContentJob (film, content)); + BOOST_FOREACH (shared_ptr i, content) { + shared_ptr j (new ExamineContentJob (film, i)); - _job_connections.push_back ( j->Finished.connect ( bind ( &ContentMenu::maybe_found_missing, this, boost::weak_ptr (j), boost::weak_ptr (_content.front ()), - boost::weak_ptr (content) + boost::weak_ptr (i) ) - ) - ); + ); - JobManager::instance()->add (j); + JobManager::instance()->add (j); + } } void @@ -356,7 +364,7 @@ ContentMenu::maybe_found_missing (weak_ptr j, weak_ptr oc, weak_pt return; } - old_content->set_path (new_content->path (0)); + old_content->set_paths (new_content->paths()); } void @@ -370,9 +378,9 @@ ContentMenu::kdm () if (d->ShowModal() == wxID_OK) { try { - dcp->add_kdm (dcp::EncryptedKDM (dcp::file_to_string (wx_to_std (d->GetPath ())))); + dcp->add_kdm (dcp::EncryptedKDM (dcp::file_to_string (wx_to_std (d->GetPath ()), MAX_KDM_SIZE))); } catch (exception& e) { - error_dialog (_parent, wxString::Format (_("Could not load KDM (%s)"), e.what ())); + error_dialog (_parent, _("Could not load KDM"), std_to_wx(e.what())); d->Destroy (); return; } @@ -407,7 +415,9 @@ ContentMenu::ov () void ContentMenu::properties () { - ContentPropertiesDialog* d = new ContentPropertiesDialog (_parent, _content.front ()); + shared_ptr film = _film.lock (); + DCPOMATIC_ASSERT (film); + ContentPropertiesDialog* d = new ContentPropertiesDialog (_parent, film, _content.front()); d->ShowModal (); d->Destroy (); } @@ -415,16 +425,21 @@ ContentMenu::properties () void ContentMenu::cpl_selected (wxCommandEvent& ev) { + if (!_pop_up_open) { + return; + } + DCPOMATIC_ASSERT (!_content.empty ()); shared_ptr dcp = dynamic_pointer_cast (_content.front ()); DCPOMATIC_ASSERT (dcp); - DCPExaminer ex (dcp); + DCPExaminer ex (dcp, true); list > cpls = ex.cpls (); - DCPOMATIC_ASSERT (ev.GetId() < int (cpls.size())); + DCPOMATIC_ASSERT (ev.GetId() > 0); + DCPOMATIC_ASSERT (ev.GetId() <= int (cpls.size())); list >::const_iterator i = cpls.begin (); - for (int j = 0; j < ev.GetId(); ++j) { + for (int j = 0; j < ev.GetId() - 1; ++j) { ++i; }