# Use distro-provided FFmpeg on Arch
deps = []
- deps.append(('libdcp', 'b9c5e3f'))
- deps.append(('libsub', '4a1de69'))
+ deps.append(('libdcp', '127b57a'))
+ deps.append(('libsub', '44e3032'))
deps.append(('leqm-nrt', '131f971'))
deps.append(('rtaudio', 'f619b76'))
# We get our OpenSSL libraries from the environment, but we
_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);
/* [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><ContentVersion></code>,
- <code><AudioLanguage></code>, <code><SubtitleLanguage></code>, <code><Territory></code>,
- <code><Rating></code>, <code><Studio></code>, <code><Facility></code>, <code><TempVersion></code>,
- <code><PreRelease></code>, <code><RedBand></code>, <code><Chain></code>, <code><TwoDVersionOFThreeD></code>,
- <code><MasteredLuminance></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. */
#ifndef DCPOMATIC_CONFIG_H
#define DCPOMATIC_CONFIG_H
-#include "isdcf_metadata.h"
#include "types.h"
#include "state.h"
#include "edid.h"
return _show_experimental_audio_processors;
}
- ISDCFMetadata default_isdcf_metadata () const {
- return _default_isdcf_metadata;
- }
-
boost::optional<std::string> language () const {
return _language;
}
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;
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;
, _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)
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));
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()));
_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"));
}
_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");
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) {
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.
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;
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;
}
}
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) {
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) {
_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.
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);
}
}
_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>
}
+void
+Film::set_studio (optional<string> s)
+{
+ FilmChangeSignaller ch (this, Property::STUDIO);
+ _studio = s;
+}
+
+
optional<DCPTime>
Film::marker (dcp::Marker type) 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;
+}
+
#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"
RESOLUTION,
ENCRYPTED,
J2K_BANDWIDTH,
- ISDCF_METADATA,
VIDEO_FRAME_RATE,
AUDIO_CHANNELS,
/** The setting of _three_d has changed */
CHAIN,
DISTRIBUTOR,
FACILITY,
+ STUDIO,
+ TEMP_VERSION,
+ PRE_RELEASE,
+ RED_BAND,
+ TWO_D_VERSION_OF_THREE_D,
LUMINANCE,
};
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;
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;
}
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);
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);
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 */
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;
+++ /dev/null
-/*
- 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;
-}
+++ /dev/null
-/*
- 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
return liberation_normal;
}
+
+
+string
+to_upper (string s)
+{
+ transform (s.begin(), s.end(), s.begin(), ::toupper);
+ return s;
+}
+
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>
image_examiner.cc
image_filename_sorter.cc
image_proxy.cc
- isdcf_metadata.cc
j2k_image_proxy.cc
job.cc
job_manager.cc
#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"
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
_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));
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;
_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));
}
_interop_metadata_dialog = new InteropMetadataDialog (_panel, _film);
+ _interop_metadata_dialog->setup ();
_interop_metadata_dialog->Show ();
} else {
if (_smpte_metadata_dialog) {
}
_smpte_metadata_dialog = new SMPTEMetadataDialog (_panel, _film);
+ _smpte_metadata_dialog->setup ();
_smpte_metadata_dialog->Show ();
}
}
}
}
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;
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;
}
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);
{
_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);
_film->set_use_isdcf_name (_use_isdcf_name->GetValue ());
}
-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 ()
{
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 ();
wxStaticText* _container_label;
wxChoice* _container;
wxStaticText* _container_size;
- wxButton* _edit_isdcf_button;
wxButton* _copy_isdcf_name_button;
wxStaticText* _j2k_bandwidth_label;
wxStaticText* _mbits_label;
#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"
#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);
_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()));
}
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 ());
wxSpinCtrl* _j2k_bandwidth;
wxSpinCtrl* _audio_delay;
- wxButton* _isdcf_metadata_button;
wxSpinCtrl* _still_length;
#ifdef DCPOMATIC_USE_OWN_PICKER
DirPickerCtrl* _directory;
{
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());
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);
}
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),
);
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 ();
}
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()) });
}
#include "editable_list.h"
+#include "metadata_dialog.h"
#include <dcp/language_tag.h>
#include <dcp/types.h>
#include <wx/wx.h>
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;
};
+++ /dev/null
-/*
- 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;
-}
+++ /dev/null
-/*
- 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;
-};
_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);
}
}
_list->SetItemState (selection, wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED);
- _list->EnsureVisible (selection);
+ if (static_cast<int>(selection) < _list->GetItemCount()) {
+ _list->EnsureVisible (selection);
+ }
}
--- /dev/null
+/*
+ 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));
+}
+
--- /dev/null
+/*
+ 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
+
#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"
#include "lib/film.h"
#include <dcp/types.h>
#include <wx/gbsizer.h>
-#include <wx/notebook.h>
#include <wx/spinctrl.h>
}
-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(
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);
_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__
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 ();
}
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) {
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);
- }
}
}
}
-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 ()
{
}
-void
-SMPTEMetadataDialog::chain_changed ()
-{
- film()->set_chain (wx_to_std(_chain->GetValue()));
-}
-
-
void
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 ();
- }
}
}
-void
-SMPTEMetadataDialog::enable_facility_changed ()
-{
- setup_sensitivity ();
- if (_enable_facility->GetValue()) {
- film()->set_facility (wx_to_std(_facility->GetValue()));
- } else {
- film()->set_facility ();
- }
-}
-
-
#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>
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;
};
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
make_chain_dialog.cc
markers_dialog.cc
message_dialog.cc
+ metadata_dialog.cc
monitor_dialog.cc
move_to_dialog.cc
nag_dialog.cc
using std::cout;
-using std::shared_ptr;
using std::make_shared;
+using std::shared_ptr;
+using std::string;
BOOST_AUTO_TEST_CASE (isdcf_name_test)
BOOST_REQUIRE (!wait_for_jobs());
BOOST_REQUIRE (audio->audio);
audio->audio->set_language(dcp::LanguageTag("en-US"));
- ISDCFMetadata m;
- m.content_version = 1;
- m.territory = "UK";
- m.rating = "PG";
- m.studio = "ST";
- m.facility = "FA";
- film->set_isdcf_metadata (m);
+ film->set_content_versions({"1"});
+ film->set_release_territory(dcp::LanguageTag::RegionSubtag("GB"));
+ film->set_ratings({dcp::Rating("BBFC", "PG")});
+ film->set_studio (string("ST"));
+ film->set_facility (string("FAC"));
film->set_interop (true);
- BOOST_CHECK_EQUAL (film->isdcf_name(false), "MyNiceFilm_FTR-1_F_EN-XX_UK-PG_10_2K_ST_20140704_FA_IOP_OV");
+ BOOST_CHECK_EQUAL (film->isdcf_name(false), "MyNiceFilm_FTR-1_F_EN-XX_GB-PG_10_2K_ST_20140704_FAC_IOP_OV");
/* Check that specifying no audio language writes XX */
audio->audio->set_language (boost::none);
- film->set_isdcf_metadata (m);
- BOOST_CHECK_EQUAL (film->isdcf_name(false), "MyNiceFilm_FTR-1_F_XX-XX_UK-PG_10_2K_ST_20140704_FA_IOP_OV");
+ BOOST_CHECK_EQUAL (film->isdcf_name(false), "MyNiceFilm_FTR-1_F_XX-XX_GB-PG_10_2K_ST_20140704_FAC_IOP_OV");
/* Test a long name and some different data */
text->text.front()->set_burn (true);
text->text.front()->set_language (dcp::LanguageTag("fr-FR"));
film->examine_and_add_content (text);
+ film->set_version_number(2);
+ film->set_release_territory(dcp::LanguageTag::RegionSubtag("US"));
+ film->set_ratings({dcp::Rating("MPA", "R")});
+ film->set_studio (string("di"));
+ film->set_facility (string("ppfacility"));
BOOST_REQUIRE (!wait_for_jobs());
- m.content_version = 2;
audio = content_factory("test/data/sine_440.wav").front();
film->examine_and_add_content (audio);
BOOST_REQUIRE (!wait_for_jobs());
BOOST_REQUIRE (audio->audio);
audio->audio->set_language (dcp::LanguageTag("de-DE"));
- m.territory = "US";
- m.rating = "R";
- m.studio = "DI";
- m.facility = "PP";
- film->set_isdcf_metadata (m);
film->set_interop (false);
- BOOST_CHECK_EQUAL (film->isdcf_name(false), "MyNiceFilmWith_TLR-2_S_DE-fr_US-R_MOS_4K_DI_20140704_PP_SMPTE_OV");
+ BOOST_CHECK_EQUAL (film->isdcf_name(false), "MyNiceFilmWith_TLR-2_S_DE-fr_US-R_MOS_4K_DI_20140704_PPF_SMPTE_OV");
/* Test to see that RU ratings like 6+ survive */
- m.rating = "6+";
- film->set_isdcf_metadata (m);
- BOOST_CHECK_EQUAL (film->dcp_name(false), "MyNiceFilmWith_TLR-2_S_DE-fr_US-6+_MOS_4K_DI_20140704_PP_SMPTE_OV");
- m.rating = "R";
- film->set_isdcf_metadata (m);
+ film->set_ratings({dcp::Rating("RARS", "6+")});
+ BOOST_CHECK_EQUAL (film->dcp_name(false), "MyNiceFilmWith_TLR-2_S_DE-fr_US-6+_MOS_4K_DI_20140704_PPF_SMPTE_OV");
+ film->set_ratings({dcp::Rating("MPA", "R")});
/* Test interior aspect ratio: shouldn't be shown with trailers */
BOOST_REQUIRE (!wait_for_jobs());
content->video->set_custom_ratio (1.33);
film->set_container (Ratio::from_id ("185"));
- BOOST_CHECK_EQUAL (film->isdcf_name(false), "MyNiceFilmWith_TLR-2_F_DE-fr_US-R_MOS_4K_DI_20140704_PP_SMPTE_OV");
+ BOOST_CHECK_EQUAL (film->isdcf_name(false), "MyNiceFilmWith_TLR-2_F_DE-fr_US-R_MOS_4K_DI_20140704_PPF_SMPTE_OV");
/* But should be shown for anything else */
film->set_dcp_content_type (DCPContentType::from_isdcf_name ("XSN"));
- BOOST_CHECK_EQUAL (film->isdcf_name(false), "MyNiceFilmWith_XSN-2_F-133_DE-fr_US-R_MOS_4K_DI_20140704_PP_SMPTE_OV");
+ BOOST_CHECK_EQUAL (film->isdcf_name(false), "MyNiceFilmWith_XSN-2_F-133_DE-fr_US-R_MOS_4K_DI_20140704_PPF_SMPTE_OV");
/* And it should always be numeric */
content->video->set_custom_ratio (2.39);
- BOOST_CHECK_EQUAL (film->isdcf_name(false), "MyNiceFilmWith_XSN-2_F-239_DE-fr_US-R_MOS_4K_DI_20140704_PP_SMPTE_OV");
+ BOOST_CHECK_EQUAL (film->isdcf_name(false), "MyNiceFilmWith_XSN-2_F-239_DE-fr_US-R_MOS_4K_DI_20140704_PPF_SMPTE_OV");
content->video->set_custom_ratio (1.9);
- BOOST_CHECK_EQUAL (film->isdcf_name(false), "MyNiceFilmWith_XSN-2_F-190_DE-fr_US-R_MOS_4K_DI_20140704_PP_SMPTE_OV");
+ BOOST_CHECK_EQUAL (film->isdcf_name(false), "MyNiceFilmWith_XSN-2_F-190_DE-fr_US-R_MOS_4K_DI_20140704_PPF_SMPTE_OV");
content->video->set_custom_ratio (1.33);
/* Test 3D */
film->set_three_d (true);
- BOOST_CHECK_EQUAL (film->isdcf_name(false), "MyNiceFilmWith_XSN-2-3D_F-133_DE-fr_US-R_MOS_4K_DI_20140704_PP_SMPTE-3D_OV");
+ BOOST_CHECK_EQUAL (film->isdcf_name(false), "MyNiceFilmWith_XSN-2-3D_F-133_DE-fr_US-R_MOS_4K_DI_20140704_PPF_SMPTE-3D_OV");
/* Test content type modifiers */
film->set_three_d (false);
- m.temp_version = true;
- m.pre_release = true;
- m.red_band = true;
- m.chain = "MyChain";
- m.two_d_version_of_three_d = true;
- m.mastered_luminance = "4fl";
- film->set_isdcf_metadata (m);
+ film->set_temp_version (true);
+ film->set_pre_release (true);
+ film->set_red_band (true);
+ film->set_two_d_version_of_three_d (true);
+ film->set_chain (string("MyChain"));
+ film->set_luminance (dcp::Luminance(4.5, dcp::Luminance::Unit::FOOT_LAMBERT));
film->set_video_frame_rate (48);
- BOOST_CHECK_EQUAL (film->isdcf_name(false), "MyNiceFilmWith_XSN-2-Temp-Pre-RedBand-MyChain-2D-4fl-48_F-133_DE-fr_US-R_MOS_4K_DI_20140704_PP_SMPTE_OV");
+ BOOST_CHECK_EQUAL (film->isdcf_name(false), "MyNiceFilmWith_XSN-2-Temp-Pre-RedBand-MyChain-2D-4fl-48_F-133_DE-fr_US-R_MOS_4K_DI_20140704_PPF_SMPTE_OV");
/* Test a name which is already in camelCase */
film->set_three_d (false);
- m.temp_version = false;
- m.pre_release = false;
- m.red_band = false;
- m.chain = "";
- m.two_d_version_of_three_d = false;
- m.mastered_luminance = "";
- film->set_isdcf_metadata (m);
+ film->set_temp_version (false);
+ film->set_pre_release (false);
+ film->set_red_band (false);
+ film->set_two_d_version_of_three_d (false);
+ film->set_chain (string(""));
+ film->set_luminance (boost::none);
film->set_video_frame_rate (24);
film->set_name ("IKnowCamels");
- BOOST_CHECK_EQUAL (film->isdcf_name(false), "IKnowCamels_XSN-2_F-133_DE-fr_US-R_MOS_4K_DI_20140704_PP_SMPTE_OV");
+ BOOST_CHECK_EQUAL (film->isdcf_name(false), "IKnowCamels_XSN-2_F-133_DE-fr_US-R_MOS_4K_DI_20140704_PPF_SMPTE_OV");
/* And one in capitals */
film->set_name ("LIKE SHOUTING");
- BOOST_CHECK_EQUAL (film->isdcf_name(false), "LikeShouting_XSN-2_F-133_DE-fr_US-R_MOS_4K_DI_20140704_PP_SMPTE_OV");
+ BOOST_CHECK_EQUAL (film->isdcf_name(false), "LikeShouting_XSN-2_F-133_DE-fr_US-R_MOS_4K_DI_20140704_PPF_SMPTE_OV");
/* Test audio channel markup */
auto sound = make_shared<FFmpegContent>("test/data/sine_440.wav");
film->examine_and_add_content (sound);
BOOST_REQUIRE (!wait_for_jobs());
- BOOST_CHECK_EQUAL (film->isdcf_name(false), "LikeShouting_XSN-2_F-133_DE-fr_US-R_10_4K_DI_20140704_PP_SMPTE_OV");
+ BOOST_CHECK_EQUAL (film->isdcf_name(false), "LikeShouting_XSN-2_F-133_DE-fr_US-R_10_4K_DI_20140704_PPF_SMPTE_OV");
AudioMapping mapping = sound->audio->mapping ();
mapping.set (0, dcp::Channel::LEFT, 1.0);
sound->audio->set_mapping (mapping);
- BOOST_CHECK_EQUAL (film->isdcf_name(false), "LikeShouting_XSN-2_F-133_DE-fr_US-R_20_4K_DI_20140704_PP_SMPTE_OV");
+ BOOST_CHECK_EQUAL (film->isdcf_name(false), "LikeShouting_XSN-2_F-133_DE-fr_US-R_20_4K_DI_20140704_PPF_SMPTE_OV");
mapping.set (0, dcp::Channel::RIGHT, 1.0);
sound->audio->set_mapping (mapping);
- BOOST_CHECK_EQUAL (film->isdcf_name(false), "LikeShouting_XSN-2_F-133_DE-fr_US-R_30_4K_DI_20140704_PP_SMPTE_OV");
+ BOOST_CHECK_EQUAL (film->isdcf_name(false), "LikeShouting_XSN-2_F-133_DE-fr_US-R_30_4K_DI_20140704_PPF_SMPTE_OV");
mapping.set (0, dcp::Channel::LFE, 1.0);
sound->audio->set_mapping (mapping);
- BOOST_CHECK_EQUAL (film->isdcf_name(false), "LikeShouting_XSN-2_F-133_DE-fr_US-R_31_4K_DI_20140704_PP_SMPTE_OV");
+ BOOST_CHECK_EQUAL (film->isdcf_name(false), "LikeShouting_XSN-2_F-133_DE-fr_US-R_31_4K_DI_20140704_PPF_SMPTE_OV");
mapping.set (0, dcp::Channel::LS, 1.0);
sound->audio->set_mapping (mapping);
- BOOST_CHECK_EQUAL (film->isdcf_name(false), "LikeShouting_XSN-2_F-133_DE-fr_US-R_41_4K_DI_20140704_PP_SMPTE_OV");
+ BOOST_CHECK_EQUAL (film->isdcf_name(false), "LikeShouting_XSN-2_F-133_DE-fr_US-R_41_4K_DI_20140704_PPF_SMPTE_OV");
mapping.set (0, dcp::Channel::RS, 1.0);
sound->audio->set_mapping (mapping);
- BOOST_CHECK_EQUAL (film->isdcf_name(false), "LikeShouting_XSN-2_F-133_DE-fr_US-R_51_4K_DI_20140704_PP_SMPTE_OV");
+ BOOST_CHECK_EQUAL (film->isdcf_name(false), "LikeShouting_XSN-2_F-133_DE-fr_US-R_51_4K_DI_20140704_PPF_SMPTE_OV");
mapping.set (0, dcp::Channel::HI, 1.0);
sound->audio->set_mapping (mapping);
- BOOST_CHECK_EQUAL (film->isdcf_name(false), "LikeShouting_XSN-2_F-133_DE-fr_US-R_51_4K_DI_20140704_PP_SMPTE_OV");
+ BOOST_CHECK_EQUAL (film->isdcf_name(false), "LikeShouting_XSN-2_F-133_DE-fr_US-R_51_4K_DI_20140704_PPF_SMPTE_OV");
film->set_audio_channels (8);
mapping.set (0, dcp::Channel::HI, 1.0);
sound->audio->set_mapping (mapping);
- BOOST_CHECK_EQUAL (film->isdcf_name(false), "LikeShouting_XSN-2_F-133_DE-fr_US-R_51-HI_4K_DI_20140704_PP_SMPTE_OV");
+ BOOST_CHECK_EQUAL (film->isdcf_name(false), "LikeShouting_XSN-2_F-133_DE-fr_US-R_51-HI_4K_DI_20140704_PPF_SMPTE_OV");
mapping.set (0, dcp::Channel::VI, 1.0);
sound->audio->set_mapping (mapping);
- BOOST_CHECK_EQUAL (film->isdcf_name(false), "LikeShouting_XSN-2_F-133_DE-fr_US-R_51-HI-VI_4K_DI_20140704_PP_SMPTE_OV");
+ BOOST_CHECK_EQUAL (film->isdcf_name(false), "LikeShouting_XSN-2_F-133_DE-fr_US-R_51-HI-VI_4K_DI_20140704_PPF_SMPTE_OV");
film->set_audio_channels(10);
mapping.set (0, dcp::Channel::HI, 0.0);
mapping.set (0, dcp::Channel::VI, 0.0);
sound->audio->set_mapping (mapping);
- BOOST_CHECK_EQUAL (film->isdcf_name(false), "LikeShouting_XSN-2_F-133_DE-fr_US-R_51_4K_DI_20140704_PP_SMPTE_OV");
+ BOOST_CHECK_EQUAL (film->isdcf_name(false), "LikeShouting_XSN-2_F-133_DE-fr_US-R_51_4K_DI_20140704_PPF_SMPTE_OV");
mapping.set (0, dcp::Channel::HI, 1.0);
sound->audio->set_mapping (mapping);
- BOOST_CHECK_EQUAL (film->isdcf_name(false), "LikeShouting_XSN-2_F-133_DE-fr_US-R_51-HI_4K_DI_20140704_PP_SMPTE_OV");
+ BOOST_CHECK_EQUAL (film->isdcf_name(false), "LikeShouting_XSN-2_F-133_DE-fr_US-R_51-HI_4K_DI_20140704_PPF_SMPTE_OV");
mapping.set (0, dcp::Channel::VI, 1.0);
sound->audio->set_mapping (mapping);
- BOOST_CHECK_EQUAL (film->isdcf_name(false), "LikeShouting_XSN-2_F-133_DE-fr_US-R_51-HI-VI_4K_DI_20140704_PP_SMPTE_OV");
+ BOOST_CHECK_EQUAL (film->isdcf_name(false), "LikeShouting_XSN-2_F-133_DE-fr_US-R_51-HI-VI_4K_DI_20140704_PPF_SMPTE_OV");
film->set_audio_channels(12);
mapping.set (0, dcp::Channel::BSL, 1.0);
mapping.set (0, dcp::Channel::HI, 0.0);
mapping.set (0, dcp::Channel::VI, 0.0);
sound->audio->set_mapping (mapping);
- BOOST_CHECK_EQUAL (film->isdcf_name(false), "LikeShouting_XSN-2_F-133_DE-fr_US-R_71_4K_DI_20140704_PP_SMPTE_OV");
+ BOOST_CHECK_EQUAL (film->isdcf_name(false), "LikeShouting_XSN-2_F-133_DE-fr_US-R_71_4K_DI_20140704_PPF_SMPTE_OV");
mapping.set (0, dcp::Channel::HI, 1.0);
sound->audio->set_mapping (mapping);
- BOOST_CHECK_EQUAL (film->isdcf_name(false), "LikeShouting_XSN-2_F-133_DE-fr_US-R_71-HI_4K_DI_20140704_PP_SMPTE_OV");
+ BOOST_CHECK_EQUAL (film->isdcf_name(false), "LikeShouting_XSN-2_F-133_DE-fr_US-R_71-HI_4K_DI_20140704_PPF_SMPTE_OV");
mapping.set (0, dcp::Channel::VI, 1.0);
sound->audio->set_mapping (mapping);
- BOOST_CHECK_EQUAL (film->isdcf_name(false), "LikeShouting_XSN-2_F-133_DE-fr_US-R_71-HI-VI_4K_DI_20140704_PP_SMPTE_OV");
+ BOOST_CHECK_EQUAL (film->isdcf_name(false), "LikeShouting_XSN-2_F-133_DE-fr_US-R_71-HI-VI_4K_DI_20140704_PPF_SMPTE_OV");
}
Config::instance()->set_master_encoding_threads (boost::thread::hardware_concurrency());
Config::instance()->set_server_encoding_threads (1);
Config::instance()->set_server_port_base (61921);
- Config::instance()->set_default_isdcf_metadata (ISDCFMetadata ());
Config::instance()->set_default_container (Ratio::from_id ("185"));
Config::instance()->set_default_dcp_content_type (static_cast<DCPContentType*> (0));
Config::instance()->set_default_audio_delay (0);