Similar pending/done for Film::Change.
authorCarl Hetherington <cth@carlh.net>
Sun, 19 Aug 2018 12:55:46 +0000 (13:55 +0100)
committerCarl Hetherington <cth@carlh.net>
Sun, 19 Aug 2018 12:55:46 +0000 (13:55 +0100)
15 files changed:
src/lib/film.cc
src/lib/film.h
src/lib/player.cc
src/lib/player.h
src/tools/dcpomatic.cc
src/wx/film_editor.cc
src/wx/film_editor.h
src/wx/film_viewer.cc
src/wx/film_viewer.h
src/wx/hints_dialog.cc
src/wx/hints_dialog.h
src/wx/timeline.cc
src/wx/timeline.h
src/wx/timeline_dialog.cc
src/wx/timeline_dialog.h

index 846e8ac51cd2c48f12c110a2c4c98d0249fc929b..eaaa611afdbe52a762ccd957fd79f7d3c0c03508 100644 (file)
@@ -938,19 +938,28 @@ Film::signal_changed (Property p)
 {
        _dirty = true;
 
+       Change (CHANGE_TYPE_PENDING, p);
+       bool changed = false;
+
        switch (p) {
        case Film::CONTENT:
                set_video_frame_rate (_playlist->best_video_frame_rate ());
+               changed = true;
                break;
        case Film::VIDEO_FRAME_RATE:
        case Film::SEQUENCE:
                _playlist->maybe_sequence ();
+               changed = true;
                break;
        default:
                break;
        }
 
-       emit (boost::bind (boost::ref (Changed), p));
+       if (changed) {
+               emit (boost::bind (boost::ref (Change), CHANGE_TYPE_DONE, p));
+       } else {
+               Change (CHANGE_TYPE_CANCELLED, p);
+       }
 }
 
 void
index c6c8403cb793d9245a53b39e7c8ae388c7aa0b08..649768c7a620141c0ddb6d4ed7040d2c98b4fef4 100644 (file)
@@ -323,8 +323,8 @@ public:
        void set_reel_length (int64_t);
        void set_upload_after_make_dcp (bool);
 
-       /** Emitted when some property has of the Film has changed */
-       mutable boost::signals2::signal<void (Property)> Changed;
+       /** Emitted when some property has of the Film is about to change or has changed */
+       mutable boost::signals2::signal<void (ChangeType, Property)> Change;
 
        /** Emitted when some property of our content has changed */
        mutable boost::signals2::signal<void (ChangeType, boost::weak_ptr<Content>, int, bool)> ContentChange;
