Fix metadata again.
[dcpomatic.git] / src / tools / dcpomatic.cc
index 16506e411fbacd46520a22e4a2de4ee7eb9d19d9..e3e52d09153346bb4f60e66a0fdc2ff0f9dd3756 100644 (file)
 
 */
 
+/** @file  src/tools/dcpomatic.cc
+ *  @brief The main DCP-o-matic GUI.
+ */
+
 #include "lib/film.h"
 #include "lib/config.h"
 #include "lib/util.h"
 #include "lib/version.h"
-#include "lib/ui_signaller.h"
+#include "lib/signal_manager.h"
 #include "lib/log.h"
 #include "lib/job_manager.h"
 #include "lib/transcode_job.h"
@@ -39,7 +43,7 @@
 #include "wx/wx_util.h"
 #include "wx/new_film_dialog.h"
 #include "wx/properties_dialog.h"
-#include "wx/wx_ui_signaller.h"
+#include "wx/wx_signal_manager.h"
 #include "wx/about_dialog.h"
 #include "wx/kdm_dialog.h"
 #include "wx/servers_list_dialog.h"
@@ -127,7 +131,6 @@ enum {
        ID_file_save,
        ID_file_properties,
        ID_file_history,
-       ID_edit_restore_default_preferences,
        /* Allow spare IDs after _history for the recent files list */
        ID_content_scale_to_fit_width = 100,
        ID_content_scale_to_fit_height,
@@ -138,15 +141,16 @@ enum {
        ID_tools_hints,
        ID_tools_encoding_servers,
        ID_tools_check_for_updates,
+       ID_tools_restore_default_preferences,
        ID_help_report_a_problem,
        /* IDs for shortcuts (with no associated menu item) */
        ID_add_file
 };
 
-class Frame : public wxFrame
+class DOMFrame : public wxFrame
 {
 public:
-       Frame (wxString const & title)
+       DOMFrame (wxString const & title)
                : wxFrame (NULL, -1, title)
                , _hints_dialog (0)
                , _servers_list_dialog (0)
@@ -180,30 +184,30 @@ public:
                setup_menu (bar);
                SetMenuBar (bar);
 
-               _config_changed_connection = Config::instance()->Changed.connect (boost::bind (&Frame::config_changed, this));
+               _config_changed_connection = Config::instance()->Changed.connect (boost::bind (&DOMFrame::config_changed, this));
                config_changed ();
 
-               Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&Frame::file_new, this),                ID_file_new);
-               Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&Frame::file_open, this),               ID_file_open);
-               Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&Frame::file_save, this),               ID_file_save);
-               Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&Frame::file_properties, this),         ID_file_properties);
-               Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&Frame::file_history, this, _1),        ID_file_history, ID_file_history + HISTORY_SIZE);
-               Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&Frame::file_exit, this),               wxID_EXIT);
-               Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&Frame::edit_preferences, this),        wxID_PREFERENCES);
-               Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&Frame::edit_restore_default_preferences, this), ID_edit_restore_default_preferences);
-               Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&Frame::content_scale_to_fit_width, this), ID_content_scale_to_fit_width);
-               Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&Frame::content_scale_to_fit_height, this), ID_content_scale_to_fit_height);
-               Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&Frame::jobs_make_dcp, this),           ID_jobs_make_dcp);
-               Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&Frame::jobs_make_kdms, this),          ID_jobs_make_kdms);
-               Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&Frame::jobs_send_dcp_to_tms, this),    ID_jobs_send_dcp_to_tms);
-               Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&Frame::jobs_show_dcp, this),           ID_jobs_show_dcp);
-               Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&Frame::tools_hints, this),             ID_tools_hints);
-               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));
+               Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&DOMFrame::file_new, this),                ID_file_new);
+               Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&DOMFrame::file_open, this),               ID_file_open);
+               Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&DOMFrame::file_save, this),               ID_file_save);
+               Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&DOMFrame::file_properties, this),         ID_file_properties);
+               Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&DOMFrame::file_history, this, _1),        ID_file_history, ID_file_history + HISTORY_SIZE);
+               Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&DOMFrame::file_exit, this),               wxID_EXIT);
+               Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&DOMFrame::edit_preferences, this),        wxID_PREFERENCES);
+               Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&DOMFrame::content_scale_to_fit_width, this), ID_content_scale_to_fit_width);
+               Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&DOMFrame::content_scale_to_fit_height, this), ID_content_scale_to_fit_height);
+               Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&DOMFrame::jobs_make_dcp, this),           ID_jobs_make_dcp);
+               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_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);
+               Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&DOMFrame::tools_restore_default_preferences, this), ID_tools_restore_default_preferences);
+               Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&DOMFrame::help_about, this),              wxID_ABOUT);
+               Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&DOMFrame::help_report_a_problem, this),   ID_help_report_a_problem);
+
+               Bind (wxEVT_CLOSE_WINDOW, boost::bind (&DOMFrame::close, this, _1));
 
                /* Use a panel as the only child of the Frame so that we avoid
                   the dark-grey background on Windows.
@@ -224,10 +228,10 @@ public:
 
                set_menu_sensitivity ();
 
-               _film_editor->FileChanged.connect (bind (&Frame::file_changed, this, _1));
+               _film_editor->FileChanged.connect (bind (&DOMFrame::file_changed, this, _1));
                file_changed ("");
 
-               JobManager::instance()->ActiveJobsChanged.connect (boost::bind (&Frame::set_menu_sensitivity, this));
+               JobManager::instance()->ActiveJobsChanged.connect (boost::bind (&DOMFrame::set_menu_sensitivity, this));
 
                overall_panel->SetSizer (main_sizer);
 
@@ -236,6 +240,9 @@ public:
                Bind (wxEVT_MENU, boost::bind (&ContentPanel::add_file_clicked, _film_editor->content_panel()), ID_add_file);
                wxAcceleratorTable accel_table (1, accel);
                SetAcceleratorTable (accel_table);
+
+               /* Instantly save any config changes when using the DCP-o-matic GUI */
+               Config::instance()->Changed.connect (boost::bind (&Config::write, Config::instance ()));
        }
 
        void new_film (boost::filesystem::path path)
