X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fwx%2Fcontent_menu.cc;h=83b84f5947e41161a1cacdc86546ea0925309580;hb=732ce79ef10c58c129a8b9822fad9955a97a153d;hp=cae56283bbfde0673f2dd716bbfb8b0e57248aff;hpb=df936f57844340064ae3dcc2cf9dac0a0013be06;p=dcpomatic.git diff --git a/src/wx/content_menu.cc b/src/wx/content_menu.cc index cae56283b..83b84f594 100644 --- a/src/wx/content_menu.cc +++ b/src/wx/content_menu.cc @@ -27,10 +27,12 @@ #include "repeat_dialog.h" #include "timeline_video_content_view.h" #include "timeline_audio_content_view.h" +#include "wx_ptr.h" #include "wx_util.h" #include "lib/audio_content.h" #include "lib/config.h" #include "lib/content_factory.h" +#include "lib/constants.h" #include "lib/copy_dcp_details_to_film.h" #include "lib/dcp_content.h" #include "lib/dcp_examiner.h" @@ -43,7 +45,6 @@ #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 @@ -222,9 +223,8 @@ ContentMenu::repeat () return; } - auto d = new RepeatDialog (_parent); + auto d = make_wx(_parent); if (d->ShowModal() != wxID_OK) { - d->Destroy (); return; } @@ -234,7 +234,6 @@ ContentMenu::repeat () } film->repeat_content (_content, d->number ()); - d->Destroy (); _content.clear (); _views.clear (); @@ -344,15 +343,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); + auto d = make_wx(nullptr, _("Choose a folder"), wxT (""), wxDD_DIR_MUST_EXIST); r = d->ShowModal (); path = wx_to_std (d->GetPath()); - d->Destroy (); } else { - auto d = new wxFileDialog (nullptr, _("Choose a file"), wxT (""), wxT (""), wxT ("*.*")); + auto d = make_wx(nullptr, _("Choose a file"), wxT (""), wxT (""), wxT ("*.*")); r = d->ShowModal (); path = wx_to_std (d->GetPath()); - d->Destroy (); } if (r == wxID_CANCEL) { @@ -383,50 +380,49 @@ ContentMenu::kdm () auto dcp = dynamic_pointer_cast (_content.front()); DCPOMATIC_ASSERT (dcp); - auto d = new wxFileDialog (_parent, _("Select KDM")); + auto d = make_wx(_parent, _("Select KDM")); - 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 (d->ShowModal() != wxID_OK) { + 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(wx_to_std(d->GetPath()), 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 @@ -436,7 +432,7 @@ ContentMenu::ov () auto dcp = dynamic_pointer_cast (_content.front()); DCPOMATIC_ASSERT (dcp); - auto d = new wxDirDialog (_parent, _("Select OV")); + auto d = make_wx(_parent, _("Select OV")); if (d->ShowModal() == wxID_OK) { dcp->add_ov (wx_to_std (d->GetPath())); @@ -444,8 +440,6 @@ ContentMenu::ov () DCPOMATIC_ASSERT (film); JobManager::instance()->add (make_shared(film, dcp)); } - - d->Destroy (); } void @@ -453,9 +447,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 (); } @@ -465,8 +458,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; @@ -483,7 +475,9 @@ ContentMenu::advanced () } if (dialog->video_frame_rate()) { - content->set_video_frame_rate(*dialog->video_frame_rate()); + auto film = _film.lock(); + DCPOMATIC_ASSERT(film); + content->set_video_frame_rate(film, *dialog->video_frame_rate()); } else { content->unset_video_frame_rate(); } @@ -551,11 +545,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 */