From 479cab0437a14f9fbf5949a6334d43eb384168ad Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Fri, 29 Jul 2016 10:40:58 +0100 Subject: [PATCH] Rearrange KDM window and replace OK/Cancel with Make KDM button. --- ChangeLog | 3 + src/tools/dcpomatic.cc | 46 ++--------- src/wx/kdm_dialog.cc | 151 +++++++++++++++++------------------- src/wx/kdm_dialog.h | 22 ++---- src/wx/name_format_editor.h | 12 ++- src/wx/screens_panel.cc | 18 ++--- 6 files changed, 105 insertions(+), 147 deletions(-) diff --git a/ChangeLog b/ChangeLog index c5b9cc56e..897ea5b46 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,8 @@ 2016-07-29 c.hetherington + * Rearrange Make KDM window and replace the + confusing OK/Cancel buttons with "Make KDM" (part of #848). + * Allow configuration of KDM filename format. 2016-07-28 Carl Hetherington diff --git a/src/tools/dcpomatic.cc b/src/tools/dcpomatic.cc index e29d41db7..cd827016d 100644 --- a/src/tools/dcpomatic.cc +++ b/src/tools/dcpomatic.cc @@ -170,6 +170,7 @@ public: , _hints_dialog (0) , _servers_list_dialog (0) , _config_dialog (0) + , _kdm_dialog (0) , _file_menu (0) , _history_items (0) , _history_position (0) @@ -484,47 +485,13 @@ private: return; } - KDMDialog* d = new KDMDialog (this, _film); - if (d->ShowModal () != wxID_OK) { - d->Destroy (); - return; + if (_kdm_dialog) { + _kdm_dialog->Destroy (); + _kdm_dialog = 0; } - try { - list screen_kdms = _film->make_kdms (d->screens(), d->cpl(), d->from(), d->until(), d->formulation()); - - NameFormat::Map name_values; - name_values["film_name"] = _film->name(); - name_values["from"] = dcp::LocalTime(d->from()).date() + " " + dcp::LocalTime(d->from()).time_of_day(); - name_values["to"] = dcp::LocalTime(d->until()).date() + " " + dcp::LocalTime(d->until()).time_of_day(); - - if (d->write_to ()) { - ScreenKDM::write_files ( - screen_kdms, - d->directory(), - d->name_format(), - name_values - ); - } else { - JobManager::instance()->add ( - shared_ptr (new SendKDMEmailJob ( - CinemaKDMs::collect (screen_kdms), - d->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.")); - } - - d->Destroy (); + _kdm_dialog = new KDMDialog (this, _film); + _kdm_dialog->Show (this); } void jobs_make_dcp_batch () @@ -978,6 +945,7 @@ private: HintsDialog* _hints_dialog; ServersListDialog* _servers_list_dialog; wxPreferencesEditor* _config_dialog; + KDMDialog* _kdm_dialog; wxMenu* _file_menu; shared_ptr _film; int _history_items; diff --git a/src/wx/kdm_dialog.cc b/src/wx/kdm_dialog.cc index ee164518a..253050ddf 100644 --- a/src/wx/kdm_dialog.cc +++ b/src/wx/kdm_dialog.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2012-2015 Carl Hetherington + Copyright (C) 2012-2016 Carl Hetherington This file is part of DCP-o-matic. @@ -26,12 +26,18 @@ #include "kdm_cpl_panel.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 +#include #include #include #include using std::string; +using std::exception; using std::map; using std::list; using std::pair; @@ -40,11 +46,17 @@ using std::vector; using std::make_pair; using boost::shared_ptr; -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 * 2); + horizontal->Add (right, 1, wxEXPAND); /* Font for sub-headings */ wxFont subheading_font (*wxNORMAL_FONT); @@ -53,51 +65,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, 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, 0, wxEXPAND); + 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_COMMAND_BUTTON_CLICKED, boost::bind (&KDMDialog::make_clicked, this)); setup_sensitivity (); @@ -111,67 +117,50 @@ 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 (); -} - -bool -KDMDialog::write_to () const -{ - return _output->write_to (); + _make->Enable (!_screens->screens().empty() && _timing->valid() && _cpl->has_selected()); } -dcp::Formulation -KDMDialog::formulation () const -{ - return _output->formulation (); -} - -KDMNameFormat -KDMDialog::name_format () const +void +KDMDialog::make_clicked () { - return _output->name_format (); -} + shared_ptr film = _film.lock (); + DCPOMATIC_ASSERT (film); -int -KDMDialog::ShowModal () -{ - int const r = wxDialog::ShowModal (); _output->save_kdm_name_format (); - return r; + + try { + list screen_kdms = film->make_kdms ( + _screens->screens(), _cpl->cpl(), _timing->from(), _timing->until(), _output->formulation() + ); + + NameFormat::Map name_values; + name_values["film_name"] = film->name(); + name_values["from"] = dcp::LocalTime(_timing->from()).date() + " " + dcp::LocalTime(_timing->from()).time_of_day(); + name_values["to"] = 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 + ); + } else { + JobManager::instance()->add ( + shared_ptr (new SendKDMEmailJob ( + CinemaKDMs::collect (screen_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.")); + } } diff --git a/src/wx/kdm_dialog.h b/src/wx/kdm_dialog.h index 7d64fea77..bae2fc16b 100644 --- a/src/wx/kdm_dialog.h +++ b/src/wx/kdm_dialog.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2012 Carl Hetherington + Copyright (C) 2012-2016 Carl Hetherington This file is part of DCP-o-matic. @@ -38,28 +38,16 @@ struct CPLSummary; class KDMDialog : public wxDialog { public: - KDMDialog (wxWindow *, boost::shared_ptr); - - std::list > screens () const; - /** @return KDM from time in local time; note that ptime has no time zone information */ - boost::posix_time::ptime from () const; - /** @return KDM until time in local time; note that ptime has no time zone information */ - boost::posix_time::ptime until () const; - - boost::filesystem::path cpl () const; - - boost::filesystem::path directory () const; - bool write_to () const; - dcp::Formulation formulation () const; - KDMNameFormat name_format () const; - - int ShowModal (); + KDMDialog (wxWindow *, boost::shared_ptr film); private: void setup_sensitivity (); + void make_clicked (); + boost::weak_ptr _film; ScreensPanel* _screens; KDMTimingPanel* _timing; KDMCPLPanel* _cpl; KDMOutputPanel* _output; + wxButton* _make; }; diff --git a/src/wx/name_format_editor.h b/src/wx/name_format_editor.h index ee88d46b3..ab4787f64 100644 --- a/src/wx/name_format_editor.h +++ b/src/wx/name_format_editor.h @@ -76,7 +76,17 @@ private: virtual void update_example () { _name.set_specification (wx_to_std (_specification->GetValue ())); - _example->SetLabel (wxString::Format (_("e.g. %s"), _name.get (_example_values))); + + wxString example = wxString::Format (_("e.g. %s"), _name.get (_example_values)); + wxString wrapped; + for (size_t i = 0; i < example.Length(); ++i) { + if (i > 0 && (i % 30) == 0) { + wrapped += "\n"; + } + wrapped += example[i]; + } + + _example->SetLabel (wrapped); } wxPanel* _panel; diff --git a/src/wx/screens_panel.cc b/src/wx/screens_panel.cc index 0638763fe..042fcc5ab 100644 --- a/src/wx/screens_panel.cc +++ b/src/wx/screens_panel.cc @@ -52,20 +52,20 @@ ScreensPanel::ScreensPanel (wxWindow* parent) add_cinemas (); - wxGridSizer* target_buttons = new wxGridSizer (2, DCPOMATIC_BUTTON_STACK_GAP * 2, DCPOMATIC_SIZER_Y_GAP); + wxBoxSizer* target_buttons = new wxBoxSizer (wxVERTICAL); _add_cinema = new wxButton (this, wxID_ANY, _("Add Cinema...")); - target_buttons->Add (_add_cinema, 1, wxEXPAND); - _add_screen = new wxButton (this, wxID_ANY, _("Add Screen...")); - target_buttons->Add (_add_screen, 1, wxEXPAND); + target_buttons->Add (_add_cinema, 1, wxEXPAND | wxBOTTOM, DCPOMATIC_BUTTON_STACK_GAP); _edit_cinema = new wxButton (this, wxID_ANY, _("Edit Cinema...")); - target_buttons->Add (_edit_cinema, 1, wxEXPAND); - _edit_screen = new wxButton (this, wxID_ANY, _("Edit Screen...")); - target_buttons->Add (_edit_screen, 1, wxEXPAND); + target_buttons->Add (_edit_cinema, 1, wxEXPAND | wxBOTTOM, DCPOMATIC_BUTTON_STACK_GAP); _remove_cinema = new wxButton (this, wxID_ANY, _("Remove Cinema")); - target_buttons->Add (_remove_cinema, 1, wxEXPAND); + target_buttons->Add (_remove_cinema, 1, wxEXPAND | wxBOTTOM, DCPOMATIC_BUTTON_STACK_GAP); + _add_screen = new wxButton (this, wxID_ANY, _("Add Screen...")); + target_buttons->Add (_add_screen, 1, wxEXPAND | wxBOTTOM, DCPOMATIC_BUTTON_STACK_GAP); + _edit_screen = new wxButton (this, wxID_ANY, _("Edit Screen...")); + target_buttons->Add (_edit_screen, 1, wxEXPAND | wxBOTTOM, DCPOMATIC_BUTTON_STACK_GAP); _remove_screen = new wxButton (this, wxID_ANY, _("Remove Screen")); - target_buttons->Add (_remove_screen, 1, wxEXPAND); + target_buttons->Add (_remove_screen, 1, wxEXPAND | wxBOTTOM, DCPOMATIC_BUTTON_STACK_GAP); targets->Add (target_buttons, 0, 0); -- 2.30.2