Move video frame rate override into advanced prefs (#1852).
authorCarl Hetherington <cth@carlh.net>
Tue, 3 Nov 2020 23:17:53 +0000 (00:17 +0100)
committerCarl Hetherington <cth@carlh.net>
Tue, 3 Nov 2020 23:17:53 +0000 (00:17 +0100)
src/wx/content_advanced_dialog.cc
src/wx/content_advanced_dialog.h
src/wx/timing_panel.cc
src/wx/timing_panel.h

index 8ab2e8dc07e20353fb92b336d89b7b6d950f0498..9f2a45106805a4c3995418347825114a6a5d605e 100644 (file)
 #include "static_text.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 <wx/gbsizer.h>
 #include <boost/bind.hpp>
@@ -36,10 +38,12 @@ using std::string;
 using std::vector;
 using boost::bind;
 using boost::dynamic_pointer_cast;
+using boost::optional;
 using boost::shared_ptr;
 #if BOOST_VERSION >= 106100
 using namespace boost::placeholders;
 #endif
+using dcp::locale_convert;
 
 
 
@@ -64,11 +68,24 @@ ContentAdvancedDialog::ContentAdvancedDialog (wxWindow* parent, shared_ptr<Conte
        wxBoxSizer* filters = new wxBoxSizer (wxHORIZONTAL);
        filters->Add (_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);
+       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;
 
        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));
+       sizer->Add (ignore_video, wxGBPosition(r, 0), wxGBSpan(1, 3));
        ++r;
 
        wxSizer* overall = new wxBoxSizer (wxVERTICAL);
@@ -84,8 +101,19 @@ ContentAdvancedDialog::ContentAdvancedDialog (wxWindow* parent, shared_ptr<Conte
        ignore_video->SetValue (_content->video ? !content->video->use() : false);
        setup_filters ();
 
+       bool const single_frame_image_content = dynamic_pointer_cast<const ImageContent>(_content) && _content->number_of_paths() == 1;
+       video_frame_rate_label->Enable (!single_frame_image_content);
+       _video_frame_rate->Enable (!single_frame_image_content);
+
+       optional<double> vfr = _content->video_frame_rate ();
+       if (vfr) {
+               _video_frame_rate->SetValue (std_to_wx(locale_convert<string>(*vfr)));
+       }
+
        ignore_video->Bind (wxEVT_CHECKBOX, bind(&ContentAdvancedDialog::ignore_video_changed, this, _1));
        _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));
 }
 
 
@@ -148,3 +176,31 @@ ContentAdvancedDialog::filters_changed (vector<Filter const *> filters)
        setup_filters ();
 }
 
+
+void
+ContentAdvancedDialog::set_video_frame_rate ()
+{
+       if (_video_frame_rate->GetValue() != wxT("")) {
+               _content->set_video_frame_rate (locale_convert<double>(wx_to_std(_video_frame_rate->GetValue())));
+       } else {
+               _content->unset_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<DCPContent>(_content) || dynamic_pointer_cast<FFmpegContent>(_content))) {
+              enable = false;
+       }
+
+       _set_video_frame_rate->Enable (enable);
+}
+
index b8c12d7b2aa36615f14ac564f9d1311c391ddb5e..b01669bac1e44c0cb4d16b6158aa543152fa6e2b 100644 (file)
@@ -41,10 +41,14 @@ private:
        void edit_filters ();
        void filters_changed (std::vector<Filter const *> filters);
        void setup_filters ();
+       void set_video_frame_rate ();
+       void video_frame_rate_changed ();
 
        boost::shared_ptr<Content> _content;
 
        wxStaticText* _filters;
        wxButton* _filters_button;
+       wxTextCtrl* _video_frame_rate;
+       wxButton* _set_video_frame_rate;
 };
 
index 9bf4cacf70a5ceddd28fbb49907f47273c2891ed..c643d208044613a42d58d52a56fa587da4ba694a 100644 (file)
@@ -109,36 +109,6 @@ TimingPanel::TimingPanel (ContentPanel* p, weak_ptr<FilmViewer> viewer)
        _play_length_label = create_label (this, _("Play length"), true);
        _play_length = new Timecode<DCPTime> (this);
 
