Replace some raw arrays with std::vectors.
[dcpomatic.git] / src / tools / dcpomatic.cc
index 0226eb7af1ac32e69217959bde0e491d27dd4ff5..e9302c6a0a4a461b4b793f849f37c5b52b3908fc 100644 (file)
  */
 
 
-#include "wx/standard_controls.h"
-#include "wx/film_viewer.h"
-#include "wx/film_editor.h"
-#include "wx/job_manager_view.h"
-#include "wx/full_config_dialog.h"
-#include "wx/wx_util.h"
-#include "wx/film_name_location_dialog.h"
-#include "wx/wx_signal_manager.h"
-#include "wx/recreate_chain_dialog.h"
 #include "wx/about_dialog.h"
-#include "wx/kdm_dialog.h"
-#include "wx/dkdm_dialog.h"
-#include "wx/self_dkdm_dialog.h"
-#include "wx/servers_list_dialog.h"
-#include "wx/hints_dialog.h"
-#include "wx/update_dialog.h"
 #include "wx/content_panel.h"
-#include "wx/report_problem_dialog.h"
-#include "wx/video_waveform_dialog.h"
-#include "wx/system_information_dialog.h"
-#include "wx/save_template_dialog.h"
-#include "wx/templates_dialog.h"
-#include "wx/nag_dialog.h"
+#include "wx/dkdm_dialog.h"
 #include "wx/export_subtitles_dialog.h"
 #include "wx/export_video_file_dialog.h"
-#include "wx/paste_dialog.h"
+#include "wx/film_editor.h"
+#include "wx/film_name_location_dialog.h"
+#include "wx/film_viewer.h"
 #include "wx/focus_manager.h"
+#include "wx/full_config_dialog.h"
+#include "wx/hints_dialog.h"
 #include "wx/html_dialog.h"
-#include "wx/send_i18n_dialog.h"
 #include "wx/i18n_hook.h"
-#include "lib/film.h"
+#include "wx/job_manager_view.h"
+#include "wx/kdm_dialog.h"
+#include "wx/nag_dialog.h"
+#include "wx/paste_dialog.h"
+#include "wx/recreate_chain_dialog.h"
+#include "wx/report_problem_dialog.h"
+#include "wx/save_template_dialog.h"
+#include "wx/self_dkdm_dialog.h"
+#include "wx/send_i18n_dialog.h"
+#include "wx/servers_list_dialog.h"
+#include "wx/standard_controls.h"
+#include "wx/system_information_dialog.h"
+#include "wx/templates_dialog.h"
+#include "wx/update_dialog.h"
+#include "wx/video_waveform_dialog.h"
+#include "wx/wx_signal_manager.h"
+#include "wx/wx_util.h"
 #include "lib/analytics.h"
-#include "lib/emailer.h"
+#include "lib/audio_content.h"
+#include "lib/check_content_change_job.h"
+#include "lib/cinema.h"
+#include "lib/compose.hpp"
 #include "lib/config.h"
-#include "lib/cross.h"
-#include "lib/util.h"
-#include "lib/video_content.h"
 #include "lib/content.h"
-#include "lib/version.h"
-#include "lib/signal_manager.h"
-#include "lib/log.h"
-#include "lib/screen.h"
-#include "lib/job_manager.h"
-#include "lib/exceptions.h"
-#include "lib/cinema.h"
-#include "lib/kdm_with_metadata.h"
-#include "lib/send_kdm_email_job.h"
-#include "lib/encode_server_finder.h"
-#include "lib/update_checker.h"
-#include "lib/cross.h"
 #include "lib/content_factory.h"
-#include "lib/compose.hpp"
-#include "lib/dcpomatic_socket.h"
-#include "lib/hints.h"
+#include "lib/cross.h"
+#include "lib/cross.h"
 #include "lib/dcp_content.h"
-#include "lib/ffmpeg_encoder.h"
-#include "lib/transcode_job.h"
-#include "lib/dkdm_wrapper.h"
-#include "lib/audio_content.h"
-#include "lib/check_content_change_job.h"
-#include "lib/text_content.h"
 #include "lib/dcpomatic_log.h"
