Improve hints dialog in various ways, especially with long projects (#1439).
authorCarl Hetherington <cth@carlh.net>
Sun, 6 Jan 2019 19:49:37 +0000 (19:49 +0000)
committerCarl Hetherington <cth@carlh.net>
Sun, 6 Jan 2019 19:49:37 +0000 (19:49 +0000)
ChangeLog
src/lib/hints.cc
src/lib/hints.h
src/wx/hints_dialog.cc
src/wx/hints_dialog.h

index 1f87ca8..6b4528e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,7 @@
 2019-01-06  Carl Hetherington  <cth@carlh.net>
 
+       * Improve behaviour of hints dialog with long projects (#1439).
+
        * Fix incorrect video waveform display (#1425).
 
 2019-01-05  Carl Hetherington  <cth@carlh.net>
index 1856269..d961b1a 100644 (file)
@@ -56,6 +56,7 @@ Hints::Hints (weak_ptr<const Film> film)
        , _long_ccap (false)
        , _overlap_ccap (false)
        , _too_many_ccap_lines (false)
+       , _stop (false)
 {
 
 }
@@ -65,6 +66,10 @@ Hints::stop_thread ()
 {
        if (_thread) {
                try {
+                       {
+                               boost::mutex::scoped_lock lm (_mutex);
+                               _stop = true;
+                       }
                        _thread->interrupt ();
                        _thread->join ();
                } catch (...) {
@@ -88,6 +93,7 @@ Hints::start ()
        _long_ccap = false;
        _overlap_ccap = false;
        _too_many_ccap_lines = false;
+       _stop = false;
        _thread = new boost::thread (bind(&Hints::thread, this));
 }
 
@@ -267,8 +273,24 @@ Hints::thread ()
        player->set_ignore_video ();
        player->set_ignore_audio ();
        player->Text.connect (bind(&Hints::text, this, _1, _2, _4));
-       while (!player->pass ()) {
-               bind (boost::ref(Pulse));
+
+       struct timeval last_pulse;
+       gettimeofday (&last_pulse, 0);
+
+       while (!player->pass()) {
+
+               struct timeval now;
+               gettimeofday (&now, 0);
+               if ((seconds(now) - seconds(last_pulse)) > 1) {
+                       {
+                               boost::mutex::scoped_lock lm (_mutex);
+                               if (_stop) {
+                                       break;
+                               }
+                       }
+                       emit (bind (boost::ref(Pulse)));
+                       last_pulse = now;
+               }
        }
 
        emit (bind(boost::ref(Finished)));
index b8bc806..35e3618 100644 (file)
@@ -56,4 +56,7 @@ private:
        bool _overlap_ccap;
        bool _too_many_ccap_lines;
        boost::optional<DCPTimePeriod> _last;
+
+       boost::mutex _mutex;
+       bool _stop;
 };
index 099b313..18e8a6f 100644 (file)
@@ -41,6 +41,7 @@ HintsDialog::HintsDialog (wxWindow* parent, boost::weak_ptr<Film> film, bool ok)
        : wxDialog (parent, wxID_ANY, _("Hints"))
        , _film (film)
        , _hints (new Hints (film))
+       , _finished (false)
 {
        wxBoxSizer* sizer = new wxBoxSizer (wxVERTICAL);
 
@@ -109,6 +110,7 @@ HintsDialog::film_change (ChangeType type)
        Layout ();
        _gauge->SetValue (0);
        update ();
+       _finished = false;
        _hints->start ();
 }
 
@@ -123,7 +125,11 @@ HintsDialog::update ()
 {
        _text->Clear ();
        if (_current.empty ()) {
-               _text->WriteText (_("There are no hints: everything looks good!"));
+               if (_finished) {
+                       _text->WriteText (_("There are no hints: everything looks good!"));
+               } else {
+                       _text->WriteText (_("There are no hints yet: project check in progress."));
+               }
        } else {
                _text->BeginStandardBullet (N_("standard/circle"), 1, 50);
                BOOST_FOREACH (string i, _current) {
@@ -156,6 +162,8 @@ HintsDialog::pulse ()
 void
 HintsDialog::finished ()
 {
+       _finished = true;
+       update ();
        _gauge->Hide ();
        _gauge_message->Hide ();
        Layout ();
index 2755c70..709587a 100644 (file)
@@ -48,6 +48,7 @@ private:
        wxRichTextCtrl* _text;
        boost::shared_ptr<Hints> _hints;
        std::list<std::string> _current;
+       bool _finished;
 
        boost::signals2::scoped_connection _film_change_connection;
        boost::signals2::scoped_connection _film_content_change_connection;