X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Ftools%2Fdcpomatic_batch.cc;h=8d787dd50192a58dde06efcef321210290a08ee9;hb=5cd49a43b0c453f714bb654d0f23b726b39dadec;hp=b4ab054fda92c9c01b287cac72ad115bdebed65a;hpb=a183c1776cfd020a37d028ebb0f641352f49697b;p=dcpomatic.git diff --git a/src/tools/dcpomatic_batch.cc b/src/tools/dcpomatic_batch.cc index b4ab054fd..8d787dd50 100644 --- a/src/tools/dcpomatic_batch.cc +++ b/src/tools/dcpomatic_batch.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2013 Carl Hetherington + Copyright (C) 2013-2015 Carl Hetherington This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -19,6 +19,7 @@ #include #include +#include #include #include "lib/version.h" #include "lib/compose.hpp" @@ -27,11 +28,15 @@ #include "lib/film.h" #include "lib/job_manager.h" #include "wx/wx_util.h" -#include "wx/wx_ui_signaller.h" +#include "wx/about_dialog.h" +#include "wx/wx_signal_manager.h" #include "wx/job_manager_view.h" +using std::exception; using boost::shared_ptr; +static std::string film_to_load; + enum { ID_file_add_film = 1, ID_file_quit, @@ -52,43 +57,49 @@ setup_menu (wxMenuBar* m) m->Append (help, _("&Help")); } -class Frame : public wxFrame +class DOMFrame : public wxFrame { public: - Frame (wxString const & title) + DOMFrame (wxString const & title) : wxFrame (NULL, -1, title) + , _sizer (new wxBoxSizer (wxVERTICAL)) { wxMenuBar* bar = new wxMenuBar; setup_menu (bar); SetMenuBar (bar); - Connect (ID_file_add_film, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler (Frame::file_add_film)); - Connect (ID_file_quit, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler (Frame::file_quit)); - Connect (ID_help_about, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler (Frame::help_about)); + Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&DOMFrame::file_add_film, this), ID_file_add_film); + Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&DOMFrame::file_quit, this), ID_file_quit); + Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&DOMFrame::help_about, this), ID_help_about); wxPanel* panel = new wxPanel (this); wxSizer* s = new wxBoxSizer (wxHORIZONTAL); s->Add (panel, 1, wxEXPAND); SetSizer (s); - wxSizer* sizer = new wxBoxSizer (wxVERTICAL); - - JobManagerView* job_manager_view = new JobManagerView (panel, JobManagerView::PAUSE); - sizer->Add (job_manager_view, 1, wxALL | wxEXPAND, 6); + JobManagerView* job_manager_view = new JobManagerView (panel); + _sizer->Add (job_manager_view, 1, wxALL | wxEXPAND, 6); wxSizer* buttons = new wxBoxSizer (wxHORIZONTAL); wxButton* add = new wxButton (panel, wxID_ANY, _("Add Film...")); - add->Connect (wxID_ANY, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler (Frame::add_film)); + add->Bind (wxEVT_COMMAND_BUTTON_CLICKED, boost::bind (&DOMFrame::add_film, this)); buttons->Add (add, 1, wxALL, 6); - sizer->Add (buttons, 0, wxALL, 6); + _sizer->Add (buttons, 0, wxALL, 6); - panel->SetSizer (sizer); + panel->SetSizer (_sizer); - Connect (wxID_ANY, wxEVT_CLOSE_WINDOW, wxCloseEventHandler (Frame::close)); + Bind (wxEVT_CLOSE_WINDOW, boost::bind (&DOMFrame::close, this, _1)); + Bind (wxEVT_SIZE, boost::bind (&DOMFrame::sized, this, _1)); } private: + void sized (wxSizeEvent& ev) + { + _sizer->Layout (); + ev.Skip (); + } + bool should_close () { if (!JobManager::instance()->work_to_do ()) { @@ -106,7 +117,7 @@ private: d->Destroy (); return r; } - + void close (wxCloseEvent& ev) { if (!should_close ()) { @@ -117,55 +128,34 @@ private: ev.Skip (); } - void file_add_film (wxCommandEvent& ev) + void file_add_film () { - add_film (ev); + add_film (); } - - void file_quit (wxCommandEvent &) + + void file_quit () { if (should_close ()) { Close (true); } } - void help_about (wxCommandEvent &) + void help_about () { - wxAboutDialogInfo info; - info.SetName (_("DCP-o-matic Batch Converter")); - if (strcmp (dcpomatic_git_commit, "release") == 0) { - info.SetVersion (std_to_wx (String::compose ("version %1", dcpomatic_version))); - } else { - info.SetVersion (std_to_wx (String::compose ("version %1 git %2", dcpomatic_version, dcpomatic_git_commit))); - } - info.SetDescription (_("Free, open-source DCP generation from almost anything.")); - info.SetCopyright (_("(C) 2012-2013 Carl Hetherington, Terrence Meiczinger, Paul Davis, Ole Laursen")); - - wxArrayString authors; - authors.Add (wxT ("Carl Hetherington")); - authors.Add (wxT ("Terrence Meiczinger")); - authors.Add (wxT ("Paul Davis")); - authors.Add (wxT ("Ole Laursen")); - info.SetDevelopers (authors); - - wxArrayString translators; - translators.Add (wxT ("Olivier Perriere")); - translators.Add (wxT ("Lilian Lefranc")); - translators.Add (wxT ("Thierry Journet")); - translators.Add (wxT ("Massimiliano Broggi")); - translators.Add (wxT ("Manuel AC")); - translators.Add (wxT ("Adam Klotblixt")); - info.SetTranslators (translators); - - info.SetWebSite (wxT ("http://carlh.net/software/dcpomatic")); - wxAboutBox (info); + AboutDialog* d = new AboutDialog (this); + d->ShowModal (); + d->Destroy (); } - void add_film (wxCommandEvent &) + void add_film () { wxDirDialog* c = new wxDirDialog (this, _("Select film to open"), wxStandardPaths::Get().GetDocumentsDir(), wxDEFAULT_DIALOG_STYLE | wxDD_DIR_MUST_EXIST); + if (_last_parent) { + c->SetPath (std_to_wx (_last_parent.get().string ())); + } + int r; - while (1) { + while (true) { r = c->ShowModal (); if (r == wxID_OK && c->GetPath() == wxStandardPaths::Get().GetDocumentsDir()) { error_dialog (this, _("You did not select a folder. Make sure that you select a folder before clicking Open.")); @@ -173,7 +163,7 @@ private: break; } } - + if (r == wxID_OK) { try { shared_ptr film (new Film (wx_to_std (c->GetPath ()))); @@ -186,8 +176,18 @@ private: } } + _last_parent = boost::filesystem::path (wx_to_std (c->GetPath ())).parent_path (); + c->Destroy (); } + + boost::optional _last_parent; + wxSizer* _sizer; +}; + +static const wxCmdLineEntryDesc command_line_description[] = { + { wxCMD_LINE_PARAM, 0, 0, "film to load", wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_MULTIPLE | wxCMD_LINE_PARAM_OPTIONAL }, + { wxCMD_LINE_NONE, "", "", "", wxCmdLineParamType (0), 0 } }; class App : public wxApp @@ -197,20 +197,22 @@ class App : public wxApp if (!wxApp::OnInit()) { return false; } - -#ifdef DCPOMATIC_LINUX + +#ifdef DCPOMATIC_LINUX unsetenv ("UBUNTU_MENUPROXY"); -#endif +#endif + + dcpomatic_setup_path_encoding (); /* Enable i18n; this will create a Config object to look for a force-configured language. This Config object will be wrong, however, because dcpomatic_setup - hasn't yet been called and there aren't any scalers, filters etc. + hasn't yet been called and there aren't any filters etc. set up yet. */ dcpomatic_setup_i18n (); - /* Set things up, including scalers / filters etc. + /* Set things up, including filters etc. which will now be internationalised correctly. */ dcpomatic_setup (); @@ -220,20 +222,46 @@ class App : public wxApp */ Config::drop (); - Frame* f = new Frame (_("DCP-o-matic Batch Converter")); + DOMFrame* f = new DOMFrame (_("DCP-o-matic Batch Converter")); SetTopWindow (f); f->Maximize (); f->Show (); - ui_signaller = new wxUISignaller (this); - this->Connect (-1, wxEVT_IDLE, wxIdleEventHandler (App::idle)); + signal_manager = new wxSignalManager (this); + this->Bind (wxEVT_IDLE, boost::bind (&App::idle, this)); + + shared_ptr film; + if (!film_to_load.empty() && boost::filesystem::is_directory (film_to_load)) { + try { + film.reset (new Film (film_to_load)); + film->read_metadata (); + film->make_dcp (); + } catch (exception& e) { + error_dialog (0, std_to_wx (String::compose (wx_to_std (_("Could not load film %1 (%2)")), film_to_load, e.what()))); + } + } return true; } - void idle (wxIdleEvent &) + void idle () { - ui_signaller->ui_idle (); + signal_manager->ui_idle (); + } + + void OnInitCmdLine (wxCmdLineParser& parser) + { + parser.SetDesc (command_line_description); + parser.SetSwitchChars (wxT ("-")); + } + + bool OnCmdLineParsed (wxCmdLineParser& parser) + { + if (parser.GetParamCount() > 0) { + film_to_load = wx_to_std (parser.GetParam(0)); + } + + return true; } };