Fix (I think) some strange situations where ::get() on dialogs
[dcpomatic.git] / src / tools / dcpomatic_combiner.cc
index 886c1c613b28fe51e683a05afc9d8968aa99d9ec..4532b04299981c35297d97d5b3bee0dbc1ef83eb 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2020 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2020-2021 Carl Hetherington <cth@carlh.net>
 
     This file is part of DCP-o-matic.
 
 #include "lib/job_manager.h"
 #include "lib/util.h"
 #include <dcp/combine.h>
-DCPOMATIC_DISABLE_WARNINGS
+LIBDCP_DISABLE_WARNINGS
 #include <wx/filepicker.h>
-DCPOMATIC_ENABLE_WARNINGS
+LIBDCP_ENABLE_WARNINGS
 #include <wx/wx.h>
 #include <boost/bind/bind.hpp>
 #include <boost/filesystem.hpp>
 #include <exception>
 
 
+using std::dynamic_pointer_cast;
 using std::exception;
+using std::make_shared;
+using std::shared_ptr;
 using std::string;
 using std::vector;
-using std::dynamic_pointer_cast;
 using boost::optional;
-using std::shared_ptr;
 #if BOOST_VERSION >= 106100
 using namespace boost::placeholders;
 #endif
@@ -64,7 +65,7 @@ public:
 
        }
 
-       boost::filesystem::path get () const
+       optional<boost::filesystem::path> get () const
        {
                return boost::filesystem::path(wx_to_std(GetPath()));
        }
@@ -80,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);
 
@@ -103,14 +104,20 @@ public:
                        true
                        );
 
-               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);
@@ -137,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 (
@@ -150,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())
@@ -158,21 +167,21 @@ private:
                        return;
                }
 
-               JobManager* jm = JobManager::instance ();
-               jm->add (shared_ptr<Job>(new CombineDCPJob(_inputs, output)));
+               auto jm = JobManager::instance ();
+               jm->add (make_shared<CombineDCPJob>(_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<CombineDCPJob> last = dynamic_pointer_cast<CombineDCPJob> (jm->get().back());
+               auto last = dynamic_pointer_cast<CombineDCPJob> (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()));
                        }
@@ -186,6 +195,7 @@ private:
        }
 
        EditableList<boost::filesystem::path, DirDialogWrapper>* _input;
+       wxTextCtrl* _annotation_text = nullptr;
        DirPickerCtrl* _output;
        vector<boost::filesystem::path> _inputs;
        Button* _combine;
@@ -195,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));
@@ -249,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;
                }
 
@@ -279,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 ())
@@ -288,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)