X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Ftools%2Fdcpomatic.cc;h=f61ef19e2408478e30a1174e00c6cf7d95ef6db4;hb=373f010a7f04add1f49169cbaa60cb7ae5f508d4;hp=9cfd5e4b2dc886375cb749ef21912b7d834d70ef;hpb=1327b93e61b4143a1209d67a7e9353fa96f58d23;p=dcpomatic.git diff --git a/src/tools/dcpomatic.cc b/src/tools/dcpomatic.cc index 9cfd5e4b2..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__ @@ -212,22 +233,29 @@ public: setup_menu (bar); SetMenuBar (bar); - Connect (ID_file_new, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler (Frame::file_new)); - Connect (ID_file_open, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler (Frame::file_open)); - Connect (ID_file_save, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler (Frame::file_save)); - Connect (ID_file_properties, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler (Frame::file_properties)); - Connect (wxID_EXIT, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler (Frame::file_exit)); - Connect (wxID_PREFERENCES, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler (Frame::edit_preferences)); - Connect (ID_jobs_make_dcp, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler (Frame::jobs_make_dcp)); - Connect (ID_jobs_send_dcp_to_tms, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler (Frame::jobs_send_dcp_to_tms)); - Connect (ID_jobs_show_dcp, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler (Frame::jobs_show_dcp)); - Connect (wxID_ABOUT, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler (Frame::help_about)); - - Connect (wxID_ANY, wxEVT_MENU_OPEN, wxMenuEventHandler (Frame::menu_opened)); + 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_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. + */ + wxPanel* overall_panel = new wxPanel (this, wxID_ANY); - film_editor = new FilmEditor (film, this); - film_viewer = new FilmViewer (film, this); - JobManagerView* job_manager_view = new JobManagerView (this, static_cast (0)); + film_editor = new FilmEditor (film, overall_panel); + film_viewer = new FilmViewer (film, overall_panel); + JobManagerView* job_manager_view = new JobManagerView (overall_panel, static_cast (0)); wxBoxSizer* right_sizer = new wxBoxSizer (wxVERTICAL); right_sizer->Add (film_viewer, 2, wxEXPAND | wxALL, 6); @@ -246,8 +274,10 @@ public: file_changed (""); } + JobManager::instance()->ActiveJobsChanged.connect (boost::bind (set_menu_sensitivity)); + set_film (); - SetSizer (main_sizer); + overall_panel->SetSizer (main_sizer); } private: @@ -258,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); } @@ -281,7 +311,7 @@ private: SetTitle (std_to_wx (s.str())); } - void file_new (wxCommandEvent &) + void file_new () { NewFilmDialog* d = new NewFilmDialog (this); int const r = d->ShowModal (); @@ -318,7 +348,7 @@ private: d->Destroy (); } - void file_open (wxCommandEvent &) + void file_open () { wxDirDialog* c = new wxDirDialog (this, _("Select film to open"), wxStandardPaths::Get().GetDocumentsDir(), wxDEFAULT_DIALOG_STYLE | wxDD_DIR_MUST_EXIST); int r; @@ -348,25 +378,29 @@ private: c->Destroy (); } - void file_save (wxCommandEvent &) + void file_save () { film->write_metadata (); } - void file_properties (wxCommandEvent &) + void file_properties () { PropertiesDialog* d = new PropertiesDialog (this, film); d->ShowModal (); d->Destroy (); } - void file_exit (wxCommandEvent &) + void file_exit () { + if (!should_close ()) { + return; + } + maybe_save_then_delete_film (); Close (true); } - void edit_preferences (wxCommandEvent &) + void edit_preferences () { ConfigDialog* d = new ConfigDialog (this); d->ShowModal (); @@ -374,17 +408,40 @@ private: Config::instance()->write (); } - void jobs_make_dcp (wxCommandEvent &) + void jobs_make_dcp () { 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 (wxCommandEvent &) + void jobs_send_dcp_to_tms () { film->send_dcp_to_tms (); } - void jobs_show_dcp (wxCommandEvent &) + void jobs_show_dcp () { #ifdef __WXMSW__ string d = film->directory(); @@ -410,12 +467,40 @@ private: #endif } - void help_about (wxCommandEvent &) + void help_about () { AboutDialog* d = new AboutDialog (this); 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 @@ -496,7 +581,7 @@ class App : public wxApp f->Show (); ui_signaller = new wxUISignaller (this); - this->Connect (-1, wxEVT_IDLE, wxIdleEventHandler (App::idle)); + this->Bind (wxEVT_IDLE, boost::bind (&App::idle, this)); return true; } @@ -530,7 +615,7 @@ class App : public wxApp return true; } - void idle (wxIdleEvent &) + void idle () { ui_signaller->ui_idle (); }