@@ -393,7 +400,7 @@ private:
                _config_dialog->Show (this);
        }
 
-       void edit_restore_default_preferences ()
+       void tools_restore_default_preferences ()
        {
                Config::restore_defaults ();
        }
@@ -402,9 +409,16 @@ private:
        {
                double required;
                double available;
+               bool can_hard_link;
 
-               if (!_film->should_be_enough_disk_space (required, available)) {
-                       if (!confirm_dialog (this, wxString::Format (_("The DCP for this film will take up about %.1f Gb, and the disk that you are using only has %.1f Gb available.  Do you want to continue anyway?"), required, available))) {
+               if (!_film->should_be_enough_disk_space (required, available, can_hard_link)) {
+                       wxString message;
+                       if (can_hard_link) {
+                               message = wxString::Format (_("The DCP for this film will take up about %.1f Gb, and the disk that you are using only has %.1f Gb available.  Do you want to continue anyway?"), required, available);
+                       } else {
+                               message = wxString::Format (_("The DCP and intermediate files for this film will take up about %.1f Gb, and the disk that you are using only has %.1f Gb available.  You would need half as much space if the filesystem supported hard links, but it does not.  Do you want to continue anyway?"), required, available);
+                       }
+                       if (!confirm_dialog (this, message)) {
                                return;
                        }
                }
@@ -667,11 +681,9 @@ private:
        
 #ifdef __WXOSX__       
                add_item (_file_menu, _("&Preferences...\tCtrl-P"), wxID_PREFERENCES, ALWAYS);
-               add_item (_file_menu, _("Restore default preferences"), ID_edit_restore_default_preferences, ALWAYS);
 #else
                wxMenu* edit = new wxMenu;
                add_item (edit, _("&Preferences...\tCtrl-P"), wxID_PREFERENCES, ALWAYS);
-               add_item (edit, _("Restore default preferences"), ID_edit_restore_default_preferences, ALWAYS);
 #endif
 
                wxMenu* content = new wxMenu;
@@ -688,6 +700,8 @@ private:
                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);
+               tools->AppendSeparator ();
+               add_item (tools, _("Restore default preferences"), ID_tools_restore_default_preferences, ALWAYS);
                
                wxMenu* help = new wxMenu;
 #ifdef __WXOSX__       
@@ -811,7 +825,7 @@ private:
                */
                Config::drop ();
 
-               _frame = new Frame (_("DCP-o-matic"));
+               _frame = new DOMFrame (_("DCP-o-matic"));
                SetTopWindow (_frame);
                _frame->Maximize ();
                _frame->Show ();
@@ -831,7 +845,7 @@ private:
                        }
                }
 
-               ui_signaller = new wxUISignaller (this);
+               signal_manager = new wxSignalManager (this);
                Bind (wxEVT_IDLE, boost::bind (&App::idle, this));
 
                Bind (wxEVT_TIMER, boost::bind (&App::check, this));
@@ -899,7 +913,7 @@ private:
 
        void idle ()
        {
-               ui_signaller->ui_idle ();
+               signal_manager->ui_idle ();
        }
 
        void check ()
@@ -929,7 +943,7 @@ private:
                }
        }
 
-       Frame* _frame;
+       DOMFrame* _frame;
        shared_ptr<wxTimer> _timer;
        string _film_to_load;
        string _film_to_create;