X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fwx%2Fkdm_dialog.cc;h=55b89a37128925841dafbcada17040c9faac4508;hb=7851658223286410d5afb1e32bc44b4012ec5f55;hp=519317dcc9d07b804518585e5431822264471d88;hpb=29d863fb2533fe754a82a5274caf19a3b19e2994;p=dcpomatic.git diff --git a/src/wx/kdm_dialog.cc b/src/wx/kdm_dialog.cc index 519317dcc..55b89a371 100644 --- a/src/wx/kdm_dialog.cc +++ b/src/wx/kdm_dialog.cc @@ -1,157 +1,178 @@ /* - Copyright (C) 2012 Carl Hetherington + Copyright (C) 2012-2018 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 . */ -#include -#include -#include -#include "lib/cinema.h" #include "kdm_dialog.h" -#include "new_cinema_dialog.h" #include "wx_util.h" -#ifdef __WXMSW__ -#include "dir_picker_ctrl.h" -#else -#include -#endif - -using namespace std; +#include "screens_panel.h" +#include "kdm_timing_panel.h" +#include "kdm_output_panel.h" +#include "kdm_cpl_panel.h" +#include "confirm_kdm_email_dialog.h" +#include "static_text.h" +#include "dcpomatic_button.h" +#include "lib/film.h" +#include "lib/screen.h" +#include "lib/screen_kdm.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; +using std::cout; +using std::vector; +using std::make_pair; +using std::runtime_error; using boost::shared_ptr; +using boost::bind; -KDMDialog::KDMDialog (wxWindow* parent) +KDMDialog::KDMDialog (wxWindow* parent, shared_ptr film) : wxDialog (parent, wxID_ANY, _("Make KDMs")) + , _film (film) { - wxBoxSizer* vertical = new wxBoxSizer (wxVERTICAL); - - add_label_to_sizer (vertical, this, "Make KDMs for"); - - wxBoxSizer* targets = new wxBoxSizer (wxHORIZONTAL); - - _targets = new wxTreeCtrl (this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTR_HIDE_ROOT | wxTR_MULTIPLE | wxTR_HAS_BUTTONS); - targets->Add (_targets, 1, wxEXPAND | wxALL, 6); - - _root = _targets->AddRoot ("Foo"); - shared_ptr csy (new Cinema ("City Screen York")); - add_cinema (csy); - add_screen (csy, shared_ptr (new Screen ("Screen 1"))); - add_screen (csy, shared_ptr (new Screen ("Screen 2"))); - add_screen (csy, shared_ptr (new Screen ("Screen 3"))); - _targets->ExpandAll (); - - wxBoxSizer* target_buttons = new wxBoxSizer (wxVERTICAL); - - _new_cinema = new wxButton (this, wxID_ANY, _("New Cinema...")); - target_buttons->Add (_new_cinema, 1, wxEXPAND | wxALL, 6); - _new_screen = new wxButton (this, wxID_ANY, _("New Screen...")); - target_buttons->Add (_new_screen, 1, wxEXPAND | wxALL, 6); - - targets->Add (target_buttons, 0, wxEXPAND | wxALL, 6); - - vertical->Add (targets, 0, wxEXPAND | wxALL, 6); - - wxFlexGridSizer* table = new wxFlexGridSizer (3, 2, 6); - add_label_to_sizer (table, this, "From"); - _from_date = new wxDatePickerCtrl (this, wxID_ANY); - table->Add (_from_date, 1, wxEXPAND); - _from_time = new wxTimePickerCtrl (this, wxID_ANY); - table->Add (_from_time, 1, wxEXPAND); - - add_label_to_sizer (table, this, "To"); - _to_date = new wxDatePickerCtrl (this, wxID_ANY); - table->Add (_to_date, 1, wxEXPAND); - _to_time = new wxTimePickerCtrl (this, wxID_ANY); - table->Add (_to_time, 1, wxEXPAND); - - add_label_to_sizer (table, this, "Write to"); - -#ifdef __WXMSW__ - _folder = new DirPickerCtrl (this); -#else - _folder = new wxDirPickerCtrl (this, wxDD_DIR_MUST_EXIST); -#endif - - table->Add (_folder, 1, wxEXPAND); - - vertical->Add (table, 1, wxEXPAND | wxALL, 6); - - wxSizer* buttons = CreateSeparatedButtonSizer (wxOK); - if (buttons) { - vertical->Add (buttons, wxSizerFlags().Expand().DoubleBorder()); + /* 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); + subheading_font.SetWeight (wxFONTWEIGHT_BOLD); + + /* Sub-heading: Screens */ + wxStaticText* h = new StaticText (this, _("Screens")); + h->SetFont (subheading_font); + left->Add (h, 0, wxALIGN_CENTER_VERTICAL | wxBOTTOM, DCPOMATIC_SIZER_Y_GAP); + _screens = new ScreensPanel (this); + 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 StaticText (this, S_("KDM|Timing")); + h->SetFont (subheading_font); + right->Add (h, 0, wxALIGN_CENTER_VERTICAL, DCPOMATIC_SIZER_Y_GAP * 2); + _timing = new KDMTimingPanel (this); + right->Add (_timing); + + /* Sub-heading: CPL */ + h = new StaticText (this, _("CPL")); + h->SetFont (subheading_font); + right->Add (h, 0, wxALIGN_CENTER_VERTICAL, DCPOMATIC_SIZER_Y_GAP * 2); + + vector cpls; + BOOST_FOREACH (CPLSummary const & i, film->cpls()) { + if (i.encrypted) { + cpls.push_back (i); + } } - _targets->Connect (wxID_ANY, wxEVT_COMMAND_TREE_SEL_CHANGED, wxCommandEventHandler (KDMDialog::targets_selection_changed), 0, this); - _new_cinema->Connect (wxID_ANY, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler (KDMDialog::new_cinema_clicked), 0, this); - _new_screen->Connect (wxID_ANY, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler (KDMDialog::new_screen_clicked), 0, this); + _cpl = new KDMCPLPanel (this, cpls); + right->Add (_cpl, 0, wxEXPAND); + + /* Sub-heading: Output */ + h = new StaticText (this, _("Output")); + h->SetFont (subheading_font); + right->Add (h, 0, wxALIGN_CENTER_VERTICAL | wxTOP, DCPOMATIC_SIZER_Y_GAP * 2); + _output = new KDMOutputPanel (this, film->interop ()); + right->Add (_output, 0, wxEXPAND | wxTOP, DCPOMATIC_SIZER_GAP); - _new_screen->Enable (false); - - SetSizer (vertical); - vertical->Layout (); - vertical->SetSizeHints (this); + _make = new Button (this, _("Make KDMs")); + right->Add (_make, 0, wxTOP | wxBOTTOM, DCPOMATIC_SIZER_GAP); + + /* Make an overall sizer to get a nice border */ + + wxBoxSizer* overall_sizer = new wxBoxSizer (wxVERTICAL); + 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 (); + + SetSizer (overall_sizer); + overall_sizer->Layout (); + overall_sizer->SetSizeHints (this); } void -KDMDialog::targets_selection_changed (wxCommandEvent &) +KDMDialog::setup_sensitivity () { - wxArrayTreeItemIds s; - _targets->GetSelections (s); - - bool selected_cinema = false; - for (size_t i = 0; i < s.GetCount(); ++i) { - if (_cinemas.find (s[i]) != _cinemas.end()) { - selected_cinema = true; - } - } - - _new_screen->Enable (selected_cinema); + _screens->setup_sensitivity (); + _output->setup_sensitivity (); + _make->Enable (!_screens->screens().empty() && _timing->valid() && _cpl->has_selected()); } -void -KDMDialog::add_cinema (shared_ptr c) +bool +KDMDialog::confirm_overwrite (boost::filesystem::path path) { - _cinemas[_targets->AppendItem (_root, std_to_wx (c->name))] = c; + return confirm_dialog ( + this, + wxString::Format (_("File %s already exists. Do you want to overwrite it?"), std_to_wx(path.string()).data()) + ); } void -KDMDialog::add_screen (shared_ptr c, shared_ptr s) +KDMDialog::make_clicked () { - map >::const_iterator i = _cinemas.begin(); - while (i != _cinemas.end() && i->second != c) { - ++i; - } + shared_ptr film = _film.lock (); + DCPOMATIC_ASSERT (film); - if (i == _cinemas.end()) { - return; - } + list > screen_kdms; + try { - _screens[_targets->AppendItem (i->first, std_to_wx (s->name))] = s; -} + screen_kdms = film->make_kdms ( + _screens->screens(), _cpl->cpl(), _timing->from(), _timing->until(), _output->formulation(), + !_output->forensic_mark_video(), _output->forensic_mark_audio() ? boost::optional() : 0 + ); -void -KDMDialog::new_cinema_clicked (wxCommandEvent &) -{ - NewCinemaDialog* d = new NewCinemaDialog (this); - d->ShowModal (); - d->Destroy (); -} + } catch (runtime_error& e) { + error_dialog (this, std_to_wx(e.what())); + return; + } -void -KDMDialog::new_screen_clicked (wxCommandEvent &) -{ + pair, int> result = _output->make (screen_kdms, film->name(), _timing, bind (&KDMDialog::confirm_overwrite, this, _1)); + if (result.first) { + JobManager::instance()->add (result.first); + } + if (result.second > 0) { + /* XXX: proper plural form support in wxWidgets? */ + wxString s = result.second == 1 ? _("%d KDM written to %s") : _("%d KDMs written to %s"); + message_dialog ( + this, + wxString::Format (s, result.second, std_to_wx(_output->directory().string()).data()) + ); + } }