+#include "lib/dcpomatic_socket.h"
+#include "lib/dkdm_wrapper.h"
+#include "lib/emailer.h"
+#include "lib/encode_server_finder.h"
+#include "lib/exceptions.h"
+#include "lib/ffmpeg_encoder.h"
+#include "lib/film.h"
+#include "lib/hints.h"
+#include "lib/job_manager.h"
+#include "lib/kdm_with_metadata.h"
+#include "lib/log.h"
+#include "lib/make_dcp.h"
+#include "lib/screen.h"
+#include "lib/send_kdm_email_job.h"
+#include "lib/signal_manager.h"
 #include "lib/subtitle_encoder.h"
-#include "lib/warnings.h"
+#include "lib/text_content.h"
+#include "lib/transcode_job.h"
+#include "lib/update_checker.h"
+#include "lib/util.h"
+#include "lib/version.h"
+#include "lib/video_content.h"
 #include <dcp/exceptions.h>
 #include <dcp/raw_convert.h>
-DCPOMATIC_DISABLE_WARNINGS
-#include <wx/generic/aboutdlgg.h>
-#include <wx/stdpaths.h>
+#include <dcp/warnings.h>
+LIBDCP_DISABLE_WARNINGS
 #include <wx/cmdline.h>
+#include <wx/generic/aboutdlgg.h>
 #include <wx/preferences.h>
 #include <wx/splash.h>
+#include <wx/stdpaths.h>
 #include <wx/wxhtml.h>
-DCPOMATIC_ENABLE_WARNINGS
+LIBDCP_ENABLE_WARNINGS
 #ifdef __WXGTK__
 #include <X11/Xlib.h>
 #endif
 #ifdef __WXMSW__
 #include <shellapi.h>
 #endif
-#include <boost/filesystem.hpp>
 #include <boost/algorithm/string.hpp>
+#include <boost/filesystem.hpp>
 #include <iostream>
 #include <fstream>
 /* This is OK as it's only used with DCPOMATIC_WINDOWS */
@@ -256,6 +257,7 @@ enum {
        ID_tools_send_translations,
        ID_tools_system_information,
        ID_tools_restore_default_preferences,
+       ID_tools_export_preferences,
        ID_help_report_a_problem,
        /* IDs for shortcuts (with no associated menu item) */
        ID_add_file,
@@ -338,6 +340,7 @@ public:
                Bind (wxEVT_MENU, boost::bind (&DOMFrame::tools_send_translations, this), ID_tools_send_translations);
                Bind (wxEVT_MENU, boost::bind (&DOMFrame::tools_system_information, this),ID_tools_system_information);
                Bind (wxEVT_MENU, boost::bind (&DOMFrame::tools_restore_default_preferences, this), ID_tools_restore_default_preferences);
+               Bind (wxEVT_MENU, boost::bind (&DOMFrame::tools_export_preferences, this), ID_tools_export_preferences);
                Bind (wxEVT_MENU, boost::bind (&DOMFrame::help_about, this),              wxID_ABOUT);
                Bind (wxEVT_MENU, boost::bind (&DOMFrame::help_report_a_problem, this),   ID_help_report_a_problem);
 
@@ -365,9 +368,8 @@ public:
 
                set_menu_sensitivity ();
 
-               _film_editor->FileChanged.connect (bind (&DOMFrame::file_changed, this, _1));
                _film_editor->content_panel()->SelectionChanged.connect (boost::bind (&DOMFrame::set_menu_sensitivity, this));
-               file_changed ("");
+               set_title ();
 
                JobManager::instance()->ActiveJobsChanged.connect (boost::bind (&DOMFrame::set_menu_sensitivity, this));
 
@@ -387,7 +389,7 @@ public:
 #else
                int accelerators = 6;
 #endif
-               auto accel = new wxAcceleratorEntry[accelerators];
+               std::vector<wxAcceleratorEntry> accel(accelerators);
                /* [Shortcut] Ctrl+A:Add file(s) to the film */
                accel[0].Set (wxACCEL_CTRL, static_cast<int>('A'), ID_add_file);
                /* [Shortcut] Delete:Remove selected content from film */
@@ -409,9 +411,8 @@ public:
                Bind (wxEVT_MENU, boost::bind (&DOMFrame::timeline_pressed, this), ID_timeline);
                Bind (wxEVT_MENU, boost::bind (&DOMFrame::back_frame, this), ID_back_frame);
                Bind (wxEVT_MENU, boost::bind (&DOMFrame::forward_frame, this), ID_forward_frame);
-               wxAcceleratorTable accel_table (accelerators, accel);
+               wxAcceleratorTable accel_table (accelerators, accel.data());
                SetAcceleratorTable (accel_table);
-               delete[] accel;
        }
 
        void remove_accelerators ()
