X-Git-Url: https://main.carlh.net/gitweb/?p=dcpomatic.git;a=blobdiff_plain;f=src%2Fwx%2Fcontent_menu.cc;h=c5dc1606d790bb577a0a5ba5382b218febc45867;hp=07ccaded207c659f8d704e57ad94817d37c79c44;hb=8775f802d15e19ff9251d0daff49994a0fc145bc;hpb=bd5e8b83a3a18787241982efdae809d4db21f65d diff --git a/src/wx/content_menu.cc b/src/wx/content_menu.cc index 07ccaded2..c5dc1606d 100644 --- a/src/wx/content_menu.cc +++ b/src/wx/content_menu.cc @@ -54,6 +54,7 @@ using boost::dynamic_pointer_cast; enum { /* Start at 256 so we can have IDs on _cpl_menu from 1 to 255 */ ID_repeat = 256, + ID_join, ID_find_missing, ID_properties, ID_re_examine, @@ -69,6 +70,7 @@ ContentMenu::ContentMenu (wxWindow* p) , _pop_up_open (false) { _repeat = _menu->Append (ID_repeat, _("Repeat...")); + _join = _menu->Append (ID_join, _("Join")); _find_missing = _menu->Append (ID_find_missing, _("Find missing...")); _properties = _menu->Append (ID_properties, _("Properties...")); _re_examine = _menu->Append (ID_re_examine, _("Re-examine...")); @@ -81,6 +83,7 @@ ContentMenu::ContentMenu (wxWindow* p) _remove = _menu->Append (ID_remove, _("Remove")); _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); @@ -111,6 +114,8 @@ ContentMenu::popup (weak_ptr film, ContentList c, TimelineContentViewList } } + _join->Enable (n > 1); + _find_missing->Enable (_content.size() == 1 && !_content.front()->paths_valid ()); _properties->Enable (_content.size() == 1); _re_examine->Enable (!_content.empty ()); @@ -121,13 +126,13 @@ ContentMenu::popup (weak_ptr film, ContentList c, TimelineContentViewList _kdm->Enable (dcp->encrypted ()); _ov->Enable (dcp->needs_assets ()); try { - DCPExaminer ex (dcp); + 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->AppendCheckItem ( + wxMenuItem* item = _cpl_menu->AppendRadioItem ( id++, wxString::Format ( "%s (%s)", @@ -137,11 +142,11 @@ ContentMenu::popup (weak_ptr film, ContentList c, TimelineContentViewList ); item->Check (dcp->cpl() && dcp->cpl() == i->id()); } - } catch (dcp::DCPReadError) { + } catch (dcp::DCPReadError &) { /* The DCP is probably missing */ - } catch (dcp::KDMDecryptionError) { + } catch (dcp::KDMDecryptionError &) { /* We have an incorrect KDM */ - } catch (KDMError) { + } catch (KDMError &) { /* We have an incorrect KDM */ } } else { @@ -185,6 +190,33 @@ ContentMenu::repeat () _views.clear (); } +void +ContentMenu::join () +{ + vector > fc; + BOOST_FOREACH (shared_ptr i, _content) { + shared_ptr f = dynamic_pointer_cast (i); + if (f) { + fc.push_back (f); + } + } + + DCPOMATIC_ASSERT (fc.size() > 1); + + shared_ptr film = _film.lock (); + if (!film) { + return; + } + + try { + shared_ptr joined (new FFmpegContent(fc)); + film->remove_content (_content); + film->examine_and_add_content (joined); + } catch (JoinError& e) { + error_dialog (_parent, std_to_wx (e.what ())); + } +} + void ContentMenu::remove () { @@ -274,9 +306,9 @@ ContentMenu::find_missing () if (r == wxID_OK) { if (dc) { - content.push_back (shared_ptr (new DCPContent (film, path))); + content.push_back (shared_ptr(new DCPContent(path))); } else { - content = content_factory (film, path); + content = content_factory (path); } } @@ -383,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 (); } @@ -399,7 +433,7 @@ ContentMenu::cpl_selected (wxCommandEvent& ev) 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() > 0); DCPOMATIC_ASSERT (ev.GetId() <= int (cpls.size()));