X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fwx%2Fkdm_dialog.cc;h=5ed1169b13390a3ac8504f39609dd7ce428dcee1;hb=7e4d7d9e4f146576a63c6ab1be9bca5a79b507d9;hp=856808f11563040a7e1464e165832f05d6e17063;hpb=8031edf0ce27b75727438e504128448b0884b426;p=dcpomatic.git diff --git a/src/wx/kdm_dialog.cc b/src/wx/kdm_dialog.cc index 856808f11..5ed1169b1 100644 --- a/src/wx/kdm_dialog.cc +++ b/src/wx/kdm_dialog.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 . */ @@ -23,14 +24,23 @@ #include "kdm_timing_panel.h" #include "kdm_output_panel.h" #include "kdm_cpl_panel.h" +#include "confirm_kdm_email_dialog.h" #include "lib/film.h" #include "lib/screen.h" +#include "lib/screen_kdm.h" +#include "lib/send_kdm_email_job.h" +#include "lib/job_manager.h" +#include "lib/cinema_kdms.h" +#include "lib/config.h" +#include "lib/cinema.h" #include +#include #include #include #include using std::string; +using std::exception; using std::map; using std::list; using std::pair; @@ -38,12 +48,19 @@ using std::cout; using std::vector; using std::make_pair; using boost::shared_ptr; +using boost::bind; -KDMDialog::KDMDialog (wxWindow* parent, boost::shared_ptr film) +KDMDialog::KDMDialog (wxWindow* parent, shared_ptr film) : wxDialog (parent, wxID_ANY, _("Make KDMs")) + , _film (film) { - /* Main sizer */ - wxBoxSizer* vertical = new wxBoxSizer (wxVERTICAL); + /* Main sizers */ + wxBoxSizer* horizontal = new wxBoxSizer (wxHORIZONTAL); + wxBoxSizer* left = new wxBoxSizer (wxVERTICAL); + wxBoxSizer* right = new wxBoxSizer (wxVERTICAL); + + horizontal->Add (left, 1, wxEXPAND | wxRIGHT, DCPOMATIC_SIZER_X_GAP * 4); + horizontal->Add (right, 1, wxEXPAND); /* Font for sub-headings */ wxFont subheading_font (*wxNORMAL_FONT); @@ -52,50 +69,45 @@ KDMDialog::KDMDialog (wxWindow* parent, boost::shared_ptr film) /* Sub-heading: Screens */ wxStaticText* h = new wxStaticText (this, wxID_ANY, _("Screens")); h->SetFont (subheading_font); - vertical->Add (h, 0, wxALIGN_CENTER_VERTICAL); + left->Add (h, 0, wxALIGN_CENTER_VERTICAL | wxBOTTOM, DCPOMATIC_SIZER_Y_GAP); _screens = new ScreensPanel (this); - /* Hack to stop KDM dialogs that are taller than my laptop screen; this - really isn't the right way to fix it... - */ - _screens->SetMaxSize (wxSize (-1, 280)); - vertical->Add (_screens, 1, wxEXPAND); + left->Add (_screens, 1, wxEXPAND | wxBOTTOM, DCPOMATIC_SIZER_Y_GAP); /* Sub-heading: Timing */ + /// TRANSLATORS: translate the word "Timing" here; do not include the "KDM|" prefix h = new wxStaticText (this, wxID_ANY, S_("KDM|Timing")); h->SetFont (subheading_font); - vertical->Add (h, 0, wxALIGN_CENTER_VERTICAL | wxTOP, DCPOMATIC_SIZER_Y_GAP * 2); + right->Add (h, 0, wxALIGN_CENTER_VERTICAL, DCPOMATIC_SIZER_Y_GAP * 2); _timing = new KDMTimingPanel (this); - vertical->Add (_timing); + right->Add (_timing); /* Sub-heading: CPL */ h = new wxStaticText (this, wxID_ANY, _("CPL")); h->SetFont (subheading_font); - vertical->Add (h, 0, wxALIGN_CENTER_VERTICAL | wxTOP, DCPOMATIC_SIZER_Y_GAP * 2); + right->Add (h, 0, wxALIGN_CENTER_VERTICAL, DCPOMATIC_SIZER_Y_GAP * 2); _cpl = new KDMCPLPanel (this, film->cpls ()); - vertical->Add (_cpl); + right->Add (_cpl, 0, wxEXPAND); /* Sub-heading: Output */ h = new wxStaticText (this, wxID_ANY, _("Output")); h->SetFont (subheading_font); - vertical->Add (h, 0, wxALIGN_CENTER_VERTICAL | wxTOP, DCPOMATIC_SIZER_Y_GAP * 2); + right->Add (h, 0, wxALIGN_CENTER_VERTICAL | wxTOP, DCPOMATIC_SIZER_Y_GAP * 2); _output = new KDMOutputPanel (this, film->interop ()); - vertical->Add (_output, 0, wxEXPAND | wxTOP, DCPOMATIC_SIZER_GAP); - + right->Add (_output, 0, wxEXPAND | wxTOP, DCPOMATIC_SIZER_GAP); - wxSizer* buttons = CreateSeparatedButtonSizer (wxOK | wxCANCEL); - if (buttons) { - vertical->Add (buttons, 0, wxEXPAND | wxALL, DCPOMATIC_SIZER_Y_GAP); - } + _make = new wxButton (this, wxID_ANY, _("Make KDMs")); + right->Add (_make, 0, wxTOP | wxBOTTOM, DCPOMATIC_SIZER_GAP); - /* Make an overall sizer to get a nice border, and put some buttons in */ + /* Make an overall sizer to get a nice border */ wxBoxSizer* overall_sizer = new wxBoxSizer (wxVERTICAL); - overall_sizer->Add (vertical, 0, wxEXPAND | wxTOP | wxLEFT | wxRIGHT, DCPOMATIC_DIALOG_BORDER); + overall_sizer->Add (horizontal, 0, wxEXPAND | wxTOP | wxLEFT | wxRIGHT, DCPOMATIC_DIALOG_BORDER); /* Bind */ _screens->ScreensChanged.connect (boost::bind (&KDMDialog::setup_sensitivity, this)); _timing->TimingChanged.connect (boost::bind (&KDMDialog::setup_sensitivity, this)); + _make->Bind (wxEVT_BUTTON, boost::bind (&KDMDialog::make_clicked, this)); setup_sensitivity (); @@ -109,53 +121,83 @@ KDMDialog::setup_sensitivity () { _screens->setup_sensitivity (); _output->setup_sensitivity (); - - bool const sd = _cpl->has_selected (); - - wxButton* ok = dynamic_cast (FindWindowById (wxID_OK, this)); - if (ok) { - ok->Enable (!_screens->screens().empty() && _timing->valid() && sd); - } -} - -boost::filesystem::path -KDMDialog::cpl () const -{ - return _cpl->cpl (); -} - -list > -KDMDialog::screens () const -{ - return _screens->screens (); -} - -boost::posix_time::ptime -KDMDialog::from () const -{ - return _timing->from (); -} - -boost::posix_time::ptime -KDMDialog::until () const -{ - return _timing->until (); -} - -boost::filesystem::path -KDMDialog::directory () const -{ - return _output->directory (); + _make->Enable (!_screens->screens().empty() && _timing->valid() && _cpl->has_selected()); } bool -KDMDialog::write_to () const +KDMDialog::confirm_overwrite (boost::filesystem::path path) { - return _output->write_to (); + return confirm_dialog ( + this, + wxString::Format (_("File %s already exists. Do you want to overwrite it?"), std_to_wx(path.string()).data()) + ); } -dcp::Formulation -KDMDialog::formulation () const +void +KDMDialog::make_clicked () { - return _output->formulation (); + shared_ptr film = _film.lock (); + DCPOMATIC_ASSERT (film); + + _output->save_kdm_name_format (); + + try { + list screen_kdms = film->make_kdms ( + _screens->screens(), _cpl->cpl(), _timing->from(), _timing->until(), _output->formulation() + ); + + dcp::NameFormat::Map name_values; + name_values['f'] = film->name(); + name_values['b'] = dcp::LocalTime(_timing->from()).date() + " " + dcp::LocalTime(_timing->from()).time_of_day(); + name_values['e'] = dcp::LocalTime(_timing->until()).date() + " " + dcp::LocalTime(_timing->until()).time_of_day(); + + if (_output->write_to ()) { + ScreenKDM::write_files ( + screen_kdms, + _output->directory(), + _output->name_format(), + name_values, + bind (&KDMDialog::confirm_overwrite, this, _1) + ); + } + + if (_output->email ()) { + + list const cinema_kdms = CinemaKDMs::collect (screen_kdms); + + bool ok = true; + + if (Config::instance()->confirm_kdm_email ()) { + list emails; + BOOST_FOREACH (CinemaKDMs i, cinema_kdms) { + BOOST_FOREACH (string j, i.cinema->emails) { + emails.push_back (j); + } + } + + ConfirmKDMEmailDialog* d = new ConfirmKDMEmailDialog (this, emails); + if (d->ShowModal() == wxID_CANCEL) { + ok = false; + } + } + + if (ok) { + JobManager::instance()->add ( + shared_ptr (new SendKDMEmailJob ( + cinema_kdms, + _output->name_format(), + name_values, + film->dcp_name(), + film->log() + )) + ); + } + } + } catch (dcp::NotEncryptedError& e) { + error_dialog (this, _("CPL's content is not encrypted.")); + } catch (exception& e) { + error_dialog (this, e.what ()); + } catch (...) { + error_dialog (this, _("An unknown exception occurred.")); + } }