@@ -493,8 +494,10 @@ public:
                if (_film) {
                        _film->Change.connect (boost::bind (&DOMFrame::film_change, this, _1));
                        _film->Message.connect (boost::bind(&DOMFrame::film_message, this, _1));
+                       _film->DirtyChange.connect (boost::bind(&DOMFrame::set_title, this));
                        dcpomatic_log = _film->log ();
                }
+               set_title ();
        }
 
        shared_ptr<Film> film () const {
@@ -523,16 +526,6 @@ private:
                }
        }
 
-       void file_changed (boost::filesystem::path f)
-       {
-               auto s = wx_to_std(_("DCP-o-matic"));
-               if (!f.empty ()) {
-                       s += " - " + f.string ();
-               }
-
-               SetTitle (std_to_wx (s));
-       }
-
        void file_new ()
        {
                auto d = new FilmNameLocationDialog (this, _("New Film"), true);
@@ -747,6 +740,21 @@ private:
                }
        }
 
+       void tools_export_preferences ()
+       {
+               auto dialog = new wxFileDialog (
+                       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) {
+                       save_all_config_as_zip (wx_to_std(dialog->GetPath()));
+               }
+       }
+
        void jobs_make_dcp ()
        {
                double required;
@@ -799,7 +807,7 @@ private:
                           a long time, and crashes/power failures are moderately likely.
                        */
                        _film->write_metadata ();
-                       _film->make_dcp (TranscodeJob::ChangedBehaviour::EXAMINE_THEN_STOP);
+                       make_dcp (_film, TranscodeJob::ChangedBehaviour::EXAMINE_THEN_STOP);
                } catch (BadSettingError& e) {
                        error_dialog (this, wxString::Format (_("Bad setting for %s."), std_to_wx(e.setting()).data()), std_to_wx(e.what()));
                } catch (std::exception& e) {
@@ -1375,6 +1383,8 @@ private:
                add_item (tools, _("System information..."), ID_tools_system_information, 0);
                tools->AppendSeparator ();
                add_item (tools, _("Restore default preferences"), ID_tools_restore_default_preferences, ALWAYS);
+               tools->AppendSeparator ();
+               add_item (tools, _("Export preferences..."), ID_tools_export_preferences, ALWAYS);
 
                wxMenu* help = new wxMenu;
 #ifdef __WXOSX__
@@ -1433,7 +1443,7 @@ private:
 
                int pos = _history_position;
 
-               /* Clear out non-existant history items before we re-build the menu */
+               /* Clear out non-existent history items before we re-build the menu */
                Config::instance()->clean_history ();
                auto history = Config::instance()->history();
 
@@ -1515,6 +1525,21 @@ private:
                d->Destroy();
        }
 
+       void set_title ()
+       {
+               auto s = wx_to_std(_("DCP-o-matic"));
+               if (_film) {
+                       if (_film->directory()) {
+                               s += " - " + _film->directory()->string();
+                       }
+                       if (_film->dirty()) {
+                               s += " *";
+                       }
+               }
+
+               SetTitle (std_to_wx(s));
+       }
+
        FilmEditor* _film_editor;
        std::shared_ptr<FilmViewer> _film_viewer;
        StandardControls* _controls;
@@ -1566,7 +1591,7 @@ public:
 
 private:
 
-       bool OnInit ()
+       bool OnInit () override
        {
                try {
                        wxInitAllImageHandlers ();
@@ -1674,13 +1699,13 @@ private:
                return true;
        }
 
-       void OnInitCmdLine (wxCmdLineParser& parser)
+       void OnInitCmdLine (wxCmdLineParser& parser) override
        {
                parser.SetDesc (command_line_description);
                parser.SetSwitchChars (wxT ("-"));
        }
 
-       bool OnCmdLineParsed (wxCmdLineParser& parser)
+       bool OnCmdLineParsed (wxCmdLineParser& parser) override
        {
                if (parser.Found (wxT("version"))) {
                        cout << "dcpomatic version " << dcpomatic_version << " " << dcpomatic_git_commit << "\n";
@@ -1750,14 +1775,14 @@ private:
        }
 
        /* An unhandled exception has occurred inside the main event loop */
-       bool OnExceptionInMainLoop ()
+       bool OnExceptionInMainLoop () override
        {
                report_exception ();
                /* This will terminate the program */
                return false;
        }
 
-       void OnUnhandledException ()
+       void OnUnhandledException () override
        {
                report_exception ();
        }