Add explanation of the effect of changing frame rate.
authorCarl Hetherington <cth@carlh.net>
Sat, 2 Mar 2013 18:22:01 +0000 (18:22 +0000)
committerCarl Hetherington <cth@carlh.net>
Sat, 2 Mar 2013 18:22:01 +0000 (18:22 +0000)
src/lib/util.cc
src/lib/util.h
src/wx/film_editor.cc
src/wx/film_editor.h
src/wx/wx_util.cc
src/wx/wx_util.h

index 85a04ed179e8305da1c3e4daa21e3d92fe47f949..d1450ccc2a4aecc7860eeb7cfa5dcf7430a1233e 100644 (file)
@@ -960,4 +960,19 @@ FrameRateConversion::FrameRateConversion (float source, int dcp)
        }
 
        change_speed = !about_equal (source * factor(), dcp);
+
+       if (!skip && !repeat && !change_speed) {
+               explanation = _("DCP and source have the same rate.\n");
+       } else {
+               if (skip) {
+                       explanation = _("DCP will use every other frame of the source.\n");
+               } else if (repeat) {
+                       explanation = _("Each source frame will be doubled in the DCP.\n");
+               }
+
+               if (change_speed) {
+                       float const pc = (source * factor()) * 100 / dcp;
+                       explanation += String::compose (_("DCP will run at %1%% of the source speed."), pc);
+               }
+       }
 }
index 103907151a8a9144f55716ee8e7904e3a00f8a8b..b0f405890a13861cd563e98c68932a8b438e28a0 100644 (file)
@@ -78,7 +78,7 @@ struct FrameRateConversion
 
                return 1;
        }
-       
+
        /** true to skip every other frame */
        bool skip;
        /** true to repeat every frame once */
@@ -93,6 +93,8 @@ struct FrameRateConversion
         *          source is 12.50fps, DCP is 25fps)
         */
        bool change_speed;
+
+       std::string explanation;
 };
 
 int best_dcp_frame_rate (float);
index 7453d175a3ce06471522fd224787c0f7ee82f9e2..12ba7c1bc69dca45b6272b3324fd9471c00e2345 100644 (file)
@@ -97,60 +97,79 @@ FilmEditor::make_film_panel ()
        _film_sizer = new wxBoxSizer (wxVERTICAL);
        _film_panel->SetSizer (_film_sizer);
 
-       wxFlexGridSizer* grid = new wxFlexGridSizer (2, 4, 4);
+       wxGridBagSizer* grid = new wxGridBagSizer (6, 6);
        _film_sizer->Add (grid, 0, wxALL, 8);
 
-       add_label_to_sizer (grid, _film_panel, _("Name"));
+       int r = 0;
+       
+       add_label_to_grid_bag_sizer (grid, _film_panel, _("Name"), wxGBPosition (r, 0));
        _name = new wxTextCtrl (_film_panel, wxID_ANY);
-       grid->Add (_name, 1, wxEXPAND);
-
-       add_label_to_sizer (grid, _film_panel, _("DCP Name"));
+       grid->Add (_name, wxGBPosition(r, 1));
+       ++r;
+       
+       add_label_to_grid_bag_sizer (grid, _film_panel, _("DCP Name"), wxGBPosition (r, 0));
        _dcp_name = new wxStaticText (_film_panel, wxID_ANY, wxT (""));
-       grid->Add (_dcp_name, 0, wxALIGN_CENTER_VERTICAL | wxSHRINK);
+       grid->Add (_dcp_name, wxGBPosition(r, 1), wxDefaultSpan, wxALIGN_CENTER_VERTICAL);
+       ++r;
 
        _use_dci_name = new wxCheckBox (_film_panel, wxID_ANY, _("Use DCI name"));
-       grid->Add (_use_dci_name, 1, wxEXPAND);
+       grid->Add (_use_dci_name, wxGBPosition (r, 0));
        _edit_dci_button = new wxButton (_film_panel, wxID_ANY, _("Details..."));
-       grid->Add (_edit_dci_button, 0);
+       grid->Add (_edit_dci_button, wxGBPosition (r, 1), wxDefaultSpan);
+       ++r;
 
-       add_label_to_sizer (grid, _film_panel, _("Content"));
+       add_label_to_grid_bag_sizer (grid, _film_panel, _("Content"), wxGBPosition (r, 0));
        _content = new wxFilePickerCtrl (_film_panel, wxID_ANY, wxT (""), _("Select Content File"), wxT("*.*"));