-       _video_frame_rate_label = create_label (this, _("Video frame rate"), true);
-       _video_frame_rate = new wxTextCtrl (this, wxID_ANY);
-       _set_video_frame_rate = new Button (this, _("Set"));
-       _set_video_frame_rate->Enable (false);
-
-       /* We can't use Wrap() here as it doesn't work with markup:
-        * http://trac.wxwidgets.org/ticket/13389
-        */
-
-       wxString in = _("<i>Only change this if the content's frame rate has been read incorrectly.</i>");
-       wxString out;
-       int const width = 20;
-       int current = 0;
-       for (size_t i = 0; i < in.Length(); ++i) {
-               if (in[i] == ' ' && current >= width) {
-                       out += '\n';
-                       current = 0;
-               } else {
-                       out += in[i];
-                       ++current;
-               }
-       }
-
-       _tip = new StaticText (this, wxT (""));
-       _tip->SetLabelMarkup (out);
-#ifdef DCPOMATIC_OSX
-       /* Hack to stop hidden text on some versions of OS X */
-       _tip->SetMinSize (wxSize (-1, 256));
-#endif
-
        _position->Changed.connect    (boost::bind (&TimingPanel::position_changed, this));
        _move_to_start_of_reel->Bind  (wxEVT_BUTTON, boost::bind (&TimingPanel::move_to_start_of_reel_clicked, this));
        _full_length->Changed.connect (boost::bind (&TimingPanel::full_length_changed, this));
@@ -147,8 +117,6 @@ TimingPanel::TimingPanel (ContentPanel* p, weak_ptr<FilmViewer> viewer)
        _trim_end->Changed.connect    (boost::bind (&TimingPanel::trim_end_changed, this));
        _trim_end_to_playhead->Bind   (wxEVT_BUTTON, boost::bind (&TimingPanel::trim_end_to_playhead_clicked, this));
        _play_length->Changed.connect (boost::bind (&TimingPanel::play_length_changed, this));
-       _video_frame_rate->Bind       (wxEVT_TEXT, boost::bind (&TimingPanel::video_frame_rate_changed, this));
-       _set_video_frame_rate->Bind   (wxEVT_BUTTON, boost::bind (&TimingPanel::set_video_frame_rate, this));
 
        shared_ptr<FilmViewer> fv = _viewer.lock ();
        DCPOMATIC_ASSERT (fv);
@@ -185,10 +153,6 @@ TimingPanel::add_to_grid ()
        _full_length->Show (full);
        _play_length_label->Show (full);
        _play_length->Show (full);
-       _video_frame_rate_label->Show (full);
-       _video_frame_rate->Show (full);
-       _set_video_frame_rate->Show (full);
-       _tip->Show (full);
 
        if (full) {
                _grid->Add (_move_to_start_of_reel, wxGBPosition(r, 1));
@@ -217,17 +181,6 @@ TimingPanel::add_to_grid ()
                add_label_to_sizer (_grid, _play_length_label, true, wxGBPosition(r, 0));
                _grid->Add (_play_length, wxGBPosition(r, 1));
                ++r;
-
-               {
-                       add_label_to_sizer (_grid, _video_frame_rate_label, true, wxGBPosition(r, 0));
-                       wxBoxSizer* s = new wxBoxSizer (wxHORIZONTAL);
-                       s->Add (_video_frame_rate, 1, wxEXPAND);
-                       s->Add (_set_video_frame_rate, 0, wxLEFT | wxRIGHT, 8);
-                       _grid->Add (s, wxGBPosition(r, 1), wxGBSpan(1, 2));
-               }
-               ++r;
-
-               _grid->Add (_tip, wxGBPosition(r, 1), wxGBSpan(1, 2));
        }
 
        /* Completely speculative fix for #891 */
@@ -356,16 +309,6 @@ TimingPanel::film_content_changed (int property)
                        }
 
                }
