Rearrange KDM window and replace OK/Cancel with Make KDM button.
authorCarl Hetherington <cth@carlh.net>
Fri, 29 Jul 2016 09:40:58 +0000 (10:40 +0100)
committerCarl Hetherington <cth@carlh.net>
Fri, 29 Jul 2016 09:40:58 +0000 (10:40 +0100)
ChangeLog
src/tools/dcpomatic.cc
src/wx/kdm_dialog.cc
src/wx/kdm_dialog.h
src/wx/name_format_editor.h
src/wx/screens_panel.cc

index c5b9cc56e5c7fdf987c31380758f21743646a8d9..897ea5b46e5ac10410aeb98e37fa35f1c5d34391 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
 2016-07-29  c.hetherington  <cth@carlh.net>
 
+       * 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  <cth@carlh.net>
index e29d41db7dd5d9c3175694c16f480fc2dba3e5b0..cd827016d6bd1f710a18e0268185f24d04a2c348 100644 (file)
@@ -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<ScreenKDM> 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<Job> (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> _film;
        int _history_items;
index ee164518aed47070613f53f267cb8c5dd35b0dd5..253050ddf52de2444b85fa99cee26342c2cd4327 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2012-2015 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2012-2016 Carl Hetherington <cth@carlh.net>
 
     This file is part of DCP-o-matic.
 
 #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 <libcxml/cxml.h>
+#include <dcp/exceptions.h>
 #include <wx/treectrl.h>
 #include <wx/listctrl.h>
 #include <iostream>
 
 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<const Film> film)
+KDMDialog::KDMDialog (wxWindow* parent, shared_ptr<const Film> 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<const Film> 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<wxButton *> (FindWindowById (wxID_OK, this));
-       if (ok) {
-               ok->Enable (!_screens->screens().empty() && _timing->valid() && sd);
-       }
-}
-
-boost::filesystem::path
-KDMDialog::cpl () const
-{
-       return _cpl->cpl ();
-}
-
-list<shared_ptr<Screen> >
-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<const Film> film = _film.lock ();
+       DCPOMATIC_ASSERT (film);
 
-int
-KDMDialog::ShowModal ()
-{
-       int const r = wxDialog::ShowModal ();
        _output->save_kdm_name_format ();
-       return r;
+
+       try {
+               list<ScreenKDM> 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<Job> (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."));
+       }
 }
index 7d64fea7776783e36fde90d627dfe89ae565fa60..bae2fc16ba5c05b80257f78db1fa583b1ee8cafe 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2012 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2012-2016 Carl Hetherington <cth@carlh.net>
 
     This file is part of DCP-o-matic.
 
@@ -38,28 +38,16 @@ struct CPLSummary;
 class KDMDialog : public wxDialog
 {
 public:
-       KDMDialog (wxWindow *, boost::shared_ptr<const Film>);
-
-       std::list<boost::shared_ptr<Screen> > 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<const Film> film);
 
 private:
        void setup_sensitivity ();
+       void make_clicked ();
 
+       boost::weak_ptr<const Film> _film;
        ScreensPanel* _screens;
        KDMTimingPanel* _timing;
        KDMCPLPanel* _cpl;
        KDMOutputPanel* _output;
+       wxButton* _make;
 };
index ee88d46b3f83213c13935b97340ad2dee2c4f2d3..ab4787f64a5349021ca10ef43286c55ab9a1e794 100644 (file)
@@ -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;
index 0638763fe364ce0743b05320d070819ad8674be4..042fcc5ab58184b9f39041c800b03b4daa81f275 100644 (file)
@@ -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);