#include "lib/decoder_factory.h"
#include "lib/ffmpeg_content.h"
#include "lib/ffmpeg_subtitle_stream.h"
+#include "lib/film.h"
#include "lib/job_manager.h"
-#include "lib/scope_guard.h"
#include "lib/string_text_file_content.h"
#include "lib/string_text_file_decoder.h"
#include "lib/subtitle_analysis.h"
#include "lib/text_content.h"
+#include <dcp/filesystem.h>
+#include <dcp/scope_guard.h>
#include <dcp/warnings.h>
LIBDCP_DISABLE_WARNINGS
#include <wx/spinctrl.h>
using std::vector;
using boost::bind;
using boost::optional;
+#if BOOST_VERSION >= 106100
+using namespace boost::placeholders;
+#endif
/** @param t Original text type of the content, if known */
refer = _("Use this DCP's closed caption as OV and make VF");
}
- _reference = new CheckBox (this, refer);
- _reference_note = new StaticText (this, wxT(""));
- _reference_note->Wrap (200);
- auto font = _reference_note->GetFont();
- font.SetStyle(wxFONTSTYLE_ITALIC);
- font.SetPointSize(font.GetPointSize() - 1);
- _reference_note->SetFont(font);
-
_use = new CheckBox (this, _("Use as"));
_type = new wxChoice (this, wxID_ANY);
_type->Append (_("open subtitles"));
_y_scale->SetRange (0, 1000);
_line_spacing->SetRange (0, 1000);
- _reference->bind(&TextPanel::reference_clicked, this);
_use->bind(&TextPanel::use_toggled, this);
_type->Bind (wxEVT_CHOICE, boost::bind (&TextPanel::type_changed, this));
_burn->bind(&TextPanel::burn_toggled, this);
{
int r = 0;
- auto 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;
-
auto use = new wxBoxSizer (wxHORIZONTAL);
use->Add (_use, 0, wxEXPAND | wxRIGHT, DCPOMATIC_SIZER_GAP);
use->Add (_type, 1, wxEXPAND, 0);
optional<DCPTextTrack> track;
if (_dcp_track->GetSelection() == int(_dcp_track->GetCount()) - 1) {
- auto d = new DCPTextTrackDialog (this);
- ScopeGuard sg = [d]() { d->Destroy(); };
+ auto d = make_wx<DCPTextTrackDialog>(this);
if (d->ShowModal() == wxID_OK) {
track = d->get();
}
void
-TextPanel::film_changed (Film::Property property)
+TextPanel::film_changed(FilmProperty property)
{
- if (property == Film::Property::CONTENT || property == Film::Property::REEL_TYPE || property == Film::Property::INTEROP) {
+ if (property == FilmProperty::CONTENT || property == FilmProperty::REEL_TYPE || property == FilmProperty::INTEROP) {
setup_sensitivity ();
}
}
if (_language_type) {
_language_type->SetSelection (text ? (text->language_is_additional() ? 1 : 0) : 0);
}
- } else if (property == DCPContentProperty::REFERENCE_TEXT) {
- if (scs) {
- auto dcp = dynamic_pointer_cast<DCPContent> (scs);
- checked_set (_reference, dcp ? dcp->reference_text(_original_type) : false);
- } else {
- checked_set (_reference, false);
- }
-
- setup_sensitivity ();
} else if (property == DCPContentProperty::TEXTS) {
setup_sensitivity ();
} else if (property == ContentProperty::TRIM_START) {
dcp = dynamic_pointer_cast<DCPContent>(sel.front());
}
- string why_not;
- bool const can_reference = dcp && dcp->can_reference_text (_parent->film(), _original_type, why_not);
- wxString cannot;
- if (why_not.empty()) {
- cannot = _("Cannot reference this DCP's subtitles or captions.");
- } else {
- cannot = _("Cannot reference this DCP's subtitles or captions: ") + std_to_wx(why_not);
- }
- setup_refer_button (_reference, _reference_note, dcp, can_reference, cannot);
-
- bool const reference = _reference->GetValue ();
+ auto const reference = dcp && dcp->reference_text(_original_type);
auto const type = current_type ();
void
TextPanel::text_view_clicked ()
{
- if (_text_view) {
- _text_view->Destroy ();
- _text_view = nullptr;
- }
-
auto c = _parent->selected_text ();
DCPOMATIC_ASSERT (c.size() == 1);
auto decoder = decoder_factory (_parent->film(), c.front(), false, false, shared_ptr<Decoder>());
if (decoder) {
- _text_view = new TextView (this, _parent->film(), c.front(), c.front()->text_of_original_type(_original_type), decoder, _parent->film_viewer());
- _text_view->Show ();
+ _text_view.reset(this, _parent->film(), c.front(), c.front()->text_of_original_type(_original_type), decoder, _parent->film_viewer());
+ _text_view->show();
}
}
void
TextPanel::fonts_dialog_clicked ()
{
- if (_fonts_dialog) {
- _fonts_dialog->Destroy ();
- _fonts_dialog = nullptr;
- }
-
auto c = _parent->selected_text ();
DCPOMATIC_ASSERT (c.size() == 1);
- _fonts_dialog = new FontsDialog (this, c.front(), c.front()->text_of_original_type(_original_type));
+ _fonts_dialog.reset(this, c.front(), c.front()->text_of_original_type(_original_type));
_fonts_dialog->Show ();
}
-void
-TextPanel::reference_clicked ()
-{
- auto c = _parent->selected ();
- if (c.size() != 1) {
- return;
- }
-
- auto d = dynamic_pointer_cast<DCPContent> (c.front ());
- if (!d) {
- return;
- }
-
- d->set_reference_text (_original_type, _reference->GetValue ());
-}
-
-
void
TextPanel::appearance_dialog_clicked ()
{
auto c = _parent->selected_text ();
DCPOMATIC_ASSERT (c.size() == 1);
- auto d = new SubtitleAppearanceDialog (this, _parent->film(), c.front(), c.front()->text_of_original_type(_original_type));
- if (d->ShowModal () == wxID_OK) {
- d->apply ();
+ SubtitleAppearanceDialog dialog(this, _parent->film(), c.front(), c.front()->text_of_original_type(_original_type));
+ if (dialog.ShowModal() == wxID_OK) {
+ dialog.apply();
}
- d->Destroy ();
}
}
_loading_analysis = true;
+ dcp::ScopeGuard sg = [this]() {
+ _loading_analysis = false;
+ setup_sensitivity();
+ };
+
setup_sensitivity ();
_analysis.reset ();
auto content = _analysis_content.lock ();
if (!content) {
- _loading_analysis = false;
- setup_sensitivity ();
return;
}
auto const path = _parent->film()->subtitle_analysis_path(content);
- if (!boost::filesystem::exists(path)) {
+ if (!dcp::filesystem::exists(path)) {
for (auto i: JobManager::instance()->get()) {
- if (dynamic_pointer_cast<AnalyseSubtitlesJob>(i)) {
+ if (dynamic_pointer_cast<AnalyseSubtitlesJob>(i) && !i->finished()) {
i->cancel ();
}
}
JobManager::instance()->analyse_subtitles (
- _parent->film(), content, _analysis_finished_connection, bind(&TextPanel::analysis_finished, this)
+ _parent->film(), content, _analysis_finished_connection, bind(&TextPanel::analysis_finished, this, _1)
);
return;
}
} catch (OldFormatError& e) {
/* An old analysis file: recreate it */
JobManager::instance()->analyse_subtitles (
- _parent->film(), content, _analysis_finished_connection, bind(&TextPanel::analysis_finished, this)
+ _parent->film(), content, _analysis_finished_connection, bind(&TextPanel::analysis_finished, this, _1)
);
return;
- }
+ }
update_outline_subtitles_in_viewer ();
- _loading_analysis = false;
- setup_sensitivity ();
}
void
-TextPanel::analysis_finished ()
+TextPanel::analysis_finished(Job::Result result)
{
+ _loading_analysis = false;
+
auto content = _analysis_content.lock ();
- if (!content) {
- _loading_analysis = false;
- setup_sensitivity ();
+ if (!content || result == Job::Result::RESULT_CANCELLED) {
+ clear_outline_subtitles();
+ setup_sensitivity();
return;
}
- if (!boost::filesystem::exists(_parent->film()->subtitle_analysis_path(content))) {
- /* We analysed and still nothing showed up, so maybe it was cancelled or it failed.
- Give up.
- */
+ if (!dcp::filesystem::exists(_parent->film()->subtitle_analysis_path(content))) {
+ /* We analysed and still nothing showed up, so maybe it failed. Give up. */
error_dialog (_parent->window(), _("Could not analyse subtitles."));
clear_outline_subtitles ();
- _loading_analysis = false;
setup_sensitivity ();
return;
}
- _loading_analysis = false;
try_to_load_analysis ();
}