X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fwx%2Fvideo_panel.cc;h=992ddf115b80455e063fe5674952b3f3bcaa73e4;hb=0ab8cf5b312f36a14f66d4564c6f4b1694ddaae0;hp=7594d98a5d36b4494f45a2afc5465242c696c1b1;hpb=92784c9c28c48859578cd6e75aa01d5657d0c341;p=dcpomatic.git diff --git a/src/wx/video_panel.cc b/src/wx/video_panel.cc index 7594d98a5..992ddf115 100644 --- a/src/wx/video_panel.cc +++ b/src/wx/video_panel.cc @@ -38,6 +38,8 @@ #include "lib/video_content.h" #include #include +#include +#include #include #include @@ -86,6 +88,8 @@ VideoPanel::VideoPanel (ContentPanel* p) font.SetPointSize(font.GetPointSize() - 1); _reference_note->SetFont(font); + _use = new wxCheckBox (this, wxID_ANY, _("Use")); + _type_label = create_label (this, _("Type"), true); _frame_type = new ContentChoice ( this, @@ -206,6 +210,7 @@ VideoPanel::VideoPanel (ContentPanel* p) _fade_in->Changed.connect (boost::bind (&VideoPanel::fade_in_changed, this)); _fade_out->Changed.connect (boost::bind (&VideoPanel::fade_out_changed, this)); + _use->Bind (wxEVT_CHECKBOX, boost::bind (&VideoPanel::use_clicked, this)); _reference->Bind (wxEVT_CHECKBOX, boost::bind (&VideoPanel::reference_clicked, this)); _filters_button->Bind (wxEVT_BUTTON, boost::bind (&VideoPanel::edit_filters_clicked, this)); _colour_conversion->Bind (wxEVT_CHOICE, boost::bind (&VideoPanel::colour_conversion_changed, this)); @@ -223,7 +228,7 @@ VideoPanel::add_to_grid () int r = 0; _reference->Show (full); - _reference_note->Show (full); + _reference_note->Show (full && !_reference_note->GetLabel().IsEmpty()); if (full) { wxBoxSizer* reference_sizer = new wxBoxSizer (wxVERTICAL); @@ -233,6 +238,10 @@ VideoPanel::add_to_grid () ++r; } + _use->Show (full); + _grid->Add (_use, wxGBPosition(r, 0), wxGBSpan(1, 2)); + ++r; + add_label_to_sizer (_grid, _type_label, true, wxGBPosition(r, 0)); _frame_type->add (_grid, wxGBPosition(r, 1), wxGBSpan(1, 2)); ++r; @@ -342,6 +351,17 @@ VideoPanel::film_changed (Film::Property property) } } +std::size_t +hash_value (boost::optional const & c) +{ + boost::hash hasher; + if (!c) { + return hasher ("none"); + } + return hasher (c->identifier()); +} + + void VideoPanel::film_content_changed (int property) { @@ -359,16 +379,36 @@ VideoPanel::film_content_changed (int property) property == VideoContentProperty::SCALE) { setup_description (); } else if (property == VideoContentProperty::COLOUR_CONVERSION) { - if (vcs && vcs->video->colour_conversion ()) { - optional preset = vcs->video->colour_conversion().get().preset (); - vector cc = PresetColourConversion::all (); - if (preset) { - checked_set (_colour_conversion, preset.get() + 1); + boost::unordered_set > check; + BOOST_FOREACH (shared_ptr i, vc) { + check.insert (i->video->colour_conversion()); + } + + /* Remove any "Many" entry that we might have added previously. There should + * be entries for each preset plus one for "None" and one for "Custom". + */ + vector cc = PresetColourConversion::all (); + if (_colour_conversion->GetCount() > cc.size() + 2) { + _colour_conversion->Delete (_colour_conversion->GetCount() - 1); + } + + if (check.size() == 1) { + if (vcs && vcs->video->colour_conversion ()) { + optional preset = vcs->video->colour_conversion().get().preset (); + if (preset) { + checked_set (_colour_conversion, preset.get() + 1); + } else { + checked_set (_colour_conversion, cc.size() + 1); + } } else { - checked_set (_colour_conversion, cc.size() + 1); + checked_set (_colour_conversion, 0); } - } else { - checked_set (_colour_conversion, 0); + } else if (check.size() > 1) { + /* Add a "many" entry and select it as an indication that multiple different + * colour conversions are present in the selection. + */ + _colour_conversion->Append (_("Many")); + checked_set (_colour_conversion, _colour_conversion->GetCount() - 1); } setup_sensitivity (); @@ -385,6 +425,19 @@ VideoPanel::film_content_changed (int property) checked_set (_filters, p); } } + } else if (property == VideoContentProperty::USE) { + set check; + BOOST_FOREACH (shared_ptr i, vc) { + check.insert (i->video->use()); + } + + if (check.size() == 1) { + checked_set (_use, vc.front()->video->use()); + } else { + checked_set (_use, false); + } + + setup_sensitivity (); } else if (property == VideoContentProperty::FADE_IN) { set check; BOOST_FOREACH (shared_ptr i, vc) { @@ -475,19 +528,20 @@ void VideoPanel::colour_conversion_changed () { ContentList vc = _parent->selected_video (); - if (vc.size() != 1) { - return; - } int const s = _colour_conversion->GetSelection (); vector all = PresetColourConversion::all (); - if (s == 0) { - vc.front()->video->unset_colour_conversion (); - } else if (s == int (all.size() + 1)) { + if (s == int(all.size() + 1)) { edit_colour_conversion_clicked (); } else { - vc.front()->video->set_colour_conversion (all[s - 1].conversion); + BOOST_FOREACH (shared_ptr i, _parent->selected_video()) { + if (s == 0) { + i->video->unset_colour_conversion (); + } else if (s != int(all.size() + 2)) { + i->video->set_colour_conversion (all[s - 1].conversion); + } + } } } @@ -495,14 +549,13 @@ void VideoPanel::edit_colour_conversion_clicked () { ContentList vc = _parent->selected_video (); - if (vc.size() != 1) { - return; - } ContentColourConversionDialog* d = new ContentColourConversionDialog (this, vc.front()->video->yuv ()); d->set (vc.front()->video->colour_conversion().get_value_or (PresetColourConversion::all().front().conversion)); if (d->ShowModal() == wxID_OK) { - vc.front()->video->set_colour_conversion (d->get ()); + BOOST_FOREACH (shared_ptr i, vc) { + i->video->set_colour_conversion (d->get ()); + } } else { /* Reset the colour conversion choice */ film_content_changed (VideoContentProperty::COLOUR_CONVERSION); @@ -528,6 +581,7 @@ VideoPanel::content_selection_changed () film_content_changed (VideoContentProperty::FADE_IN); film_content_changed (VideoContentProperty::FADE_OUT); film_content_changed (VideoContentProperty::RANGE); + film_content_changed (VideoContentProperty::USE); film_content_changed (FFmpegContentProperty::FILTERS); film_content_changed (DCPContentProperty::REFERENCE_VIDEO); @@ -546,9 +600,19 @@ VideoPanel::setup_sensitivity () string why_not; bool const can_reference = dcp && dcp->can_reference_video (_parent->film(), why_not); - setup_refer_button (_reference, _reference_note, dcp, can_reference, why_not); + wxString cannot; + if (why_not.empty()) { + cannot = _("Cannot reference this DCP's video."); + } else { + cannot = _("Cannot reference this DCP's video: ") + std_to_wx(why_not); + } + setup_refer_button (_reference, _reference_note, dcp, can_reference, cannot); + + bool const enable = !_reference->GetValue() && _use->GetValue(); + + _use->Enable (!_reference->GetValue()); - if (_reference->GetValue ()) { + if (!enable) { _frame_type->wrapped()->Enable (false); _left_crop->wrapped()->Enable (false); _right_crop->wrapped()->Enable (false); @@ -578,7 +642,7 @@ VideoPanel::setup_sensitivity () _description->Enable (true); _filters->Enable (true); _filters_button->Enable (single && !ffmpeg_sel.empty ()); - _colour_conversion->Enable (single && !video_sel.empty ()); + _colour_conversion->Enable (!video_sel.empty()); _range->Enable (single && !video_sel.empty()); } @@ -599,8 +663,8 @@ void VideoPanel::fade_in_changed () { BOOST_FOREACH (shared_ptr i, _parent->selected_video ()) { - int const vfr = _parent->film()->video_frame_rate (); - i->video->set_fade_in (_fade_in->get (vfr).frames_round (vfr)); + double const vfr = i->active_video_frame_rate (_parent->film()); + i->video->set_fade_in (_fade_in->get(vfr).frames_round(vfr)); } } @@ -608,8 +672,16 @@ void VideoPanel::fade_out_changed () { BOOST_FOREACH (shared_ptr i, _parent->selected_video ()) { - int const vfr = _parent->film()->video_frame_rate (); - i->video->set_fade_out (_fade_out->get (vfr).frames_round (vfr)); + double const vfr = i->active_video_frame_rate (_parent->film()); + i->video->set_fade_out (_fade_out->get(vfr).frames_round(vfr)); + } +} + +void +VideoPanel::use_clicked () +{ + BOOST_FOREACH (shared_ptr i, _parent->selected_video()) { + i->video->set_use (_use->GetValue()); } }