X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fwx%2Fcontent_advanced_dialog.cc;h=752fa565af23fa65f98db2b4014a18f56870c7f7;hb=5ee919f413a6c1048aecf83676d42ab3fd94e06e;hp=79e6da9fad76957bd9ba7bbd870aeb8e4e86c958;hpb=76fa6543691330bcbf911ab77b2e1133fb70ada7;p=dcpomatic.git diff --git a/src/wx/content_advanced_dialog.cc b/src/wx/content_advanced_dialog.cc index 79e6da9fa..752fa565a 100644 --- a/src/wx/content_advanced_dialog.cc +++ b/src/wx/content_advanced_dialog.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2020 Carl Hetherington + Copyright (C) 2020-2021 Carl Hetherington This file is part of DCP-o-matic. @@ -19,24 +19,40 @@ */ +#include "check_box.h" #include "content_advanced_dialog.h" #include "dcpomatic_button.h" #include "filter_dialog.h" +#include "language_tag_widget.h" #include "static_text.h" +#include "wx_ptr.h" #include "wx_util.h" #include "lib/content.h" +#include "lib/dcp_content.h" #include "lib/filter.h" #include "lib/ffmpeg_content.h" +#include "lib/image_content.h" #include "lib/video_content.h" +#include +LIBDCP_DISABLE_WARNINGS #include -#include +#include +#include +#include +LIBDCP_ENABLE_WARNINGS +#include +using std::dynamic_pointer_cast; +using std::shared_ptr; using std::string; using std::vector; using boost::bind; -using boost::dynamic_pointer_cast; -using boost::shared_ptr; +using boost::optional; +#if BOOST_VERSION >= 106100 +using namespace boost::placeholders; +#endif +using dcp::locale_convert; @@ -44,12 +60,12 @@ ContentAdvancedDialog::ContentAdvancedDialog (wxWindow* parent, shared_ptrAdd (_filters, 1, wxALL | wxALIGN_CENTER_VERTICAL, DCPOMATIC_SIZER_GAP); filters->Add (_filters_button, 0, wxALL, DCPOMATIC_SIZER_GAP); - sizer->Add (filters, wxGBPosition(r, 1)); + sizer->Add (filters, wxGBPosition(r, 1), wxGBSpan(1, 2)); + ++r; + + wxStaticText* video_frame_rate_label; + if (_content->video) { + video_frame_rate_label = add_label_to_sizer (sizer, this, _("Override detected video frame rate"), true, wxGBPosition(r, 0)); + } else { + video_frame_rate_label = add_label_to_sizer (sizer, this, _("Video frame rate that content was prepared for"), true, wxGBPosition(r, 0)); + } + _video_frame_rate = new wxTextCtrl (this, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, 0, wxNumericPropertyValidator(wxNumericPropertyValidator::Float)); + sizer->Add (_video_frame_rate, wxGBPosition(r, 1)); + _set_video_frame_rate = new Button (this, _("Set")); + _set_video_frame_rate->Enable (false); + sizer->Add (_set_video_frame_rate, wxGBPosition(r, 2)); + ++r; + + /// TRANSLATORS: next to this control is a language selector, so together they will read, for example + /// "Video has burnt-in subtitles in the language fr-FR" + _burnt_subtitle = new CheckBox(this, _("Video has burnt-in subtitles in the language")); + sizer->Add (_burnt_subtitle, wxGBPosition(r, 0), wxDefaultSpan, wxALIGN_CENTER_VERTICAL); + _burnt_subtitle_language = new LanguageTagWidget (this, _("Language of burnt-in subtitles in this content"), content->video ? content->video->burnt_subtitle_language() : boost::none); + sizer->Add (_burnt_subtitle_language->sizer(), wxGBPosition(r, 1), wxGBSpan(1, 2), wxEXPAND); ++r; - wxCheckBox* ignore_video = new wxCheckBox (this, wxID_ANY, _("Ignore this content's video and use only audio, subtitles and closed captions")); - sizer->Add (ignore_video, wxGBPosition(r, 0), wxGBSpan(1, 2)); + _ignore_video = new CheckBox(this, _("Ignore this content's video and use only audio, subtitles and closed captions")); + sizer->Add(_ignore_video, wxGBPosition(r, 0), wxGBSpan(1, 3)); ++r; - wxSizer* overall = new wxBoxSizer (wxVERTICAL); + auto overall = new wxBoxSizer (wxVERTICAL); overall->Add (sizer, 1, wxALL, DCPOMATIC_DIALOG_BORDER); - wxSizer* buttons = CreateSeparatedButtonSizer (wxOK | wxCANCEL); + auto buttons = CreateSeparatedButtonSizer (wxOK | wxCANCEL); if (buttons) { overall->Add (buttons, wxSizerFlags().Expand().DoubleBorder()); } SetSizerAndFit (overall); - ignore_video->Enable (static_cast(_content->video)); - ignore_video->SetValue (_content->video ? !content->video->use() : false); + _ignore_video->Enable(static_cast(_content->video)); + _ignore_video->SetValue(_content->video ? !content->video->use() : false); + + auto fcs = dynamic_pointer_cast(content); + _filters_allowed = static_cast(fcs); + if (fcs) { + _filters_list = fcs->filters(); + } setup_filters (); - ignore_video->Bind (wxEVT_CHECKBOX, bind(&ContentAdvancedDialog::ignore_video_changed, this, _1)); + bool const single_frame_image_content = dynamic_pointer_cast(_content) && _content->number_of_paths() == 1; + video_frame_rate_label->Enable (!single_frame_image_content); + _video_frame_rate->Enable (!single_frame_image_content); + + auto vfr = _content->video_frame_rate (); + if (vfr) { + _video_frame_rate->SetValue (std_to_wx(locale_convert(*vfr))); + } + + _burnt_subtitle->SetValue (_content->video && static_cast(_content->video->burnt_subtitle_language())); + _burnt_subtitle_language->set (_content->video ? _content->video->burnt_subtitle_language() : boost::none); + _filters_button->Bind (wxEVT_BUTTON, bind(&ContentAdvancedDialog::edit_filters, this)); + _set_video_frame_rate->Bind (wxEVT_BUTTON, bind(&ContentAdvancedDialog::set_video_frame_rate, this)); + _video_frame_rate->Bind (wxEVT_TEXT, boost::bind(&ContentAdvancedDialog::video_frame_rate_changed, this)); + _burnt_subtitle->bind(&ContentAdvancedDialog::burnt_subtitle_changed, this); + + setup_sensitivity (); } -void -ContentAdvancedDialog::ignore_video_changed (wxCommandEvent& ev) +bool +ContentAdvancedDialog::ignore_video() const { - if (_content->video) { - _content->video->set_use (!ev.IsChecked()); - } + return _ignore_video->GetValue(); } void ContentAdvancedDialog::setup_filters () { - shared_ptr fcs = dynamic_pointer_cast(_content); - if (!fcs) { + if (!_filters_allowed) { checked_set (_filters, _("None")); _filters->Enable (false); _filters_button->Enable (false); return; } - string p = Filter::ffmpeg_string (fcs->filters()); + auto p = Filter::ffmpeg_string(_filters_list); if (p.empty()) { checked_set (_filters, _("None")); } else { @@ -121,27 +177,75 @@ ContentAdvancedDialog::setup_filters () void ContentAdvancedDialog::edit_filters () { - shared_ptr fcs = dynamic_pointer_cast(_content); - if (!fcs) { + if (!_filters_allowed) { return; } - FilterDialog* d = new FilterDialog (this, fcs->filters()); - d->ActiveChanged.connect (bind(&ContentAdvancedDialog::filters_changed, this, _1)); - d->ShowModal (); - d->Destroy (); + auto dialog = make_wx(this, _filters_list); + dialog->ActiveChanged.connect(bind(&ContentAdvancedDialog::filters_changed, this, _1)); + dialog->ShowModal(); } void ContentAdvancedDialog::filters_changed (vector filters) { - shared_ptr fcs = dynamic_pointer_cast(_content); - if (!fcs) { - return; + _filters_list = filters; + setup_filters (); +} + + +optional +ContentAdvancedDialog::video_frame_rate() const +{ + if (_video_frame_rate->GetValue() == wxT("")) { + return {}; } - fcs->set_filters (filters); - setup_filters (); + return locale_convert(wx_to_std(_video_frame_rate->GetValue())); +} + + +void +ContentAdvancedDialog::set_video_frame_rate () +{ + _set_video_frame_rate->Enable (false); +} + + +void +ContentAdvancedDialog::video_frame_rate_changed () +{ + bool enable = true; + /* If the user clicks "set" now, with no frame rate entered, it would unset the video + frame rate in the selected content. This can't be allowed for some content types. + */ + if (_video_frame_rate->GetValue() == wxT("") && (dynamic_pointer_cast(_content) || dynamic_pointer_cast(_content))) { + enable = false; + } + + _set_video_frame_rate->Enable (enable); +} + + +void +ContentAdvancedDialog::setup_sensitivity () +{ + _burnt_subtitle->Enable (static_cast(_content->video)); + _burnt_subtitle_language->enable (_content->video && _burnt_subtitle->GetValue()); +} + + +void +ContentAdvancedDialog::burnt_subtitle_changed () +{ + setup_sensitivity (); +} + + +optional +ContentAdvancedDialog::burnt_subtitle_language() const +{ + return _burnt_subtitle_language->get(); }