X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Ftools%2Fdcpomatic.cc;h=f2aff9359a35412684f4262bbfe7afdd9c6aa110;hb=308488324dbc4d8b709d3fb1dc9fee0479346c21;hp=1e60d96903d3569fe8182e3777c32fd08980f902;hpb=6ffb6bf6681b709a21c8a42da213590117ad33d6;p=dcpomatic.git diff --git a/src/tools/dcpomatic.cc b/src/tools/dcpomatic.cc index 1e60d9690..f2aff9359 100644 --- a/src/tools/dcpomatic.cc +++ b/src/tools/dcpomatic.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2012-2013 Carl Hetherington + Copyright (C) 2012-2014 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 @@ -29,6 +29,7 @@ #include #include #include +#include #include "wx/film_viewer.h" #include "wx/film_editor.h" #include "wx/job_manager_view.h" @@ -57,6 +58,7 @@ #include "lib/send_kdm_email_job.h" #include "lib/server_finder.h" #include "lib/update.h" +#include "lib/content_factory.h" using std::cout; using std::string; @@ -75,10 +77,13 @@ static shared_ptr film; static std::string log_level; static std::string film_to_load; static std::string film_to_create; +static std::string content_to_add; static wxMenu* jobs_menu = 0; static void set_menu_sensitivity (); +// #define DCPOMATIC_WINDOWS_CONSOLE 1 + class FilmChangedDialog { public: @@ -110,7 +115,7 @@ private: }; -void +static void maybe_save_then_delete_film () { if (!film) { @@ -131,6 +136,30 @@ maybe_save_then_delete_film () film.reset (); } +static void +check_film_state_version (int v) +{ + if (v == 4) { + error_dialog ( + 0, + _("This film was created with an old version of DVD-o-matic and may not load correctly " + "in this version. Please check the film's settings carefully.") + ); + } +} + +static void +load_film (boost::filesystem::path file) +{ + film.reset (new Film (file)); + list const notes = film->read_metadata (); + check_film_state_version (film->state_version ()); + for (list::const_iterator i = notes.begin(); i != notes.end(); ++i) { + error_dialog (0, std_to_wx (*i)); + } + film->log()->set_level (log_level); +} + #define ALWAYS 0x0 #define NEEDS_FILM 0x1 #define NOT_DURING_DCP_CREATION 0x2 @@ -138,14 +167,14 @@ maybe_save_then_delete_film () map menu_items; -void +static void add_item (wxMenu* menu, wxString text, int id, int sens) { wxMenuItem* item = menu->Append (id, text); menu_items.insert (make_pair (item, sens)); } -void +static void set_menu_sensitivity () { list > jobs = JobManager::instance()->get (); @@ -190,7 +219,7 @@ enum { ID_tools_check_for_updates }; -void +static void setup_menu (wxMenuBar* m) { wxMenu* file = new wxMenu; @@ -252,8 +281,9 @@ public: : wxFrame (NULL, -1, title) , _hints_dialog (0) , _servers_list_dialog (0) + , _config_dialog (0) { -#ifdef DCPOMATIC_WINDOWS_CONSOLE +#if defined(DCPOMATIC_WINDOWS) && defined(DCPOMATIC_WINDOWS_CONSOLE) AllocConsole(); HANDLE handle_out = GetStdHandle(STD_OUTPUT_HANDLE); @@ -401,9 +431,7 @@ private: if (r == wxID_OK) { maybe_save_then_delete_film (); try { - film.reset (new Film (wx_to_std (c->GetPath ()))); - film->read_metadata (); - film->log()->set_level (log_level); + load_film (wx_to_std (c->GetPath ())); set_film (); } catch (std::exception& e) { wxString p = c->GetPath (); @@ -429,15 +457,16 @@ private: void file_exit () { - Close (true); + /* false here allows the close handler to veto the close request */ + Close (false); } void edit_preferences () { - ConfigDialog* d = new ConfigDialog (this); - d->ShowModal (); - d->Destroy (); - Config::instance()->write (); + if (!_config_dialog) { + _config_dialog = create_config_dialog (); + } + _config_dialog->Show (this); } void jobs_make_dcp () @@ -474,8 +503,10 @@ private: shared_ptr (new SendKDMEmailJob (film, d->screens (), d->dcp (), d->from (), d->until ())) ); } - } catch (KDMError& e) { + } catch (exception& e) { error_dialog (this, e.what ()); + } catch (...) { + error_dialog (this, _("An unknown exeception occurred.")); } d->Destroy (); @@ -574,15 +605,20 @@ private: HintsDialog* _hints_dialog; ServersListDialog* _servers_list_dialog; + wxPreferencesEditor* _config_dialog; }; static const wxCmdLineEntryDesc command_line_description[] = { { wxCMD_LINE_OPTION, "l", "log", "set log level (silent, verbose or timing)", wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL }, { wxCMD_LINE_SWITCH, "n", "new", "create new film", wxCMD_LINE_VAL_NONE, wxCMD_LINE_PARAM_OPTIONAL }, - { wxCMD_LINE_PARAM, 0, 0, "film to load or create", wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_MULTIPLE | wxCMD_LINE_PARAM_OPTIONAL }, + { wxCMD_LINE_OPTION, "c", "content", "add content file", 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 } }; +/** @class App + * @brief The magic App class for wxWidgets. + */ class App : public wxApp { bool OnInit () @@ -626,9 +662,7 @@ class App : public wxApp if (!film_to_load.empty() && boost::filesystem::is_directory (film_to_load)) { try { - film.reset (new Film (film_to_load)); - film->read_metadata (); - film->log()->set_level (log_level); + load_film (film_to_load); } 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()))); } @@ -641,6 +675,10 @@ class App : public wxApp film->set_name (boost::filesystem::path (film_to_create).filename().generic_string ()); } + if (!content_to_add.empty ()) { + film->examine_and_add_content (content_factory (film, content_to_add)); + } + _frame = new Frame (_("DCP-o-matic")); SetTopWindow (_frame); _frame->Maximize (); @@ -653,6 +691,10 @@ class App : public wxApp _timer.reset (new wxTimer (this)); _timer->Start (1000); + if (film) { + check_film_state_version (film->state_version ()); + } + UpdateChecker::instance()->StateChanged.connect (boost::bind (&App::update_checker_state_changed, this)); if (Config::instance()->check_for_updates ()) { UpdateChecker::instance()->run (); @@ -678,10 +720,15 @@ class App : public wxApp if (parser.Found (wxT ("new"))) { film_to_create = wx_to_std (parser.GetParam (0)); } else { - film_to_load = wx_to_std (parser.GetParam(0)); + film_to_load = wx_to_std (parser.GetParam (0)); } } + wxString content; + if (parser.Found (wxT ("content"), &content)) { + content_to_add = wx_to_std (content); + } + wxString log; if (parser.Found (wxT ("log"), &log)) { log_level = wx_to_std (log); @@ -690,6 +737,17 @@ class App : public wxApp return true; } + bool OnExceptionInMainLoop () + { + error_dialog (0, _("An unknown exception occurred. Please report this problem to the DCP-o-matic author (carl@dcpomatic.com).")); + return false; + } + + void OnUnhandledException () + { + error_dialog (0, _("An unknown exception occurred. Please report this problem to the DCP-o-matic author (carl@dcpomatic.com).")); + } + void idle () { ui_signaller->ui_idle (); @@ -732,7 +790,7 @@ class App : public wxApp } } - wxFrame* _frame; + Frame* _frame; shared_ptr _timer; };