X-Git-Url: https://main.carlh.net/gitweb/?p=dcpomatic.git;a=blobdiff_plain;f=src%2Ftools%2Fdcpomatic.cc;h=acdae692dad4a61b7fe0286c24bf5fec920c9741;hp=a9daf5f04bb69eb0b3fe7302fd3e36221a81a8e2;hb=3828baf56467224f5d44049bf1e7a7ed11f43a05;hpb=5122306a63a95c95a41a3d1b8a1c9f62e59acbb1 diff --git a/src/tools/dcpomatic.cc b/src/tools/dcpomatic.cc index a9daf5f04..acdae692d 100644 --- a/src/tools/dcpomatic.cc +++ b/src/tools/dcpomatic.cc @@ -1,19 +1,20 @@ /* - Copyright (C) 2012-2015 Carl Hetherington + Copyright (C) 2012-2016 Carl Hetherington - This program is free software; you can redistribute it and/or modify + This file is part of DCP-o-matic. + + DCP-o-matic is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. - This program is distributed in the hope that it will be useful, + DCP-o-matic is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + along with DCP-o-matic. If not, see . */ @@ -41,6 +42,7 @@ #include "lib/config.h" #include "lib/util.h" #include "lib/video_content.h" +#include "lib/content.h" #include "lib/version.h" #include "lib/signal_manager.h" #include "lib/log.h" @@ -57,7 +59,6 @@ #include "lib/cinema_kdms.h" #include "lib/dcpomatic_socket.h" #include -#include #include #include #include @@ -70,6 +71,7 @@ #include #endif #include +#include #include #include #include @@ -90,9 +92,8 @@ using std::list; using std::exception; using boost::shared_ptr; using boost::dynamic_pointer_cast; -using dcp::raw_convert; -class FilmChangedDialog +class FilmChangedDialog : public boost::noncopyable { public: FilmChangedDialog (string name) @@ -118,9 +119,6 @@ public: } private: - /* Not defined */ - FilmChangedDialog (FilmChangedDialog const &); - wxMessageDialog* _dialog; }; @@ -153,7 +151,8 @@ enum { ID_tools_restore_default_preferences, ID_help_report_a_problem, /* IDs for shortcuts (with no associated menu item) */ - ID_add_file + ID_add_file, + ID_remove }; class DOMFrame : public wxFrame @@ -248,10 +247,12 @@ public: overall_panel->SetSizer (main_sizer); - wxAcceleratorEntry accel[1]; + wxAcceleratorEntry accel[2]; accel[0].Set (wxACCEL_CTRL, static_cast('A'), ID_add_file); + accel[1].Set (wxACCEL_NORMAL, WXK_DELETE, ID_remove); Bind (wxEVT_MENU, boost::bind (&ContentPanel::add_file_clicked, _film_editor->content_panel()), ID_add_file); - wxAcceleratorTable accel_table (1, accel); + Bind (wxEVT_MENU, boost::bind (&DOMFrame::remove_clicked, this, _1), ID_remove); + wxAcceleratorTable accel_table (2, accel); SetAcceleratorTable (accel_table); /* Instantly save any config changes when using the DCP-o-matic GUI */ @@ -260,6 +261,13 @@ public: UpdateChecker::instance()->StateChanged.connect (boost::bind (&DOMFrame::update_checker_state_changed, this)); } + void remove_clicked (wxCommandEvent& ev) + { + if (_film_editor->content_panel()->remove_clicked (true)) { + ev.Skip (); + } + } + void new_film (boost::filesystem::path path) { shared_ptr film (new Film (path)); @@ -410,7 +418,19 @@ private: void tools_restore_default_preferences () { - Config::restore_defaults (); + wxMessageDialog* d = new wxMessageDialog ( + 0, + _("Are you sure you want to restore preferences to their defaults? This cannot be undone."), + _("Restore default preferences"), + wxYES_NO | wxYES_DEFAULT | wxICON_QUESTION + ); + + int const r = d->ShowModal (); + d->Destroy (); + + if (r == wxID_YES) { + Config::restore_defaults (); + } } void jobs_make_dcp () @@ -497,10 +517,9 @@ private: /* i = 0; try to connect via socket i = 1; try again, and then try to start the batch converter - i = 2; try again. - i = 3; try again. + i = 2 onwards; try again. */ - for (int i = 0; i < 4; ++i) { + for (int i = 0; i < 8; ++i) { try { boost::asio::io_service io_service; boost::asio::ip::tcp::resolver resolver (io_service); @@ -516,7 +535,7 @@ private: socket.read (ok, 3); return; } catch (exception& e) { - std::cout << "start batch failed: " << e.what() << "\n"; + } if (i == 1) { @@ -542,17 +561,19 @@ private: } try { - dcp::EncryptedKDM kdm = _film->make_kdm ( - Config::instance()->decryption_chain()->leaf(), - vector (), - d->cpl (), - dcp::LocalTime ("2012-01-01T01:00:00+00:00"), - dcp::LocalTime ("2112-01-01T01:00:00+00:00"), - dcp::MODIFIED_TRANSITIONAL_1 + vector dkdms = Config::instance()->dkdms (); + dkdms.push_back ( + _film->make_kdm ( + Config::instance()->decryption_chain()->leaf(), + vector (), + d->cpl (), + dcp::LocalTime ("2012-01-01T01:00:00+00:00"), + dcp::LocalTime ("2112-01-01T01:00:00+00:00"), + dcp::MODIFIED_TRANSITIONAL_1 + ) ); - string const name = tidy_for_filename(_film->name()) + "_DKDM.kdm.xml"; - kdm.as_xml (d->directory() / name); + Config::instance()->set_dkdms (dkdms); } catch (dcp::NotEncryptedError& e) { error_dialog (this, _("CPL's content is not encrypted.")); } catch (exception& e) { @@ -566,17 +587,17 @@ private: void content_scale_to_fit_width () { - VideoContentList vc = _film_editor->content_panel()->selected_video (); - for (VideoContentList::iterator i = vc.begin(); i != vc.end(); ++i) { - (*i)->scale_and_crop_to_fit_width (); + ContentList vc = _film_editor->content_panel()->selected_video (); + for (ContentList::iterator i = vc.begin(); i != vc.end(); ++i) { + (*i)->video->scale_and_crop_to_fit_width (); } } void content_scale_to_fit_height () { - VideoContentList vc = _film_editor->content_panel()->selected_video (); - for (VideoContentList::iterator i = vc.begin(); i != vc.end(); ++i) { - (*i)->scale_and_crop_to_fit_height (); + ContentList vc = _film_editor->content_panel()->selected_video (); + for (ContentList::iterator i = vc.begin(); i != vc.end(); ++i) { + (*i)->video->scale_and_crop_to_fit_height (); } } @@ -693,13 +714,45 @@ private: return; } + if (_film && _film->dirty ()) { + + wxMessageDialog* dialog = new wxMessageDialog ( + 0, + wxString::Format (_("Save changes to film \"%s\" before closing?"), std_to_wx (_film->name()).data()), + /// TRANSLATORS: this is the heading for a dialog box, which tells the user that the current + /// project (Film) has been changed since it was last saved. + _("Film changed"), + wxYES_NO | wxCANCEL | wxYES_DEFAULT | wxICON_QUESTION + ); + + dialog->SetYesNoCancelLabels ( + _("Save film and close"), _("Close without saving film"), _("Don't close") + ); + + int const r = dialog->ShowModal (); + dialog->Destroy (); + + switch (r) { + case wxID_NO: + /* Don't save and carry on to close */ + break; + case wxID_YES: + /* Save and carry on to close */ + _film->write_metadata (); + break; + case wxID_CANCEL: + /* Veto the event and stop */ + ev.Veto (); + return; + } + } + /* We don't want to hear about any more configuration changes, since they cause the File menu to be altered, which itself will be deleted around now (without, as far as I can see, any way for us to find out). */ _config_changed_connection.disconnect (); - maybe_save_then_delete_film (); ev.Skip (); } @@ -931,7 +984,7 @@ private: wxSplashScreen* splash = 0; try { - if (!Config::have_existing ()) { + if (!Config::have_existing ("config.xml")) { wxBitmap bitmap; boost::filesystem::path p = shared_path () / "splash.png"; if (bitmap.LoadFile (std_to_wx (p.string ()), wxBITMAP_TYPE_PNG)) { @@ -1062,7 +1115,7 @@ private: error_dialog ( 0, wxString::Format ( - _("An exception occurred: %s.\n\n") + " " + REPORT_PROBLEM, + _("An exception occurred: %s.\n\n") + REPORT_PROBLEM, std_to_wx (e.what ()) ) );