index 0c3aea0288ef057f531ef315333a01277c945655..dae0d23d667516f12d8bada80d1caaee82dcae36 100644 (file)
@@ -97,12 +97,12 @@ Player::Player (shared_ptr<const Film> film, shared_ptr<const Playlist> playlist
        , _audio_merger (_film->audio_frame_rate())
        , _shuffler (0)
 {
-       _film_changed_connection = _film->Changed.connect (bind (&Player::film_changed, this, _1));
+       _film_changed_connection = _film->Change.connect (bind (&Player::film_change, this, _1, _2));
        _playlist_change_connection = _playlist->Change.connect (bind (&Player::playlist_change, this, _1));
        _playlist_content_change_connection = _playlist->ContentChange.connect (bind(&Player::playlist_content_change, this, _1, _3, _4));
        set_video_container_size (_film->frame_size ());
 
-       film_changed (Film::AUDIO_PROCESSOR);
+       film_change (CHANGE_TYPE_DONE, Film::AUDIO_PROCESSOR);
 
        setup_pieces ();
        seek (DCPTime (), true);
@@ -268,7 +268,7 @@ Player::playlist_change (ChangeType type)
 }
 
 void
-Player::film_changed (Film::Property p)
+Player::film_change (ChangeType type, Film::Property p)
 {
        /* Here we should notice Film properties that affect our output, and
           alert listeners that our output now would be different to how it was
@@ -276,22 +276,25 @@ Player::film_changed (Film::Property p)
        */
 
        if (p == Film::CONTAINER) {
-               Change (CHANGE_TYPE_PENDING, PlayerProperty::FILM_CONTAINER, false);
+               Change (type, PlayerProperty::FILM_CONTAINER, false);
        } else if (p == Film::VIDEO_FRAME_RATE) {
                /* Pieces contain a FrameRateChange which contains the DCP frame rate,
                   so we need new pieces here.
                */
-               /* XXX: missing PENDING! */
-               setup_pieces ();
-               Change (CHANGE_TYPE_DONE, PlayerProperty::FILM_VIDEO_FRAME_RATE, false);
+               if (type == CHANGE_TYPE_DONE) {
+                       setup_pieces ();
+               }
+               Change (type, PlayerProperty::FILM_VIDEO_FRAME_RATE, false);
        } else if (p == Film::AUDIO_PROCESSOR) {
-               if (_film->audio_processor ()) {
+               if (type == CHANGE_TYPE_DONE && _film->audio_processor ()) {
                        boost::mutex::scoped_lock lm (_mutex);
                        _audio_processor = _film->audio_processor()->clone (_film->audio_frame_rate ());
                }
        } else if (p == Film::AUDIO_CHANNELS) {
-               boost::mutex::scoped_lock lm (_mutex);
-               _audio_merger.clear ();
+               if (type == CHANGE_TYPE_DONE) {
+                       boost::mutex::scoped_lock lm (_mutex);
+                       _audio_merger.clear ();
+               }
        }
 }
 
index 1658207996c2a903020bac44844eaf5d8b0546e8..e17456cf2d87838861404484822c523e2f47612b 100644 (file)
@@ -112,7 +112,7 @@ private:
        void setup_pieces ();
        void setup_pieces_unlocked ();
        void flush ();
-       void film_changed (Film::Property);
+       void film_change (ChangeType, Film::Property);
        void playlist_change (ChangeType);
        void playlist_content_change (ChangeType, int, bool);
        std::list<PositionImage> transform_bitmap_texts (std::list<BitmapText>) const;
index 6972b35c4e1ac097a781bee3dacaf2fe481add6c..7ae6b1c72a707aeb335fc0a504537d0c83984354 100644 (file)
@@ -434,7 +434,7 @@ public:
                if (_film->directory()) {
                        Config::instance()->add_to_history (_film->directory().get());
                }
-               _film->Changed.connect (boost::bind (&DOMFrame::set_menu_sensitivity, this));
+               _film->Change.connect (boost::bind (&DOMFrame::film_change, this, _1));
        }
 
        shared_ptr<Film> film () const {
@@ -443,6 +443,13 @@ public:
 
 private:
 
+       void film_change (ChangeType type)
+       {
+               if (type == CHANGE_TYPE_DONE) {
+                       set_menu_sensitivity ();
+               }
+       }
+
        void file_changed (boost::filesystem::path f)
        {
                string s = wx_to_std (_("DCP-o-matic"));
index 1c1c02f5b4cfc9532e79741750f731894d1f6ba4..cbdbe0f36626592dbddbcdacd6bc8bb3c1ab44fd 100644 (file)
@@ -68,8 +68,12 @@ FilmEditor::FilmEditor (wxWindow* parent, FilmViewer* viewer)
  *  @param p Property of the Film that has changed.
  */
 void
-FilmEditor::film_changed (Film::Property p)
+FilmEditor::film_change (ChangeType type, Film::Property p)
 {
+       if (type != CHANGE_TYPE_DONE) {
+               return;
+       }
+
        ensure_ui_thread ();
 
        if (!_film) {
@@ -121,7 +125,7 @@ FilmEditor::set_film (shared_ptr<Film> film)
        _dcp_panel->set_film (_film);
 
        if (_film) {
-               _film->Changed.connect (bind (&FilmEditor::film_changed, this, _1));
+               _film->Change.connect (bind (&FilmEditor::film_change, this, _1, _2));
                _film->ContentChange.connect (bind (&FilmEditor::film_content_change, this, _1, _3));
        }
 
index cd2180b3c3d297cae87019f6835b4c86c28393ee..cbc8f92bee0b0b64245e706c0ed5d33ce1d28af2 100644 (file)
@@ -56,7 +56,7 @@ public:
        }
 
        /* Handle changes to the model */
-       void film_changed (Film::Property);
+       void film_change (ChangeType, Film::Property);
        void film_content_change (ChangeType type, int);
 
        void set_general_sensitivity (bool);
index 463854992f16347c875e738565d74221501b65e1..a5e1577fee1ac70679c5659edbec29f1ead52156 100644 (file)
@@ -224,7 +224,7 @@ FilmViewer::set_film (shared_ptr<Film> film)
        _player->set_always_burn_open_subtitles ();
        _player->set_play_referenced ();
 
-       _film->Changed.connect (boost::bind (&FilmViewer::film_changed, this, _1));
+       _film->Change.connect (boost::bind (&FilmViewer::film_change, this, _1, _2));
        _player->Change.connect (boost::bind (&FilmViewer::player_change, this, _1, _2, _3));
 
        /* Keep about 1 second's worth of history samples */
@@ -720,8 +720,12 @@ FilmViewer::setup_sensitivity ()
 }
 
 void
-FilmViewer::film_changed (Film::Property p)
+FilmViewer::film_change (ChangeType type, Film::Property p)
 {
+       if (type != CHANGE_TYPE_DONE) {
+               return;
+       }
+
        if (p == Film::CONTENT || p == Film::THREE_D) {
                setup_sensitivity ();
        } else if (p == Film::AUDIO_CHANNELS) {
index d6d9a99a82b38e95dd7622f470ef2ded524f7656..0e7da10b1a948d527c3cb339e560df153d65d12a 100644 (file)
@@ -105,7 +105,7 @@ private:
        void seek (DCPTime t, bool accurate);
        void refresh_panel ();
        void setup_sensitivity ();
-       void film_changed (Film::Property);
+       void film_change (ChangeType, Film::Property);
        DCPTime nudge_amount (wxKeyboardState &);
        void timecode_clicked ();
        void frame_number_clicked ();
index 3872ea8ae2a281772df3ee667b4fecbf075b67a7..cbd48ec36c3b60fdfd51c2d4d45ba7ffd887c8af 100644 (file)
@@ -75,8 +75,8 @@ HintsDialog::HintsDialog (wxWindow* parent, boost::weak_ptr<Film> film, bool ok)
 
        boost::shared_ptr<Film> locked_film = _film.lock ();
        if (locked_film) {
-               _film_changed_connection = locked_film->Changed.connect (boost::bind (&HintsDialog::film_changed, this));
-               _film_content_changed_connection = locked_film->ContentChange.connect (boost::bind (&HintsDialog::film_content_change, this, _1));
+               _film_change_connection = locked_film->Change.connect (boost::bind (&HintsDialog::film_change, this, _1));
+               _film_content_change_connection = locked_film->ContentChange.connect (boost::bind (&HintsDialog::film_content_change, this, _1));
        }
 
        _hints->Hint.connect (bind (&HintsDialog::hint, this, _1));
@@ -84,12 +84,16 @@ HintsDialog::HintsDialog (wxWindow* parent, boost::weak_ptr<Film> film, bool ok)
        _hints->Pulse.connect (bind (&HintsDialog::pulse, this));
        _hints->Finished.connect (bind (&HintsDialog::finished, this));
 
-       film_changed ();
+       film_change (CHANGE_TYPE_DONE);
 }
 
 void
-HintsDialog::film_changed ()
+HintsDialog::film_change (ChangeType type)
 {
+       if (type != CHANGE_TYPE_DONE) {
+               return;
+       }
+
        _text->Clear ();
        _current.clear ();
 
@@ -109,9 +113,7 @@ HintsDialog::film_changed ()
 void
 HintsDialog::film_content_change (ChangeType type)
 {
-       if (type == CHANGE_TYPE_DONE) {
-               film_changed ();
-       }
+       film_change (type);
 }
 
 void
index 83510643a3be2264a54766efafbe7549a098aad2..2755c70fdf8f8f9c47b9a6e047a3828dc8f5d2b4 100644 (file)
@@ -33,7 +33,7 @@ public:
        HintsDialog (wxWindow* parent, boost::weak_ptr<Film>, bool ok);
 
 private:
-       void film_changed ();
+       void film_change (ChangeType);
        void film_content_change (ChangeType type);
        void shut_up (wxCommandEvent& ev);
        void update ();
@@ -49,6 +49,6 @@ private:
        boost::shared_ptr<Hints> _hints;
        std::list<std::string> _current;
 
-       boost::signals2::scoped_connection _film_changed_connection;
-       boost::signals2::scoped_connection _film_content_changed_connection;
+       boost::signals2::scoped_connection _film_change_connection;
+       boost::signals2::scoped_connection _film_content_change_connection;
 };
index 7353baf82c7b8b94ffc5279d4b681bae0ef99bda..0231bc400de29838f06d28f9108c014a81d58158 100644 (file)
@@ -105,11 +105,11 @@ Timeline::Timeline (wxWindow* parent, ContentPanel* cp, shared_ptr<Film> film)
        _main_canvas->Bind   (wxEVT_SCROLLWIN_PAGEDOWN,   boost::bind (&Timeline::scrolled,     this, _1));
        _main_canvas->Bind   (wxEVT_SCROLLWIN_THUMBTRACK, boost::bind (&Timeline::scrolled,     this, _1));
 
-       film_changed (Film::CONTENT);
+       film_change (CHANGE_TYPE_DONE, Film::CONTENT);
 
        SetMinSize (wxSize (640, 4 * pixels_per_track() + 96));
 
-       _film_changed_connection = film->Changed.connect (bind (&Timeline::film_changed, this, _1));
+       _film_changed_connection = film->Change.connect (bind (&Timeline::film_change, this, _1, _2));
        _film_content_change_connection = film->ContentChange.connect (bind (&Timeline::film_content_change, this, _1, _3, _4));
 
        setup_scrollbars ();
@@ -197,8 +197,12 @@ Timeline::paint_main ()
 }
 
 void
-Timeline::film_changed (Film::Property p)
+Timeline::film_change (ChangeType type, Film::Property p)
 {
+       if (type != CHANGE_TYPE_DONE) {
+               return;
+       }
+
        if (p == Film::CONTENT || p == Film::REEL_TYPE || p == Film::REEL_LENGTH) {
                ensure_ui_thread ();
                recreate_views ();
index 9f3a4a47b6a7ead9aa7f4ac003cabc70fadc21f3..89fd941790b5265ea5d0ad5a2bc605c586488c3f 100644 (file)
@@ -91,7 +91,7 @@ private:
        void mouse_moved (wxMouseEvent &);
        void mouse_moved_select (wxMouseEvent &);
        void mouse_moved_zoom (wxMouseEvent &);
-       void film_changed (Film::Property);
+       void film_change (ChangeType type, Film::Property);
        void film_content_change (ChangeType type, int, bool frequent);
        void resized ();
        void assign_tracks ();
index d2194f5c750b16e09bbd7680c97809bfc3940fbd..050f900534f7431e64724e4af2038985f36709e9 100644 (file)
@@ -87,9 +87,9 @@ TimelineDialog::TimelineDialog (ContentPanel* cp, shared_ptr<Film> film)
        sizer->SetSizeHints (this);
 
         _toolbar->ToggleTool ((int) Timeline::SNAP, _timeline.snap ());
-       film_changed (Film::SEQUENCE);
+       film_change (CHANGE_TYPE_DONE, Film::SEQUENCE);
 
-       _film_changed_connection = film->Changed.connect (bind (&TimelineDialog::film_changed, this, _1));
+       _film_changed_connection = film->Change.connect (bind (&TimelineDialog::film_change, this, _1, _2));
 }
 
 wxString
@@ -100,8 +100,12 @@ TimelineDialog::bitmap_path (string name)
 }
 
 void
-TimelineDialog::film_changed (Film::Property p)
+TimelineDialog::film_change (ChangeType type, Film::Property p)
 {
+       if (type != CHANGE_TYPE_DONE) {
+               return;
+       }
+
        shared_ptr<Film> film = _film.lock ();
        if (!film) {
                return;
index b7aaba14d92e16839968d4e20c386e637ec63597..1aff36c8ccb629395cee4c46c2e20d41022fda4d 100644 (file)
@@ -33,7 +33,7 @@ public:
        void set_selection (ContentList selection);
 
 private:
-       void film_changed (Film::Property);
+       void film_change (ChangeType type, Film::Property);
        void tool_clicked (wxCommandEvent& id);
        wxString bitmap_path (std::string name);