X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fwx%2Fvideo_panel.cc;h=713ef9d2c25ad9ed3cc3ca237742e2d4a907688d;hb=3e20b106388c0ba4a291cb15968a10c6fbd5b367;hp=80aac66ea749c3fe01d6648c5e4ad4036a75529e;hpb=cf7af490abb124631a775f5031f43ed58c0c1e4a;p=dcpomatic.git diff --git a/src/wx/video_panel.cc b/src/wx/video_panel.cc index 80aac66ea..713ef9d2c 100644 --- a/src/wx/video_panel.cc +++ b/src/wx/video_panel.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2012-2016 Carl Hetherington + Copyright (C) 2012-2018 Carl Hetherington This file is part of DCP-o-matic. @@ -24,6 +24,9 @@ #include "content_colour_conversion_dialog.h" #include "content_widget.h" #include "content_panel.h" +#include "static_text.h" +#include "check_box.h" +#include "dcpomatic_button.h" #include "lib/filter.h" #include "lib/ffmpeg_content.h" #include "lib/colour_conversion.h" @@ -35,6 +38,8 @@ #include "lib/video_content.h" #include #include +#include +#include #include #include @@ -48,6 +53,9 @@ using boost::shared_ptr; using boost::dynamic_pointer_cast; using boost::bind; using boost::optional; +#if BOOST_VERSION >= 106100 +using namespace boost::placeholders; +#endif static VideoContentScale index_to_scale (int n) @@ -74,8 +82,8 @@ scale_to_index (VideoContentScale scale) VideoPanel::VideoPanel (ContentPanel* p) : ContentSubPanel (p, _("Video")) { - _reference = new wxCheckBox (this, wxID_ANY, _("Use this DCP's video as OV and make VF")); - _reference_note = new wxStaticText (this, wxID_ANY, _("")); + _reference = new CheckBox (this, _("Use this DCP's video as OV and make VF")); + _reference_note = new StaticText (this, wxT("")); _reference_note->Wrap (200); wxFont font = _reference_note->GetFont(); font.SetStyle(wxFONTSTYLE_ITALIC); @@ -157,8 +165,8 @@ VideoPanel::VideoPanel (ContentPanel* p) size.SetHeight (-1); _filters_label = create_label (this, _("Filters"), true); - _filters = new wxStaticText (this, wxID_ANY, _("None"), wxDefaultPosition, size); - _filters_button = new wxButton (this, wxID_ANY, _("Edit...")); + _filters = new StaticText (this, _("None"), wxDefaultPosition, size); + _filters_button = new Button (this, _("Edit...")); _colour_conversion_label = create_label (this, _("Colour conversion"), true); _colour_conversion = new wxChoice (this, wxID_ANY, wxDefaultPosition, size); @@ -169,15 +177,15 @@ VideoPanel::VideoPanel (ContentPanel* p) /// TRANSLATORS: translate the word "Custom" here; do not include the "Colour|" prefix _colour_conversion->Append (S_("Colour|Custom")); - _edit_colour_conversion_button = new wxButton (this, wxID_ANY, _("Edit...")); + _edit_colour_conversion_button = new Button (this, _("Edit...")); - _description = new wxStaticText (this, wxID_ANY, wxT ("\n \n \n \n \n"), wxDefaultPosition, wxDefaultSize); + _description = new StaticText (this, wxT ("\n \n \n \n \n"), wxDefaultPosition, wxDefaultSize); _description->SetFont(font); - _left_crop->wrapped()->SetRange (0, 1024); - _top_crop->wrapped()->SetRange (0, 1024); - _right_crop->wrapped()->SetRange (0, 1024); - _bottom_crop->wrapped()->SetRange (0, 1024); + _left_crop->wrapped()->SetRange (0, 4096); + _top_crop->wrapped()->SetRange (0, 4096); + _right_crop->wrapped()->SetRange (0, 4096); + _bottom_crop->wrapped()->SetRange (0, 4096); _scale->wrapped()->Clear (); BOOST_FOREACH (VideoContentScale const & i, VideoContentScale::all ()) { @@ -241,10 +249,6 @@ VideoPanel::add_to_grid () _grid->Add (crop, wxGBPosition (r, 0), wxGBSpan (2, 4)); r += 2; - _fade_in_label->Show (full); - _fade_in->Show (full); - _fade_out_label->Show (full); - _fade_out->Show (full); _scale_to_label->Show (full); _scale->show (full); _filters_label->Show (full); @@ -254,15 +258,15 @@ VideoPanel::add_to_grid () _colour_conversion->Show (full); _edit_colour_conversion_button->Show (full); - if (full) { - add_label_to_sizer (_grid, _fade_in_label, true, wxGBPosition (r, 0)); - _grid->Add (_fade_in, wxGBPosition (r, 1), wxGBSpan (1, 3)); - ++r; + add_label_to_sizer (_grid, _fade_in_label, true, wxGBPosition (r, 0)); + _grid->Add (_fade_in, wxGBPosition (r, 1), wxGBSpan (1, 3)); + ++r; - add_label_to_sizer (_grid, _fade_out_label, true, wxGBPosition (r, 0)); - _grid->Add (_fade_out, wxGBPosition (r, 1), wxGBSpan (1, 3)); - ++r; + add_label_to_sizer (_grid, _fade_out_label, true, wxGBPosition (r, 0)); + _grid->Add (_fade_out, wxGBPosition (r, 1), wxGBSpan (1, 3)); + ++r; + if (full) { add_label_to_sizer (_grid, _scale_to_label, true, wxGBPosition (r, 0)); _scale->add (_grid, wxGBPosition (r, 1), wxGBSpan (1, 2)); ++r; @@ -297,11 +301,9 @@ VideoPanel::film_changed (Film::Property property) switch (property) { case Film::VIDEO_FRAME_RATE: case Film::CONTAINER: - setup_description (); - setup_sensitivity (); - break; case Film::RESOLUTION: setup_description (); + setup_sensitivity (); break; case Film::REEL_TYPE: case Film::INTEROP: @@ -312,6 +314,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) { @@ -329,16 +342,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 (); @@ -363,8 +396,8 @@ VideoPanel::film_content_changed (int property) if (check.size() == 1) { _fade_in->set ( - ContentTime::from_frames (vc.front()->video->fade_in (), vc.front()->active_video_frame_rate ()), - vc.front()->active_video_frame_rate () + ContentTime::from_frames (vc.front()->video->fade_in(), vc.front()->active_video_frame_rate(_parent->film())), + vc.front()->active_video_frame_rate(_parent->film()) ); } else { _fade_in->clear (); @@ -377,8 +410,8 @@ VideoPanel::film_content_changed (int property) if (check.size() == 1) { _fade_out->set ( - ContentTime::from_frames (vc.front()->video->fade_out (), vc.front()->active_video_frame_rate ()), - vc.front()->active_video_frame_rate () + ContentTime::from_frames (vc.front()->video->fade_out(), vc.front()->active_video_frame_rate(_parent->film())), + vc.front()->active_video_frame_rate(_parent->film()) ); } else { _fade_out->clear (); @@ -422,7 +455,7 @@ VideoPanel::setup_description () return; } - string d = vc.front()->video->processing_description (); + string d = vc.front()->video->processing_description (_parent->film()); size_t lines = count (d.begin(), d.end(), '\n'); for (int i = lines; i < 6; ++i) { @@ -437,19 +470,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); + } + } } } @@ -457,14 +491,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); @@ -506,7 +539,7 @@ VideoPanel::setup_sensitivity () } string why_not; - bool const can_reference = dcp && dcp->can_reference_video (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); if (_reference->GetValue ()) { @@ -538,7 +571,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()); } ContentList vc = _parent->selected_video (); @@ -558,8 +591,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)); } } @@ -567,8 +600,8 @@ 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)); } }