2016-03-13 Carl Hetherington <cth@carlh.net>
+ * Ignore empty email addresses for KDMs (#818).
+
* Fix crash when using non-English decimal separators
in the audio gain calculator dialogue (#824).
return lexical_cast<float> (s);
}
}
+
+bool
+string_not_empty (string s)
+{
+ return !s.empty ();
+}
extern std::string video_asset_filename (boost::shared_ptr<dcp::PictureAsset> asset);
extern std::string audio_asset_filename (boost::shared_ptr<dcp::SoundAsset> asset);
extern float relaxed_string_to_float (std::string);
+extern bool string_not_empty (std::string);
#endif
vector<string> columns;
columns.push_back (wx_to_std (_("CPL")));
_dkdm = new EditableList<dcp::EncryptedKDM, KDMFileDialogWrapper> (
- overall_panel, columns, bind (&DOMFrame::dkdms, this), bind (&DOMFrame::set_dkdms, this, _1), bind (&column, _1), false
+ overall_panel, columns, bind (&DOMFrame::dkdms, this), bind (&DOMFrame::set_dkdms, this, _1), bind (&always_valid), bind (&column, _1), false
);
vertical->Add (_dkdm, 0, wxEXPAND | wxALL, DCPOMATIC_SIZER_Y_GAP);
#include "cinema_dialog.h"
#include "wx_util.h"
#include "lib/dcpomatic_assert.h"
+#include "lib/util.h"
#include <boost/foreach.hpp>
using std::string;
vector<string> columns;
columns.push_back (wx_to_std (_("Address")));
_email_list = new EditableList<string, EmailDialog> (
- this, columns, bind (&CinemaDialog::get_emails, this), bind (&CinemaDialog::set_emails, this, _1), bind (&column, _1)
+ this, columns, bind (&CinemaDialog::get_emails, this), bind (&CinemaDialog::set_emails, this, _1), bind (&string_not_empty, _1), bind (&column, _1)
);
sizer->Add (_email_list, wxGBPosition (r, 0), wxGBSpan (1, 2), wxEXPAND);
columns,
boost::bind (&Config::servers, Config::instance()),
boost::bind (&Config::set_servers, Config::instance(), _1),
+ boost::bind (&always_valid),
boost::bind (&EncodingServersPage::server_column, this, _1)
);
columns.push_back (wx_to_std (_("Address")));
add_label_to_sizer (table, _panel, _("CC addresses"), true);
_kdm_cc = new EditableList<string, EmailDialog> (
- _panel, columns, bind (&Config::kdm_cc, Config::instance()), bind (&Config::set_kdm_cc, Config::instance(), _1), bind (&column, _1)
+ _panel,
+ columns,
+ bind (&Config::kdm_cc, Config::instance()),
+ bind (&Config::set_kdm_cc, Config::instance(), _1),
+ bind (&string_not_empty, _1),
+ bind (&column, _1)
);
table->Add (_kdm_cc, 1, wxEXPAND | wxALL);
--- /dev/null
+/*
+ Copyright (C) 2016 Carl Hetherington <cth@carlh.net>
+
+ This program 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,
+ 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.
+
+*/
+
+bool
+always_valid ()
+{
+ return true;
+}
/*
- Copyright (C) 2012-2015 Carl Hetherington <cth@carlh.net>
+ Copyright (C) 2012-2016 Carl Hetherington <cth@carlh.net>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
#include <boost/function.hpp>
#include <vector>
+bool always_valid ();
+
/** @param T type of things being edited.
* @param S dialog to edit a thing.
*/
std::vector<std::string> columns,
boost::function<std::vector<T> ()> get,
boost::function<void (std::vector<T>)> set,
+ boost::function<bool (T)> valid,
boost::function<std::string (T, int)> column,
bool can_edit = true,
bool title = true
: wxPanel (parent)
, _get (get)
, _set (set)
+ , _valid (valid)
, _columns (columns.size ())
, _column (column)
, _edit (0)
S* dialog = new S (this);
if (dialog->ShowModal() == wxID_OK) {
- add_to_control (dialog->get ());
- std::vector<T> all = _get ();
- all.push_back (dialog->get ());
- _set (all);
+ T const v = dialog->get ();
+ if (_valid (v)) {
+ add_to_control (v);
+ std::vector<T> all = _get ();
+ all.push_back (v);
+ _set (all);
+ }
}
dialog->Destroy ();
S* dialog = new S (this);
dialog->set (all[item]);
if (dialog->ShowModal() == wxID_OK) {
- all[item] = dialog->get ();
+ T const v = dialog->get ();
+ if (!_valid (v)) {
+ return;
+ }
+
+ all[item] = v;
}
dialog->Destroy ();
boost::function <std::vector<T> ()> _get;
boost::function <void (std::vector<T>)> _set;
+ boost::function <bool (T)> _valid;
int _columns;
boost::function<std::string (T, int)> _column;
vector<string> columns;
columns.push_back (wx_to_std (_("Thumbprint")));
_trusted_device_list = new EditableList<dcp::Certificate, CertificateFileDialogWrapper> (
- this, columns, bind (&ScreenDialog::trusted_devices, this), bind (&ScreenDialog::set_trusted_devices, this, _1), bind (&column, _1), false
+ this,
+ columns,
+ bind (&ScreenDialog::trusted_devices, this),
+ bind (&ScreenDialog::set_trusted_devices, this, _1),
+ bind (&always_valid),
+ bind (&column, _1),
+ false
);
_sizer->Add (_trusted_device_list, wxGBPosition (r, 0), wxGBSpan (1, 3), wxEXPAND);
content_properties_dialog.cc
content_sub_panel.cc
dcp_panel.cc
+ editable_list.cc
email_dialog.cc
image_sequence_dialog.cc
image_subtitle_colour_dialog.cc