-       grid->Add (_content, 1, wxEXPAND);
+       grid->Add (_content, wxGBPosition (r, 1), wxDefaultSpan, wxEXPAND);
+       ++r;
 
        _trust_content_header = new wxCheckBox (_film_panel, wxID_ANY, _("Trust content's header"));
        video_control (_trust_content_header);
-       grid->Add (_trust_content_header, 1);
-       grid->AddSpacer (0);
+       grid->Add (_trust_content_header, wxGBPosition (r, 0), wxGBSpan(1, 2));
+       ++r;
 
-       add_label_to_sizer (grid, _film_panel, _("Content Type"));
+       add_label_to_grid_bag_sizer (grid, _film_panel, _("Content Type"), wxGBPosition (r, 0));
        _dcp_content_type = new wxChoice (_film_panel, wxID_ANY);
-       grid->Add (_dcp_content_type);
+       grid->Add (_dcp_content_type, wxGBPosition (r, 1));
+       ++r;
 
-       video_control (add_label_to_sizer (grid, _film_panel, _("Original Frame Rate")));
+       video_control (add_label_to_grid_bag_sizer (grid, _film_panel, _("Original Frame Rate"), wxGBPosition (r, 0)));
        _source_frame_rate = new wxStaticText (_film_panel, wxID_ANY, wxT (""));
-       grid->Add (video_control (_source_frame_rate), 1, wxALIGN_CENTER_VERTICAL);
+       grid->Add (video_control (_source_frame_rate), wxGBPosition (r, 1), wxDefaultSpan, wxALIGN_CENTER_VERTICAL);
+       ++r;
 
        {
-               add_label_to_sizer (grid, _film_panel, _("DCP Frame Rate"));
+               add_label_to_grid_bag_sizer (grid, _film_panel, _("DCP Frame Rate"), wxGBPosition (r, 0));
                wxBoxSizer* s = new wxBoxSizer (wxHORIZONTAL);
                _dcp_frame_rate = new wxChoice (_film_panel, wxID_ANY);
                s->Add (_dcp_frame_rate, 1, wxALIGN_CENTER_VERTICAL);
                _best_dcp_frame_rate = new wxButton (_film_panel, wxID_ANY, _("Use best"));
                s->Add (_best_dcp_frame_rate, 1, wxALIGN_CENTER_VERTICAL | wxALL | wxEXPAND, 6);
-               grid->Add (s, 1);
+               grid->Add (s, wxGBPosition (r, 1));
        }
+       ++r;
+
+       _frame_rate_explanation = new wxStaticText (_film_panel, wxID_ANY, wxT (""), wxDefaultPosition, wxDefaultSize, wxST_NO_AUTORESIZE);
+       grid->Add (video_control (_frame_rate_explanation), wxGBPosition (r, 0), wxGBSpan (1, 2), wxEXPAND | wxALIGN_CENTER_VERTICAL);
+       wxFont font = _frame_rate_explanation->GetFont();
+       font.SetStyle(wxFONTSTYLE_ITALIC);
+       font.SetPointSize(font.GetPointSize() - 1);
+       _frame_rate_explanation->SetFont(font);
+       ++r;
        
-       video_control (add_label_to_sizer (grid, _film_panel, _("Original Size")));
+       video_control (add_label_to_grid_bag_sizer (grid, _film_panel, _("Original Size"), wxGBPosition (r, 0)));
        _original_size = new wxStaticText (_film_panel, wxID_ANY, wxT (""));
-       grid->Add (video_control (_original_size), 1, wxALIGN_CENTER_VERTICAL);
+       grid->Add (video_control (_original_size), wxGBPosition (r, 1), wxDefaultSpan, wxALIGN_CENTER_VERTICAL);
+       ++r;
        
-       video_control (add_label_to_sizer (grid, _film_panel, _("Length")));
+       video_control (add_label_to_grid_bag_sizer (grid, _film_panel, _("Length"), wxGBPosition (r, 0)));
        _length = new wxStaticText (_film_panel, wxID_ANY, wxT (""));
