Cleanup: move variable assignment that happens in every branch.
[dcpomatic.git] / src / wx / text_panel.cc
index a9a3f142dd60ce3773f5f2d0f8acb7965052f415..2fdcbb51f5d03733abdbce3d9950d5c1ad089acd 100644 (file)
@@ -32,6 +32,7 @@
 #include "subtitle_appearance_dialog.h"
 #include "text_panel.h"
 #include "text_view.h"
+#include "wx_ptr.h"
 #include "wx_util.h"
 #include "lib/analyse_subtitles_job.h"
 #include "lib/dcp_content.h"
@@ -41,6 +42,7 @@
 #include "lib/ffmpeg_content.h"
 #include "lib/ffmpeg_subtitle_stream.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"
@@ -126,10 +128,10 @@ TextPanel::create ()
        _y_scale->SetRange (0, 1000);
        _line_spacing->SetRange (0, 1000);
 
-       _reference->Bind                (wxEVT_CHECKBOX, boost::bind (&TextPanel::reference_clicked, this));
-       _use->Bind                      (wxEVT_CHECKBOX, boost::bind (&TextPanel::use_toggled, this));
+       _reference->bind(&TextPanel::reference_clicked, this);
+       _use->bind(&TextPanel::use_toggled, this);
        _type->Bind                     (wxEVT_CHOICE,   boost::bind (&TextPanel::type_changed, this));
-       _burn->Bind                     (wxEVT_CHECKBOX, boost::bind (&TextPanel::burn_toggled, this));
+       _burn->bind(&TextPanel::burn_toggled, this);
        _x_offset->Bind                 (wxEVT_SPINCTRL, boost::bind (&TextPanel::x_offset_changed, this));
        _y_offset->Bind                 (wxEVT_SPINCTRL, boost::bind (&TextPanel::y_offset_changed, this));
        _x_scale->Bind                  (wxEVT_SPINCTRL, boost::bind (&TextPanel::x_scale_changed, this));
@@ -162,7 +164,7 @@ TextPanel::setup_visibility ()
                }
                if (!_outline_subtitles) {
                        _outline_subtitles = new CheckBox (this, _("Show subtitle area"));
-                       _outline_subtitles->Bind (wxEVT_CHECKBOX, boost::bind (&TextPanel::outline_subtitles_changed, this));
+                       _outline_subtitles->bind(&TextPanel::outline_subtitles_changed, this);
                        _grid->Add (_outline_subtitles, wxGBPosition(_outline_subtitles_row, 0), wxGBSpan(1, 2));
                }
                if (!_language) {
@@ -369,11 +371,10 @@ TextPanel::dcp_track_changed ()
        optional<DCPTextTrack> track;
 
        if (_dcp_track->GetSelection() == int(_dcp_track->GetCount()) - 1) {
-               auto d = new DCPTextTrackDialog (this);
+               auto d = make_wx<DCPTextTrackDialog>(this);
                if (d->ShowModal() == wxID_OK) {
                        track = d->get();
                }
-               d->Destroy ();
        } else {
                /* Find the DCPTextTrack that was selected */
                for (auto i: _parent->film()->closed_caption_tracks()) {
@@ -734,18 +735,13 @@ TextPanel::content_selection_changed ()
 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.reset(this, _parent->film(), c.front(), c.front()->text_of_original_type(_original_type), decoder, _parent->film_viewer());
                _text_view->Show ();
        }
 }
@@ -754,15 +750,10 @@ TextPanel::text_view_clicked ()
 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 ();
 }
 
@@ -790,11 +781,10 @@ 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 ();
 }
 
 
@@ -819,13 +809,16 @@ TextPanel::try_to_load_analysis ()
        }
 
        _loading_analysis = true;
+       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;
        }
 
@@ -833,7 +826,7 @@ TextPanel::try_to_load_analysis ()
 
        if (!boost::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 ();
                        }
                }
@@ -852,21 +845,16 @@ TextPanel::try_to_load_analysis ()
                        _parent->film(), content, _analysis_finished_connection, bind(&TextPanel::analysis_finished, this)
                        );
                return;
-        }
+       }
 
        update_outline_subtitles_in_viewer ();
-       _loading_analysis = false;
-       setup_sensitivity ();
 }
 
 
 void
 TextPanel::update_outline_subtitles_in_viewer ()
 {
-       auto fv = _parent->film_viewer().lock();
-       if (!fv) {
-               return;
-       }
+       auto& fv = _parent->film_viewer();
 
        if (_analysis) {
                auto rect = _analysis->bounding_box ();
@@ -876,9 +864,9 @@ TextPanel::update_outline_subtitles_in_viewer ()
                        rect->x += content->text.front()->x_offset() - _analysis->analysis_x_offset();
                        rect->y += content->text.front()->y_offset() - _analysis->analysis_y_offset();
                }
-               fv->set_outline_subtitles (rect);
+               fv.set_outline_subtitles(rect);
        } else {
-               fv->set_outline_subtitles ({});
+               fv.set_outline_subtitles({});
        }
 }
 
@@ -898,9 +886,10 @@ TextPanel::clear_outline_subtitles ()
 void
 TextPanel::analysis_finished ()
 {
+       _loading_analysis = false;
+
        auto content = _analysis_content.lock ();
        if (!content) {
-               _loading_analysis = false;
                setup_sensitivity ();
                return;
        }
@@ -911,12 +900,10 @@ TextPanel::analysis_finished ()
                */
                error_dialog (_parent->window(), _("Could not analyse subtitles."));
                clear_outline_subtitles ();
-               _loading_analysis = false;
                setup_sensitivity ();
                return;
        }
 
-       _loading_analysis = false;
        try_to_load_analysis ();
 }