X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fwx%2Fsmpte_metadata_dialog.cc;h=772250701ebe062706223c35cb6dd0619ac97661;hb=28111007e2e6fd62f5810be780706ae1618bd33f;hp=6c130836fee26170002cd940ef709b63c591236a;hpb=d97029163865e212dc3d7b3c57c16459933a11f6;p=dcpomatic.git diff --git a/src/wx/smpte_metadata_dialog.cc b/src/wx/smpte_metadata_dialog.cc index 6c130836f..772250701 100644 --- a/src/wx/smpte_metadata_dialog.cc +++ b/src/wx/smpte_metadata_dialog.cc @@ -21,6 +21,7 @@ #include "content_version_dialog.h" #include "editable_list.h" #include "language_tag_dialog.h" +#include "language_tag_widget.h" #include "smpte_metadata_dialog.h" #include "rating_dialog.h" #include "lib/film.h" @@ -31,8 +32,18 @@ using std::string; using std::vector; using boost::optional; -using boost::shared_ptr; -using boost::weak_ptr; +using std::shared_ptr; +using std::weak_ptr; +#if BOOST_VERSION >= 106100 +using namespace boost::placeholders; +#endif + + +static string +additional_subtitle_language_column (dcp::LanguageTag r, int) +{ + return r.to_string(); +} static string @@ -55,7 +66,7 @@ content_versions_column (string v, int) SMPTEMetadataDialog::SMPTEMetadataDialog (wxWindow* parent, weak_ptr weak_film) : wxDialog (parent, wxID_ANY, _("Metadata")) - , _film (weak_film) + , WeakFilm (weak_film) { wxBoxSizer* overall_sizer = new wxBoxSizer (wxVERTICAL); SetSizer (overall_sizer); @@ -63,21 +74,56 @@ SMPTEMetadataDialog::SMPTEMetadataDialog (wxWindow* parent, weak_ptr weak_ wxFlexGridSizer* sizer = new wxFlexGridSizer (2, DCPOMATIC_SIZER_X_GAP, DCPOMATIC_SIZER_Y_GAP); sizer->AddGrowableCol (1, 1); - wxButton* edit_name_language = 0; - Button* edit_release_territory = 0; + add_label_to_sizer (sizer, this, _("Title language"), true, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL); + _name_language = new LanguageTagWidget( + this, + wxString::Format(_("The language that the film's title (\"%s\") is in"), std_to_wx(film()->name())), + film()->name_language() + ); + sizer->Add (_name_language->sizer(), 0, wxEXPAND); + + add_label_to_sizer (sizer, this, _("Audio language"), true, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL); + _audio_language = new LanguageTagWidget( + this, + _("The main language that is spoken in the film's soundtrack"), + film()->audio_language() + ); + sizer->Add (_audio_language->sizer(), 0, wxEXPAND); + + _enable_main_subtitle_language = new wxCheckBox (this, wxID_ANY, _("Main subtitle language")); + sizer->Add (_enable_main_subtitle_language, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, DCPOMATIC_SIZER_GAP); + vector subtitle_languages = film()->subtitle_languages(); + _main_subtitle_language = new LanguageTagWidget( + this, + _("The main language that is displayed in the film's subtitles"), + subtitle_languages.empty() ? dcp::LanguageTag("en-US") : subtitle_languages.front() + ); + sizer->Add (_main_subtitle_language->sizer(), 0, wxEXPAND); - add_label_to_sizer(sizer, this, _("Title language"), true); { - wxSizer* s = new wxBoxSizer (wxHORIZONTAL); - _name_language = new wxStaticText (this, wxID_ANY, wxT("")); - _name_language->SetToolTip (wxString::Format(_("The language that the film's title (\"%s\") is in"), std_to_wx(film()->name()))); - s->Add (_name_language, 1, wxLEFT | wxALIGN_CENTER_VERTICAL, DCPOMATIC_SIZER_X_GAP); - edit_name_language = new Button (this, _("Edit...")); - s->Add (edit_name_language, 0, wxLEFT, DCPOMATIC_SIZER_GAP); - sizer->Add (s, 0, wxEXPAND); + int flags = wxALIGN_TOP | wxLEFT | wxRIGHT | wxTOP; +#ifdef __WXOSX__ + flags |= wxALIGN_RIGHT; +#endif + wxStaticText* m = create_label (this, _("Additional subtitle languages"), true); + sizer->Add (m, 0, flags, DCPOMATIC_SIZER_GAP); } - add_label_to_sizer (sizer, this, _("Release territory"), true); + vector columns; + columns.push_back (EditableListColumn("Language", 250, true)); + _additional_subtitle_languages = new EditableList ( + this, + columns, + boost::bind(&SMPTEMetadataDialog::additional_subtitle_languages, this), + boost::bind(&SMPTEMetadataDialog::set_additional_subtitle_languages, this, _1), + boost::bind(&additional_subtitle_language_column, _1, _2), + true, + false + ); + sizer->Add (_additional_subtitle_languages, 1, wxEXPAND); + + Button* edit_release_territory = 0; + add_label_to_sizer (sizer, this, _("Release territory"), true, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL); { wxSizer* s = new wxBoxSizer (wxHORIZONTAL); _release_territory = new wxStaticText (this, wxID_ANY, wxT("")); @@ -87,27 +133,27 @@ SMPTEMetadataDialog::SMPTEMetadataDialog (wxWindow* parent, weak_ptr weak_ sizer->Add (s, 0, wxEXPAND); } - add_label_to_sizer (sizer, this, _("Version number"), true); + add_label_to_sizer (sizer, this, _("Version number"), true, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL); _version_number = new wxSpinCtrl (this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 1, 1000); sizer->Add (_version_number, 0); - add_label_to_sizer (sizer, this, _("Status"), true); + add_label_to_sizer (sizer, this, _("Status"), true, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL); _status = new wxChoice (this, wxID_ANY); sizer->Add (_status, 0); - add_label_to_sizer (sizer, this, _("Chain"), true); + add_label_to_sizer (sizer, this, _("Chain"), true, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL); _chain = new wxTextCtrl (this, wxID_ANY); sizer->Add (_chain, 1, wxEXPAND); - add_label_to_sizer (sizer, this, _("Distributor"), true); + add_label_to_sizer (sizer, this, _("Distributor"), true, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL); _distributor = new wxTextCtrl (this, wxID_ANY); sizer->Add (_distributor, 1, wxEXPAND); - add_label_to_sizer (sizer, this, _("Facility"), true); + add_label_to_sizer (sizer, this, _("Facility"), true, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL); _facility = new wxTextCtrl (this, wxID_ANY); sizer->Add (_facility, 1, wxEXPAND); - add_label_to_sizer (sizer, this, _("Luminance"), true); + add_label_to_sizer (sizer, this, _("Luminance"), true, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL); { wxSizer* s = new wxBoxSizer (wxHORIZONTAL); _luminance_value = new wxSpinCtrlDouble (this, wxID_ANY); @@ -128,7 +174,7 @@ SMPTEMetadataDialog::SMPTEMetadataDialog (wxWindow* parent, weak_ptr weak_ sizer->Add (m, 0, flags, DCPOMATIC_SIZER_GAP); } - vector columns; + columns.clear (); columns.push_back (EditableListColumn("Agency", 200, true)); columns.push_back (EditableListColumn("Label", 50, true)); _ratings = new EditableList ( @@ -181,7 +227,10 @@ SMPTEMetadataDialog::SMPTEMetadataDialog (wxWindow* parent, weak_ptr weak_ _luminance_unit->Append (_("candela per m²")); _luminance_unit->Append (_("foot lambert")); - edit_name_language->Bind (wxEVT_BUTTON, boost::bind(&SMPTEMetadataDialog::edit_name_language, this)); + _name_language->Changed.connect (boost::bind(&SMPTEMetadataDialog::name_language_changed, this, _1)); + _audio_language->Changed.connect (boost::bind(&SMPTEMetadataDialog::audio_language_changed, this, _1)); + _enable_main_subtitle_language->Bind (wxEVT_CHECKBOX, boost::bind(&SMPTEMetadataDialog::enable_main_subtitle_changed, this)); + _main_subtitle_language->Changed.connect (boost::bind(&SMPTEMetadataDialog::main_subtitle_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)); @@ -204,6 +253,9 @@ SMPTEMetadataDialog::SMPTEMetadataDialog (wxWindow* parent, weak_ptr weak_ film_changed (CHANGE_TYPE_DONE, Film::FACILITY); film_changed (CHANGE_TYPE_DONE, Film::CONTENT_VERSIONS); film_changed (CHANGE_TYPE_DONE, Film::LUMINANCE); + film_changed (CHANGE_TYPE_DONE, Film::SUBTITLE_LANGUAGES); + + setup_sensitivity (); } @@ -215,20 +267,20 @@ SMPTEMetadataDialog::film_changed (ChangeType type, Film::Property property) } if (property == Film::NAME_LANGUAGE) { - checked_set (_name_language, std_to_wx(film()->name_language().to_string())); + _name_language->set (film()->name_language()); } else if (property == Film::RELEASE_TERRITORY) { - checked_set (_release_territory, std_to_wx(*dcp::LanguageTag::get_subtag_description(dcp::LanguageTag::REGION, film()->release_territory().subtag()))); + checked_set (_release_territory, std_to_wx(*dcp::LanguageTag::get_subtag_description(dcp::LanguageTag::SubtagType::REGION, film()->release_territory().subtag()))); } else if (property == Film::VERSION_NUMBER) { checked_set (_version_number, film()->version_number()); } else if (property == Film::STATUS) { switch (film()->status()) { - case dcp::TEMP: + case dcp::Status::TEMP: checked_set (_status, 0); break; - case dcp::PRE: + case dcp::Status::PRE: checked_set (_status, 1); break; - case dcp::FINAL: + case dcp::Status::FINAL: checked_set (_status, 2); break; } @@ -241,13 +293,21 @@ SMPTEMetadataDialog::film_changed (ChangeType type, Film::Property property) } else if (property == Film::LUMINANCE) { checked_set (_luminance_value, film()->luminance().value()); switch (film()->luminance().unit()) { - case dcp::Luminance::CANDELA_PER_SQUARE_METRE: + case dcp::Luminance::Unit::CANDELA_PER_SQUARE_METRE: checked_set (_luminance_unit, 0); break; - case dcp::Luminance::FOOT_LAMBERT: + case dcp::Luminance::Unit::FOOT_LAMBERT: checked_set (_luminance_unit, 1); break; } + } else if (property == Film::SUBTITLE_LANGUAGES) { + vector languages = film()->subtitle_languages(); + checked_set (_enable_main_subtitle_language, !languages.empty()); + if (!languages.empty()) { + _main_subtitle_language->set (languages.front()); + } else { + _main_subtitle_language->set (dcp::LanguageTag("en-US")); + } } } @@ -281,12 +341,16 @@ SMPTEMetadataDialog::set_content_versions (vector cv) void -SMPTEMetadataDialog::edit_name_language () +SMPTEMetadataDialog::name_language_changed (dcp::LanguageTag tag) { - LanguageTagDialog* d = new LanguageTagDialog(this, film()->name_language()); - d->ShowModal (); - film()->set_name_language (d->get()); - d->Destroy (); + film()->set_name_language (tag); +} + + +void +SMPTEMetadataDialog::audio_language_changed (dcp::LanguageTag tag) +{ + film()->set_audio_language (tag); } @@ -303,15 +367,6 @@ SMPTEMetadataDialog::edit_release_territory () } -shared_ptr -SMPTEMetadataDialog::film () const -{ - shared_ptr film = _film.lock (); - DCPOMATIC_ASSERT (film); - return film; -} - - void SMPTEMetadataDialog::version_number_changed () { @@ -324,13 +379,13 @@ SMPTEMetadataDialog::status_changed () { switch (_status->GetSelection()) { case 0: - film()->set_status (dcp::TEMP); + film()->set_status(dcp::Status::TEMP); break; case 1: - film()->set_status (dcp::PRE); + film()->set_status(dcp::Status::PRE); break; case 2: - film()->set_status (dcp::FINAL); + film()->set_status(dcp::Status::FINAL); break; } } @@ -363,12 +418,76 @@ SMPTEMetadataDialog::luminance_changed () dcp::Luminance::Unit unit; switch (_luminance_unit->GetSelection()) { case 0: - unit = dcp::Luminance::CANDELA_PER_SQUARE_METRE; + unit = dcp::Luminance::Unit::CANDELA_PER_SQUARE_METRE; break; case 1: - unit = dcp::Luminance::FOOT_LAMBERT; + unit = dcp::Luminance::Unit::FOOT_LAMBERT; break; + default: + DCPOMATIC_ASSERT (false); } film()->set_luminance (dcp::Luminance(_luminance_value->GetValue(), unit)); } + + +void +SMPTEMetadataDialog::enable_main_subtitle_changed () +{ + setup_sensitivity (); + bool enabled = _enable_main_subtitle_language->GetValue (); + if (enabled) { + film()->set_subtitle_language (_main_subtitle_language->get()); + } else { + set_additional_subtitle_languages (vector()); + _additional_subtitle_languages->refresh (); + film()->unset_subtitle_language (); + } +} + + +void +SMPTEMetadataDialog::setup_sensitivity () +{ + bool const enabled = _enable_main_subtitle_language->GetValue (); + _main_subtitle_language->enable (enabled); + _additional_subtitle_languages->Enable (enabled); +} + + +void +SMPTEMetadataDialog::main_subtitle_language_changed (dcp::LanguageTag tag) +{ + vector existing = film()->subtitle_languages(); + if (existing.empty()) { + existing.push_back (tag); + } else { + existing[0] = tag; + } + + film()->set_subtitle_languages (existing); +} + + +vector +SMPTEMetadataDialog::additional_subtitle_languages () +{ + vector all = film()->subtitle_languages(); + if (all.empty()) { + return all; + } + + return vector(all.begin() + 1, all.end()); +} + + +void +SMPTEMetadataDialog::set_additional_subtitle_languages (vector languages) +{ + vector all = film()->subtitle_languages(); + DCPOMATIC_ASSERT (!all.empty()); + all.resize (1); + copy (languages.begin(), languages.end(), back_inserter(all)); + film()->set_subtitle_languages (all); +} +