-
-               bool const single_frame_image_content = content && dynamic_pointer_cast<const ImageContent> (content) && content->number_of_paths() == 1;
-
-               if ((check_vc.size() == 1 || count_ac == 1 || count_sc == 1) && !single_frame_image_content) {
-                       checked_set (_video_frame_rate, locale_convert<string> (content->video_frame_rate().get(), 5));
-                       _video_frame_rate->Enable (true);
-               } else {
-                       checked_set (_video_frame_rate, wxT (""));
-                       _video_frame_rate->Enable (false);
-               }
        }
 
        bool have_still = false;
@@ -378,7 +321,6 @@ TimingPanel::film_content_changed (int property)
 
        _full_length->set_editable (have_still);
        _play_length->set_editable (!have_still);
-       _set_video_frame_rate->Enable (false);
        setup_sensitivity ();
 }
 
@@ -480,45 +422,6 @@ TimingPanel::play_length_changed ()
        }
 }
 
-void
-TimingPanel::video_frame_rate_changed ()
-{
-       bool enable = true;
-       if (_video_frame_rate->GetValue() == wxT("")) {
-               /* No frame rate has been entered; if the user clicks "set" now it would unset the video
-                  frame rate in the selected content.  This can't be allowed for some content types.
-               */
-               BOOST_FOREACH (shared_ptr<Content> i, _parent->selected()) {
-                       if (
-                               dynamic_pointer_cast<DCPContent>(i) ||
-                               dynamic_pointer_cast<FFmpegContent>(i)
-                               ) {
-                               enable = false;
-                       }
-               }
-       }
-
-       _set_video_frame_rate->Enable (enable);
-}
-
-void
-TimingPanel::set_video_frame_rate ()
-{
-       optional<double> fr;
-       if (_video_frame_rate->GetValue() != wxT("")) {
-               fr = locale_convert<double> (wx_to_std (_video_frame_rate->GetValue ()));
-       }
-       Suspender::Block bl = _film_content_changed_suspender.block ();
-       BOOST_FOREACH (shared_ptr<Content> i, _parent->selected ()) {
-               if (fr) {
-                       i->set_video_frame_rate (*fr);
-               } else {
-                       i->unset_video_frame_rate ();
-               }
-       }
-
-       _set_video_frame_rate->Enable (false);
-}
 
 void
 TimingPanel::content_selection_changed ()
@@ -599,7 +502,6 @@ TimingPanel::setup_sensitivity ()
        _trim_start->Enable (e);
        _trim_end->Enable (e);
        _play_length->Enable (e);
-       _video_frame_rate->Enable (e);
 
        shared_ptr<FilmViewer> fv = _viewer.lock ();
        DCPOMATIC_ASSERT (fv);
index e0be2d74bf22dc5c5744bf6b97fee628a049f380..d413361d416f17e15ecf187ea630f71ee136c9cc 100644 (file)
@@ -42,8 +42,6 @@ private:
        void trim_end_changed ();
        void trim_end_to_playhead_clicked ();
        void play_length_changed ();
-       void video_frame_rate_changed ();
-       void set_video_frame_rate ();
        void update_full_length ();
        void update_play_length ();
        void setup_sensitivity ();
@@ -56,7 +54,6 @@ private:
        wxStaticText* _s_label;
        wxStaticText* _f_label;
        wxStaticText* _colon[3];
-       wxStaticText* _tip;
        wxStaticText* _position_label;
        Timecode<dcpomatic::DCPTime>* _position;
        wxButton* _move_to_start_of_reel;
@@ -70,9 +67,6 @@ private:
        Timecode<dcpomatic::ContentTime>* _trim_end;
        wxStaticText* _play_length_label;
        Timecode<dcpomatic::DCPTime>* _play_length;
-       wxStaticText* _video_frame_rate_label;
-       wxTextCtrl* _video_frame_rate;
-       wxButton* _set_video_frame_rate;
 
        Suspender _film_content_changed_suspender;
 };