X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fwx%2Fcontent_menu.cc;h=32a4c9ac9f30768477263995aa677f5908eaf609;hb=HEAD;hp=80976e5f678b80c5f152a33821d0d06fa10320c7;hpb=da38c8a0156808595be0aae1b1490069a663fb78;p=dcpomatic.git diff --git a/src/wx/content_menu.cc b/src/wx/content_menu.cc index 80976e5f6..642457d93 100644 --- a/src/wx/content_menu.cc +++ b/src/wx/content_menu.cc @@ -23,7 +23,10 @@ #include "content_advanced_dialog.h" #include "content_menu.h" #include "content_properties_dialog.h" +#include "dir_dialog.h" +#include "file_dialog.h" #include "film_viewer.h" +#include "id.h" #include "repeat_dialog.h" #include "timeline_video_content_view.h" #include "timeline_audio_content_view.h" @@ -39,12 +42,12 @@ #include "lib/exceptions.h" #include "lib/ffmpeg_content.h" #include "lib/film.h" +#include "lib/film_util.h" #include "lib/find_missing.h" #include "lib/guess_crop.h" #include "lib/image_content.h" #include "lib/job_manager.h" #include "lib/playlist.h" -#include "lib/scope_guard.h" #include "lib/video_content.h" #include #include @@ -72,8 +75,7 @@ using namespace dcpomatic; enum { - /* Start at 256 so we can have IDs on _cpl_menu from 1 to 255 */ - ID_repeat = 256, + ID_repeat = DCPOMATIC_CONTENT_MENU, ID_join, ID_find_missing, ID_properties, @@ -84,6 +86,7 @@ enum { ID_ov, ID_choose_cpl, ID_set_dcp_settings, + ID_set_dcp_markers, ID_remove }; @@ -107,6 +110,7 @@ ContentMenu::ContentMenu(wxWindow* p, FilmViewer& viewer) _cpl_menu = new wxMenu (); _choose_cpl = _menu->Append (ID_choose_cpl, _("Choose CPL..."), _cpl_menu); _set_dcp_settings = _menu->Append (ID_set_dcp_settings, _("Set project DCP settings from this DCP")); + _set_dcp_markers = _menu->Append(ID_set_dcp_markers, _("Set project markers from this DCP")); _menu->AppendSeparator (); _remove = _menu->Append (ID_remove, _("Remove")); @@ -120,6 +124,7 @@ ContentMenu::ContentMenu(wxWindow* p, FilmViewer& viewer) _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::set_dcp_settings, this), ID_set_dcp_settings); + _parent->Bind (wxEVT_MENU, boost::bind (&ContentMenu::set_dcp_markers, this), ID_set_dcp_markers); _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); } @@ -132,7 +137,7 @@ ContentMenu::popup (weak_ptr film, ContentList c, TimelineContentViewList _views = v; int const N = _cpl_menu->GetMenuItemCount(); - for (int i = 1; i <= N; ++i) { + for (int i = DCPOMATIC_CPL_MENU; i < DCPOMATIC_CPL_MENU + N; ++i) { _cpl_menu->Delete (i); } @@ -159,11 +164,11 @@ ContentMenu::popup (weak_ptr film, ContentList c, TimelineContentViewList _kdm->Enable (dcp->encrypted ()); _ov->Enable (dcp->needs_assets ()); _set_dcp_settings->Enable (static_cast(dcp)); + _set_dcp_markers->Enable(static_cast(dcp)); try { auto cpls = dcp::find_and_resolve_cpls (dcp->directories(), true); _choose_cpl->Enable (cpls.size() > 1); - /* We can't have 0 as a menu item ID on OS X */ - int id = 1; + int id = DCPOMATIC_CPL_MENU; for (auto i: cpls) { auto item = _cpl_menu->AppendRadioItem ( id++, @@ -187,10 +192,12 @@ ContentMenu::popup (weak_ptr film, ContentList c, TimelineContentViewList _ov->Enable (false); _choose_cpl->Enable (false); _set_dcp_settings->Enable (false); + _set_dcp_markers->Enable(false); } } else { _kdm->Enable (false); _set_dcp_settings->Enable (false); + _set_dcp_markers->Enable(false); } _remove->Enable (!_content.empty ()); @@ -212,7 +219,22 @@ ContentMenu::set_dcp_settings () DCPOMATIC_ASSERT (_content.size() == 1); auto dcp = dynamic_pointer_cast(_content.front()); DCPOMATIC_ASSERT (dcp); - copy_dcp_details_to_film (dcp, film); + copy_dcp_settings_to_film(dcp, film); +} + + +void +ContentMenu::set_dcp_markers() +{ + auto film = _film.lock(); + if (!film) { + return; + } + + DCPOMATIC_ASSERT(_content.size() == 1); + auto dcp = dynamic_pointer_cast(_content.front()); + DCPOMATIC_ASSERT(dcp); + copy_dcp_markers_to_film(dcp, film); } @@ -223,9 +245,8 @@ ContentMenu::repeat () return; } - auto d = new RepeatDialog (_parent); + auto d = make_wx(_parent); if (d->ShowModal() != wxID_OK) { - d->Destroy (); return; } @@ -235,7 +256,6 @@ ContentMenu::repeat () } film->repeat_content (_content, d->number ()); - d->Destroy (); _content.clear (); _views.clear (); @@ -345,15 +365,13 @@ ContentMenu::find_missing () boost::filesystem::path path; if ((ic && !ic->still ()) || dc) { - auto d = new wxDirDialog (nullptr, _("Choose a folder"), wxT (""), wxDD_DIR_MUST_EXIST); - r = d->ShowModal (); - path = wx_to_std (d->GetPath()); - d->Destroy (); + wxDirDialog dialog(nullptr, _("Choose a folder"), wxT(""), wxDD_DIR_MUST_EXIST); + r = dialog.ShowModal(); + path = wx_to_std(dialog.GetPath()); } else { - auto d = new wxFileDialog (nullptr, _("Choose a file"), wxT (""), wxT (""), wxT ("*.*")); - r = d->ShowModal (); - path = wx_to_std (d->GetPath()); - d->Destroy (); + wxFileDialog dialog(nullptr, _("Choose a file"), wxT(""), wxT(""), wxT("*.*")); + r = dialog.ShowModal(); + path = wx_to_std(dialog.GetPath()); } if (r == wxID_CANCEL) { @@ -384,50 +402,49 @@ ContentMenu::kdm () auto dcp = dynamic_pointer_cast (_content.front()); DCPOMATIC_ASSERT (dcp); - auto d = new wxFileDialog (_parent, _("Select KDM")); + FileDialog dialog(_parent, _("Select KDM"), wxT("XML files|*.xml|All files|*.*"), 0, "AddKDMPath"); - if (d->ShowModal() == wxID_OK) { - optional kdm; - try { - 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; - } - - /* 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; - } + if (!dialog.show()) { + return; + } - auto cpls = dcp::find_and_resolve_cpls (dcp->directories(), true); - bool const kdm_matches_any_cpl = std::any_of(cpls.begin(), cpls.end(), [kdm](shared_ptr cpl) { return cpl->id() == kdm->cpl_id(); }); - bool const kdm_matches_selected_cpl = dcp->cpl() || kdm->cpl_id() == dcp->cpl().get(); + optional kdm; + try { + kdm = dcp::EncryptedKDM(dcp::file_to_string(dialog.path(), MAX_KDM_SIZE)); + } catch (exception& e) { + error_dialog (_parent, _("Could not load KDM"), std_to_wx(e.what())); + return; + } - if (!kdm_matches_any_cpl) { - error_dialog (_parent, _("This KDM was not made for this DCP. You will need a different one.")); - return; - } + /* 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; + } - 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.")); - } + auto cpls = dcp::find_and_resolve_cpls (dcp->directories(), true); + bool const kdm_matches_any_cpl = std::any_of(cpls.begin(), cpls.end(), [kdm](shared_ptr cpl) { return cpl->id() == kdm->cpl_id(); }); + bool const kdm_matches_selected_cpl = dcp->cpl() || kdm->cpl_id() == dcp->cpl().get(); - dcp->add_kdm (*kdm); + if (!kdm_matches_any_cpl) { + error_dialog (_parent, _("This KDM was not made for this DCP. You will need a different one.")); + return; + } - auto film = _film.lock (); - DCPOMATIC_ASSERT (film); - JobManager::instance()->add (make_shared(film, dcp)); + 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.")); } - d->Destroy (); + dcp->add_kdm (*kdm); + + auto film = _film.lock (); + DCPOMATIC_ASSERT (film); + JobManager::instance()->add (make_shared(film, dcp)); } void @@ -437,16 +454,16 @@ ContentMenu::ov () auto dcp = dynamic_pointer_cast (_content.front()); DCPOMATIC_ASSERT (dcp); - auto d = new wxDirDialog (_parent, _("Select OV")); + auto film = _film.lock(); + DCPOMATIC_ASSERT(film); + DirDialog dialog(_parent, _("Select OV"), wxDD_DIR_MUST_EXIST, "AddFilesPath", add_files_override_path(film)); - if (d->ShowModal() == wxID_OK) { - dcp->add_ov (wx_to_std (d->GetPath())); - shared_ptr film = _film.lock (); + if (dialog.show()) { + dcp->add_ov(dialog.path()); + auto film = _film.lock(); DCPOMATIC_ASSERT (film); JobManager::instance()->add (make_shared(film, dcp)); } - - d->Destroy (); } void @@ -454,9 +471,8 @@ ContentMenu::properties () { auto film = _film.lock (); DCPOMATIC_ASSERT (film); - auto d = new ContentPropertiesDialog (_parent, film, _content.front()); + auto d = make_wx(_parent, film, _content.front()); d->ShowModal (); - d->Destroy (); } @@ -466,8 +482,7 @@ ContentMenu::advanced () DCPOMATIC_ASSERT(!_content.empty()); auto content = _content.front(); - auto dialog = new ContentAdvancedDialog(_parent, content); - ScopeGuard sg = [dialog]() { dialog->Destroy(); }; + auto dialog = make_wx(_parent, content); if (dialog->ShowModal() == wxID_CANCEL) { return; @@ -505,15 +520,11 @@ ContentMenu::cpl_selected (wxCommandEvent& ev) DCPOMATIC_ASSERT (dcp); auto cpls = dcp::find_and_resolve_cpls (dcp->directories(), true); - DCPOMATIC_ASSERT (ev.GetId() > 0); - DCPOMATIC_ASSERT (ev.GetId() <= int (cpls.size())); - auto i = cpls.begin (); - for (int j = 0; j < ev.GetId() - 1; ++j) { - ++i; - } + DCPOMATIC_ASSERT(ev.GetId() >= DCPOMATIC_CPL_MENU); + DCPOMATIC_ASSERT(ev.GetId() < int(DCPOMATIC_CPL_MENU + cpls.size())); + dcp->set_cpl(cpls[ev.GetId() - DCPOMATIC_CPL_MENU]->id()); - dcp->set_cpl ((*i)->id ()); auto film = _film.lock (); DCPOMATIC_ASSERT (film); JobManager::instance()->add (make_shared(film, dcp)); @@ -533,12 +544,13 @@ ContentMenu::auto_crop () DCPOMATIC_ASSERT (film); auto const content = _content.front(); auto const current_crop = content->video->actual_crop(); + auto const video_size_guess = content->video->size().get_value_or(dcp::Size(1998, 1080)); _viewer.set_crop_guess( dcpomatic::Rect( - static_cast(std::max(0, crop.left - current_crop.left)) / content->video->size().width, - static_cast(std::max(0, crop.top - current_crop.top)) / content->video->size().height, - 1.0f - (static_cast(std::max(0, crop.left - current_crop.left + crop.right - current_crop.right)) / content->video->size().width), - 1.0f - (static_cast(std::max(0, crop.top - current_crop.top + crop.bottom - current_crop.bottom)) / content->video->size().height) + static_cast(std::max(0, crop.left - current_crop.left)) / video_size_guess.width, + static_cast(std::max(0, crop.top - current_crop.top)) / video_size_guess.height, + 1.0f - (static_cast(std::max(0, crop.left - current_crop.left + crop.right - current_crop.right)) / video_size_guess.width), + 1.0f - (static_cast(std::max(0, crop.top - current_crop.top + crop.bottom - current_crop.bottom)) / video_size_guess.height) )); }; @@ -554,11 +566,7 @@ ContentMenu::auto_crop () auto const crop = guess_crop_for_content (); update_viewer (crop); - if (_auto_crop_dialog) { - _auto_crop_dialog->Destroy(); - _auto_crop_dialog = nullptr; - } - _auto_crop_dialog = new AutoCropDialog (_parent, crop); + _auto_crop_dialog.reset(_parent, crop); _auto_crop_dialog->Show (); /* Update the dialog and view when the crop threshold changes */