X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Ftools%2Fdcpomatic.cc;h=af4576fd5e2daeee848eebc2ed981e00e185c136;hb=963c7649da903b87637975e8c2d634da887d3109;hp=5ff04de228bd0611092a8b9610c2b58bee113b4c;hpb=da38c8a0156808595be0aae1b1490069a663fb78;p=dcpomatic.git diff --git a/src/tools/dcpomatic.cc b/src/tools/dcpomatic.cc index 5ff04de22..af4576fd5 100644 --- a/src/tools/dcpomatic.cc +++ b/src/tools/dcpomatic.cc @@ -53,6 +53,7 @@ #include "wx/update_dialog.h" #include "wx/video_waveform_dialog.h" #include "wx/wx_signal_manager.h" +#include "wx/wx_ptr.h" #include "wx/wx_util.h" #include "lib/analytics.h" #include "lib/audio_content.h" @@ -576,42 +577,42 @@ private: void file_new () { - auto d = new FilmNameLocationDialog (this, _("New Film"), true); + auto d = make_wx(this, _("New Film"), true); int const r = d->ShowModal (); - if (r == wxID_OK && d->check_path() && maybe_save_then_delete_film()) { - try { - new_film (d->path(), d->template_name()); - } catch (boost::filesystem::filesystem_error& e) { + if (r != wxID_OK || !d->check_path() || !maybe_save_then_delete_film()) { + return; + } + + try { + new_film (d->path(), d->template_name()); + } catch (boost::filesystem::filesystem_error& e) { #ifdef DCPOMATIC_WINDOWS - string bad_chars = "<>:\"/|?*"; - string const filename = d->path().filename().string(); - string found_bad_chars; - for (size_t i = 0; i < bad_chars.length(); ++i) { - if (filename.find(bad_chars[i]) != string::npos && found_bad_chars.find(bad_chars[i]) == string::npos) { - found_bad_chars += bad_chars[i]; - } + string bad_chars = "<>:\"/|?*"; + string const filename = d->path().filename().string(); + string found_bad_chars; + for (size_t i = 0; i < bad_chars.length(); ++i) { + if (filename.find(bad_chars[i]) != string::npos && found_bad_chars.find(bad_chars[i]) == string::npos) { + found_bad_chars += bad_chars[i]; } - wxString message = _("Could not create folder to store film."); - message += " "; - if (!found_bad_chars.empty()) { - message += wxString::Format (_("Try removing the %s characters from your folder name."), std_to_wx(found_bad_chars).data()); - } else { - message += _("Please check that you do not have Windows controlled folder access enabled for DCP-o-matic."); - } - error_dialog (this, message, std_to_wx(e.what())); + } + wxString message = _("Could not create folder to store film."); + message += " "; + if (!found_bad_chars.empty()) { + message += wxString::Format (_("Try removing the %s characters from your folder name."), std_to_wx(found_bad_chars).data()); + } else { + message += _("Please check that you do not have Windows controlled folder access enabled for DCP-o-matic."); + } + error_dialog (this, message, std_to_wx(e.what())); #else - error_dialog (this, _("Could not create folder to store film."), std_to_wx(e.what())); + error_dialog (this, _("Could not create folder to store film."), std_to_wx(e.what())); #endif - } } - - d->Destroy (); } void file_open () { - auto c = new wxDirDialog ( + auto c = make_wx( this, _("Select film to open"), std_to_wx (Config::instance()->default_directory_or (wx_to_std (wxStandardPaths::Get().GetDocumentsDir())).string ()), @@ -631,8 +632,6 @@ private: if (r == wxID_OK && maybe_save_then_delete_film()) { load_film (wx_to_std (c->GetPath ())); } - - c->Destroy (); } void file_save () @@ -642,43 +641,35 @@ private: void file_save_as_template () { - auto d = new SaveTemplateDialog (this); - int const r = d->ShowModal (); - if (r == wxID_OK) { + auto d = make_wx(this); + if (d->ShowModal() == wxID_OK) { Config::instance()->save_template (_film, d->name ()); } - d->Destroy (); } void file_duplicate () { - auto d = new FilmNameLocationDialog (this, _("Duplicate Film"), false); - int const r = d->ShowModal (); + auto d = make_wx(this, _("Duplicate Film"), false); - if (r == wxID_OK && d->check_path() && maybe_save_film()) { + if (d->ShowModal() == wxID_OK && d->check_path() && maybe_save_film()) { shared_ptr film (new Film (d->path())); film->copy_from (_film); film->set_name (d->path().filename().generic_string()); film->write_metadata (); } - - d->Destroy (); } void file_duplicate_and_open () { - auto d = new FilmNameLocationDialog (this, _("Duplicate Film"), false); - int const r = d->ShowModal (); + auto d = make_wx(this, _("Duplicate Film"), false); - if (r == wxID_OK && d->check_path() && maybe_save_film()) { - shared_ptr film (new Film (d->path())); + if (d->ShowModal() == wxID_OK && d->check_path() && maybe_save_film()) { + auto film = make_shared(d->path()); film->copy_from (_film); film->set_name (d->path().filename().generic_string()); film->write_metadata (); set_film (film); } - - d->Destroy (); } void file_close () @@ -732,30 +723,31 @@ private: { DCPOMATIC_ASSERT (_clipboard); - auto d = new PasteDialog (this, static_cast(_clipboard->video), static_cast(_clipboard->audio), !_clipboard->text.empty()); - if (d->ShowModal() == wxID_OK) { - for (auto i: _film_editor->content_panel()->selected()) { - if (d->video() && i->video) { - DCPOMATIC_ASSERT (_clipboard->video); - i->video->take_settings_from (_clipboard->video); - } - if (d->audio() && i->audio) { - DCPOMATIC_ASSERT (_clipboard->audio); - i->audio->take_settings_from (_clipboard->audio); - } + auto d = make_wx(this, static_cast(_clipboard->video), static_cast(_clipboard->audio), !_clipboard->text.empty()); + if (d->ShowModal() != wxID_OK) { + return; + } - if (d->text()) { - auto j = i->text.begin (); - auto k = _clipboard->text.begin (); - while (j != i->text.end() && k != _clipboard->text.end()) { - (*j)->take_settings_from (*k); - ++j; - ++k; - } + for (auto i: _film_editor->content_panel()->selected()) { + if (d->video() && i->video) { + DCPOMATIC_ASSERT (_clipboard->video); + i->video->take_settings_from (_clipboard->video); + } + if (d->audio() && i->audio) { + DCPOMATIC_ASSERT (_clipboard->audio); + i->audio->take_settings_from (_clipboard->audio); + } + + if (d->text()) { + auto j = i->text.begin (); + auto k = _clipboard->text.begin (); + while (j != i->text.end() && k != _clipboard->text.end()) { + (*j)->take_settings_from (*k); + ++j; + ++k; } } } - d->Destroy (); } void edit_select_all () @@ -773,32 +765,26 @@ private: void tools_restore_default_preferences () { - auto d = new wxMessageDialog ( - 0, + auto d = make_wx( + nullptr, _("Are you sure you want to restore preferences to their defaults? This cannot be undone."), _("Restore default preferences"), wxYES_NO | wxYES_DEFAULT | wxICON_QUESTION ); - int const r = d->ShowModal (); - d->Destroy (); - - if (r == wxID_YES) { + if (d->ShowModal() == wxID_YES) { Config::restore_defaults (); } } void tools_export_preferences () { - auto dialog = new wxFileDialog ( + auto dialog = make_wx( this, _("Specify ZIP file"), wxEmptyString, wxT("dcpomatic_config.zip"), wxT("ZIP files (*.zip)|*.zip"), wxFD_SAVE | wxFD_OVERWRITE_PROMPT ); - int const r = dialog->ShowModal (); - dialog->Destroy (); - - if (r == wxID_OK) { + if (dialog->ShowModal() == wxID_OK) { save_all_config_as_zip (wx_to_std(dialog->GetPath())); } } @@ -822,10 +808,8 @@ private: } if (Config::instance()->show_hints_before_make_dcp()) { - auto hints = new HintsDialog (this, _film, false); - int const r = hints->ShowModal(); - hints->Destroy (); - if (r == wxID_CANCEL) { + auto hints = make_wx(this, _film, false); + if (hints->ShowModal() == wxID_CANCEL) { return; } } @@ -936,10 +920,8 @@ private: } if (Config::instance()->show_hints_before_make_dcp()) { - auto hints = new HintsDialog (this, _film, false); - int const r = hints->ShowModal(); - hints->Destroy (); - if (r == wxID_CANCEL) { + auto hints = make_wx(this, _film, false); + if (hints->ShowModal() == wxID_CANCEL) { return; } } @@ -976,9 +958,8 @@ private: return; } - auto d = new SelfDKDMDialog (this, _film); + auto d = make_wx(this, _film); if (d->ShowModal () != wxID_OK) { - d->Destroy (); return; } @@ -1028,49 +1009,47 @@ private: kdm->as_xml (path); } } - - d->Destroy (); } void jobs_export_video_file () { - auto d = new ExportVideoFileDialog (this, _film->isdcf_name(true)); - if (d->ShowModal() == wxID_OK) { - if (boost::filesystem::exists(d->path())) { - bool ok = confirm_dialog( - this, - wxString::Format (_("File %s already exists. Do you want to overwrite it?"), std_to_wx(d->path().string()).data()) - ); - - if (!ok) { - d->Destroy (); - return; - } - } + auto d = make_wx(this, _film->isdcf_name(true)); + if (d->ShowModal() != wxID_OK) { + return; + } - auto job = make_shared(_film, TranscodeJob::ChangedBehaviour::EXAMINE_THEN_STOP); - job->set_encoder ( - make_shared ( - _film, job, d->path(), d->format(), d->mixdown_to_stereo(), d->split_reels(), d->split_streams(), d->x264_crf()) - ); - JobManager::instance()->add (job); + if (boost::filesystem::exists(d->path())) { + bool ok = confirm_dialog( + this, + wxString::Format (_("File %s already exists. Do you want to overwrite it?"), std_to_wx(d->path().string()).data()) + ); + + if (!ok) { + return; + } } - d->Destroy (); + + auto job = make_shared(_film, TranscodeJob::ChangedBehaviour::EXAMINE_THEN_STOP); + job->set_encoder ( + make_shared ( + _film, job, d->path(), d->format(), d->mixdown_to_stereo(), d->split_reels(), d->split_streams(), d->x264_crf()) + ); + JobManager::instance()->add (job); } void jobs_export_subtitles () { - auto d = new ExportSubtitlesDialog (this, _film->reels().size(), _film->interop()); - if (d->ShowModal() == wxID_OK) { - auto job = make_shared(_film, TranscodeJob::ChangedBehaviour::EXAMINE_THEN_STOP); - job->set_encoder ( - make_shared(_film, job, d->path(), _film->isdcf_name(true), d->split_reels(), d->include_font()) - ); - JobManager::instance()->add (job); + auto d = make_wx(this, _film->reels().size(), _film->interop()); + if (d->ShowModal() != wxID_OK) { + return; } - d->Destroy (); + auto job = make_shared(_film, TranscodeJob::ChangedBehaviour::EXAMINE_THEN_STOP); + job->set_encoder( + make_shared(_film, job, d->path(), _film->isdcf_name(true), d->split_reels(), d->include_font()) + ); + JobManager::instance()->add(job); } @@ -1145,48 +1124,46 @@ private: void tools_send_translations () { - auto d = new SendI18NDialog (this); - if (d->ShowModal() == wxID_OK) { - string body; - body += d->name() + "\n"; - body += d->language() + "\n"; - body += string(dcpomatic_version) + " " + string(dcpomatic_git_commit) + "\n"; - body += "--\n"; - auto translations = I18NHook::translations (); - for (auto i: translations) { - body += i.first + "\n" + i.second + "\n\n"; - } - list to = { "carl@dcpomatic.com" }; - if (d->email().find("@") == string::npos) { - error_dialog (this, _("You must enter a valid email address when sending translations, " - "otherwise the DCP-o-matic maintainers cannot credit you or contact you with questions.")); - } else { - Emailer emailer (d->email(), to, "DCP-o-matic translations", body); - try { - emailer.send ("main.carlh.net", 2525, EmailProtocol::STARTTLS); - } catch (NetworkError& e) { - error_dialog (this, _("Could not send translations"), std_to_wx(e.what())); - } - } + auto d = make_wx(this); + if (d->ShowModal() != wxID_OK) { + return; } - d->Destroy (); + string body; + body += d->name() + "\n"; + body += d->language() + "\n"; + body += string(dcpomatic_version) + " " + string(dcpomatic_git_commit) + "\n"; + body += "--\n"; + auto translations = I18NHook::translations (); + for (auto i: translations) { + body += i.first + "\n" + i.second + "\n\n"; + } + list to = { "carl@dcpomatic.com" }; + if (d->email().find("@") == string::npos) { + error_dialog (this, _("You must enter a valid email address when sending translations, " + "otherwise the DCP-o-matic maintainers cannot credit you or contact you with questions.")); + } else { + Emailer emailer (d->email(), to, "DCP-o-matic translations", body); + try { + emailer.send ("main.carlh.net", 2525, EmailProtocol::STARTTLS); + } catch (NetworkError& e) { + error_dialog (this, _("Could not send translations"), std_to_wx(e.what())); + } + } } void help_about () { - auto d = new AboutDialog (this); + auto d = make_wx(this); d->ShowModal (); - d->Destroy (); } void help_report_a_problem () { - auto d = new ReportProblemDialog (this, _film); + auto d = make_wx(this, _film); if (d->ShowModal () == wxID_OK) { d->report (); } - d->Destroy (); } bool should_close () @@ -1195,16 +1172,14 @@ private: return true; } - auto d = new wxMessageDialog ( - 0, + auto d = make_wx( + nullptr, _("There are unfinished jobs; are you sure you want to quit?"), _("Unfinished jobs"), wxYES_NO | wxYES_DEFAULT | wxICON_QUESTION ); - bool const r = d->ShowModal() == wxID_YES; - d->Destroy (); - return r; + return d->ShowModal() == wxID_YES; } void close (wxCloseEvent& ev) @@ -1539,9 +1514,8 @@ private: } if (uc->state() == UpdateChecker::State::YES) { - auto dialog = new UpdateDialog (this, uc->stable(), uc->test()); + auto dialog = make_wx(this, uc->stable(), uc->test()); dialog->ShowModal (); - dialog->Destroy (); } else if (uc->state() == UpdateChecker::State::FAILED) { error_dialog (this, _("The DCP-o-matic download server could not be contacted.")); } else { @@ -1577,9 +1551,8 @@ private: void analytics_message (string title, string html) { - auto d = new HTMLDialog(this, std_to_wx(title), std_to_wx(html)); + auto d = make_wx(this, std_to_wx(title), std_to_wx(html)); d->ShowModal(); - d->Destroy(); } void set_title () @@ -1748,18 +1721,14 @@ private: auto release_notes = find_release_notes(gui_is_dark()); if (release_notes) { - auto notes = new HTMLDialog(nullptr, _("Release notes"), std_to_wx(*release_notes), true); + auto notes = make_wx(nullptr, _("Release notes"), std_to_wx(*release_notes), true); notes->Centre(); notes->ShowModal(); - notes->Destroy(); } } catch (exception& e) { - if (_splash) { - _splash->Destroy (); - _splash = nullptr; - } + _splash.reset(); error_dialog (nullptr, wxString::Format ("DCP-o-matic could not start."), std_to_wx(e.what())); } @@ -1871,10 +1840,7 @@ private: void close_splash () { - if (_splash) { - _splash->Destroy (); - _splash = 0; - } + _splash.reset(); } void config_failed_to_load (Config::LoadFailure what) @@ -1892,8 +1858,7 @@ private: /* Destroy the splash screen here, as otherwise bad things seem to happen (for reasons unknown) when we open our recreate dialog, close it, *then* try to Destroy the splash (the Destroy fails). */ - _splash->Destroy (); - _splash = nullptr; + _splash.reset(); auto config = Config::instance(); switch (reason) { @@ -1902,7 +1867,7 @@ private: if (config->nagged(Config::NAG_BAD_SIGNER_CHAIN_UTF8)) { return false; } - auto d = new RecreateChainDialog ( + auto d = make_wx( _frame, _("Recreate signing certificates"), _("The certificate chain that DCP-o-matic uses for signing DCPs and KDMs contains a small error\n" "which will prevent DCPs from being validated correctly on some systems. Do you want to re-create\n" @@ -1910,16 +1875,14 @@ private: _("Do nothing"), Config::NAG_BAD_SIGNER_CHAIN_UTF8 ); - int const r = d->ShowModal (); - d->Destroy (); - return r == wxID_OK; + return d->ShowModal() == wxID_OK; } case Config::BAD_SIGNER_VALIDITY_TOO_LONG: { if (config->nagged(Config::NAG_BAD_SIGNER_CHAIN_VALIDITY)) { return false; } - auto d = new RecreateChainDialog ( + auto d = make_wx( _frame, _("Recreate signing certificates"), _("The certificate chain that DCP-o-matic uses for signing DCPs and KDMs has a validity period\n" "that is too long. This will cause problems playing back DCPs on some systems.\n" @@ -1927,29 +1890,25 @@ private: _("Do nothing"), Config::NAG_BAD_SIGNER_CHAIN_VALIDITY ); - int const r = d->ShowModal (); - d->Destroy (); - return r == wxID_OK; + return d->ShowModal() == wxID_OK; } case Config::BAD_SIGNER_INCONSISTENT: { - auto d = new RecreateChainDialog ( + auto d = make_wx( _frame, _("Recreate signing certificates"), _("The certificate chain that DCP-o-matic uses for signing DCPs and KDMs is inconsistent and\n" "cannot be used. DCP-o-matic cannot start unless you re-create it. Do you want to re-create\n" "the certificate chain for signing DCPs and KDMs?"), _("Close DCP-o-matic") ); - int const r = d->ShowModal (); - d->Destroy (); - if (r != wxID_OK) { + if (d->ShowModal() != wxID_OK) { exit (EXIT_FAILURE); } return true; } case Config::BAD_DECRYPTION_INCONSISTENT: { - auto d = new RecreateChainDialog ( + auto d = make_wx( _frame, _("Recreate KDM decryption chain"), _("The certificate chain that DCP-o-matic uses for decrypting KDMs is inconsistent and\n" "cannot be used. DCP-o-matic cannot start unless you re-create it. Do you want to re-create\n" @@ -1957,9 +1916,7 @@ private: "configuration before continuing."), _("Close DCP-o-matic") ); - int const r = d->ShowModal (); - d->Destroy (); - if (r != wxID_OK) { + if (d->ShowModal() != wxID_OK) { exit (EXIT_FAILURE); } return true; @@ -1970,7 +1927,7 @@ private: } DOMFrame* _frame = nullptr; - wxSplashScreen* _splash = nullptr; + wx_ptr _splash; shared_ptr _timer; string _film_to_load; string _film_to_create;