Cleanup: replace some list with vector.
[dcpomatic.git] / src / tools / dcpomatic.cc
index 1923a12a3f4305e964d53e6718ff6e1936680a85..d6b6bc2b72aaba15126950ebdf4244c7e051d260 100644 (file)
@@ -74,6 +74,7 @@
 #include "lib/exceptions.h"
 #include "lib/ffmpeg_encoder.h"
 #include "lib/film.h"
+#include "lib/font_config.h"
 #include "lib/hints.h"
 #include "lib/job_manager.h"
 #include "lib/kdm_with_metadata.h"
@@ -614,14 +615,22 @@ private:
 
        void file_save ()
        {
-               _film->write_metadata ();
+               try {
+                       _film->write_metadata ();
+               } catch (exception& e) {
+                       error_dialog(this, _("Could not save project."), std_to_wx(e.what()));
+               }
        }
 
        void file_save_as_template ()
        {
                SaveTemplateDialog dialog(this);
                if (dialog.ShowModal() == wxID_OK) {
-                       Config::instance()->save_template(_film, dialog.name());
+                       try {
+                               Config::instance()->save_template(_film, dialog.name());
+                       } catch (exception& e) {
+                               error_dialog(this, _("Could not save template."), std_to_wx(e.what()));
+                       }
                }
        }
 
@@ -633,7 +642,11 @@ private:
                        auto film = make_shared<Film>(dialog.path());
                        film->copy_from (_film);
                        film->set_name(dialog.path().filename().generic_string());
-                       film->write_metadata ();
+                       try {
+                               film->write_metadata();
+                       } catch (exception& e) {
+                               error_dialog(this, _("Could not duplicate project."), std_to_wx(e.what()));
+                       }
                }
        }
 
@@ -645,8 +658,12 @@ private:
                        auto film = make_shared<Film>(dialog.path());
                        film->copy_from (_film);
                        film->set_name(dialog.path().filename().generic_string());
-                       film->write_metadata ();
-                       set_film (film);
+                       try {
+                               film->write_metadata ();
+                               set_film (film);
+                       } catch (exception& e) {
+                               error_dialog(this, _("Could not duplicate project."), std_to_wx(e.what()));
+                       }
                }
        }
 
@@ -1098,12 +1115,11 @@ private:
                for (auto i: translations) {
                        body += i.first + "\n" + i.second + "\n\n";
                }
-               list<string> to = { "carl@dcpomatic.com" };
                if (dialog.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(dialog.email(), to, "DCP-o-matic translations", body);
+                       Emailer emailer(dialog.email(), { "carl@dcpomatic.com" }, "DCP-o-matic translations", body);
                        try {
                                emailer.send ("main.carlh.net", 2525, EmailProtocol::STARTTLS);
                        } catch (NetworkError& e) {
@@ -1175,6 +1191,8 @@ private:
                /* Also stop hearing about analytics-related stuff */
                _analytics_message_connection.disconnect ();
 
+               FontConfig::drop();
+
                ev.Skip ();
        }
 
@@ -1250,14 +1268,20 @@ private:
                        return true;
                }
 
-               if (_film->dirty ()) {
-                       T d (_film->name ());
-                       switch (d.run ()) {
+               while (_film->dirty()) {
+                       T dialog(_film->name());
+                       switch (dialog.run()) {
                        case wxID_NO:
                                return true;
                        case wxID_YES:
-                               _film->write_metadata ();
-                               return true;
+                               try {
+                                       _film->write_metadata();
+                                       return true;
+                               } catch (exception& e) {
+                                       error_dialog(this, _("Could not save project."), std_to_wx(e.what()));
+                                       /* Go round again for another try */
+                               }
+                               break;
                        case wxID_CANCEL:
                                return false;
                        }
@@ -1684,7 +1708,7 @@ private:
                }
                catch (exception& e)
                {
-                       _splash.reset();
+                       close_splash();
                        error_dialog (nullptr, wxString::Format ("DCP-o-matic could not start."), std_to_wx(e.what()));
                }
 
@@ -1796,7 +1820,8 @@ private:
 
        void close_splash ()
        {
-               _splash.reset();
+               _splash->Destroy();
+               _splash = nullptr;
        }
 
        void config_failed_to_load (Config::LoadFailure what)
@@ -1814,7 +1839,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.reset();
+               close_splash();
 
                auto config = Config::instance();
                switch (reason) {
@@ -1883,7 +1908,7 @@ private:
        }
 
        DOMFrame* _frame = nullptr;
-       wx_ptr<wxSplashScreen> _splash;
+       wxSplashScreen* _splash;
        shared_ptr<wxTimer> _timer;
        string _film_to_load;
        string _film_to_create;