Hand-apply 6a3cd511559433554ab40ed72ff94b7d8dc2c5bd from master;
[dcpomatic.git] / src / tools / dcpomatic.cc
index e59892d92721e4be1e835b0654b165ac2f432392..b0df7b32c9d5d7c52be5a2c38cb388457a6cf242 100644 (file)
@@ -30,7 +30,7 @@
 #include <wx/stdpaths.h>
 #include <wx/cmdline.h>
 #include <wx/preferences.h>
-#include <libdcp/exceptions.h>
+#include <dcp/exceptions.h>
 #include "wx/film_viewer.h"
 #include "wx/film_editor.h"
 #include "wx/job_manager_view.h"
@@ -45,6 +45,8 @@
 #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/film.h"
 #include "lib/config.h"
 #include "lib/util.h"
@@ -72,8 +74,6 @@ using std::exception;
 using boost::shared_ptr;
 using boost::dynamic_pointer_cast;
 
-// #define DCPOMATIC_WINDOWS_CONSOLE 1
-
 class FilmChangedDialog
 {
 public:
@@ -82,6 +82,9 @@ 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.
+                       */
                        _("Film changed"),
                        wxYES_NO | wxYES_DEFAULT | wxICON_QUESTION
                        );
@@ -128,6 +131,7 @@ enum {
        ID_tools_hints,
        ID_tools_encoding_servers,
        ID_tools_check_for_updates,
+       ID_help_report_a_problem,
        /* IDs for shortcuts (with no associated menu item) */
        ID_add_file
 };
@@ -145,20 +149,24 @@ public:
                , _history_position (0)
                , _history_separator (0)
        {
-#if defined(DCPOMATIC_WINDOWS) && defined(DCPOMATIC_WINDOWS_CONSOLE)
-                AllocConsole();
-               
-               HANDLE handle_out = GetStdHandle(STD_OUTPUT_HANDLE);
-               int hCrt = _open_osfhandle((intptr_t) handle_out, _O_TEXT);
-               FILE* hf_out = _fdopen(hCrt, "w");
-               setvbuf(hf_out, NULL, _IONBF, 1);
-               *stdout = *hf_out;
-               
-               HANDLE handle_in = GetStdHandle(STD_INPUT_HANDLE);
-               hCrt = _open_osfhandle((intptr_t) handle_in, _O_TEXT);
-               FILE* hf_in = _fdopen(hCrt, "r");
-               setvbuf(hf_in, NULL, _IONBF, 128);
-               *stdin = *hf_in;
+#if defined(DCPOMATIC_WINDOWS)
+               if (Config::instance()->win32_console ()) {
+                       AllocConsole();
+                       
+                       HANDLE handle_out = GetStdHandle(STD_OUTPUT_HANDLE);
+                       int hCrt = _open_osfhandle((intptr_t) handle_out, _O_TEXT);
+                       FILE* hf_out = _fdopen(hCrt, "w");
+                       setvbuf(hf_out, NULL, _IONBF, 1);
+                       *stdout = *hf_out;
+                       
+                       HANDLE handle_in = GetStdHandle(STD_INPUT_HANDLE);
+                       hCrt = _open_osfhandle((intptr_t) handle_in, _O_TEXT);
+                       FILE* hf_in = _fdopen(hCrt, "r");
+                       setvbuf(hf_in, NULL, _IONBF, 128);
+                       *stdin = *hf_in;
+
+                       cout << "DCP-o-matic is starting." << "\n";
+               }
 #endif
 
                wxMenuBar* bar = new wxMenuBar;
@@ -185,15 +193,10 @@ public:
                Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&Frame::tools_encoding_servers, this),  ID_tools_encoding_servers);
                Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&Frame::tools_check_for_updates, this), ID_tools_check_for_updates);
                Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&Frame::help_about, this),              wxID_ABOUT);
+               Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&Frame::help_report_a_problem, this),   ID_help_report_a_problem);
 
                Bind (wxEVT_CLOSE_WINDOW, boost::bind (&Frame::close, this, _1));
 
-               wxAcceleratorEntry accel[1];
-               accel[0].Set (wxACCEL_CTRL, static_cast<int>('A'), ID_add_file);
-               Bind (wxEVT_MENU, boost::bind (&FilmEditor::content_add_file_clicked, _film_editor), ID_add_file);
-               wxAcceleratorTable accel_table (1, accel);
-               SetAcceleratorTable (accel_table);
-
                /* Use a panel as the only child of the Frame so that we avoid
                   the dark-grey background on Windows.
                */
@@ -201,7 +204,7 @@ public:
 
                _film_editor = new FilmEditor (overall_panel);
                _film_viewer = new FilmViewer (overall_panel);
-               JobManagerView* job_manager_view = new JobManagerView (overall_panel, static_cast<JobManagerView::Buttons> (0));
+               JobManagerView* job_manager_view = new JobManagerView (overall_panel);
 
                wxBoxSizer* right_sizer = new wxBoxSizer (wxVERTICAL);
                right_sizer->Add (_film_viewer, 2, wxEXPAND | wxALL, 6);
@@ -219,6 +222,12 @@ public:
                JobManager::instance()->ActiveJobsChanged.connect (boost::bind (&Frame::set_menu_sensitivity, this));
 
                overall_panel->SetSizer (main_sizer);
+
+               wxAcceleratorEntry accel[1];
+               accel[0].Set (wxACCEL_CTRL, static_cast<int>('A'), ID_add_file);
+               Bind (wxEVT_MENU, boost::bind (&ContentPanel::add_file_clicked, _film_editor->content_panel()), ID_add_file);
+               wxAcceleratorTable accel_table (1, accel);
+               SetAcceleratorTable (accel_table);
        }
 
        void new_film (boost::filesystem::path path)
