summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2021-04-04 20:55:08 +0200
committerCarl Hetherington <cth@carlh.net>2021-04-04 20:55:08 +0200
commit0aabb6497979e2df9731f8753645149d85c02bc8 (patch)
tree93b536f42f019b516e2ddd7eaf5c8291d08580cd /src
parent8e1b0dfe3103867a749ff51156e3ed6547f298a0 (diff)
parent1c1cf56ec8982690afa5d9463d3bb76bc9c4081d (diff)
Remove the ISDCF metadata dialogue box (#1929).
We obtain its information from elsewhere: mostly the Interop/SMPTE metadata dialogue box.
Diffstat (limited to 'src')
-rw-r--r--src/lib/config.cc14
-rw-r--r--src/lib/config.h11
-rw-r--r--src/lib/film.cc126
-rw-r--r--src/lib/film.h44
-rw-r--r--src/lib/isdcf_metadata.cc83
-rw-r--r--src/lib/isdcf_metadata.h68
-rw-r--r--src/lib/util.cc9
-rw-r--r--src/lib/util.h1
-rw-r--r--src/lib/wscript1
-rw-r--r--src/wx/dcp_panel.cc49
-rw-r--r--src/wx/dcp_panel.h2
-rw-r--r--src/wx/full_config_dialog.cc16
-rw-r--r--src/wx/full_language_tag_dialog.cc2
-rw-r--r--src/wx/interop_metadata_dialog.cc50
-rw-r--r--src/wx/interop_metadata_dialog.h9
-rw-r--r--src/wx/isdcf_metadata_dialog.cc113
-rw-r--r--src/wx/isdcf_metadata_dialog.h47
-rw-r--r--src/wx/language_tag_dialog.cc8
-rw-r--r--src/wx/metadata_dialog.cc387
-rw-r--r--src/wx/metadata_dialog.h95
-rw-r--r--src/wx/player_config_dialog.cc1
-rw-r--r--src/wx/smpte_metadata_dialog.cc230
-rw-r--r--src/wx/smpte_metadata_dialog.h37
-rw-r--r--src/wx/wscript2
24 files changed, 691 insertions, 714 deletions
diff --git a/src/lib/config.cc b/src/lib/config.cc
index 0dcc84117..6ec3b0588 100644
--- a/src/lib/config.cc
+++ b/src/lib/config.cc
@@ -309,12 +309,6 @@ try
_dcp_product_version = f.optional_string_child("DCPProductVersion").get_value_or("");
_dcp_j2k_comment = f.optional_string_child("DCPJ2KComment").get_value_or("");
- if (version && version.get() >= 2) {
- _default_isdcf_metadata = ISDCFMetadata (f.node_child ("ISDCFMetadata"));
- } else {
- _default_isdcf_metadata = ISDCFMetadata (f.node_child ("DCIMetadata"));
- }
-
_default_still_length = f.optional_number_child<int>("DefaultStillLength").get_value_or (10);
_default_j2k_bandwidth = f.optional_number_child<int>("DefaultJ2KBandwidth").get_value_or (200000000);
_default_audio_delay = f.optional_number_child<int>("DefaultAudioDelay").get_value_or (0);
@@ -688,14 +682,6 @@ Config::write_config () const
/* [XML] UploadAfterMakeDCP 1 to upload to a TMS after making a DCP, 0 for no upload. */
root->add_child("UploadAfterMakeDCP")->add_child_text (_upload_after_make_dcp ? "1" : "0");
- /* [XML] ISDCFMetadata Default ISDCF metadata to use for new films; child tags are <code>&lt;ContentVersion&gt;</code>,
- <code>&lt;AudioLanguage&gt;</code>, <code>&lt;SubtitleLanguage&gt;</code>, <code>&lt;Territory&gt;</code>,
- <code>&lt;Rating&gt;</code>, <code>&lt;Studio&gt;</code>, <code>&lt;Facility&gt;</code>, <code>&lt;TempVersion&gt;</code>,
- <code>&lt;PreRelease&gt;</code>, <code>&lt;RedBand&gt;</code>, <code>&lt;Chain&gt;</code>, <code>&lt;TwoDVersionOFThreeD&gt;</code>,
- <code>&lt;MasteredLuminance&gt;</code>.
- */
- _default_isdcf_metadata.as_xml (root->add_child ("ISDCFMetadata"));
-
/* [XML] DefaultStillLength Default length (in seconds) for still images in new films. */
root->add_child("DefaultStillLength")->add_child_text (raw_convert<string> (_default_still_length));
/* [XML] DefaultJ2KBandwidth Default bitrate (in bits per second) for JPEG2000 data in new films. */
diff --git a/src/lib/config.h b/src/lib/config.h
index 0a48a00e1..eb8f88da9 100644
--- a/src/lib/config.h
+++ b/src/lib/config.h
@@ -25,7 +25,6 @@
#ifndef DCPOMATIC_CONFIG_H
#define DCPOMATIC_CONFIG_H
-#include "isdcf_metadata.h"
#include "types.h"
#include "state.h"
#include "edid.h"
@@ -166,10 +165,6 @@ public:
return _show_experimental_audio_processors;
}
- ISDCFMetadata default_isdcf_metadata () const {
- return _default_isdcf_metadata;
- }
-
boost::optional<std::string> language () const {
return _language;
}
@@ -636,10 +631,6 @@ public:
maybe_set (_show_experimental_audio_processors, e, SHOW_EXPERIMENTAL_AUDIO_PROCESSORS);
}
- void set_default_isdcf_metadata (ISDCFMetadata d) {
- maybe_set (_default_isdcf_metadata, d);
- }
-
void set_language (std::string l) {
if (_language && _language.get() == l) {
return;
@@ -1174,8 +1165,6 @@ private:
bool _allow_any_container;
/** Offer the upmixers in the audio processor settings */
bool _show_experimental_audio_processors;
- /** Default ISDCF metadata for newly-created Films */
- ISDCFMetadata _default_isdcf_metadata;
boost::optional<std::string> _language;
/** Default length of still image content (seconds) */
int _default_still_length;
diff --git a/src/lib/film.cc b/src/lib/film.cc
index 7dd0ff6f1..a9ac82b5a 100644
--- a/src/lib/film.cc
+++ b/src/lib/film.cc
@@ -155,7 +155,6 @@ Film::Film (optional<boost::filesystem::path> dir)
, _encrypted (false)
, _context_id (dcp::make_uuid ())
, _j2k_bandwidth (Config::instance()->default_j2k_bandwidth ())
- , _isdcf_metadata (Config::instance()->default_isdcf_metadata ())
, _video_frame_rate (24)
, _audio_channels (Config::instance()->default_dcp_audio_channels ())
, _three_d (false)
@@ -446,7 +445,6 @@ Film::metadata (bool with_content_paths) const
root->add_child("Resolution")->add_child_text (resolution_to_string (_resolution));
root->add_child("J2KBandwidth")->add_child_text (raw_convert<string> (_j2k_bandwidth));
- _isdcf_metadata.as_xml (root->add_child ("ISDCFMetadata"));
root->add_child("VideoFrameRate")->add_child_text (raw_convert<string> (_video_frame_rate));
root->add_child("ISDCFDate")->add_child_text (boost::gregorian::to_iso_string (_isdcf_date));
root->add_child("AudioChannels")->add_child_text (raw_convert<string> (_audio_channels));
@@ -490,6 +488,13 @@ Film::metadata (bool with_content_paths) const
if (_facility) {
root->add_child("Facility")->add_child_text(*_facility);
}
+ if (_studio) {
+ root->add_child("Studio")->add_child_text(*_studio);
+ }
+ root->add_child("TempVersion")->add_child_text(_temp_version ? "1" : "0");
+ root->add_child("PreRelease")->add_child_text(_pre_release ? "1" : "0");
+ root->add_child("RedBand")->add_child_text(_red_band ? "1" : "0");
+ root->add_child("TwoDVersionOfThreeD")->add_child_text(_two_d_version_of_three_d ? "1" : "0");
if (_luminance) {
root->add_child("LuminanceValue")->add_child_text(raw_convert<string>(_luminance->value()));
root->add_child("LuminanceUnit")->add_child_text(dcp::Luminance::unit_to_string(_luminance->unit()));
@@ -565,11 +570,9 @@ Film::read_metadata (optional<boost::filesystem::path> path)
_name = f.string_child ("Name");
if (_state_version >= 9) {
_use_isdcf_name = f.bool_child ("UseISDCFName");
- _isdcf_metadata = ISDCFMetadata (f.node_child ("ISDCFMetadata"));
_isdcf_date = boost::gregorian::from_undelimited_string (f.string_child ("ISDCFDate"));
} else {
_use_isdcf_name = f.bool_child ("UseDCIName");
- _isdcf_metadata = ISDCFMetadata (f.node_child ("DCIMetadata"));
_isdcf_date = boost::gregorian::from_undelimited_string (f.string_child ("DCIDate"));
}
@@ -666,6 +669,11 @@ Film::read_metadata (optional<boost::filesystem::path> path)
_chain = f.optional_string_child("Chain");
_distributor = f.optional_string_child("Distributor");
_facility = f.optional_string_child("Facility");
+ _studio = f.optional_string_child("Studio");
+ _temp_version = f.optional_bool_child("TempVersion").get_value_or(false);
+ _pre_release = f.optional_bool_child("PreRelease").get_value_or(false);
+ _red_band = f.optional_bool_child("RedBand").get_value_or(false);
+ _two_d_version_of_three_d = f.optional_bool_child("TwoDVersionOfThreeD").get_value_or(false);
auto value = f.optional_number_child<float>("LuminanceValue");
auto unit = f.optional_string_child("LuminanceUnit");
@@ -846,37 +854,49 @@ Film::isdcf_name (bool if_created_now) const
if (dcp_content_type()) {
d += "_" + dcp_content_type()->isdcf_name();
- d += "-" + raw_convert<string>(isdcf_metadata().content_version);
+ string version = "1";
+ if (_interop) {
+ if (!_content_versions.empty()) {
+ auto cv = _content_versions[0];
+ if (!cv.empty() && std::all_of(cv.begin(), cv.end(), isdigit)) {
+ version = cv;
+ }
+ }
+ } else {
+ version = dcp::raw_convert<string>(_version_number);
+ }
+ d += "-" + version;
}
- auto const dm = isdcf_metadata ();
-
- if (dm.temp_version) {
+ if (_temp_version) {
d += "-Temp";
}
- if (dm.pre_release) {
+ if (_pre_release) {
d += "-Pre";
}
- if (dm.red_band) {
+ if (_red_band) {
d += "-RedBand";
}
- if (!dm.chain.empty ()) {
- d += "-" + dm.chain;
+ if (_chain && !_chain->empty()) {
+ d += "-" + *_chain;
}
if (three_d ()) {
d += "-3D";
}
- if (dm.two_d_version_of_three_d) {
+ if (_two_d_version_of_three_d) {
d += "-2D";
}
- if (!dm.mastered_luminance.empty ()) {
- d += "-" + dm.mastered_luminance;
+ if (_luminance) {
+ auto fl = _luminance->value_in_foot_lamberts();
+ char buffer[64];
+ snprintf (buffer, sizeof(buffer), "%.1f", fl);
+ d += String::compose("-%1fl", buffer);
}
if (video_frame_rate() != 24) {
@@ -908,9 +928,8 @@ Film::isdcf_name (bool if_created_now) const
auto audio_langs = audio_languages();
auto audio_language = (audio_langs.empty() || !audio_langs.front().language()) ? "XX" : audio_langs.front().language()->subtag();
- transform (audio_language.begin(), audio_language.end(), audio_language.begin(), ::toupper);
- d += "_" + audio_language;
+ d += "_" + to_upper (audio_language);
/* I'm not clear on the precise details of the convention for CCAP labelling;
for now I'm just appending -CCAP if we have any closed captions.
@@ -934,7 +953,7 @@ Film::isdcf_name (bool if_created_now) const
if (burnt_in) {
transform (lang.begin(), lang.end(), lang.begin(), ::tolower);
} else {
- transform (lang.begin(), lang.end(), lang.begin(), ::toupper);
+ lang = to_upper (lang);
}
d += "-" + lang;
@@ -946,12 +965,13 @@ Film::isdcf_name (bool if_created_now) const
d += "-XX";
}
- if (!dm.territory.empty ()) {
- d += "_" + dm.territory;
- if (dm.rating.empty ()) {
+ if (_release_territory) {
+ auto territory = _release_territory->subtag();
+ d += "_" + to_upper (territory);
+ if (_ratings.empty ()) {
d += "-NR";
} else {
- d += "-" + dm.rating;
+ d += "-" + _ratings[0].label;
}
}
@@ -975,8 +995,8 @@ Film::isdcf_name (bool if_created_now) const
d += "_" + resolution_to_string (_resolution);
- if (!dm.studio.empty ()) {
- d += "_" + dm.studio;
+ if (_studio && _studio->length() >= 2) {
+ d += "_" + to_upper (_studio->substr(0, 4));
}
if (if_created_now) {
@@ -985,8 +1005,8 @@ Film::isdcf_name (bool if_created_now) const
d += "_" + boost::gregorian::to_iso_string (_isdcf_date);
}
- if (!dm.facility.empty ()) {
- d += "_" + dm.facility;
+ if (_facility && _facility->length() >= 3) {
+ d += "_" + to_upper(_facility->substr(0, 3));
}
if (_interop) {
@@ -1106,13 +1126,6 @@ Film::set_j2k_bandwidth (int b)
_j2k_bandwidth = b;
}
-void
-Film::set_isdcf_metadata (ISDCFMetadata m)
-{
- FilmChangeSignaller ch (this, Property::ISDCF_METADATA);
- _isdcf_metadata = m;
-}
-
/** @param f New frame rate.
* @param user_explicit true if this comes from a direct user instruction, false if it is from
* DCP-o-matic being helpful.
@@ -1140,9 +1153,8 @@ Film::set_three_d (bool t)
FilmChangeSignaller ch (this, Property::THREE_D);
_three_d = t;
- if (_three_d && _isdcf_metadata.two_d_version_of_three_d) {
- FilmChangeSignaller ch (this, Property::ISDCF_METADATA);
- _isdcf_metadata.two_d_version_of_three_d = false;
+ if (_three_d && _two_d_version_of_three_d) {
+ set_two_d_version_of_three_d (false);
}
}
@@ -1867,7 +1879,6 @@ Film::use_template (string name)
_audio_processor = _template_film->_audio_processor;
_reel_type = _template_film->_reel_type;
_reel_length = _template_film->_reel_length;
- _isdcf_metadata = _template_film->_isdcf_metadata;
}
pair<double, double>
@@ -2050,6 +2061,14 @@ Film::set_facility (optional<string> f)
}
+void
+Film::set_studio (optional<string> s)
+{
+ FilmChangeSignaller ch (this, Property::STUDIO);
+ _studio = s;
+}
+
+
optional<DCPTime>
Film::marker (dcp::Marker type) const
{
@@ -2107,3 +2126,36 @@ Film::add_ffoc_lfoc (Markers& markers) const
markers[dcp::Marker::LFOC] = length() - DCPTime::from_frames(1, video_frame_rate());
}
}
+
+
+void
+Film::set_temp_version (bool t)
+{
+ FilmChangeSignaller ch (this, Property::TEMP_VERSION);
+ _temp_version = t;
+}
+
+
+void
+Film::set_pre_release (bool p)
+{
+ FilmChangeSignaller ch (this, Property::PRE_RELEASE);
+ _pre_release = p;
+}
+
+
+void
+Film::set_red_band (bool r)
+{
+ FilmChangeSignaller ch (this, Property::RED_BAND);
+ _red_band = r;
+}
+
+
+void
+Film::set_two_d_version_of_three_d (bool t)
+{
+ FilmChangeSignaller ch (this, Property::TWO_D_VERSION_OF_THREE_D);
+ _two_d_version_of_three_d = t;
+}
+
diff --git a/src/lib/film.h b/src/lib/film.h
index 6b50bba5e..5fc56acfb 100644
--- a/src/lib/film.h
+++ b/src/lib/film.h
@@ -29,7 +29,6 @@
#include "change_signaller.h"
#include "dcp_text_track.h"
#include "frame_rate_change.h"
-#include "isdcf_metadata.h"
#include "signaller.h"
#include "types.h"
#include "util.h"
@@ -217,7 +216,6 @@ public:
RESOLUTION,
ENCRYPTED,
J2K_BANDWIDTH,
- ISDCF_METADATA,
VIDEO_FRAME_RATE,
AUDIO_CHANNELS,
/** The setting of _three_d has changed */
@@ -239,6 +237,11 @@ public:
CHAIN,
DISTRIBUTOR,
FACILITY,
+ STUDIO,
+ TEMP_VERSION,
+ PRE_RELEASE,
+ RED_BAND,
+ TWO_D_VERSION_OF_THREE_D,
LUMINANCE,
};
@@ -281,10 +284,6 @@ public:
return _j2k_bandwidth;
}
- ISDCFMetadata isdcf_metadata () const {
- return _isdcf_metadata;
- }
-
/** @return The frame rate of the DCP */
int video_frame_rate () const {
return _video_frame_rate;
@@ -373,6 +372,26 @@ public:
return _facility;
}
+ boost::optional<std::string> studio () const {
+ return _studio;
+ }
+
+ bool temp_version () const {
+ return _temp_version;
+ }
+
+ bool pre_release () const {
+ return _pre_release;
+ }
+
+ bool red_band () const {
+ return _red_band;
+ }
+
+ bool two_d_version_of_three_d () const {
+ return _two_d_version_of_three_d;
+ }
+
boost::optional<dcp::Luminance> luminance () const {
return _luminance;
}
@@ -393,7 +412,6 @@ public:
void set_resolution (Resolution, bool user_explicit = true);
void set_encrypted (bool);
void set_j2k_bandwidth (int);
- void set_isdcf_metadata (ISDCFMetadata);
void set_video_frame_rate (int rate, bool user_explicit = false);
void set_audio_channels (int);
void set_three_d (bool);
@@ -416,6 +434,11 @@ public:
void set_status (dcp::Status s);
void set_chain (boost::optional<std::string> c = boost::none);
void set_facility (boost::optional<std::string> f = boost::none);
+ void set_studio (boost::optional<std::string> s = boost::none);
+ void set_temp_version (bool t);
+ void set_pre_release (bool p);
+ void set_red_band (bool r);
+ void set_two_d_version_of_three_d (bool t);
void set_distributor (boost::optional<std::string> d = boost::none);
void set_luminance (boost::optional<dcp::Luminance> l = boost::none);
@@ -488,8 +511,6 @@ private:
std::string _context_id;
/** bandwidth for J2K files in bits per second */
int _j2k_bandwidth;
- /** ISDCF naming stuff */
- ISDCFMetadata _isdcf_metadata;
/** Frames per second to run our DCP at */
int _video_frame_rate;
/** The date that we should use in a ISDCF name */
@@ -522,6 +543,11 @@ private:
boost::optional<std::string> _chain;
boost::optional<std::string> _distributor;
boost::optional<std::string> _facility;
+ boost::optional<std::string> _studio;
+ bool _temp_version = false;
+ bool _pre_release = false;
+ bool _red_band = false;
+ bool _two_d_version_of_three_d = false;
boost::optional<dcp::Luminance> _luminance;
int _state_version;
diff --git a/src/lib/isdcf_metadata.cc b/src/lib/isdcf_metadata.cc
deleted file mode 100644
index 6adbd0f3c..000000000
--- a/src/lib/isdcf_metadata.cc
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- Copyright (C) 2012-2019 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 "isdcf_metadata.h"
-#include "warnings.h"
-#include <dcp/raw_convert.h>
-#include <libcxml/cxml.h>
-DCPOMATIC_DISABLE_WARNINGS
-#include <libxml++/libxml++.h>
-DCPOMATIC_ENABLE_WARNINGS
-#include <iostream>
-
-#include "i18n.h"
-
-using std::string;
-using std::shared_ptr;
-using dcp::raw_convert;
-
-ISDCFMetadata::ISDCFMetadata (cxml::ConstNodePtr node)
- : content_version (node->number_child<int> ("ContentVersion"))
- , territory (node->string_child ("Territory"))
- , rating (node->string_child ("Rating"))
- , studio (node->string_child ("Studio"))
- , facility (node->string_child ("Facility"))
- /* This stuff was added later */
- , temp_version (node->optional_bool_child ("TempVersion").get_value_or (false))
- , pre_release (node->optional_bool_child ("PreRelease").get_value_or (false))
- , red_band (node->optional_bool_child ("RedBand").get_value_or (false))
- , chain (node->optional_string_child ("Chain").get_value_or (""))
- , two_d_version_of_three_d (node->optional_bool_child ("TwoDVersionOfThreeD").get_value_or (false))
- , mastered_luminance (node->optional_string_child ("MasteredLuminance").get_value_or (""))
-{
-
-}
-
-void
-ISDCFMetadata::as_xml (xmlpp::Node* root) const
-{
- root->add_child("ContentVersion")->add_child_text (raw_convert<string> (content_version));
- root->add_child("Territory")->add_child_text (territory);
- root->add_child("Rating")->add_child_text (rating);
- root->add_child("Studio")->add_child_text (studio);
- root->add_child("Facility")->add_child_text (facility);
- root->add_child("TempVersion")->add_child_text (temp_version ? "1" : "0");
- root->add_child("PreRelease")->add_child_text (pre_release ? "1" : "0");
- root->add_child("RedBand")->add_child_text (red_band ? "1" : "0");
- root->add_child("Chain")->add_child_text (chain);
- root->add_child("TwoDVersionOfThreeD")->add_child_text (two_d_version_of_three_d ? "1" : "0");
- root->add_child("MasteredLuminance")->add_child_text (mastered_luminance);
-}
-
-bool
-operator== (ISDCFMetadata const & a, ISDCFMetadata const & b)
-{
- return a.content_version == b.content_version &&
- a.territory == b.territory &&
- a.rating == b.rating &&
- a.studio == b.studio &&
- a.facility == b.facility &&
- a.temp_version == b.temp_version &&
- a.pre_release == b.pre_release &&
- a.red_band == b.red_band &&
- a.chain == b.chain &&
- a.two_d_version_of_three_d == b.two_d_version_of_three_d &&
- a.mastered_luminance == b.mastered_luminance;
-}
diff --git a/src/lib/isdcf_metadata.h b/src/lib/isdcf_metadata.h
deleted file mode 100644
index fd021b8dc..000000000
--- a/src/lib/isdcf_metadata.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- Copyright (C) 2012-2019 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/>.
-
-*/
-
-#ifndef DCPOMATIC_ISDCF_METADATA_H
-#define DCPOMATIC_ISDCF_METADATA_H
-
-#include <libcxml/cxml.h>
-#include <string>
-
-namespace xmlpp {
- class Node;
-}
-
-class ISDCFMetadata
-{
-public:
- ISDCFMetadata ()
- : content_version (1)
- , temp_version (false)
- , pre_release (false)
- , red_band (false)
- , two_d_version_of_three_d (false)
- {}
-
- explicit ISDCFMetadata (cxml::ConstNodePtr);
-
- void as_xml (xmlpp::Node *) const;
- void read_old_metadata (std::string, std::string);
-
- int content_version;
- std::string territory;
- std::string rating;
- std::string studio;
- std::string facility;
- /** true if this is a temporary version (without final picture or sound) */
- bool temp_version;
- /** true if this is a pre-release version (final picture and sound, but without accessibility features) */
- bool pre_release;
- /** true if this has adult content */
- bool red_band;
- /** specific theatre chain or event */
- std::string chain;
- /** true if this is a 2D version of content that also exists in 3D */
- bool two_d_version_of_three_d;
- /** mastered luminance if there are multiple versions distributed (e.g. 35, 4fl, 6fl etc.) */
- std::string mastered_luminance;
-};
-
-bool operator== (ISDCFMetadata const & a, ISDCFMetadata const & b);
-
-#endif
diff --git a/src/lib/util.cc b/src/lib/util.cc
index 24ea42b8f..d3511e8c7 100644
--- a/src/lib/util.cc
+++ b/src/lib/util.cc
@@ -1167,3 +1167,12 @@ default_font_file ()
return liberation_normal;
}
+
+
+string
+to_upper (string s)
+{
+ transform (s.begin(), s.end(), s.begin(), ::toupper);
+ return s;
+}
+
diff --git a/src/lib/util.h b/src/lib/util.h
index ceb30701c..7f8106f3c 100644
--- a/src/lib/util.h
+++ b/src/lib/util.h
@@ -122,6 +122,7 @@ extern void copy_in_bits (boost::filesystem::path from, boost::filesystem::path
extern dcp::Size scale_for_display (dcp::Size s, dcp::Size display_container, dcp::Size film_container);
extern dcp::DecryptedKDM decrypt_kdm_with_helpful_error (dcp::EncryptedKDM kdm);
extern boost::filesystem::path default_font_file ();
+extern std::string to_upper (std::string s);
template <class T>
std::list<T>
diff --git a/src/lib/wscript b/src/lib/wscript
index 1b45152a4..7cbd85a4c 100644
--- a/src/lib/wscript
+++ b/src/lib/wscript
@@ -121,7 +121,6 @@ sources = """
image_examiner.cc
image_filename_sorter.cc
image_proxy.cc
- isdcf_metadata.cc
j2k_image_proxy.cc
job.cc
job_manager.cc
diff --git a/src/wx/dcp_panel.cc b/src/wx/dcp_panel.cc
index 8501eae9c..302ed4184 100644
--- a/src/wx/dcp_panel.cc
+++ b/src/wx/dcp_panel.cc
@@ -20,7 +20,6 @@
#include "dcp_panel.h"
#include "wx_util.h"
-#include "isdcf_metadata_dialog.h"
#include "audio_dialog.h"
#include "focus_manager.h"
#include "check_box.h"
@@ -85,7 +84,6 @@ DCPPanel::DCPPanel (wxNotebook* n, shared_ptr<Film> film, weak_ptr<FilmViewer> v
FocusManager::instance()->add(_name);
_use_isdcf_name = new CheckBox (_panel, _("Use ISDCF name"));
- _edit_isdcf_button = new Button (_panel, _("Details..."));
_copy_isdcf_name_button = new Button (_panel, _("Copy as name"));
/* wxST_ELLIPSIZE_MIDDLE works around a bug in GTK2 and/or wxWidgets, see
@@ -126,7 +124,6 @@ DCPPanel::DCPPanel (wxNotebook* n, shared_ptr<Film> film, weak_ptr<FilmViewer> v
_name->Bind (wxEVT_TEXT, boost::bind (&DCPPanel::name_changed, this));
_use_isdcf_name->Bind (wxEVT_CHECKBOX, boost::bind (&DCPPanel::use_isdcf_name_toggled, this));
- _edit_isdcf_button->Bind (wxEVT_BUTTON, boost::bind (&DCPPanel::edit_isdcf_button_clicked, this));
_copy_isdcf_name_button->Bind(wxEVT_BUTTON, boost::bind (&DCPPanel::copy_isdcf_name_button_clicked, this));
_dcp_content_type->Bind (wxEVT_CHOICE, boost::bind (&DCPPanel::dcp_content_type_changed, this));
_encrypted->Bind (wxEVT_CHECKBOX, boost::bind (&DCPPanel::encrypted_toggled, this));
@@ -162,8 +159,8 @@ DCPPanel::add_to_grid ()
auto name_sizer = new wxBoxSizer (wxHORIZONTAL);
name_sizer->Add (_name_label, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, DCPOMATIC_SIZER_X_GAP);
- name_sizer->Add (_name, 1, wxALIGN_CENTER_VERTICAL);
- _grid->Add (name_sizer, wxGBPosition(r, 0), wxGBSpan(1, 2), wxEXPAND);
+ name_sizer->Add (_name, 1, wxRIGHT | wxALIGN_CENTER_VERTICAL, DCPOMATIC_SIZER_X_GAP);
+ _grid->Add (name_sizer, wxGBPosition(r, 0), wxGBSpan(1, 2), wxRIGHT | wxEXPAND, DCPOMATIC_DIALOG_BORDER);
++r;
int flags = wxALIGN_CENTER_VERTICAL;
@@ -173,14 +170,13 @@ DCPPanel::add_to_grid ()
_grid->Add (_use_isdcf_name, wxGBPosition (r, 0), wxDefaultSpan, flags);
{
- wxBoxSizer* s = new wxBoxSizer (wxHORIZONTAL);
- s->Add (_edit_isdcf_button, 1, wxEXPAND | wxRIGHT, DCPOMATIC_SIZER_X_GAP);
- s->Add (_copy_isdcf_name_button, 1, wxEXPAND | wxLEFT, DCPOMATIC_SIZER_X_GAP);
+ auto s = new wxBoxSizer (wxHORIZONTAL);
+ s->Add (_copy_isdcf_name_button, 0, wxLEFT, DCPOMATIC_SIZER_X_GAP);
_grid->Add (s, wxGBPosition (r, 1), wxDefaultSpan, wxEXPAND);
}
++r;
- _grid->Add (_dcp_name, wxGBPosition(r, 0), wxGBSpan (1, 2), wxALIGN_CENTER_VERTICAL | wxEXPAND);
+ _grid->Add (_dcp_name, wxGBPosition(r, 0), wxGBSpan(1, 2), wxALIGN_CENTER_VERTICAL);
++r;
add_label_to_sizer (_grid, _dcp_content_type_label, true, wxGBPosition (r, 0));
@@ -323,6 +319,7 @@ DCPPanel::metadata_clicked ()
}
_interop_metadata_dialog = new InteropMetadataDialog (_panel, _film);
+ _interop_metadata_dialog->setup ();
_interop_metadata_dialog->Show ();
} else {
if (_smpte_metadata_dialog) {
@@ -331,6 +328,7 @@ DCPPanel::metadata_clicked ()
}
_smpte_metadata_dialog = new SMPTEMetadataDialog (_panel, _film);
+ _smpte_metadata_dialog->setup ();
_smpte_metadata_dialog->Show ();
}
}
@@ -377,12 +375,8 @@ DCPPanel::film_changed (Film::Property p)
}
}
setup_dcp_name ();
- _edit_isdcf_button->Enable (_film->use_isdcf_name ());
break;
}
- case Film::Property::ISDCF_METADATA:
- setup_dcp_name ();
- break;
case Film::Property::VIDEO_FRAME_RATE:
{
bool done = false;
@@ -444,6 +438,20 @@ DCPPanel::film_changed (Film::Property p)
setup_dcp_name ();
setup_sensitivity ();
break;
+ case Film::Property::CONTENT_VERSIONS:
+ case Film::Property::VERSION_NUMBER:
+ case Film::Property::RELEASE_TERRITORY:
+ case Film::Property::RATINGS:
+ case Film::Property::FACILITY:
+ case Film::Property::STUDIO:
+ case Film::Property::TEMP_VERSION:
+ case Film::Property::PRE_RELEASE:
+ case Film::Property::RED_BAND:
+ case Film::Property::TWO_D_VERSION_OF_THREE_D:
+ case Film::Property::CHAIN:
+ case Film::Property::LUMINANCE:
+ setup_dcp_name ();
+ break;
default:
break;
}
@@ -560,7 +568,6 @@ DCPPanel::set_film (shared_ptr<Film> film)
film_changed (Film::Property::RESOLUTION);
film_changed (Film::Property::ENCRYPTED);
film_changed (Film::Property::J2K_BANDWIDTH);
- film_changed (Film::Property::ISDCF_METADATA);
film_changed (Film::Property::VIDEO_FRAME_RATE);
film_changed (Film::Property::AUDIO_CHANNELS);
film_changed (Film::Property::SEQUENCE);
@@ -586,7 +593,6 @@ DCPPanel::setup_sensitivity ()
{
_name->Enable (_generally_sensitive);
_use_isdcf_name->Enable (_generally_sensitive);
- _edit_isdcf_button->Enable (_generally_sensitive);
_dcp_content_type->Enable (_generally_sensitive);
_copy_isdcf_name_button->Enable (_generally_sensitive);
_encrypted->Enable (_generally_sensitive);
@@ -633,19 +639,6 @@ DCPPanel::use_isdcf_name_toggled ()
}
void
-DCPPanel::edit_isdcf_button_clicked ()
-{
- if (!_film) {
- return;
- }
-
- auto d = new ISDCFMetadataDialog (_panel, _film->isdcf_metadata (), _film->three_d ());
- d->ShowModal ();
- _film->set_isdcf_metadata (d->isdcf_metadata ());
- d->Destroy ();
-}
-
-void
DCPPanel::setup_dcp_name ()
{
_dcp_name->SetLabel (std_to_wx (_film->dcp_name (true)));
diff --git a/src/wx/dcp_panel.h b/src/wx/dcp_panel.h
index 9b362a26c..a076e4bb4 100644
--- a/src/wx/dcp_panel.h
+++ b/src/wx/dcp_panel.h
@@ -64,7 +64,6 @@ public:
private:
void name_changed ();
void use_isdcf_name_toggled ();
- void edit_isdcf_button_clicked ();
void copy_isdcf_name_button_clicked ();
void container_changed ();
void dcp_content_type_changed ();
@@ -118,7 +117,6 @@ private:
wxStaticText* _container_label;
wxChoice* _container;
wxStaticText* _container_size;
- wxButton* _edit_isdcf_button;
wxButton* _copy_isdcf_name_button;
wxStaticText* _j2k_bandwidth_label;
wxStaticText* _mbits_label;
diff --git a/src/wx/full_config_dialog.cc b/src/wx/full_config_dialog.cc
index 3b07c7765..962295528 100644
--- a/src/wx/full_config_dialog.cc
+++ b/src/wx/full_config_dialog.cc
@@ -28,7 +28,6 @@
#include "filter_dialog.h"
#include "dir_picker_ctrl.h"
#include "file_picker_ctrl.h"
-#include "isdcf_metadata_dialog.h"
#include "server_dialog.h"
#include "make_chain_dialog.h"
#include "email_dialog.h"
@@ -275,10 +274,6 @@ private:
#endif
table->Add (_directory, 1, wxEXPAND);
- add_label_to_sizer (table, _panel, _("Default ISDCF name details"), true, 0, wxLEFT | wxRIGHT | wxALIGN_CENTRE_VERTICAL);
- _isdcf_metadata_button = new Button (_panel, _("Edit..."));
- table->Add (_isdcf_metadata_button);
-
add_label_to_sizer (table, _panel, _("Default container"), true, 0, wxLEFT | wxRIGHT | wxALIGN_CENTRE_VERTICAL);
_container = new wxChoice (_panel, wxID_ANY);
table->Add (_container);
@@ -328,8 +323,6 @@ private:
_directory->Bind (wxEVT_DIRPICKER_CHANGED, boost::bind (&DefaultsPage::directory_changed, this));
_kdm_directory->Bind (wxEVT_DIRPICKER_CHANGED, boost::bind (&DefaultsPage::kdm_directory_changed, this));
- _isdcf_metadata_button->Bind (wxEVT_BUTTON, boost::bind (&DefaultsPage::edit_isdcf_metadata_clicked, this));
-
for (auto i: Ratio::containers()) {
_container->Append (std_to_wx(i->container_nickname()));
}
@@ -414,14 +407,6 @@ private:
Config::instance()->set_default_kdm_directory (wx_to_std (_kdm_directory->GetPath ()));
}
- void edit_isdcf_metadata_clicked ()
- {
- ISDCFMetadataDialog* d = new ISDCFMetadataDialog (_panel, Config::instance()->default_isdcf_metadata (), false);
- d->ShowModal ();
- Config::instance()->set_default_isdcf_metadata (d->isdcf_metadata ());
- d->Destroy ();
- }
-
void still_length_changed ()
{
Config::instance()->set_default_still_length (_still_length->GetValue ());
@@ -446,7 +431,6 @@ private:
wxSpinCtrl* _j2k_bandwidth;
wxSpinCtrl* _audio_delay;
- wxButton* _isdcf_metadata_button;
wxSpinCtrl* _still_length;
#ifdef DCPOMATIC_USE_OWN_PICKER
DirPickerCtrl* _directory;
diff --git a/src/wx/full_language_tag_dialog.cc b/src/wx/full_language_tag_dialog.cc
index 2b3aeb7de..a26dcc0bb 100644
--- a/src/wx/full_language_tag_dialog.cc
+++ b/src/wx/full_language_tag_dialog.cc
@@ -173,7 +173,7 @@ private:
{
auto search = _search->GetValue();
_list->set_search (search.ToStdString());
- if (search.Length() > 0) {
+ if (search.Length() > 0 && _list->GetItemCount() > 0) {
_list->EnsureVisible (0);
}
SearchChanged (_search->GetValue().ToStdString());
diff --git a/src/wx/interop_metadata_dialog.cc b/src/wx/interop_metadata_dialog.cc
index aa61984b3..61aa23498 100644
--- a/src/wx/interop_metadata_dialog.cc
+++ b/src/wx/interop_metadata_dialog.cc
@@ -38,24 +38,22 @@ using namespace boost::placeholders;
InteropMetadataDialog::InteropMetadataDialog (wxWindow* parent, weak_ptr<Film> film)
- : wxDialog (parent, wxID_ANY, _("Metadata"))
- , _film (film)
+ : MetadataDialog (parent, film)
{
- auto overall_sizer = new wxBoxSizer (wxVERTICAL);
- SetSizer (overall_sizer);
- auto sizer = new wxFlexGridSizer (2, DCPOMATIC_SIZER_X_GAP, DCPOMATIC_SIZER_Y_GAP);
- sizer->AddGrowableCol (1, 1);
+}
- auto f = _film.lock();
- DCPOMATIC_ASSERT (f);
+void
+InteropMetadataDialog::setup_standard (wxPanel* panel, wxSizer* sizer)
+{
+ MetadataDialog::setup_standard (panel, sizer);
{
int flags = wxALIGN_TOP | wxLEFT | wxRIGHT | wxTOP;
#ifdef __WXOSX__
flags |= wxALIGN_RIGHT;
#endif
- auto m = create_label (this, _("Ratings"), true);
+ auto m = create_label (panel, _("Ratings"), true);
sizer->Add (m, 0, flags, DCPOMATIC_SIZER_GAP);
}
@@ -63,7 +61,7 @@ InteropMetadataDialog::InteropMetadataDialog (wxWindow* parent, weak_ptr<Film> f
columns.push_back (EditableListColumn(_("Agency"), 200, true));
columns.push_back (EditableListColumn(_("Label"), 50, true));
_ratings = new EditableList<dcp::Rating, RatingDialog> (
- this,
+ panel,
columns,
boost::bind(&InteropMetadataDialog::ratings, this),
boost::bind(&InteropMetadataDialog::set_ratings, this, _1),
@@ -78,23 +76,13 @@ InteropMetadataDialog::InteropMetadataDialog (wxWindow* parent, weak_ptr<Film> f
);
sizer->Add (_ratings, 1, wxEXPAND);
- add_label_to_sizer (sizer, this, _("Content version"), true, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL);
- _content_version = new wxTextCtrl (this, wxID_ANY);
+ add_label_to_sizer (sizer, panel, _("Content version"), true, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL);
+ _content_version = new wxTextCtrl (panel, wxID_ANY);
sizer->Add (_content_version, 1, wxEXPAND);
- auto cv = f->content_versions();
+ auto cv = film()->content_versions();
_content_version->SetValue (std_to_wx(cv.empty() ? "" : cv[0]));
- overall_sizer->Add (sizer, 1, wxEXPAND | wxALL, DCPOMATIC_DIALOG_BORDER);
-
- auto buttons = CreateSeparatedButtonSizer (wxCLOSE);
- if (buttons) {
- overall_sizer->Add (buttons, wxSizerFlags().Expand().DoubleBorder());
- }
-
- overall_sizer->Layout ();
- overall_sizer->SetSizeHints (this);
-
_content_version->Bind (wxEVT_TEXT, boost::bind(&InteropMetadataDialog::content_version_changed, this));
_content_version->SetFocus ();
}
@@ -103,25 +91,19 @@ InteropMetadataDialog::InteropMetadataDialog (wxWindow* parent, weak_ptr<Film> f
vector<dcp::Rating>
InteropMetadataDialog::ratings () const
{
- auto film = _film.lock ();
- DCPOMATIC_ASSERT (film);
- return film->ratings ();
+ return film()->ratings ();
}
+
void
InteropMetadataDialog::set_ratings (vector<dcp::Rating> r)
{
- auto film = _film.lock ();
- DCPOMATIC_ASSERT (film);
- film->set_ratings (r);
+ film()->set_ratings (r);
}
+
void
InteropMetadataDialog::content_version_changed ()
{
- auto film = _film.lock ();
- DCPOMATIC_ASSERT (film);
- vector<string> cv;
- cv.push_back (wx_to_std(_content_version->GetValue()));
- film->set_content_versions (cv);
+ film()->set_content_versions ({ wx_to_std(_content_version->GetValue()) });
}
diff --git a/src/wx/interop_metadata_dialog.h b/src/wx/interop_metadata_dialog.h
index b8a1a36e6..b730c1238 100644
--- a/src/wx/interop_metadata_dialog.h
+++ b/src/wx/interop_metadata_dialog.h
@@ -20,6 +20,7 @@
#include "editable_list.h"
+#include "metadata_dialog.h"
#include <dcp/language_tag.h>
#include <dcp/types.h>
#include <wx/wx.h>
@@ -31,17 +32,19 @@ class LanguageTagWidget;
class RatingDialog;
-class InteropMetadataDialog : public wxDialog
+class InteropMetadataDialog : public MetadataDialog
{
public:
InteropMetadataDialog (wxWindow* parent, std::weak_ptr<Film> film);
private:
- std::vector<dcp::Rating> ratings () const;
+ void setup_standard (wxPanel* panel, wxSizer* sizer) override;
+
void set_ratings (std::vector<dcp::Rating> r);
void content_version_changed ();
- std::weak_ptr<Film> _film;
+ std::vector<dcp::Rating> ratings () const;
+
EditableList<dcp::Rating, RatingDialog>* _ratings;
wxTextCtrl* _content_version;
};
diff --git a/src/wx/isdcf_metadata_dialog.cc b/src/wx/isdcf_metadata_dialog.cc
deleted file mode 100644
index 2fde930c6..000000000
--- a/src/wx/isdcf_metadata_dialog.cc
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- Copyright (C) 2012-2019 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 "isdcf_metadata_dialog.h"
-#include "wx_util.h"
-#include "check_box.h"
-#include "lib/film.h"
-#include <wx/wx.h>
-#include <wx/sizer.h>
-#include <wx/spinctrl.h>
-
-using std::shared_ptr;
-
-/** @param parent Parent window.
- * @param dm Initial ISDCF metadata.
- * @param threed true if the film is in 3D.
- */
-ISDCFMetadataDialog::ISDCFMetadataDialog (wxWindow* parent, ISDCFMetadata dm, bool threed)
- : TableDialog (parent, _("ISDCF name"), 2, 1, true)
-{
- add (_("Content version"), true);
- _content_version = add (new wxSpinCtrl (this, wxID_ANY));
-
- add (_("Territory (e.g. UK)"), true);
- _territory = add (new wxTextCtrl (this, wxID_ANY));
-
- add (_("Rating (e.g. 15)"), true);
- _rating = add (new wxTextCtrl (this, wxID_ANY));
-
- add (_("Studio (e.g. TCF)"), true);
- _studio = add (new wxTextCtrl (this, wxID_ANY));
-
- add (_("Facility (e.g. DLA)"), true);
- _facility = add (new wxTextCtrl (this, wxID_ANY));
-
- _temp_version = add (new CheckBox(this, _("Temp version")));
- add_spacer ();
-
- _pre_release = add (new CheckBox(this, _("Pre-release")));
- add_spacer ();
-
- _red_band = add (new CheckBox(this, _("Red band")));
- add_spacer ();
-
- add (_("Chain"), true);
- _chain = add (new wxTextCtrl (this, wxID_ANY));
-
- _two_d_version_of_three_d = add (new CheckBox(this, _("2D version of content available in 3D")));
- add_spacer ();
-
- if (threed) {
- _two_d_version_of_three_d->Enable (false);
- }
-
- add (_("Mastered luminance (e.g. 14fl)"), true);
- _mastered_luminance = add (new wxTextCtrl (this, wxID_ANY));
-
- _content_version->SetRange (1, 1024);
-
- _content_version->SetValue (dm.content_version);
- _territory->SetValue (std_to_wx (dm.territory));
- _rating->SetValue (std_to_wx (dm.rating));
- _studio->SetValue (std_to_wx (dm.studio));
- _facility->SetValue (std_to_wx (dm.facility));
- _temp_version->SetValue (dm.temp_version);
- _pre_release->SetValue (dm.pre_release);
- _red_band->SetValue (dm.red_band);
- _chain->SetValue (std_to_wx (dm.chain));
- _two_d_version_of_three_d->SetValue (dm.two_d_version_of_three_d);
- _mastered_luminance->SetValue (std_to_wx (dm.mastered_luminance));
-
- layout ();
-
- _content_version->SetFocus ();
-}
-
-
-ISDCFMetadata
-ISDCFMetadataDialog::isdcf_metadata () const
-{
- ISDCFMetadata dm;
-
- dm.content_version = _content_version->GetValue ();
- dm.territory = wx_to_std (_territory->GetValue ());
- dm.rating = wx_to_std (_rating->GetValue ());
- dm.studio = wx_to_std (_studio->GetValue ());
- dm.facility = wx_to_std (_facility->GetValue ());
- dm.temp_version = _temp_version->GetValue ();
- dm.pre_release = _pre_release->GetValue ();
- dm.red_band = _red_band->GetValue ();
- dm.chain = wx_to_std (_chain->GetValue ());
- dm.two_d_version_of_three_d = _two_d_version_of_three_d->GetValue ();
- dm.mastered_luminance = wx_to_std (_mastered_luminance->GetValue ());
-
- return dm;
-}
diff --git a/src/wx/isdcf_metadata_dialog.h b/src/wx/isdcf_metadata_dialog.h
deleted file mode 100644
index 778009551..000000000
--- a/src/wx/isdcf_metadata_dialog.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- Copyright (C) 2012-2019 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 "table_dialog.h"
-#include "lib/isdcf_metadata.h"
-#include <wx/textctrl.h>
-
-class wxSpinCtrl;
-class Film;
-
-class ISDCFMetadataDialog : public TableDialog
-{
-public:
- ISDCFMetadataDialog (wxWindow *, ISDCFMetadata, bool threed);
-
- ISDCFMetadata isdcf_metadata () const;
-
-private:
- wxSpinCtrl* _content_version;
- wxTextCtrl* _territory;
- wxTextCtrl* _rating;
- wxTextCtrl* _studio;
- wxTextCtrl* _facility;
- wxCheckBox* _temp_version;
- wxCheckBox* _pre_release;
- wxCheckBox* _red_band;
- wxTextCtrl* _chain;
- wxCheckBox* _two_d_version_of_three_d;
- wxTextCtrl* _mastered_luminance;
-};
diff --git a/src/wx/language_tag_dialog.cc b/src/wx/language_tag_dialog.cc
index c72c64b31..ca08996c6 100644
--- a/src/wx/language_tag_dialog.cc
+++ b/src/wx/language_tag_dialog.cc
@@ -116,7 +116,9 @@ LanguageTagDialog::set (dcp::LanguageTag tag)
_custom.push_back (tag);
selection = _presets.size() + _custom.size() - 1;
populate_list ();
- _list->EnsureVisible (_list->GetItemCount() - 1);
+ if (_list->GetItemCount() > 0) {
+ _list->EnsureVisible (_list->GetItemCount() - 1);
+ }
} else {
selection = _presets.size() + std::distance(_custom.begin(), iter);
}
@@ -125,7 +127,9 @@ LanguageTagDialog::set (dcp::LanguageTag tag)
}
_list->SetItemState (selection, wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED);
- _list->EnsureVisible (selection);
+ if (static_cast<int>(selection) < _list->GetItemCount()) {
+ _list->EnsureVisible (selection);
+ }
}
diff --git a/src/wx/metadata_dialog.cc b/src/wx/metadata_dialog.cc
new file mode 100644
index 000000000..c0e543b34
--- /dev/null
+++ b/src/wx/metadata_dialog.cc
@@ -0,0 +1,387 @@
+/*
+ Copyright (C) 2021 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 "dcpomatic_button.h"
+#include "full_language_tag_dialog.h"
+#include "metadata_dialog.h"
+#include "wx_util.h"
+#include "lib/film.h"
+#include <boost/bind.hpp>
+#include <boost/weak_ptr.hpp>
+#include <wx/notebook.h>
+#include <wx/spinctrl.h>
+#include <wx/wx.h>
+
+
+using std::weak_ptr;
+
+
+MetadataDialog::MetadataDialog (wxWindow* parent, weak_ptr<Film> weak_film)
+ : wxDialog (parent, wxID_ANY, _("Metadata"))
+ , WeakFilm (weak_film)
+{
+
+}
+
+
+void
+MetadataDialog::setup ()
+{
+ auto notebook = new wxNotebook (this, wxID_ANY);
+
+ auto prepare = [notebook](std::function<void (wxPanel*, wxSizer*)> setup, wxString name) {
+ auto panel = new wxPanel (notebook, wxID_ANY);
+ auto sizer = new wxFlexGridSizer (2, DCPOMATIC_SIZER_X_GAP, DCPOMATIC_SIZER_Y_GAP);
+ sizer->AddGrowableCol (1, 1);
+ setup (panel, sizer);
+ auto overall_sizer = new wxBoxSizer (wxVERTICAL);
+ overall_sizer->Add (sizer, 1, wxEXPAND | wxALL, DCPOMATIC_DIALOG_BORDER);
+ panel->SetSizer (overall_sizer);
+ notebook->AddPage (panel, name);
+ };
+
+ prepare (boost::bind(&MetadataDialog::setup_standard, this, _1, _2), _("Standard"));
+ prepare (boost::bind(&MetadataDialog::setup_advanced, this, _1, _2), _("Advanced"));
+
+ auto overall_sizer = new wxBoxSizer (wxVERTICAL);
+ overall_sizer->Add (notebook, 1, wxEXPAND | wxALL, DCPOMATIC_DIALOG_BORDER);
+
+ auto buttons = CreateSeparatedButtonSizer (wxCLOSE);
+ if (buttons) {
+ overall_sizer->Add (buttons, wxSizerFlags().Expand().DoubleBorder());
+ }
+
+ SetSizer (overall_sizer);
+ overall_sizer->Layout ();
+ overall_sizer->SetSizeHints (this);
+
+ _edit_release_territory->Bind (wxEVT_BUTTON, boost::bind(&MetadataDialog::edit_release_territory, this));
+ _enable_release_territory->Bind (wxEVT_CHECKBOX, boost::bind(&MetadataDialog::enable_release_territory_changed, this));
+ _enable_facility->Bind (wxEVT_CHECKBOX, boost::bind(&MetadataDialog::enable_facility_changed, this));
+ _facility->Bind (wxEVT_TEXT, boost::bind(&MetadataDialog::facility_changed, this));
+ _enable_studio->Bind (wxEVT_CHECKBOX, boost::bind(&MetadataDialog::enable_studio_changed, this));
+ _studio->Bind (wxEVT_TEXT, boost::bind(&MetadataDialog::studio_changed, this));
+ _enable_chain->Bind (wxEVT_CHECKBOX, boost::bind(&MetadataDialog::enable_chain_changed, this));
+ _chain->Bind (wxEVT_TEXT, boost::bind(&MetadataDialog::chain_changed, this));
+ _temp_version->Bind (wxEVT_CHECKBOX, boost::bind(&MetadataDialog::temp_version_changed, this));
+ _pre_release->Bind (wxEVT_CHECKBOX, boost::bind(&MetadataDialog::pre_release_changed, this));
+ _red_band->Bind (wxEVT_CHECKBOX, boost::bind(&MetadataDialog::red_band_changed, this));
+ _two_d_version_of_three_d->Bind (wxEVT_CHECKBOX, boost::bind(&MetadataDialog::two_d_version_of_three_d_changed, this));
+ _enable_luminance->Bind (wxEVT_CHECKBOX, boost::bind(&MetadataDialog::enable_luminance_changed, this));
+ _luminance_value->Bind (wxEVT_SPINCTRLDOUBLE, boost::bind(&MetadataDialog::luminance_changed, this));
+ _luminance_unit->Bind (wxEVT_CHOICE, boost::bind(&MetadataDialog::luminance_changed, this));
+
+ _film_changed_connection = film()->Change.connect(boost::bind(&MetadataDialog::film_changed, this, _1, _2));
+
+ film_changed (ChangeType::DONE, Film::Property::RELEASE_TERRITORY);
+ film_changed (ChangeType::DONE, Film::Property::FACILITY);
+ film_changed (ChangeType::DONE, Film::Property::STUDIO);
+ film_changed (ChangeType::DONE, Film::Property::TEMP_VERSION);
+ film_changed (ChangeType::DONE, Film::Property::PRE_RELEASE);
+ film_changed (ChangeType::DONE, Film::Property::RED_BAND);
+ film_changed (ChangeType::DONE, Film::Property::TWO_D_VERSION_OF_THREE_D);
+ film_changed (ChangeType::DONE, Film::Property::CHAIN);
+ film_changed (ChangeType::DONE, Film::Property::LUMINANCE);
+
+ setup_sensitivity ();
+}
+
+
+void
+MetadataDialog::film_changed (ChangeType type, Film::Property property)
+{
+ if (type != ChangeType::DONE) {
+ return;
+ }
+
+ if (property == Film::Property::RELEASE_TERRITORY) {
+ auto rt = film()->release_territory();
+ checked_set (_enable_release_territory, static_cast<bool>(rt));
+ if (rt) {
+ _release_territory = *rt;
+ checked_set (_release_territory_text, std_to_wx(*dcp::LanguageTag::get_subtag_description(*_release_territory)));
+ }
+ } else if (property == Film::Property::FACILITY) {
+ checked_set (_enable_facility, static_cast<bool>(film()->facility()));
+ if (film()->facility()) {
+ checked_set (_facility, *film()->facility());
+ }
+ } else if (property == Film::Property::STUDIO) {
+ checked_set (_enable_studio, static_cast<bool>(film()->studio()));
+ if (film()->studio()) {
+ checked_set (_studio, *film()->studio());
+ }
+ } else if (property == Film::Property::CHAIN) {
+ checked_set (_enable_chain, static_cast<bool>(film()->chain()));
+ if (film()->chain()) {
+ checked_set (_chain, *film()->chain());
+ }
+ } else if (property == Film::Property::TEMP_VERSION) {
+ checked_set (_temp_version, film()->temp_version());
+ } else if (property == Film::Property::PRE_RELEASE) {
+ checked_set (_pre_release, film()->pre_release());
+ } else if (property == Film::Property::RED_BAND) {
+ checked_set (_red_band, film()->red_band());
+ } else if (property == Film::Property::TWO_D_VERSION_OF_THREE_D) {
+ checked_set (_two_d_version_of_three_d, film()->two_d_version_of_three_d());
+ } else if (property == Film::Property::LUMINANCE) {
+ auto lum = film()->luminance();
+ checked_set (_enable_luminance, static_cast<bool>(lum));
+ if (lum) {
+ checked_set (_luminance_value, lum->value());
+ switch (lum->unit()) {
+ case dcp::Luminance::Unit::CANDELA_PER_SQUARE_METRE:
+ checked_set (_luminance_unit, 0);
+ break;
+ case dcp::Luminance::Unit::FOOT_LAMBERT:
+ checked_set (_luminance_unit, 1);
+ break;
+ }
+ }
+ }
+}
+
+
+void
+MetadataDialog::setup_standard (wxPanel* panel, wxSizer* sizer)
+{
+ _enable_release_territory = new wxCheckBox (panel, wxID_ANY, _("Release territory"));
+ sizer->Add (_enable_release_territory, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, DCPOMATIC_SIZER_GAP);
+ {
+ auto s = new wxBoxSizer (wxHORIZONTAL);
+ _release_territory_text = new wxStaticText (panel, wxID_ANY, wxT(""));
+ s->Add (_release_territory_text, 1, wxLEFT | wxALIGN_CENTER_VERTICAL, DCPOMATIC_SIZER_X_GAP);
+ _edit_release_territory = new Button (panel, _("Edit..."));
+ s->Add (_edit_release_territory, 0, wxLEFT, DCPOMATIC_SIZER_GAP);
+ sizer->Add (s, 0, wxEXPAND);
+ }
+}
+
+
+void
+MetadataDialog::edit_release_territory ()
+{
+ DCPOMATIC_ASSERT (film()->release_territory());
+ auto d = new RegionSubtagDialog(this, *film()->release_territory());
+ d->ShowModal ();
+ auto tag = d->get();
+ if (tag) {
+ _release_territory = *tag;
+ film()->set_release_territory(*tag);
+ }
+ d->Destroy ();
+}
+
+
+void
+MetadataDialog::setup_sensitivity ()
+{
+ auto const enabled = _enable_release_territory->GetValue();
+ _release_territory_text->Enable (enabled);
+ _edit_release_territory->Enable (enabled);
+ _facility->Enable (_enable_facility->GetValue());
+ _chain->Enable (_enable_chain->GetValue());
+ _studio->Enable (_enable_studio->GetValue());
+ _luminance_value->Enable (_enable_luminance->GetValue());
+ _luminance_unit->Enable (_enable_luminance->GetValue());
+}
+
+
+void
+MetadataDialog::enable_release_territory_changed ()
+{
+ setup_sensitivity ();
+ if (_enable_release_territory->GetValue()) {
+ film()->set_release_territory (_release_territory.get_value_or(dcp::LanguageTag::RegionSubtag("US")));
+ } else {
+ film()->set_release_territory ();
+ }
+}
+
+
+void
+MetadataDialog::setup_advanced (wxPanel* panel, wxSizer* sizer)
+{
+ _enable_facility = new wxCheckBox (panel, wxID_ANY, _("Facility"));
+ sizer->Add (_enable_facility, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL);
+ _facility = new wxTextCtrl (panel, wxID_ANY);
+ sizer->Add (_facility, 1, wxEXPAND);
+
+ _enable_studio = new wxCheckBox (panel, wxID_ANY, _("Studio"));
+ sizer->Add (_enable_studio, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL);
+ _studio = new wxTextCtrl (panel, wxID_ANY);
+ sizer->Add (_studio, 1, wxEXPAND);
+
+ _enable_chain = new wxCheckBox (panel, wxID_ANY, _("Chain"));
+ sizer->Add (_enable_chain, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL);
+ _chain = new wxTextCtrl (panel, wxID_ANY);
+ sizer->Add (_chain, 1, wxEXPAND);
+
+ _temp_version = new wxCheckBox (panel, wxID_ANY, _("Temporary version"));
+ sizer->Add (_temp_version, 0, wxALIGN_CENTER_VERTICAL);
+ sizer->AddSpacer (0);
+
+ _pre_release = new wxCheckBox (panel, wxID_ANY, _("Pre-release"));
+ sizer->Add (_pre_release, 0, wxALIGN_CENTER_VERTICAL);
+ sizer->AddSpacer (0);
+
+ _red_band = new wxCheckBox (panel, wxID_ANY, _("Red band"));
+ sizer->Add (_red_band, 0, wxALIGN_CENTER_VERTICAL);
+ sizer->AddSpacer (0);
+
+ _two_d_version_of_three_d = new wxCheckBox (panel, wxID_ANY, _("2D version of 3D DCP"));
+ sizer->Add (_two_d_version_of_three_d, 0, wxALIGN_CENTER_VERTICAL);
+ sizer->AddSpacer (0);
+
+ _enable_luminance = new wxCheckBox (panel, wxID_ANY, _("Luminance"));
+ sizer->Add (_enable_luminance, 0, wxALIGN_CENTER_VERTICAL);
+ {
+ auto s = new wxBoxSizer (wxHORIZONTAL);
+ _luminance_value = new wxSpinCtrlDouble (panel, wxID_ANY);
+ _luminance_value->SetDigits (1);
+ _luminance_value->SetIncrement (0.1);
+ s->Add (_luminance_value, 0);
+ _luminance_unit = new wxChoice (panel, wxID_ANY);
+ s->Add (_luminance_unit, 0, wxLEFT, DCPOMATIC_SIZER_X_GAP);
+ sizer->Add (s, 1, wxEXPAND);
+ }
+
+ _luminance_unit->Append (wxString::FromUTF8(_("candela per m²")));
+ _luminance_unit->Append (_("foot lambert"));
+
+}
+
+
+void
+MetadataDialog::facility_changed ()
+{
+ film()->set_facility (wx_to_std(_facility->GetValue()));
+}
+
+
+void
+MetadataDialog::enable_facility_changed ()
+{
+ setup_sensitivity ();
+ if (_enable_facility->GetValue()) {
+ film()->set_facility (wx_to_std(_facility->GetValue()));
+ } else {
+ film()->set_facility ();
+ }
+}
+
+
+void
+MetadataDialog::studio_changed ()
+{
+ film()->set_studio (wx_to_std(_studio->GetValue()));
+}
+
+
+void
+MetadataDialog::enable_studio_changed ()
+{
+ setup_sensitivity ();
+ if (_enable_studio->GetValue()) {
+ film()->set_studio (wx_to_std(_studio->GetValue()));
+ } else {
+ film()->set_studio ();
+ }
+}
+
+
+void
+MetadataDialog::temp_version_changed ()
+{
+ film()->set_temp_version(_temp_version->GetValue());
+}
+
+
+void
+MetadataDialog::pre_release_changed ()
+{
+ film()->set_pre_release(_pre_release->GetValue());
+}
+
+
+void
+MetadataDialog::red_band_changed ()
+{
+ film()->set_red_band(_red_band->GetValue());
+}
+
+
+void
+MetadataDialog::two_d_version_of_three_d_changed ()
+{
+ film()->set_two_d_version_of_three_d(_two_d_version_of_three_d->GetValue());
+}
+
+
+void
+MetadataDialog::chain_changed ()
+{
+ film()->set_chain (wx_to_std(_chain->GetValue()));
+}
+
+
+void
+MetadataDialog::enable_chain_changed ()
+{
+ setup_sensitivity ();
+ if (_enable_chain->GetValue()) {
+ chain_changed ();
+ } else {
+ film()->set_chain ();
+ }
+}
+
+
+void
+MetadataDialog::enable_luminance_changed ()
+{
+ setup_sensitivity ();
+ if (_enable_luminance->GetValue()) {
+ luminance_changed ();
+ } else {
+ film()->set_luminance ();
+ }
+}
+
+
+void
+MetadataDialog::luminance_changed ()
+{
+ dcp::Luminance::Unit unit;
+ switch (_luminance_unit->GetSelection()) {
+ case 0:
+ unit = dcp::Luminance::Unit::CANDELA_PER_SQUARE_METRE;
+ break;
+ case 1:
+ unit = dcp::Luminance::Unit::FOOT_LAMBERT;
+ break;
+ default:
+ DCPOMATIC_ASSERT (false);
+ }
+
+ film()->set_luminance (dcp::Luminance(_luminance_value->GetValue(), unit));
+}
+
diff --git a/src/wx/metadata_dialog.h b/src/wx/metadata_dialog.h
new file mode 100644
index 000000000..7c4471e59
--- /dev/null
+++ b/src/wx/metadata_dialog.h
@@ -0,0 +1,95 @@
+/*
+ Copyright (C) 2021 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/>.
+
+*/
+
+
+#ifndef DCPOMATIC_METADATA_DIALOG_H
+#define DCPOMATIC_METADATA_DIALOG_H
+
+
+#include "lib/change_signaller.h"
+#include "lib/film.h"
+#include "lib/warnings.h"
+#include "lib/weak_film.h"
+DCPOMATIC_DISABLE_WARNINGS
+#include <wx/wx.h>
+DCPOMATIC_ENABLE_WARNINGS
+
+
+class Button;
+class wxSpinCtrlDouble;
+
+
+class MetadataDialog : public wxDialog, public WeakFilm
+{
+public:
+ MetadataDialog (wxWindow* parent, std::weak_ptr<Film> film);
+
+ virtual void setup ();
+
+protected:
+ virtual void setup_standard (wxPanel*, wxSizer*);
+ virtual void setup_advanced (wxPanel*, wxSizer*);
+ virtual void film_changed (ChangeType type, Film::Property property);
+ virtual void setup_sensitivity ();
+
+private:
+ void edit_release_territory ();
+ void enable_release_territory_changed ();
+ void facility_changed ();
+ void enable_facility_changed ();
+ void studio_changed ();
+ void enable_studio_changed ();
+ void temp_version_changed ();
+ void pre_release_changed ();
+ void red_band_changed ();
+ void two_d_version_of_three_d_changed ();
+ void chain_changed ();
+ void enable_chain_changed ();
+ void enable_luminance_changed ();
+ void luminance_changed ();
+
+ wxCheckBox* _enable_release_territory;
+ /** The current release territory displayed in the UI; since we can't easily convert
+ * the string in _release_territory_text to a RegionSubtag we just store the RegionSubtag
+ * alongside.
+ */
+ boost::optional<dcp::LanguageTag::RegionSubtag> _release_territory;
+ wxStaticText* _release_territory_text;
+ Button* _edit_release_territory;
+ wxCheckBox* _enable_facility;
+ wxTextCtrl* _facility;
+ wxCheckBox* _enable_chain;
+ wxTextCtrl* _chain;
+ wxCheckBox* _enable_studio;
+ wxTextCtrl* _studio;
+ wxCheckBox* _temp_version;
+ wxCheckBox* _pre_release;
+ wxCheckBox* _red_band;
+ wxCheckBox* _two_d_version_of_three_d;
+ wxCheckBox* _enable_luminance;
+ wxSpinCtrlDouble* _luminance_value;
+ wxChoice* _luminance_unit;
+
+ boost::signals2::scoped_connection _film_changed_connection;
+};
+
+
+#endif
+
diff --git a/src/wx/player_config_dialog.cc b/src/wx/player_config_dialog.cc
index c32e892d9..3c480e37e 100644
--- a/src/wx/player_config_dialog.cc
+++ b/src/wx/player_config_dialog.cc
@@ -28,7 +28,6 @@
#include "filter_dialog.h"
#include "file_picker_ctrl.h"
#include "dir_picker_ctrl.h"
-#include "isdcf_metadata_dialog.h"
#include "server_dialog.h"
#include "make_chain_dialog.h"
#include "email_dialog.h"
diff --git a/src/wx/smpte_metadata_dialog.cc b/src/wx/smpte_metadata_dialog.cc
index 464da6710..e4d2d9622 100644
--- a/src/wx/smpte_metadata_dialog.cc
+++ b/src/wx/smpte_metadata_dialog.cc
@@ -28,7 +28,6 @@
#include "lib/film.h"
#include <dcp/types.h>
#include <wx/gbsizer.h>
-#include <wx/notebook.h>
#include <wx/spinctrl.h>
@@ -60,13 +59,10 @@ content_versions_column (string v, int)
}
-wxPanel *
-SMPTEMetadataDialog::main_panel (wxWindow* parent)
+void
+SMPTEMetadataDialog::setup_standard (wxPanel* panel, wxSizer* sizer)
{
- auto panel = new wxPanel (parent, wxID_ANY);
-
- auto sizer = new wxFlexGridSizer (2, DCPOMATIC_SIZER_X_GAP, DCPOMATIC_SIZER_Y_GAP);
- sizer->AddGrowableCol (1, 1);
+ MetadataDialog::setup_standard (panel, sizer);
add_label_to_sizer (sizer, panel, _("Title language"), true, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL);
_name_language = new LanguageTagWidget(
@@ -98,33 +94,13 @@ SMPTEMetadataDialog::main_panel (wxWindow* parent)
false
);
sizer->Add (_ratings, 1, wxEXPAND);
-
- auto overall_sizer = new wxBoxSizer (wxVERTICAL);
- overall_sizer->Add (sizer, 1, wxEXPAND | wxALL, DCPOMATIC_DIALOG_BORDER);
- panel->SetSizer (overall_sizer);
-
- return panel;
}
-wxPanel *
-SMPTEMetadataDialog::advanced_panel (wxWindow* parent)
+void
+SMPTEMetadataDialog::setup_advanced (wxPanel* panel, wxSizer* sizer)
{
- auto panel = new wxPanel (parent, wxID_ANY);
-
- auto sizer = new wxFlexGridSizer (2, DCPOMATIC_SIZER_X_GAP, DCPOMATIC_SIZER_Y_GAP);
- sizer->AddGrowableCol (1, 1);
-
- _enable_release_territory = new wxCheckBox (panel, wxID_ANY, _("Release territory"));
- sizer->Add (_enable_release_territory, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, DCPOMATIC_SIZER_GAP);
- {
- auto s = new wxBoxSizer (wxHORIZONTAL);
- _release_territory_text = new wxStaticText (panel, wxID_ANY, wxT(""));
- s->Add (_release_territory_text, 1, wxLEFT | wxALIGN_CENTER_VERTICAL, DCPOMATIC_SIZER_X_GAP);
- _edit_release_territory = new Button (panel, _("Edit..."));
- s->Add (_edit_release_territory, 0, wxLEFT, DCPOMATIC_SIZER_GAP);
- sizer->Add (s, 0, wxEXPAND);
- }
+ MetadataDialog::setup_advanced (panel, sizer);
add_label_to_sizer (sizer, panel, _("Version number"), true, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL);
_version_number = new wxSpinCtrl (panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 1, 1000);
@@ -134,33 +110,11 @@ SMPTEMetadataDialog::advanced_panel (wxWindow* parent)
_status = new wxChoice (panel, wxID_ANY);
sizer->Add (_status, 0);
- _enable_chain = new wxCheckBox (panel, wxID_ANY, _("Chain"));
- sizer->Add (_enable_chain, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL);
- _chain = new wxTextCtrl (panel, wxID_ANY);
- sizer->Add (_chain, 1, wxEXPAND);
-
_enable_distributor = new wxCheckBox (panel, wxID_ANY, _("Distributor"));
sizer->Add (_enable_distributor, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL);
_distributor = new wxTextCtrl (panel, wxID_ANY);
sizer->Add (_distributor, 1, wxEXPAND);
- _enable_facility = new wxCheckBox (panel, wxID_ANY, _("Facility"));
- sizer->Add (_enable_facility, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL);
- _facility = new wxTextCtrl (panel, wxID_ANY);
- sizer->Add (_facility, 1, wxEXPAND);
-
- add_label_to_sizer (sizer, panel, _("Luminance"), true, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL);
- {
- auto s = new wxBoxSizer (wxHORIZONTAL);
- _luminance_value = new wxSpinCtrlDouble (panel, wxID_ANY);
- _luminance_value->SetDigits (1);
- _luminance_value->SetIncrement (0.1);
- s->Add (_luminance_value, 0);
- _luminance_unit = new wxChoice (panel, wxID_ANY);
- s->Add (_luminance_unit, 0, wxLEFT, DCPOMATIC_SIZER_X_GAP);
- sizer->Add (s, 1, wxEXPAND);
- }
-
{
int flags = wxALIGN_TOP | wxRIGHT | wxTOP;
#ifdef __WXOSX__
@@ -182,69 +136,36 @@ SMPTEMetadataDialog::advanced_panel (wxWindow* parent)
false
);
sizer->Add (_content_versions, 1, wxEXPAND);
-
- auto overall_sizer = new wxBoxSizer (wxVERTICAL);
- overall_sizer->Add (sizer, 1, wxEXPAND | wxALL, DCPOMATIC_DIALOG_BORDER);
- panel->SetSizer (overall_sizer);
-
- return panel;
}
SMPTEMetadataDialog::SMPTEMetadataDialog (wxWindow* parent, weak_ptr<Film> weak_film)
- : wxDialog (parent, wxID_ANY, _("Metadata"))
- , WeakFilm (weak_film)
+ : MetadataDialog (parent, weak_film)
{
- auto notebook = new wxNotebook (this, wxID_ANY);
- notebook->AddPage (main_panel(notebook), _("Standard"));
- notebook->AddPage (advanced_panel(notebook), _("Advanced"));
- auto overall_sizer = new wxBoxSizer (wxVERTICAL);
- overall_sizer->Add (notebook, 1, wxEXPAND | wxALL, DCPOMATIC_DIALOG_BORDER);
+}
- auto buttons = CreateSeparatedButtonSizer (wxCLOSE);
- if (buttons) {
- overall_sizer->Add (buttons, wxSizerFlags().Expand().DoubleBorder());
- }
- SetSizer (overall_sizer);
- overall_sizer->Layout ();
- overall_sizer->SetSizeHints (this);
+void
+SMPTEMetadataDialog::setup ()
+{
+ MetadataDialog::setup ();
_status->Append (_("Temporary"));
_status->Append (_("Pre-release"));
_status->Append (_("Final"));
- _luminance_unit->Append (wxString::FromUTF8(_("candela per m²")));
- _luminance_unit->Append (_("foot lambert"));
-
_name_language->Changed.connect (boost::bind(&SMPTEMetadataDialog::name_language_changed, this, _1));
- _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));
- _enable_chain->Bind (wxEVT_CHECKBOX, boost::bind(&SMPTEMetadataDialog::enable_chain_changed, this));
- _chain->Bind (wxEVT_TEXT, boost::bind(&SMPTEMetadataDialog::chain_changed, this));
_enable_distributor->Bind (wxEVT_CHECKBOX, boost::bind(&SMPTEMetadataDialog::enable_distributor_changed, this));
_distributor->Bind (wxEVT_TEXT, boost::bind(&SMPTEMetadataDialog::distributor_changed, this));
- _enable_facility->Bind (wxEVT_CHECKBOX, boost::bind(&SMPTEMetadataDialog::enable_facility_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));
- _enable_release_territory->Bind (wxEVT_CHECKBOX, boost::bind(&SMPTEMetadataDialog::enable_release_territory_changed, this));
-
- _version_number->SetFocus ();
-
- _film_changed_connection = film()->Change.connect(boost::bind(&SMPTEMetadataDialog::film_changed, this, _1, _2));
film_changed (ChangeType::DONE, Film::Property::NAME_LANGUAGE);
- film_changed (ChangeType::DONE, Film::Property::RELEASE_TERRITORY);
film_changed (ChangeType::DONE, Film::Property::VERSION_NUMBER);
film_changed (ChangeType::DONE, Film::Property::STATUS);
- film_changed (ChangeType::DONE, Film::Property::CHAIN);
film_changed (ChangeType::DONE, Film::Property::DISTRIBUTOR);
- film_changed (ChangeType::DONE, Film::Property::FACILITY);
film_changed (ChangeType::DONE, Film::Property::CONTENT_VERSIONS);
- film_changed (ChangeType::DONE, Film::Property::LUMINANCE);
setup_sensitivity ();
}
@@ -253,19 +174,14 @@ SMPTEMetadataDialog::SMPTEMetadataDialog (wxWindow* parent, weak_ptr<Film> weak_
void
SMPTEMetadataDialog::film_changed (ChangeType type, Film::Property property)
{
+ MetadataDialog::film_changed (type, property);
+
if (type != ChangeType::DONE || film()->interop()) {
return;
}
if (property == Film::Property::NAME_LANGUAGE) {
_name_language->set (film()->name_language());
- } else if (property == Film::Property::RELEASE_TERRITORY) {
- auto rt = film()->release_territory();
- checked_set (_enable_release_territory, static_cast<bool>(rt));
- if (rt) {
- _release_territory = *rt;
- checked_set (_release_territory_text, std_to_wx(*dcp::LanguageTag::get_subtag_description(*_release_territory)));
- }
} else if (property == Film::Property::VERSION_NUMBER) {
checked_set (_version_number, film()->version_number());
} else if (property == Film::Property::STATUS) {
@@ -280,37 +196,11 @@ SMPTEMetadataDialog::film_changed (ChangeType type, Film::Property property)
checked_set (_status, 2);
break;
}
- } else if (property == Film::Property::CHAIN) {
- checked_set (_enable_chain, static_cast<bool>(film()->chain()));
- if (film()->chain()) {
- checked_set (_chain, *film()->chain());
- }
} else if (property == Film::Property::DISTRIBUTOR) {
checked_set (_enable_distributor, static_cast<bool>(film()->distributor()));
if (film()->distributor()) {
checked_set (_distributor, *film()->distributor());
}
- } else if (property == Film::Property::FACILITY) {
- checked_set (_enable_facility, static_cast<bool>(film()->facility()));
- if (film()->facility()) {
- checked_set (_facility, *film()->facility());
- }
- } else if (property == Film::Property::LUMINANCE) {
- auto lum = film()->luminance();
- if (lum) {
- checked_set (_luminance_value, lum->value());
- switch (lum->unit()) {
- case dcp::Luminance::Unit::CANDELA_PER_SQUARE_METRE:
- checked_set (_luminance_unit, 0);
- break;
- case dcp::Luminance::Unit::FOOT_LAMBERT:
- checked_set (_luminance_unit, 1);
- break;
- }
- } else {
- checked_set (_luminance_value, 4.5);
- checked_set (_luminance_unit, 1);
- }
}
}
@@ -351,21 +241,6 @@ SMPTEMetadataDialog::name_language_changed (dcp::LanguageTag tag)
void
-SMPTEMetadataDialog::edit_release_territory ()
-{
- DCPOMATIC_ASSERT (film()->release_territory());
- auto d = new RegionSubtagDialog(this, *film()->release_territory());
- d->ShowModal ();
- auto tag = d->get();
- if (tag) {
- _release_territory = *tag;
- film()->set_release_territory(*tag);
- }
- d->Destroy ();
-}
-
-
-void
SMPTEMetadataDialog::version_number_changed ()
{
film()->set_version_number (_version_number->GetValue());
@@ -390,13 +265,6 @@ SMPTEMetadataDialog::status_changed ()
void
-SMPTEMetadataDialog::chain_changed ()
-{
- film()->set_chain (wx_to_std(_chain->GetValue()));
-}
-
-
-void
SMPTEMetadataDialog::distributor_changed ()
{
film()->set_distributor (wx_to_std(_distributor->GetValue()));
@@ -404,67 +272,11 @@ SMPTEMetadataDialog::distributor_changed ()
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::Unit::CANDELA_PER_SQUARE_METRE;
- break;
- case 1:
- unit = dcp::Luminance::Unit::FOOT_LAMBERT;
- break;
- default:
- DCPOMATIC_ASSERT (false);
- }
-
- film()->set_luminance (dcp::Luminance(_luminance_value->GetValue(), unit));
-}
-
-
-void
SMPTEMetadataDialog::setup_sensitivity ()
{
- {
- auto const enabled = _enable_release_territory->GetValue();
- _release_territory_text->Enable (enabled);
- _edit_release_territory->Enable (enabled);
- }
+ MetadataDialog::setup_sensitivity ();
- _chain->Enable (_enable_chain->GetValue());
_distributor->Enable (_enable_distributor->GetValue());
- _facility->Enable (_enable_facility->GetValue());
-}
-
-
-void
-SMPTEMetadataDialog::enable_release_territory_changed ()
-{
- setup_sensitivity ();
- if (_enable_release_territory->GetValue()) {
- film()->set_release_territory (_release_territory.get_value_or(dcp::LanguageTag::RegionSubtag("US")));
- } else {
- film()->set_release_territory ();
- }
-}
-
-
-void
-SMPTEMetadataDialog::enable_chain_changed ()
-{
- setup_sensitivity ();
- if (_enable_chain->GetValue()) {
- film()->set_chain (wx_to_std(_chain->GetValue()));
- } else {
- film()->set_chain ();
- }
}
@@ -480,15 +292,3 @@ SMPTEMetadataDialog::enable_distributor_changed ()
}
-void
-SMPTEMetadataDialog::enable_facility_changed ()
-{
- setup_sensitivity ();
- if (_enable_facility->GetValue()) {
- film()->set_facility (wx_to_std(_facility->GetValue()));
- } else {
- film()->set_facility ();
- }
-}
-
-
diff --git a/src/wx/smpte_metadata_dialog.h b/src/wx/smpte_metadata_dialog.h
index 46272adbb..d1a792a36 100644
--- a/src/wx/smpte_metadata_dialog.h
+++ b/src/wx/smpte_metadata_dialog.h
@@ -21,6 +21,7 @@
#include "editable_list.h"
#include "full_language_tag_dialog.h"
+#include "metadata_dialog.h"
#include "lib/film.h"
#include "lib/weak_film.h"
#include <dcp/language_tag.h>
@@ -36,54 +37,34 @@ class LanguageTagWidget;
class LanguageTagDialog;
-class SMPTEMetadataDialog : public wxDialog, public WeakFilm
+class SMPTEMetadataDialog : public MetadataDialog
{
public:
SMPTEMetadataDialog (wxWindow* parent, std::weak_ptr<Film> film);
+ void setup () override;
+
private:
- wxPanel* main_panel (wxWindow* parent);
- wxPanel* advanced_panel (wxWindow* parent);
+ void setup_standard (wxPanel* parent, wxSizer* sizer) override;
+ void setup_advanced (wxPanel* parent, wxSizer* sizer) override;
+ void film_changed (ChangeType type, Film::Property property) override;
+ void setup_sensitivity () override;
+
std::vector<dcp::Rating> ratings () const;
void set_ratings (std::vector<dcp::Rating> r);
std::vector<std::string> content_versions () const;
void set_content_versions (std::vector<std::string> v);
void name_language_changed (dcp::LanguageTag tag);
- void edit_release_territory ();
void version_number_changed ();
void status_changed ();
- void chain_changed ();
void distributor_changed ();
- void facility_changed ();
- void luminance_changed ();
- void film_changed (ChangeType type, Film::Property property);
- void setup_sensitivity ();
- void enable_release_territory_changed ();
- void enable_chain_changed ();
void enable_distributor_changed ();
- void enable_facility_changed ();
LanguageTagWidget* _name_language;
- wxCheckBox* _enable_release_territory;
- /** The current release territory displayed in the UI; since we can't easily convert
- * the string in _release_territory_text to a RegionSubtag we just store the RegionSubtag
- * alongside.
- */
- boost::optional<dcp::LanguageTag::RegionSubtag> _release_territory;
- wxStaticText* _release_territory_text;
- Button* _edit_release_territory;
wxSpinCtrl* _version_number;
wxChoice* _status;
- wxCheckBox* _enable_chain;
- wxTextCtrl* _chain;
wxCheckBox* _enable_distributor;
wxTextCtrl* _distributor;
- wxCheckBox* _enable_facility;
- wxTextCtrl* _facility;
- wxSpinCtrlDouble* _luminance_value;
- wxChoice* _luminance_unit;
EditableList<dcp::Rating, RatingDialog>* _ratings;
EditableList<std::string, ContentVersionDialog>* _content_versions;
-
- boost::signals2::scoped_connection _film_changed_connection;
};
diff --git a/src/wx/wscript b/src/wx/wscript
index 76eea3fa5..1d0fb0810 100644
--- a/src/wx/wscript
+++ b/src/wx/wscript
@@ -85,7 +85,6 @@ sources = """
image_sequence_dialog.cc
instant_i18n_dialog.cc
interop_metadata_dialog.cc
- isdcf_metadata_dialog.cc
job_manager_view.cc
job_view.cc
job_view_dialog.cc
@@ -99,6 +98,7 @@ sources = """
make_chain_dialog.cc
markers_dialog.cc
message_dialog.cc
+ metadata_dialog.cc
monitor_dialog.cc
move_to_dialog.cc
nag_dialog.cc