X-Git-Url: https://main.carlh.net/gitweb/?p=dcpomatic.git;a=blobdiff_plain;f=src%2Ftools%2Fdcpomatic.cc;h=e9a1f652cea81ef535369e8cb82604b855316a06;hp=aa37f2fb7d81b37099ef0765f43b2a56ec8e8533;hb=f80e2f7b370c3a6dfa8a78c9665a8eaf43a05f03;hpb=ad5c8849fc3ef5aad88201f28db5474a60db4436 diff --git a/src/tools/dcpomatic.cc b/src/tools/dcpomatic.cc index aa37f2fb7..e9a1f652c 100644 --- a/src/tools/dcpomatic.cc +++ b/src/tools/dcpomatic.cc @@ -61,6 +61,7 @@ #include "lib/cinema_kdms.h" #include "lib/dcpomatic_socket.h" #include "lib/hints.h" +#include "lib/dcp_content.h" #include #include #include @@ -76,6 +77,7 @@ #endif #include #include +#include #include #include /* This is OK as it's only used with DCPOMATIC_WINDOWS */ @@ -209,8 +211,12 @@ public: setup_menu (bar); SetMenuBar (bar); - _config_changed_connection = Config::instance()->Changed.connect (boost::bind (&DOMFrame::config_changed, this)); - config_changed (); +#ifdef DCPOMATIC_WINDOWS + SetIcon (wxIcon (std_to_wx ("id"))); +#endif + + _config_changed_connection = Config::instance()->Changed.connect (boost::bind (&DOMFrame::config_changed, this, _1)); + config_changed (Config::OTHER); Bind (wxEVT_MENU, boost::bind (&DOMFrame::file_new, this), ID_file_new); Bind (wxEVT_MENU, boost::bind (&DOMFrame::file_open, this), ID_file_open); @@ -272,9 +278,6 @@ public: wxAcceleratorTable accel_table (2, 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 ())); - UpdateChecker::instance()->StateChanged.connect (boost::bind (&DOMFrame::update_checker_state_changed, this)); } @@ -493,6 +496,16 @@ private: } } + + /* Remove any existing DCP if the user agrees */ + boost::filesystem::path const dcp_dir = _film->dir (_film->dcp_name(), false); + if (boost::filesystem::exists (dcp_dir)) { + if (!confirm_dialog (this, wxString::Format (_("Do you want to overwrite the existing DCP %s?"), std_to_wx(dcp_dir.string()).data()))) { + return; + } + boost::filesystem::remove_all (dcp_dir); + } + try { /* It seems to make sense to auto-save metadata here, since the make DCP may last a long time, and crashes/power failures are moderately likely. @@ -502,7 +515,7 @@ private: } catch (BadSettingError& e) { error_dialog (this, wxString::Format (_("Bad setting for %s (%s)"), std_to_wx(e.setting()).data(), std_to_wx(e.what()).data())); } catch (std::exception& e) { - error_dialog (this, wxString::Format (_("Could not make DCP: %s"), std_to_wx(e.what()).data())); + error_dialog (this, wxString::Format (_("Could not make DCP: %s."), std_to_wx(e.what()).data())); } } @@ -546,7 +559,7 @@ private: try { boost::asio::io_service io_service; boost::asio::ip::tcp::resolver resolver (io_service); - boost::asio::ip::tcp::resolver::query query ("127.0.0.1", raw_convert (Config::instance()->server_port_base() + 2)); + boost::asio::ip::tcp::resolver::query query ("127.0.0.1", raw_convert (BATCH_JOB_PORT)); boost::asio::ip::tcp::resolver::iterator endpoint_iterator = resolver.resolve (query); Socket socket (5); socket.connect (*endpoint_iterator); @@ -920,8 +933,35 @@ private: m->Append (help, _("&Help")); } - void config_changed () + void config_changed (Config::Property what) { + /* Instantly save any config changes when using the DCP-o-matic GUI */ + if (what == Config::CINEMAS) { + try { + Config::instance()->write_cinemas(); + } catch (exception& e) { + error_dialog ( + this, + wxString::Format ( + _("Could not write to cinemas file at %s. Your changes have not been saved."), + std_to_wx (Config::instance()->cinemas_file().string()).data() + ) + ); + } + } else { + try { + Config::instance()->write_config(); + } catch (exception& e) { + error_dialog ( + this, + wxString::Format ( + _("Could not write to config file at %s. Your changes have not been saved."), + std_to_wx (Config::instance()->cinemas_file().string()).data() + ) + ); + } + } + for (int i = 0; i < _history_items; ++i) { delete _file_menu->Remove (ID_file_history + i); } @@ -1000,7 +1040,8 @@ private: static const wxCmdLineEntryDesc command_line_description[] = { { wxCMD_LINE_SWITCH, "n", "new", "create new film", wxCMD_LINE_VAL_NONE, wxCMD_LINE_PARAM_OPTIONAL }, - { wxCMD_LINE_OPTION, "c", "content", "add content file", wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL }, + { wxCMD_LINE_OPTION, "c", "content", "add content file / directory", wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL }, + { wxCMD_LINE_OPTION, "d", "dcp", "add content DCP", wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL }, { wxCMD_LINE_PARAM, 0, 0, "film to load or create", wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL }, { wxCMD_LINE_NONE, "", "", "", wxCmdLineParamType (0), 0 } }; @@ -1094,7 +1135,12 @@ private: if (!_film_to_create.empty ()) { _frame->new_film (_film_to_create, optional ()); if (!_content_to_add.empty ()) { - _frame->film()->examine_and_add_content (content_factory (_frame->film(), _content_to_add)); + BOOST_FOREACH (shared_ptr i, content_factory (_frame->film(), _content_to_add)) { + _frame->film()->examine_and_add_content (i); + } + } + if (!_dcp_to_add.empty ()) { + _frame->film()->examine_and_add_content (shared_ptr (new DCPContent (_frame->film(), _dcp_to_add))); } } @@ -1138,6 +1184,11 @@ private: _content_to_add = wx_to_std (content); } + wxString dcp; + if (parser.Found (wxT ("dcp"), &dcp)) { + _dcp_to_add = wx_to_std (dcp); + } + return true; } @@ -1204,6 +1255,7 @@ private: string _film_to_load; string _film_to_create; string _content_to_add; + string _dcp_to_add; }; IMPLEMENT_APP (App)