X-Git-Url: https://main.carlh.net/gitweb/?p=dcpomatic.git;a=blobdiff_plain;f=src%2Ftools%2Fdcpomatic_combiner.cc;h=5a6457d465baea48fe0e5b5048e7316bc865ca0f;hp=5f1a7722a7ebd7fab5f93a9922ea1f18d10760a4;hb=5c48efdde34ee11f135ea8b369d85d50d1410445;hpb=5a3e836da9480bca0c3ef3384fa2010f358ccc7e diff --git a/src/tools/dcpomatic_combiner.cc b/src/tools/dcpomatic_combiner.cc index 5f1a7722a..5a6457d46 100644 --- a/src/tools/dcpomatic_combiner.cc +++ b/src/tools/dcpomatic_combiner.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2020 Carl Hetherington + Copyright (C) 2020-2021 Carl Hetherington This file is part of DCP-o-matic. @@ -28,21 +28,25 @@ #include "lib/job_manager.h" #include "lib/util.h" #include -DCPOMATIC_DISABLE_WARNINGS +LIBDCP_DISABLE_WARNINGS #include -DCPOMATIC_ENABLE_WARNINGS +LIBDCP_ENABLE_WARNINGS #include -#include +#include #include #include +using std::dynamic_pointer_cast; using std::exception; +using std::make_shared; +using std::shared_ptr; using std::string; using std::vector; -using boost::dynamic_pointer_cast; using boost::optional; -using boost::shared_ptr; +#if BOOST_VERSION >= 106100 +using namespace boost::placeholders; +#endif static string @@ -61,7 +65,7 @@ public: } - boost::filesystem::path get () const + optional get () const { return boost::filesystem::path(wx_to_std(GetPath())); } @@ -77,13 +81,13 @@ class DOMFrame : public wxFrame { public: explicit DOMFrame (wxString const & title) - : wxFrame (0, -1, title) + : wxFrame (nullptr, -1, title) { /* Use a panel as the only child of the Frame so that we avoid the dark-grey background on Windows. */ - wxPanel* overall_panel = new wxPanel (this); - wxSizer* s = new wxBoxSizer (wxHORIZONTAL); + auto overall_panel = new wxPanel (this); + auto s = new wxBoxSizer (wxHORIZONTAL); s->Add (overall_panel, 1, wxEXPAND); SetSizer (s); @@ -96,18 +100,24 @@ public: boost::bind(&DOMFrame::inputs, this), boost::bind(&DOMFrame::set_inputs, this, _1), &display_string, - false, - true + true, + EditableListButton::NEW | EditableListButton::REMOVE ); - wxBoxSizer* output = new wxBoxSizer (wxHORIZONTAL); + auto output = new wxFlexGridSizer (2, DCPOMATIC_SIZER_X_GAP, DCPOMATIC_SIZER_Y_GAP); + output->AddGrowableCol (1, 1); + + add_label_to_sizer (output, overall_panel, _("Annotation text"), true, 0, wxLEFT | wxRIGHT | wxALIGN_CENTRE_VERTICAL); + _annotation_text = new wxTextCtrl (overall_panel, wxID_ANY, wxT("")); + output->Add (_annotation_text, 1, wxEXPAND); + add_label_to_sizer (output, overall_panel, _("Output DCP folder"), true, 0, wxLEFT | wxRIGHT | wxALIGN_CENTRE_VERTICAL); _output = new DirPickerCtrl (overall_panel); output->Add (_output, 1, wxEXPAND); _combine = new Button (overall_panel, _("Combine")); - wxBoxSizer* sizer = new wxBoxSizer (wxVERTICAL); + auto sizer = new wxBoxSizer (wxVERTICAL); sizer->Add (_input, 1, wxALL | wxEXPAND, DCPOMATIC_DIALOG_BORDER); sizer->Add (output, 0, wxALL | wxEXPAND, DCPOMATIC_DIALOG_BORDER); sizer->Add (_combine, 0, wxALL | wxALIGN_RIGHT, DCPOMATIC_DIALOG_BORDER); @@ -134,9 +144,11 @@ private: void combine () { - boost::filesystem::path const output = wx_to_std(_output->GetPath()); + using namespace boost::filesystem; + + path const output = wx_to_std(_output->GetPath()); - if (boost::filesystem::is_directory(output) && !boost::filesystem::is_empty(output)) { + if (is_directory(output) && !is_empty(output)) { if (!confirm_dialog ( this, std_to_wx ( @@ -147,7 +159,7 @@ private: )) { return; } - } else if (boost::filesystem::is_regular_file(output)) { + } else if (is_regular_file(output)) { error_dialog ( this, String::compose (wx_to_std(_("%1 already exists as a file, so you cannot use it for a DCP.")), output.string()) @@ -155,21 +167,21 @@ private: return; } - JobManager* jm = JobManager::instance (); - jm->add (shared_ptr(new CombineDCPJob(_inputs, output))); + auto jm = JobManager::instance (); + jm->add (make_shared(_inputs, output, wx_to_std(_annotation_text->GetValue()))); bool const ok = display_progress (_("DCP-o-matic Combine"), _("Combining DCPs")); if (!ok) { return; } DCPOMATIC_ASSERT (!jm->get().empty()); - shared_ptr last = dynamic_pointer_cast (jm->get().back()); + auto last = dynamic_pointer_cast (jm->get().back()); DCPOMATIC_ASSERT (last); if (last->finished_ok()) { message_dialog (this, _("DCPs combined successfully.")); } else { - wxString m = std_to_wx(last->error_summary()); + auto m = std_to_wx(last->error_summary()); if (!last->error_details().empty()) { m += wxString::Format(" (%s)", std_to_wx(last->error_details())); } @@ -183,6 +195,7 @@ private: } EditableList* _input; + wxTextCtrl* _annotation_text = nullptr; DirPickerCtrl* _output; vector _inputs; Button* _combine; @@ -192,11 +205,9 @@ private: class App : public wxApp { public: - App () - : _frame (0) - {} + App () {} - bool OnInit () + bool OnInit () override { try { Config::FailedToLoad.connect (boost::bind (&App::config_failed_to_load, this)); @@ -246,7 +257,7 @@ public: } catch (exception& e) { - error_dialog (0, wxString::Format ("DCP-o-matic DCP Combiner could not start."), std_to_wx(e.what())); + error_dialog (nullptr, wxString::Format ("DCP-o-matic DCP Combiner could not start."), std_to_wx(e.what())); return false; } @@ -276,7 +287,7 @@ public: } catch (FileError& e) { error_dialog ( 0, - wxString::Format ( + wxString::Format( _("An exception occurred: %s (%s)\n\n") + REPORT_PROBLEM, std_to_wx (e.what()), std_to_wx (e.file().string().c_str ()) @@ -285,29 +296,29 @@ public: } catch (exception& e) { error_dialog ( 0, - wxString::Format ( + wxString::Format( _("An exception occurred: %s.\n\n") + REPORT_PROBLEM, std_to_wx (e.what ()) ) ); } catch (...) { - error_dialog (0, _("An unknown exception occurred.") + " " + REPORT_PROBLEM); + error_dialog (nullptr, _("An unknown exception occurred.") + " " + REPORT_PROBLEM); } } - bool OnExceptionInMainLoop () + bool OnExceptionInMainLoop () override { report_exception (); /* This will terminate the program */ return false; } - void OnUnhandledException () + void OnUnhandledException () override { report_exception (); } - DOMFrame* _frame; + DOMFrame* _frame = nullptr; }; IMPLEMENT_APP (App)