Separate ExceptionStore.
[dcpomatic.git] / src / tools / dcpomatic.cc
index 896ada0904c745a4d3f77608a2cfb00dc8190d68..7a15475572fe837af9c8885e4906182f1234f52a 100644 (file)
  *  @brief The main DCP-o-matic GUI.
  */
 
+#include "wx/film_viewer.h"
+#include "wx/film_editor.h"
+#include "wx/job_manager_view.h"
+#include "wx/config_dialog.h"
+#include "wx/wx_util.h"
+#include "wx/new_film_dialog.h"
+#include "wx/wx_signal_manager.h"
+#include "wx/about_dialog.h"
+#include "wx/kdm_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 "lib/film.h"
 #include "lib/config.h"
 #include "lib/util.h"
+#include "lib/video_content.h"
 #include "lib/version.h"
 #include "lib/signal_manager.h"
 #include "lib/log.h"
 #include "lib/send_kdm_email_job.h"
 #include "lib/server_finder.h"
 #include "lib/update.h"
+#include "lib/cross.h"
 #include "lib/content_factory.h"
-#include "wx/film_viewer.h"
-#include "wx/film_editor.h"
-#include "wx/job_manager_view.h"
-#include "wx/config_dialog.h"
-#include "wx/wx_util.h"
-#include "wx/new_film_dialog.h"
-#include "wx/wx_signal_manager.h"
-#include "wx/about_dialog.h"
-#include "wx/kdm_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 "lib/compose.hpp"
 #include <dcp/exceptions.h>
 #include <wx/generic/aboutdlgg.h>
 #include <wx/stdpaths.h>
 #include <wx/cmdline.h>
 #include <wx/preferences.h>
+#include <wx/splash.h>
 #ifdef __WXMSW__
 #include <shellapi.h>
 #endif
@@ -91,9 +96,8 @@ public:
                _dialog = new wxMessageDialog (
                        0,
                        wxString::Format (_("Save changes to film \"%s\" before closing?"), std_to_wx (name).data()),
-                       /* TRANSLATORS: this is the heading for a dialog box, which tells the user that the current
-                          project (Film) has been changed since it was last saved.
-                       */
+                       /// TRANSLATORS: this is the heading for a dialog box, which tells the user that the current
+                       /// project (Film) has been changed since it was last saved.
                        _("Film changed"),
                        wxYES_NO | wxYES_DEFAULT | wxICON_QUESTION
                        );
@@ -136,6 +140,7 @@ enum {
        ID_jobs_make_kdms,
        ID_jobs_send_dcp_to_tms,
        ID_jobs_show_dcp,
+       ID_tools_video_waveform,
        ID_tools_hints,
        ID_tools_encoding_servers,
        ID_tools_check_for_updates,
@@ -150,6 +155,7 @@ class DOMFrame : public wxFrame
 public:
        DOMFrame (wxString const & title)
                : wxFrame (NULL, -1, title)
+               , _video_waveform_dialog (0)
                , _hints_dialog (0)
                , _servers_list_dialog (0)
                , _config_dialog (0)
@@ -197,6 +203,7 @@ public:
                Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&DOMFrame::jobs_make_kdms, this),          ID_jobs_make_kdms);
                Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&DOMFrame::jobs_send_dcp_to_tms, this),    ID_jobs_send_dcp_to_tms);
                Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&DOMFrame::jobs_show_dcp, this),           ID_jobs_show_dcp);
+               Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&DOMFrame::tools_video_waveform, this),    ID_tools_video_waveform);
                Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&DOMFrame::tools_hints, this),             ID_tools_hints);
                Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&DOMFrame::tools_encoding_servers, this),  ID_tools_encoding_servers);
                Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&DOMFrame::tools_check_for_updates, this), ID_tools_check_for_updates);
@@ -512,6 +519,15 @@ private:
 #endif
        }
 
+       void tools_video_waveform ()
+       {
+               if (!_video_waveform_dialog) {
+                       _video_waveform_dialog = new VideoWaveformDialog (this, _film_viewer);
+               }
+
+               _video_waveform_dialog->Show ();
+       }
+
        void tools_hints ()
        {
                if (!_hints_dialog) {
@@ -685,6 +701,7 @@ private:
                add_item (jobs_menu, _("S&how DCP"), ID_jobs_show_dcp, NEEDS_FILM | NOT_DURING_DCP_CREATION | NEEDS_CPL);
 
                wxMenu* tools = new wxMenu;
+               add_item (tools, _("Video waveform..."), ID_tools_video_waveform, NEEDS_FILM);
                add_item (tools, _("Hints..."), ID_tools_hints, 0);
                add_item (tools, _("Encoding servers..."), ID_tools_encoding_servers, 0);
                add_item (tools, _("Check for updates"), ID_tools_check_for_updates, 0);
@@ -743,6 +760,7 @@ private:
 
        FilmEditor* _film_editor;
        FilmViewer* _film_viewer;
+       VideoWaveformDialog* _video_waveform_dialog;
        HintsDialog* _hints_dialog;
        ServersListDialog* _servers_list_dialog;
        wxPreferencesEditor* _config_dialog;
@@ -777,6 +795,18 @@ private:
        bool OnInit ()
        try
        {
+               wxInitAllImageHandlers ();
+
+               wxSplashScreen* splash = 0;
+               if (!Config::have_existing ()) {
+                       wxBitmap bitmap;
+                       boost::filesystem::path p = shared_path () / "splash.png";
+                       if (bitmap.LoadFile (std_to_wx (p.string ()), wxBITMAP_TYPE_PNG)) {
+                               splash = new wxSplashScreen (bitmap, wxSPLASH_CENTRE_ON_SCREEN | wxSPLASH_NO_TIMEOUT, 0, 0, -1);
+                               wxYield ();
+                       }
+               }
+
                SetAppName (_("DCP-o-matic"));
 
                if (!wxApp::OnInit()) {
@@ -793,7 +823,8 @@ private:
                TransformProcessType (&serial, kProcessTransformToForegroundApplication);
 #endif
 
-               wxInitAllImageHandlers ();
+               cout << "set up path encoding.\n";
+               dcpomatic_setup_path_encoding ();
 
                /* Enable i18n; this will create a Config object
                   to look for a force-configured language.  This Config
@@ -816,6 +847,9 @@ private:
                _frame = new DOMFrame (_("DCP-o-matic"));
                SetTopWindow (_frame);
                _frame->Maximize ();
+               if (splash) {
+                       splash->Destroy ();
+               }
                _frame->Show ();
 
                if (!_film_to_load.empty() && boost::filesystem::is_directory (_film_to_load)) {
@@ -883,7 +917,7 @@ private:
                try {
                        throw;
                } catch (FileError& e) {
-                       error_dialog (0, wxString::Format (_("An exception occurred: %s in %s.\n\n" + REPORT_PROBLEM), e.what(), e.file().string().c_str ()));
+                       error_dialog (0, wxString::Format (_("An exception occurred: %s (%s).\n\n" + REPORT_PROBLEM), e.what(), e.file().string().c_str ()));
                } catch (exception& e) {
                        error_dialog (0, wxString::Format (_("An exception occurred: %s.\n\n"), e.what ()) + "  " + REPORT_PROBLEM);
                } catch (...) {