From 53eb16342d492236aca77e4b73c0911a5d5eec9f Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Sat, 2 Mar 2013 18:22:01 +0000 Subject: [PATCH] Add explanation of the effect of changing frame rate. --- src/lib/util.cc | 15 +++++++++ src/lib/util.h | 4 ++- src/wx/film_editor.cc | 78 +++++++++++++++++++++++++++---------------- src/wx/film_editor.h | 1 + src/wx/wx_util.cc | 8 +++++ src/wx/wx_util.h | 3 ++ 6 files changed, 80 insertions(+), 29 deletions(-) diff --git a/src/lib/util.cc b/src/lib/util.cc index 85a04ed17..d1450ccc2 100644 --- a/src/lib/util.cc +++ b/src/lib/util.cc @@ -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); + } + } } diff --git a/src/lib/util.h b/src/lib/util.h index 103907151..b0f405890 100644 --- a/src/lib/util.h +++ b/src/lib/util.h @@ -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); diff --git a/src/wx/film_editor.cc b/src/wx/film_editor.cc index 7453d175a..12ba7c1bc 100644 --- a/src/wx/film_editor.cc +++ b/src/wx/film_editor.cc @@ -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 const ct = DCPContentType::all (); for (vector::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)); } } diff --git a/src/wx/film_editor.h b/src/wx/film_editor.h index 4adea2bc9..e9e21894e 100644 --- a/src/wx/film_editor.h +++ b/src/wx/film_editor.h @@ -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 */ diff --git a/src/wx/wx_util.cc b/src/wx/wx_util.cc index bf78ff4d7..720a058cb 100644 --- a/src/wx/wx_util.cc +++ b/src/wx/wx_util.cc @@ -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. diff --git a/src/wx/wx_util.h b/src/wx/wx_util.h index 6cde08a90..bff3d7982 100644 --- a/src/wx/wx_util.h +++ b/src/wx/wx_util.h @@ -18,11 +18,13 @@ */ #include +#include #include #include 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); -- 2.30.2