X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Ftools%2Fdcpomatic.cc;h=f61ef19e2408478e30a1174e00c6cf7d95ef6db4;hb=373f010a7f04add1f49169cbaa60cb7ae5f508d4;hp=884a2238f6dd73f88364245f6a7f3ea363eaad77;hpb=1dad4c1b2ef0e5dbb1c6da76acb62c8df623c154;p=dcpomatic.git diff --git a/src/tools/dcpomatic.cc b/src/tools/dcpomatic.cc index 884a2238f..f61ef19e2 100644 --- a/src/tools/dcpomatic.cc +++ b/src/tools/dcpomatic.cc @@ -39,12 +39,16 @@ #include "wx/properties_dialog.h" #include "wx/wx_ui_signaller.h" #include "wx/about_dialog.h" +#include "wx/kdm_dialog.h" #include "lib/film.h" #include "lib/config.h" #include "lib/util.h" #include "lib/version.h" #include "lib/ui_signaller.h" #include "lib/log.h" +#include "lib/job_manager.h" +#include "lib/transcode_job.h" +#include "lib/exceptions.h" using std::cout; using std::string; @@ -52,9 +56,11 @@ using std::wstring; using std::stringstream; using std::map; using std::make_pair; +using std::list; using std::exception; using std::ofstream; using boost::shared_ptr; +using boost::dynamic_pointer_cast; static FilmEditor* film_editor = 0; static FilmViewer* film_viewer = 0; @@ -118,15 +124,14 @@ maybe_save_then_delete_film () film.reset (); } -enum Sensitivity { - ALWAYS, - NEEDS_FILM -}; +#define ALWAYS 0x0 +#define NEEDS_FILM 0x1 +#define NOT_DURING_DCP_CREATION 0x2 -map menu_items; +map menu_items; void -add_item (wxMenu* menu, wxString text, int id, Sensitivity sens) +add_item (wxMenu* menu, wxString text, int id, int sens) { wxMenuItem* item = menu->Append (id, text); menu_items.insert (make_pair (item, sens)); @@ -135,12 +140,26 @@ add_item (wxMenu* menu, wxString text, int id, Sensitivity sens) void set_menu_sensitivity () { - for (map::iterator i = menu_items.begin(); i != menu_items.end(); ++i) { - if (i->second == NEEDS_FILM) { - i->first->Enable (film != 0); - } else { - i->first->Enable (true); + list > jobs = JobManager::instance()->get (); + list >::iterator i = jobs.begin(); + while (i != jobs.end() && dynamic_pointer_cast (*i) == 0) { + ++i; + } + bool const dcp_creation = (i != jobs.end ()); + + for (map::iterator j = menu_items.begin(); j != menu_items.end(); ++j) { + + bool enabled = true; + + if ((j->second & NEEDS_FILM) && film == 0) { + enabled = false; } + + if ((j->second & NOT_DURING_DCP_CREATION) && dcp_creation) { + enabled = false; + } + + j->first->Enable (enabled); } } @@ -150,6 +169,7 @@ enum { ID_file_save, ID_file_properties, ID_jobs_make_dcp, + ID_jobs_make_kdms, ID_jobs_send_dcp_to_tms, ID_jobs_show_dcp, }; @@ -183,9 +203,10 @@ setup_menu (wxMenuBar* m) #endif jobs_menu = new wxMenu; - add_item (jobs_menu, _("&Make DCP"), ID_jobs_make_dcp, NEEDS_FILM); - add_item (jobs_menu, _("&Send DCP to TMS"), ID_jobs_send_dcp_to_tms, NEEDS_FILM); - add_item (jobs_menu, _("S&how DCP"), ID_jobs_show_dcp, NEEDS_FILM); + add_item (jobs_menu, _("&Make DCP"), ID_jobs_make_dcp, NEEDS_FILM | NOT_DURING_DCP_CREATION); + add_item (jobs_menu, _("Make &KDMs..."), ID_jobs_make_kdms, NEEDS_FILM); + add_item (jobs_menu, _("&Send DCP to TMS"), ID_jobs_send_dcp_to_tms, NEEDS_FILM | NOT_DURING_DCP_CREATION); + add_item (jobs_menu, _("S&how DCP"), ID_jobs_show_dcp, NEEDS_FILM | NOT_DURING_DCP_CREATION); wxMenu* help = new wxMenu; #ifdef __WXOSX__ @@ -219,10 +240,13 @@ public: 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::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::help_about, this), wxID_ABOUT); + Bind (wxEVT_MENU_OPEN, boost::bind (&Frame::menu_opened, this, _1)); + Bind (wxEVT_CLOSE_WINDOW, boost::bind (&Frame::close, this, _1)); /* Use a panel as the only child of the Frame so that we avoid the dark-grey background on Windows. @@ -250,6 +274,8 @@ public: file_changed (""); } + JobManager::instance()->ActiveJobsChanged.connect (boost::bind (set_menu_sensitivity)); + set_film (); overall_panel->SetSizer (main_sizer); } @@ -262,7 +288,7 @@ private: return; } - bool const have_dcp = film && film->have_dcp(); + bool const have_dcp = false;//film && film->have_dcp(); jobs_menu->Enable (ID_jobs_send_dcp_to_tms, have_dcp); jobs_menu->Enable (ID_jobs_show_dcp, have_dcp); } @@ -366,6 +392,10 @@ private: void file_exit () { + if (!should_close ()) { + return; + } + maybe_save_then_delete_film (); Close (true); } @@ -382,6 +412,29 @@ private: { JobWrapper::make_dcp (this, film); } + + void jobs_make_kdms () + { + if (!film) { + return; + } + + KDMDialog* d = new KDMDialog (this); + if (d->ShowModal () == wxID_OK) { + try { + film->make_kdms ( + d->screens (), + d->from (), + d->until (), + d->directory () + ); + } catch (KDMError& e) { + error_dialog (this, e.what ()); + } + } + + d->Destroy (); + } void jobs_send_dcp_to_tms () { @@ -420,6 +473,34 @@ private: d->ShowModal (); d->Destroy (); } + + bool should_close () + { + if (!JobManager::instance()->work_to_do ()) { + return true; + } + + wxMessageDialog* d = new wxMessageDialog ( + 0, + _("There are unfinished jobs; are you sure you want to quit?"), + _("Unfinished jobs"), + wxYES_NO | wxYES_DEFAULT | wxICON_QUESTION + ); + + bool const r = d->ShowModal() == wxID_YES; + d->Destroy (); + return r; + } + + void close (wxCloseEvent& ev) + { + if (!should_close ()) { + ev.Veto (); + return; + } + + ev.Skip (); + } }; #if wxMINOR_VERSION == 9