summaryrefslogtreecommitdiff
path: root/src/wx/smpte_metadata_dialog.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/wx/smpte_metadata_dialog.cc')
-rw-r--r--src/wx/smpte_metadata_dialog.cc374
1 files changed, 374 insertions, 0 deletions
diff --git a/src/wx/smpte_metadata_dialog.cc b/src/wx/smpte_metadata_dialog.cc
new file mode 100644
index 000000000..6c130836f
--- /dev/null
+++ b/src/wx/smpte_metadata_dialog.cc
@@ -0,0 +1,374 @@
+/*
+ Copyright (C) 2019-2020 Carl Hetherington <cth@carlh.net>
+
+ 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.
+
+ 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 DCP-o-matic. If not, see <http://www.gnu.org/licenses/>.
+
+*/
+
+#include "content_version_dialog.h"
+#include "editable_list.h"
+#include "language_tag_dialog.h"
+#include "smpte_metadata_dialog.h"
+#include "rating_dialog.h"
+#include "lib/film.h"
+#include <dcp/types.h>
+#include <wx/gbsizer.h>
+#include <wx/spinctrl.h>
+
+using std::string;
+using std::vector;
+using boost::optional;
+using boost::shared_ptr;
+using boost::weak_ptr;
+
+
+static string
+ratings_column (dcp::Rating r, int c)
+{
+ if (c == 0) {
+ return r.agency;
+ }
+
+ return r.label;
+}
+
+
+static string
+content_versions_column (string v, int)
+{
+ return v;
+}
+
+
+SMPTEMetadataDialog::SMPTEMetadataDialog (wxWindow* parent, weak_ptr<Film> weak_film)
+ : wxDialog (parent, wxID_ANY, _("Metadata"))
+ , _film (weak_film)
+{
+ wxBoxSizer* overall_sizer = new wxBoxSizer (wxVERTICAL);
+ SetSizer (overall_sizer);
+
+ wxFlexGridSizer* sizer = new wxFlexGridSizer (2, DCPOMATIC_SIZER_X_GAP, DCPOMATIC_SIZER_Y_GAP);
+ sizer->AddGrowableCol (1, 1);
+
+ wxButton* edit_name_language = 0;
+ Button* edit_release_territory = 0;
+
+ add_label_to_sizer(sizer, this, _("Title language"), true);
+ {
+ wxSizer* s = new wxBoxSizer (wxHORIZONTAL);
+ _name_language = new wxStaticText (this, wxID_ANY, wxT(""));
+ _name_language->SetToolTip (wxString::Format(_("The language that the film's title (\"%s\") is in"), std_to_wx(film()->name())));
+ s->Add (_name_language, 1, wxLEFT | wxALIGN_CENTER_VERTICAL, DCPOMATIC_SIZER_X_GAP);
+ edit_name_language = new Button (this, _("Edit..."));
+ s->Add (edit_name_language, 0, wxLEFT, DCPOMATIC_SIZER_GAP);
+ sizer->Add (s, 0, wxEXPAND);
+ }
+
+ add_label_to_sizer (sizer, this, _("Release territory"), true);
+ {
+ wxSizer* s = new wxBoxSizer (wxHORIZONTAL);
+ _release_territory = new wxStaticText (this, wxID_ANY, wxT(""));
+ s->Add (_release_territory, 1, wxLEFT | wxALIGN_CENTER_VERTICAL, DCPOMATIC_SIZER_X_GAP);
+ edit_release_territory = new Button (this, _("Edit..."));
+ s->Add (edit_release_territory, 0, wxLEFT, DCPOMATIC_SIZER_GAP);
+ sizer->Add (s, 0, wxEXPAND);
+ }
+
+ add_label_to_sizer (sizer, this, _("Version number"), true);
+ _version_number = new wxSpinCtrl (this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 1, 1000);
+ sizer->Add (_version_number, 0);
+
+ add_label_to_sizer (sizer, this, _("Status"), true);
+ _status = new wxChoice (this, wxID_ANY);
+ sizer->Add (_status, 0);
+
+ add_label_to_sizer (sizer, this, _("Chain"), true);
+ _chain = new wxTextCtrl (this, wxID_ANY);
+ sizer->Add (_chain, 1, wxEXPAND);
+
+ add_label_to_sizer (sizer, this, _("Distributor"), true);
+ _distributor = new wxTextCtrl (this, wxID_ANY);
+ sizer->Add (_distributor, 1, wxEXPAND);
+
+ add_label_to_sizer (sizer, this, _("Facility"), true);
+ _facility = new wxTextCtrl (this, wxID_ANY);
+ sizer->Add (_facility, 1, wxEXPAND);
+
+ add_label_to_sizer (sizer, this, _("Luminance"), true);
+ {
+ wxSizer* s = new wxBoxSizer (wxHORIZONTAL);
+ _luminance_value = new wxSpinCtrlDouble (this, wxID_ANY);
+ _luminance_value->SetDigits (1);
+ _luminance_value->SetIncrement (0.1);
+ s->Add (_luminance_value, 0);
+ _luminance_unit = new wxChoice (this, wxID_ANY);
+ s->Add (_luminance_unit, 0, wxLEFT, DCPOMATIC_SIZER_X_GAP);
+ sizer->Add (s, 1, wxEXPAND);
+ }
+
+ {
+ int flags = wxALIGN_TOP | wxLEFT | wxRIGHT | wxTOP;
+#ifdef __WXOSX__
+ flags |= wxALIGN_RIGHT;
+#endif
+ wxStaticText* m = create_label (this, _("Ratings"), true);
+ sizer->Add (m, 0, flags, DCPOMATIC_SIZER_GAP);
+ }
+
+ vector<EditableListColumn> columns;
+ columns.push_back (EditableListColumn("Agency", 200, true));
+ columns.push_back (EditableListColumn("Label", 50, true));
+ _ratings = new EditableList<dcp::Rating, RatingDialog> (
+ this,
+ columns,
+ boost::bind(&SMPTEMetadataDialog::ratings, this),
+ boost::bind(&SMPTEMetadataDialog::set_ratings, this, _1),
+ boost::bind(&ratings_column, _1, _2),
+ true,
+ false
+ );
+ sizer->Add (_ratings, 1, wxEXPAND);
+
+ {
+ int flags = wxALIGN_TOP | wxLEFT | wxRIGHT | wxTOP;
+#ifdef __WXOSX__
+ flags |= wxALIGN_RIGHT;
+#endif
+ wxStaticText* m = create_label (this, _("Content versions"), true);
+ sizer->Add (m, 0, flags, DCPOMATIC_SIZER_GAP);
+ }
+
+ columns.clear ();
+ columns.push_back (EditableListColumn("Version", 350, true));
+ _content_versions = new EditableList<string, ContentVersionDialog> (
+ this,
+ columns,
+ boost::bind(&SMPTEMetadataDialog::content_versions, this),
+ boost::bind(&SMPTEMetadataDialog::set_content_versions, this, _1),
+ boost::bind(&content_versions_column, _1, _2),
+ true,
+ false
+ );
+ sizer->Add (_content_versions, 1, wxEXPAND);
+
+ overall_sizer->Add (sizer, 1, wxEXPAND | wxALL, DCPOMATIC_DIALOG_BORDER);
+
+ wxSizer* buttons = CreateSeparatedButtonSizer (wxCLOSE);
+ if (buttons) {
+ overall_sizer->Add (buttons, wxSizerFlags().Expand().DoubleBorder());
+ }
+
+ overall_sizer->Layout ();
+ overall_sizer->SetSizeHints (this);
+
+ _status->Append (_("Temporary"));
+ _status->Append (_("Pre-release"));
+ _status->Append (_("Final"));
+
+ _luminance_unit->Append (_("candela per m²"));
+ _luminance_unit->Append (_("foot lambert"));
+
+ edit_name_language->Bind (wxEVT_BUTTON, boost::bind(&SMPTEMetadataDialog::edit_name_language, this));
+ edit_release_territory->Bind (wxEVT_BUTTON, boost::bind(&SMPTEMetadataDialog::edit_release_territory, this));
+ _version_number->Bind (wxEVT_SPINCTRL, boost::bind(&SMPTEMetadataDialog::version_number_changed, this));
+ _status->Bind (wxEVT_CHOICE, boost::bind(&SMPTEMetadataDialog::status_changed, this));
+ _chain->Bind (wxEVT_TEXT, boost::bind(&SMPTEMetadataDialog::chain_changed, this));
+ _distributor->Bind (wxEVT_TEXT, boost::bind(&SMPTEMetadataDialog::distributor_changed, this));
+ _facility->Bind (wxEVT_TEXT, boost::bind(&SMPTEMetadataDialog::facility_changed, this));
+ _luminance_value->Bind (wxEVT_SPINCTRLDOUBLE, boost::bind(&SMPTEMetadataDialog::luminance_changed, this));
+ _luminance_unit->Bind (wxEVT_CHOICE, boost::bind(&SMPTEMetadataDialog::luminance_changed, this));
+
+ _version_number->SetFocus ();
+
+ _film_changed_connection = film()->Change.connect(boost::bind(&SMPTEMetadataDialog::film_changed, this, _1, _2));
+
+ film_changed (CHANGE_TYPE_DONE, Film::NAME_LANGUAGE);
+ film_changed (CHANGE_TYPE_DONE, Film::RELEASE_TERRITORY);
+ film_changed (CHANGE_TYPE_DONE, Film::VERSION_NUMBER);
+ film_changed (CHANGE_TYPE_DONE, Film::STATUS);
+ film_changed (CHANGE_TYPE_DONE, Film::CHAIN);
+ film_changed (CHANGE_TYPE_DONE, Film::DISTRIBUTOR);
+ film_changed (CHANGE_TYPE_DONE, Film::FACILITY);
+ film_changed (CHANGE_TYPE_DONE, Film::CONTENT_VERSIONS);
+ film_changed (CHANGE_TYPE_DONE, Film::LUMINANCE);
+}
+
+
+void
+SMPTEMetadataDialog::film_changed (ChangeType type, Film::Property property)
+{
+ if (type != CHANGE_TYPE_DONE || film()->interop()) {
+ return;
+ }
+
+ if (property == Film::NAME_LANGUAGE) {
+ checked_set (_name_language, std_to_wx(film()->name_language().to_string()));
+ } else if (property == Film::RELEASE_TERRITORY) {
+ checked_set (_release_territory, std_to_wx(*dcp::LanguageTag::get_subtag_description(dcp::LanguageTag::REGION, film()->release_territory().subtag())));
+ } else if (property == Film::VERSION_NUMBER) {
+ checked_set (_version_number, film()->version_number());
+ } else if (property == Film::STATUS) {
+ switch (film()->status()) {
+ case dcp::TEMP:
+ checked_set (_status, 0);
+ break;
+ case dcp::PRE:
+ checked_set (_status, 1);
+ break;
+ case dcp::FINAL:
+ checked_set (_status, 2);
+ break;
+ }
+ } else if (property == Film::CHAIN) {
+ checked_set (_chain, film()->chain());
+ } else if (property == Film::DISTRIBUTOR) {
+ checked_set (_distributor, film()->distributor());
+ } else if (property == Film::FACILITY) {
+ checked_set (_facility, film()->facility());
+ } else if (property == Film::LUMINANCE) {
+ checked_set (_luminance_value, film()->luminance().value());
+ switch (film()->luminance().unit()) {
+ case dcp::Luminance::CANDELA_PER_SQUARE_METRE:
+ checked_set (_luminance_unit, 0);
+ break;
+ case dcp::Luminance::FOOT_LAMBERT:
+ checked_set (_luminance_unit, 1);
+ break;
+ }
+ }
+}
+
+
+vector<dcp::Rating>
+SMPTEMetadataDialog::ratings () const
+{
+ return film()->ratings ();
+}
+
+
+void
+SMPTEMetadataDialog::set_ratings (vector<dcp::Rating> r)
+{
+ film()->set_ratings (r);
+}
+
+
+vector<string>
+SMPTEMetadataDialog::content_versions () const
+{
+ return film()->content_versions ();
+}
+
+
+void
+SMPTEMetadataDialog::set_content_versions (vector<string> cv)
+{
+ film()->set_content_versions (cv);
+}
+
+
+void
+SMPTEMetadataDialog::edit_name_language ()
+{
+ LanguageTagDialog* d = new LanguageTagDialog(this, film()->name_language());
+ d->ShowModal ();
+ film()->set_name_language (d->get());
+ d->Destroy ();
+}
+
+
+void
+SMPTEMetadataDialog::edit_release_territory ()
+{
+ RegionSubtagDialog* d = new RegionSubtagDialog(this, film()->release_territory());
+ d->ShowModal ();
+ optional<dcp::LanguageTag::RegionSubtag> tag = d->get();
+ if (tag) {
+ film()->set_release_territory (*tag);
+ }
+ d->Destroy ();
+}
+
+
+shared_ptr<Film>
+SMPTEMetadataDialog::film () const
+{
+ shared_ptr<Film> film = _film.lock ();
+ DCPOMATIC_ASSERT (film);
+ return film;
+}
+
+
+void
+SMPTEMetadataDialog::version_number_changed ()
+{
+ film()->set_version_number (_version_number->GetValue());
+}
+
+
+void
+SMPTEMetadataDialog::status_changed ()
+{
+ switch (_status->GetSelection()) {
+ case 0:
+ film()->set_status (dcp::TEMP);
+ break;
+ case 1:
+ film()->set_status (dcp::PRE);
+ break;
+ case 2:
+ film()->set_status (dcp::FINAL);
+ break;
+ }
+}
+
+
+void
+SMPTEMetadataDialog::chain_changed ()
+{
+ film()->set_chain (wx_to_std(_chain->GetValue()));
+}
+
+
+void
+SMPTEMetadataDialog::distributor_changed ()
+{
+ film()->set_distributor (wx_to_std(_distributor->GetValue()));
+}
+
+
+void
+SMPTEMetadataDialog::facility_changed ()
+{
+ film()->set_facility (wx_to_std(_facility->GetValue()));
+}
+
+
+void
+SMPTEMetadataDialog::luminance_changed ()
+{
+ dcp::Luminance::Unit unit;
+ switch (_luminance_unit->GetSelection()) {
+ case 0:
+ unit = dcp::Luminance::CANDELA_PER_SQUARE_METRE;
+ break;
+ case 1:
+ unit = dcp::Luminance::FOOT_LAMBERT;
+ break;
+ }
+
+ film()->set_luminance (dcp::Luminance(_luminance_value->GetValue(), unit));
+}