@@ -410,12 +419,12 @@ private:
                                        shared_ptr<Job> (new SendKDMEmailJob (_film, d->screens (), d->cpl (), d->from (), d->until (), d->formulation ()))
                                        );
                        }
-               } catch (libdcp::NotEncryptedError& e) {
+               } catch (dcp::NotEncryptedError& e) {
                        error_dialog (this, _("CPL's content is not encrypted."));
                } catch (exception& e) {
                        error_dialog (this, e.what ());
                } catch (...) {
-                       error_dialog (this, _("An unknown exeception occurred."));
+                       error_dialog (this, _("An unknown exception occurred."));
                }
        
                d->Destroy ();
@@ -423,7 +432,7 @@ private:
 
        void content_scale_to_fit_width ()
        {
-               VideoContentList vc = _film_editor->selected_video_content ();
+               VideoContentList vc = _film_editor->content_panel()->selected_video ();
                for (VideoContentList::iterator i = vc.begin(); i != vc.end(); ++i) {
                        (*i)->scale_and_crop_to_fit_width ();
                }
@@ -431,7 +440,7 @@ private:
 
        void content_scale_to_fit_height ()
        {
-               VideoContentList vc = _film_editor->selected_video_content ();
+               VideoContentList vc = _film_editor->content_panel()->selected_video ();
                for (VideoContentList::iterator i = vc.begin(); i != vc.end(); ++i) {
                        (*i)->scale_and_crop_to_fit_height ();
                }
@@ -498,6 +507,15 @@ private:
                d->Destroy ();
        }
 
+       void help_report_a_problem ()
+       {
+               ReportProblemDialog* d = new ReportProblemDialog (this, _film);
+               if (d->ShowModal () == wxID_OK) {
+                       d->report ();
+               }
+               d->Destroy ();
+       }
+
        bool should_close ()
        {
                if (!JobManager::instance()->work_to_do ()) {
@@ -542,7 +560,7 @@ private:
                }
                bool const dcp_creation = (i != jobs.end ()) && !(*i)->finished ();
                bool const have_cpl = _film && !_film->cpls().empty ();
-               bool const have_selected_video_content = !_film_editor->selected_video_content().empty();
+               bool const have_selected_video_content = !_film_editor->content_panel()->selected_video().empty();
                
                for (map<wxMenuItem*, int>::iterator j = menu_items.begin(); j != menu_items.end(); ++j) {
                        
@@ -617,10 +635,10 @@ private:
 #endif 
        
 #ifdef __WXOSX__       
-               add_item (_file_menu, _("&Preferences..."), wxID_PREFERENCES, ALWAYS);
+               add_item (_file_menu, _("&Preferences...\tCtrl-P"), wxID_PREFERENCES, ALWAYS);
 #else
                wxMenu* edit = new wxMenu;
-               add_item (edit, _("&Preferences..."), wxID_PREFERENCES, ALWAYS);
+               add_item (edit, _("&Preferences...\tCtrl-P"), wxID_PREFERENCES, ALWAYS);
 #endif
 
                wxMenu* content = new wxMenu;
@@ -644,6 +662,7 @@ private:
 #else  
                add_item (help, _("About"), wxID_ABOUT, ALWAYS);
 #endif 
+               add_item (help, _("Report a problem..."), ID_help_report_a_problem, ALWAYS);
                
                m->Append (_file_menu, _("&File"));
 #ifndef __WXOSX__      
@@ -707,6 +726,9 @@ static const wxCmdLineEntryDesc command_line_description[] = {
        { wxCMD_LINE_NONE, "", "", "", wxCmdLineParamType (0), 0 }
 };
 
+/** @class App
+ *  @brief The magic App class for wxWidgets.
+ */
 class App : public wxApp
 {
        bool OnInit ()
@@ -764,7 +786,7 @@ class App : public wxApp
                if (!_film_to_create.empty ()) {
                        _frame->new_film (_film_to_create);
                        if (!_content_to_add.empty ()) {
-                               _frame->film()->examine_and_add_content (content_factory (_frame->film(), _content_to_add));
+                               _frame->film()->examine_and_add_content (content_factory (_frame->film(), _content_to_add), true);
                        }
                }
 
@@ -818,9 +840,8 @@ class App : public wxApp
                try {
                        throw;
                } catch (exception& e) {
-                       error_dialog (0, wxString::Format (_("An exception occurred (%s).  Please report this problem to the DCP-o-matic author (carl@dcpomatic.com)."), e.what ()));
-               } catch (...) {
-                       error_dialog (0, _("An unknown exception occurred.  Please report this problem to the DCP-o-matic author (carl@dcpomatic.com)."));
+                       error_dialog (0, wxString::Format (_("An exception occurred (%s)."), e.what ()) + "  " + REPORT_PROBLEM);               } catch (...) {
+                       error_dialog (0, _("An unknown exception occurred.") + "  " + REPORT_PROBLEM);
                }
 
                /* This will terminate the program */
@@ -829,7 +850,7 @@ class App : public wxApp
        
        void OnUnhandledException ()
        {
-               error_dialog (0, _("An unknown exception occurred.  Please report this problem to the DCP-o-matic author (carl@dcpomatic.com)."));
+               error_dialog (0, _("An unknown exception occurred.") + "  " + REPORT_PROBLEM);
        }
 
        void idle ()