X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Ftools%2Fdcpomatic_batch.cc;h=e3beb8dc6deb1760199488c65b60b68abe63c6ef;hb=6980066a05f020e3b8c6d0db06ccbb18e01391e3;hp=3088743547b0ed1f7f3e3b6b0b2df574dea94ed1;hpb=b3234e76d2f614c2b05034c0bdae8d5a4e9de9ea;p=dcpomatic.git diff --git a/src/tools/dcpomatic_batch.cc b/src/tools/dcpomatic_batch.cc index 308874354..e3beb8dc6 100644 --- a/src/tools/dcpomatic_batch.cc +++ b/src/tools/dcpomatic_batch.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2013-2015 Carl Hetherington + Copyright (C) 2013-2019 Carl Hetherington This file is part of DCP-o-matic. @@ -22,30 +22,37 @@ #include "wx/about_dialog.h" #include "wx/wx_signal_manager.h" #include "wx/job_manager_view.h" -#include "wx/config_dialog.h" +#include "wx/full_config_dialog.h" #include "wx/servers_list_dialog.h" +#include "wx/dcpomatic_button.h" #include "lib/version.h" #include "lib/compose.hpp" #include "lib/config.h" #include "lib/util.h" #include "lib/film.h" #include "lib/job_manager.h" +#include "lib/job.h" #include "lib/dcpomatic_socket.h" +#include "lib/transcode_job.h" #include #include #include +#include #include #include #include #include +#include using std::exception; using std::string; using std::cout; using std::list; +using std::set; using boost::shared_ptr; using boost::thread; using boost::scoped_array; +using boost::dynamic_pointer_cast; static list films_to_load; @@ -90,7 +97,7 @@ setup_menu (wxMenuBar* m) class DOMFrame : public wxFrame { public: - DOMFrame (wxString const & title) + explicit DOMFrame (wxString const & title) : wxFrame (NULL, -1, title) , _sizer (new wxBoxSizer (wxVERTICAL)) , _config_dialog (0) @@ -100,6 +107,8 @@ public: setup_menu (bar); SetMenuBar (bar); + Config::instance()->Changed.connect (boost::bind (&DOMFrame::config_changed, this, _1)); + Bind (wxEVT_MENU, boost::bind (&DOMFrame::file_add_film, this), ID_file_add_film); Bind (wxEVT_MENU, boost::bind (&DOMFrame::file_quit, this), wxID_EXIT); Bind (wxEVT_MENU, boost::bind (&DOMFrame::edit_preferences, this), wxID_PREFERENCES); @@ -115,9 +124,17 @@ public: _sizer->Add (job_manager_view, 1, wxALL | wxEXPAND, 6); wxSizer* buttons = new wxBoxSizer (wxHORIZONTAL); - wxButton* add = new wxButton (panel, wxID_ANY, _("Add Film...")); + wxButton* add = new Button (panel, _("Add Film...")); add->Bind (wxEVT_BUTTON, boost::bind (&DOMFrame::add_film, this)); buttons->Add (add, 1, wxALL, 6); + _pause = new Button (panel, _("Pause")); + _pause->Bind (wxEVT_BUTTON, boost::bind(&DOMFrame::pause, this)); + buttons->Add (_pause, 1, wxALL, 6); + _resume = new Button (panel, _("Resume")); + _resume->Bind (wxEVT_BUTTON, boost::bind(&DOMFrame::resume, this)); + buttons->Add (_resume, 1, wxALL, 6); + + setup_sensitivity (); _sizer->Add (buttons, 0, wxALL, 6); @@ -127,16 +144,71 @@ public: Bind (wxEVT_SIZE, boost::bind (&DOMFrame::sized, this, _1)); } + void setup_sensitivity () + { + _pause->Enable (!JobManager::instance()->paused()); + _resume->Enable (JobManager::instance()->paused()); + } + + void pause () + { + JobManager::instance()->pause (); + setup_sensitivity (); + } + + void resume () + { + JobManager::instance()->resume (); + setup_sensitivity (); + } + void start_job (boost::filesystem::path path) { try { shared_ptr film (new Film (path)); film->read_metadata (); + + double total_required; + double available; + bool can_hard_link; + + film->should_be_enough_disk_space (total_required, available, can_hard_link); + + set > films; + + BOOST_FOREACH (shared_ptr i, JobManager::instance()->get()) { + films.insert (i->film()); + } + + BOOST_FOREACH (shared_ptr i, films) { + double progress = 0; + BOOST_FOREACH (shared_ptr j, JobManager::instance()->get()) { + if (i == j->film() && dynamic_pointer_cast(j)) { + progress = j->progress().get_value_or(0); + } + } + + double required; + i->should_be_enough_disk_space (required, available, can_hard_link); + total_required += (1 - progress) * required; + } + + if ((total_required - available) > 1) { + if (!confirm_dialog ( + this, + wxString::Format( + _("The DCPs for this film and the films already in the queue will take up about %.1f GB. The " + "disks that you are using only have %.1f GB available. Do you want to add this film to the queue anyway?"), + total_required, available))) { + return; + } + } + film->make_dcp (); } catch (std::exception& e) { wxString p = std_to_wx (path.string ()); wxCharBuffer b = p.ToUTF8 (); - error_dialog (this, wxString::Format (_("Could not open film at %s (%s)"), p.data(), std_to_wx (e.what()).data())); + error_dialog (this, wxString::Format (_("Could not open film at %s"), p.data()), std_to_wx(e.what())); } } @@ -190,7 +262,7 @@ private: void edit_preferences () { if (!_config_dialog) { - _config_dialog = create_config_dialog (); + _config_dialog = create_full_config_dialog (); } _config_dialog->Show (this); } @@ -237,10 +309,42 @@ private: c->Destroy (); } + 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() + ) + ); + } + } + } + boost::optional _last_parent; wxSizer* _sizer; wxPreferencesEditor* _config_dialog; ServersListDialog* _servers_list_dialog; + wxButton* _pause; + wxButton* _resume; }; static const wxCmdLineEntryDesc command_line_description[] = { @@ -251,8 +355,8 @@ static const wxCmdLineEntryDesc command_line_description[] = { class JobServer : public Server { public: - JobServer (DOMFrame* frame) - : Server (Config::instance()->server_port_base() + 2) + explicit JobServer (DOMFrame* frame) + : Server (BATCH_JOB_PORT) , _frame (frame) {} @@ -278,7 +382,15 @@ class App : public wxApp { bool OnInit () { + wxInitAllImageHandlers (); + SetAppName (_("DCP-o-matic Batch Converter")); + is_batch_converter = true; + + Config::FailedToLoad.connect (boost::bind (&App::config_failed_to_load, this)); + Config::Warning.connect (boost::bind (&App::config_warning, this, _1)); + + wxSplashScreen* splash = maybe_show_splash (); if (!wxApp::OnInit()) { return false; @@ -308,12 +420,15 @@ class App : public wxApp */ Config::drop (); - DOMFrame* f = new DOMFrame (_("DCP-o-matic Batch Converter")); - SetTopWindow (f); - f->Maximize (); - f->Show (); + _frame = new DOMFrame (_("DCP-o-matic Batch Converter")); + SetTopWindow (_frame); + _frame->Maximize (); + if (splash) { + splash->Destroy (); + } + _frame->Show (); - JobServer* server = new JobServer (f); + JobServer* server = new JobServer (_frame); new thread (boost::bind (&JobServer::run, server)); signal_manager = new wxSignalManager (this); @@ -328,12 +443,9 @@ class App : public wxApp film->make_dcp (); } catch (exception& e) { error_dialog ( - 0, std_to_wx ( - String::compose ( - wx_to_std (_("Could not load film %1 (%2)")), i.string(), - e.what() - ) - ) + 0, + std_to_wx (String::compose (wx_to_std (_("Could not load film %1")), i.string())), + std_to_wx(e.what()) ); } } @@ -361,6 +473,18 @@ class App : public wxApp return true; } + + void config_failed_to_load () + { + message_dialog (_frame, _("The existing configuration failed to load. Default values will be used instead. These may take a short time to create.")); + } + + void config_warning (string m) + { + message_dialog (_frame, std_to_wx (m)); + } + + DOMFrame* _frame; }; IMPLEMENT_APP (App)