-       grid->Add (video_control (_length), 1, wxALIGN_CENTER_VERTICAL);
+       grid->Add (video_control (_length), wxGBPosition (r, 1), wxDefaultSpan, wxALIGN_CENTER_VERTICAL);
+       ++r;
 
 
        {
-               video_control (add_label_to_sizer (grid, _film_panel, _("Trim frames")));
+               video_control (add_label_to_grid_bag_sizer (grid, _film_panel, _("Trim frames"), wxGBPosition (r, 0)));
                wxBoxSizer* s = new wxBoxSizer (wxHORIZONTAL);
                video_control (add_label_to_sizer (s, _film_panel, _("Start")));
                _trim_start = new wxSpinCtrl (_film_panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize (64, -1));
@@ -159,25 +178,27 @@ FilmEditor::make_film_panel ()
                _trim_end = new wxSpinCtrl (_film_panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize (64, -1));
                s->Add (video_control (_trim_end));
 
-               grid->Add (s);
+               grid->Add (s, wxGBPosition (r, 1));
        }
+       ++r;
 
        _dcp_ab = new wxCheckBox (_film_panel, wxID_ANY, _("A/B"));
        video_control (_dcp_ab);
-       grid->Add (_dcp_ab, 1);
-       grid->AddSpacer (0);
+       grid->Add (_dcp_ab, wxGBPosition (r, 0));
+       ++r;
 
        /* STILL-only stuff */
        {
-               still_control (add_label_to_sizer (grid, _film_panel, _("Duration")));
+               still_control (add_label_to_grid_bag_sizer (grid, _film_panel, _("Duration"), wxGBPosition (r, 0)));
                wxSizer* s = new wxBoxSizer (wxHORIZONTAL);
                _still_duration = new wxSpinCtrl (_film_panel);
                still_control (_still_duration);
                s->Add (_still_duration, 1, wxEXPAND);
                /// TRANSLATORS: `s' here is an abbreviation for seconds, the unit of time
                still_control (add_label_to_sizer (s, _film_panel, _("s")));
-               grid->Add (s);
+               grid->Add (s, wxGBPosition (r, 1));
        }
+       ++r;
 
        vector<DCPContentType const *> const ct = DCPContentType::all ();
        for (vector<DCPContentType const *>::const_iterator i = ct.begin(); i != ct.end(); ++i) {
@@ -740,6 +761,7 @@ FilmEditor::film_changed (Film::Property p)
                                }
                        }
                }
+               _frame_rate_explanation->SetLabel (std_to_wx (FrameRateConversion (_film->source_frame_rate(), _film->dcp_frame_rate()).explanation));
        }
 }
 
index 4adea2bc9fab6a994e5eb1a7b4729ce4dc62f9f7..e9e21894e6ae673b035b9ee23cec6b59b63a03c6 100644 (file)
@@ -163,6 +163,7 @@ private:
        wxStaticText* _source_frame_rate;
        wxChoice* _dcp_frame_rate;
        wxButton* _best_dcp_frame_rate;
+       wxStaticText* _frame_rate_explanation;
        /** The Film's original size */
        wxStaticText* _original_size;
        /** The Film's length */
index bf78ff4d7029c1e3acf38f6a6c8ff28574ea362b..720a058cb771425b67f0828aed0ba7f9fb8deb63 100644 (file)
@@ -43,6 +43,14 @@ add_label_to_sizer (wxSizer* s, wxWindow* p, wxString t, int prop)
        return m;
 }
 
+wxStaticText *
+add_label_to_grid_bag_sizer (wxGridBagSizer* s, wxWindow* p, wxString t, wxGBPosition pos, wxGBSpan span)
+{
+       wxStaticText* m = new wxStaticText (p, wxID_ANY, t);
+       s->Add (m, pos, span, wxALIGN_CENTER_VERTICAL | wxALL, 6);
+       return m;
+}
+
 /** Pop up an error dialogue box.
  *  @param parent Parent.
  *  @param m Message.
index 6cde08a90924dd93977d628d4b94ac1f48c730a5..bff3d7982edf0b74d70d1cb4f6f030b26a9f9d2a 100644 (file)
 */
 
 #include <wx/wx.h>
+#include <wx/gbsizer.h>
 #include <boost/function.hpp>
 #include <boost/thread.hpp>
 
 class wxFilePickerCtrl;
 class wxSpinCtrl;
+class wxGridBagSizer;
 
 /** @file src/wx/wx_util.h
  *  @brief Some utility functions and classes.
@@ -30,6 +32,7 @@ class wxSpinCtrl;
 
 extern void error_dialog (wxWindow *, wxString);
 extern wxStaticText* add_label_to_sizer (wxSizer *, wxWindow *, wxString, int prop = 0);
+extern wxStaticText* add_label_to_grid_bag_sizer (wxGridBagSizer *, wxWindow *, wxString, wxGBPosition, wxGBSpan span = wxDefaultSpan);
 extern std::string wx_to_std (wxString);
 extern wxString std_to_wx (std::string);