#include "lib/analyse_subtitles_job.h"
#include "lib/subtitle_analysis.h"
#include <wx/spinctrl.h>
-#include <boost/foreach.hpp>
using std::vector;
using std::string;
using std::list;
using std::cout;
-using boost::shared_ptr;
+using std::shared_ptr;
using boost::optional;
-using boost::dynamic_pointer_cast;
+using std::dynamic_pointer_cast;
using boost::bind;
/** @param t Original text type of the content, if known */
, _outline_subtitles (0)
, _dcp_track_label (0)
, _dcp_track (0)
- , _language_label (0)
- , _language (0)
, _text_view (0)
, _fonts_dialog (0)
, _original_type (t)
_burn = new CheckBox (this, _("Burn subtitles into image"));
+#ifdef __WXGTK3__
+ int const spin_width = 118;
+#else
+ int const spin_width = 56;
+#endif
+
_offset_label = create_label (this, _("Offset"), true);
_x_offset_label = create_label (this, _("X"), true);
- _x_offset = new wxSpinCtrl (this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(64, -1));
+ _x_offset = new wxSpinCtrl (this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(spin_width, -1));
_x_offset_pc_label = new StaticText (this, _("%"));
_y_offset_label = create_label (this, _("Y"), true);
- _y_offset = new wxSpinCtrl (this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(64, -1));
+ _y_offset = new wxSpinCtrl (this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(spin_width, -1));
_y_offset_pc_label = new StaticText (this, _("%"));
_scale_label = create_label (this, _("Scale"), true);
_x_scale_label = create_label (this, _("X"), true);
- _x_scale = new wxSpinCtrl (this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(64, -1));
+ _x_scale = new wxSpinCtrl (this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(spin_width, -1));
_x_scale_pc_label = new StaticText (this, _("%"));
_y_scale_label = create_label (this, S_("Coord|Y"), true);
- _y_scale = new wxSpinCtrl (this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(64, -1));
+ _y_scale = new wxSpinCtrl (this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(spin_width, -1));
_y_scale_pc_label = new StaticText (this, _("%"));
_line_spacing_label = create_label (this, _("Line spacing"), true);
_dcp_track->Destroy ();
_dcp_track = 0;
}
- if (!_language_label) {
- _language_label = create_label (this, _("Language"), true);
- add_label_to_sizer (_grid, _language_label, true, wxGBPosition(_language_row, 0));
- }
- if (!_language) {
- _language = new wxTextCtrl (this, wxID_ANY);
- _language->Bind (wxEVT_TEXT, boost::bind(&TextPanel::language_changed, this));
- _grid->Add (_language, wxGBPosition(_language_row, 1), wxDefaultSpan, wxEXPAND);
- film_content_changed (TextContentProperty::LANGUAGE);
- }
if (!_outline_subtitles) {
_outline_subtitles = new CheckBox (this, _("Show subtitle area"));
_outline_subtitles->Bind (wxEVT_CHECKBOX, boost::bind (&TextPanel::outline_subtitles_changed, this));
break;
case TEXT_CLOSED_CAPTION:
- if (_language_label) {
- _language_label->Destroy ();
- _language_label = 0;
- }
- if (_language) {
- _language->Destroy ();
- _language = 0;
- }
if (!_dcp_track_label) {
_dcp_track_label = create_label (this, _("CCAP track"), true);
- add_label_to_sizer (_grid, _dcp_track_label, true, wxGBPosition(_language_row, 0));
+ add_label_to_sizer (_grid, _dcp_track_label, true, wxGBPosition(_ccap_track_row, 0));
}
if (!_dcp_track) {
_dcp_track = new wxChoice (this, wxID_ANY);
_dcp_track->Bind (wxEVT_CHOICE, boost::bind(&TextPanel::dcp_track_changed, this));
- _grid->Add (_dcp_track, wxGBPosition(_language_row, 1), wxDefaultSpan, wxEXPAND);
+ _grid->Add (_dcp_track, wxGBPosition(_ccap_track_row, 1), wxDefaultSpan, wxEXPAND);
update_dcp_tracks ();
film_content_changed (TextContentProperty::DCP_TRACK);
}
void
TextPanel::add_to_grid ()
{
- Config::Interface const interface = Config::instance()->interface_complexity();
-
int r = 0;
- _reference->Show (interface == Config::INTERFACE_FULL);
- _reference_note->Show (interface == Config::INTERFACE_FULL);
-
- if (interface == Config::INTERFACE_FULL) {
- wxBoxSizer* reference_sizer = new wxBoxSizer (wxVERTICAL);
- reference_sizer->Add (_reference, 0);
- reference_sizer->Add (_reference_note, 0);
- _grid->Add (reference_sizer, wxGBPosition(r, 0), wxGBSpan(1, 4));
- ++r;
- }
+ wxBoxSizer* reference_sizer = new wxBoxSizer (wxVERTICAL);
+ reference_sizer->Add (_reference, 0);
+ reference_sizer->Add (_reference_note, 0);
+ _grid->Add (reference_sizer, wxGBPosition(r, 0), wxGBSpan(1, 4));
+ ++r;
wxBoxSizer* use = new wxBoxSizer (wxHORIZONTAL);
use->Add (_use, 0, wxEXPAND | wxRIGHT, DCPOMATIC_SIZER_GAP);
add_label_to_sizer (_grid, _offset_label, true, wxGBPosition (r, 0));
wxBoxSizer* offset = new wxBoxSizer (wxHORIZONTAL);
- add_label_to_sizer (offset, _x_offset_label, true);
+ add_label_to_sizer (offset, _x_offset_label, true, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL);
offset->Add (_x_offset, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, DCPOMATIC_SIZER_X_GAP);
offset->Add (_x_offset_pc_label, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, DCPOMATIC_SIZER_X_GAP * 2);
- add_label_to_sizer (offset, _y_offset_label, true);
- offset->Add (_y_offset, 0);
- add_label_to_sizer (offset, _y_offset_pc_label, false);
+#ifdef __WXGTK3__
+ _grid->Add (offset, wxGBPosition(r, 1));
+ ++r;
+ offset = new wxBoxSizer (wxHORIZONTAL);
+#endif
+ add_label_to_sizer (offset, _y_offset_label, true, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL);
+ offset->Add (_y_offset, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, DCPOMATIC_SIZER_X_GAP);
+ add_label_to_sizer (offset, _y_offset_pc_label, false, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL);
_grid->Add (offset, wxGBPosition (r, 1));
++r;
add_label_to_sizer (_grid, _scale_label, true, wxGBPosition (r, 0));
wxBoxSizer* scale = new wxBoxSizer (wxHORIZONTAL);
- add_label_to_sizer (scale, _x_scale_label, true);
+ add_label_to_sizer (scale, _x_scale_label, true, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL);
scale->Add (_x_scale, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, DCPOMATIC_SIZER_X_GAP);
scale->Add (_x_scale_pc_label, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, DCPOMATIC_SIZER_X_GAP * 2);
- add_label_to_sizer (scale, _y_scale_label, true);
- scale->Add (_y_scale, 0);
- add_label_to_sizer (scale, _y_scale_pc_label, false);
+#ifdef __WXGTK3__
+ _grid->Add (scale, wxGBPosition(r, 1));
+ ++r;
+ scale = new wxBoxSizer (wxHORIZONTAL);
+#endif
+ add_label_to_sizer (scale, _y_scale_label, true, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL);
+ scale->Add (_y_scale, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, DCPOMATIC_SIZER_X_GAP);
+ add_label_to_sizer (scale, _y_scale_pc_label, false, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL);
_grid->Add (scale, wxGBPosition (r, 1));
++r;
add_label_to_sizer (_grid, _line_spacing_label, true, wxGBPosition (r, 0));
wxBoxSizer* s = new wxBoxSizer (wxHORIZONTAL);
s->Add (_line_spacing);
- add_label_to_sizer (s, _line_spacing_pc_label, false);
+ add_label_to_sizer (s, _line_spacing_pc_label, false, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL);
_grid->Add (s, wxGBPosition (r, 1));
++r;
}
- _language_row = r;
+ _ccap_track_row = r;
++r;
add_label_to_sizer (_grid, _stream_label, true, wxGBPosition (r, 0));
optional<DCPTextTrack> selected;
bool many = false;
- BOOST_FOREACH (shared_ptr<Content> i, _parent->selected_text()) {
+ for (auto i: _parent->selected_text()) {
shared_ptr<TextContent> t = i->text_of_original_type(_original_type);
if (t) {
optional<DCPTextTrack> dt = t->dcp_track();
}
int n = 0;
- BOOST_FOREACH (DCPTextTrack i, _parent->film()->closed_caption_tracks()) {
+ for (auto i: _parent->film()->closed_caption_tracks()) {
if (!many && selected && *selected == i) {
_dcp_track->SetSelection (n);
}
DCPOMATIC_ASSERT (_dcp_track);
_dcp_track->Clear ();
- BOOST_FOREACH (DCPTextTrack i, _parent->film()->closed_caption_tracks()) {
+ for (auto i: _parent->film()->closed_caption_tracks()) {
/* XXX: don't display the "magic" track which has empty name and language;
this is a nasty hack (see also Film::closed_caption_tracks)
*/
d->Destroy ();
} else {
/* Find the DCPTextTrack that was selected */
- BOOST_FOREACH (DCPTextTrack i, _parent->film()->closed_caption_tracks()) {
+ for (auto i: _parent->film()->closed_caption_tracks()) {
if (i.summary() == wx_to_std(_dcp_track->GetStringSelection())) {
track = i;
}
}
if (track) {
- BOOST_FOREACH (shared_ptr<Content> i, _parent->selected_text()) {
+ for (auto i: _parent->selected_text()) {
shared_ptr<TextContent> t = i->text_of_original_type(_original_type);
if (t && t->type() == TEXT_CLOSED_CAPTION) {
t->set_dcp_track(*track);
} else if (property == TextContentProperty::LINE_SPACING) {
checked_set (_line_spacing, text ? lrint (text->line_spacing() * 100) : 100);
clear_outline_subtitles ();
- } else if (property == TextContentProperty::LANGUAGE) {
- if (_language) {
- checked_set (_language, text ? text->language() : "");
- }
} else if (property == TextContentProperty::DCP_TRACK) {
if (_dcp_track) {
update_dcp_track_selection ();
setup_sensitivity ();
} else if (property == DCPContentProperty::TEXTS) {
setup_sensitivity ();
+ } else if (property == ContentProperty::TRIM_START) {
+ setup_sensitivity ();
}
}
void
TextPanel::use_toggled ()
{
- BOOST_FOREACH (shared_ptr<Content> i, _parent->selected_text()) {
+ for (auto i: _parent->selected_text()) {
i->text_of_original_type(_original_type)->set_use (_use->GetValue());
}
}
void
TextPanel::type_changed ()
{
- BOOST_FOREACH (shared_ptr<Content> i, _parent->selected_text()) {
+ for (auto i: _parent->selected_text()) {
i->text_of_original_type(_original_type)->set_type (current_type ());
}
void
TextPanel::burn_toggled ()
{
- BOOST_FOREACH (shared_ptr<Content> i, _parent->selected_text ()) {
+ for (auto i: _parent->selected_text ()) {
i->text_of_original_type(_original_type)->set_burn (_burn->GetValue());
}
}
/* DCP subs can't have their line spacing changed */
int dcp_subs = 0;
ContentList sel = _parent->selected_text ();
- BOOST_FOREACH (shared_ptr<Content> i, sel) {
+ for (auto i: sel) {
/* These are the content types that could include subtitles */
- shared_ptr<const FFmpegContent> fc = boost::dynamic_pointer_cast<const FFmpegContent> (i);
- shared_ptr<const StringTextFileContent> sc = boost::dynamic_pointer_cast<const StringTextFileContent> (i);
- shared_ptr<const DCPContent> dc = boost::dynamic_pointer_cast<const DCPContent> (i);
- shared_ptr<const DCPSubtitleContent> dsc = boost::dynamic_pointer_cast<const DCPSubtitleContent> (i);
+ shared_ptr<const FFmpegContent> fc = std::dynamic_pointer_cast<const FFmpegContent> (i);
+ shared_ptr<const StringTextFileContent> sc = std::dynamic_pointer_cast<const StringTextFileContent> (i);
+ shared_ptr<const DCPContent> dc = std::dynamic_pointer_cast<const DCPContent> (i);
+ shared_ptr<const DCPSubtitleContent> dsc = std::dynamic_pointer_cast<const DCPSubtitleContent> (i);
if (fc) {
if (!fc->text.empty()) {
++ffmpeg_subs;
void
TextPanel::x_offset_changed ()
{
- BOOST_FOREACH (shared_ptr<Content> i, _parent->selected_text ()) {
+ for (auto i: _parent->selected_text ()) {
i->text_of_original_type(_original_type)->set_x_offset (_x_offset->GetValue() / 100.0);
}
}
void
TextPanel::y_offset_changed ()
{
- BOOST_FOREACH (shared_ptr<Content> i, _parent->selected_text ()) {
+ for (auto i: _parent->selected_text ()) {
i->text_of_original_type(_original_type)->set_y_offset (_y_offset->GetValue() / 100.0);
}
}
void
TextPanel::y_scale_changed ()
{
- BOOST_FOREACH (shared_ptr<Content> i, _parent->selected_text ()) {
+ for (auto i: _parent->selected_text ()) {
i->text_of_original_type(_original_type)->set_y_scale (_y_scale->GetValue() / 100.0);
}
}
void
TextPanel::line_spacing_changed ()
{
- BOOST_FOREACH (shared_ptr<Content> i, _parent->selected_text ()) {
+ for (auto i: _parent->selected_text ()) {
i->text_of_original_type(_original_type)->set_line_spacing (_line_spacing->GetValue() / 100.0);
}
}
-void
-TextPanel::language_changed ()
-{
- DCPOMATIC_ASSERT (_language);
- BOOST_FOREACH (shared_ptr<Content> i, _parent->selected_text ()) {
- i->text_of_original_type(_original_type)->set_language (wx_to_std (_language->GetValue()));
- }
-}
-
void
TextPanel::content_selection_changed ()
{
film_content_changed (TextContentProperty::X_SCALE);
film_content_changed (TextContentProperty::Y_SCALE);
film_content_changed (TextContentProperty::LINE_SPACING);
- film_content_changed (TextContentProperty::LANGUAGE);
film_content_changed (TextContentProperty::FONTS);
film_content_changed (TextContentProperty::TYPE);
film_content_changed (TextContentProperty::DCP_TRACK);
void
TextPanel::try_to_load_analysis ()
{
+ if (_loading_analysis) {
+ return;
+ }
+
_loading_analysis = true;
setup_sensitivity ();
_analysis.reset ();
boost::filesystem::path const path = _parent->film()->subtitle_analysis_path(content);
if (!boost::filesystem::exists(path)) {
- BOOST_FOREACH (shared_ptr<Job> i, JobManager::instance()->get()) {
+ for (auto i: JobManager::instance()->get()) {
if (dynamic_pointer_cast<AnalyseSubtitlesJob>(i)) {
i->cancel ();
}
return;
}
+ _loading_analysis = false;
try_to_load_analysis ();
}