Fix up confusion with relayering after movement drags in
authorCarl Hetherington <carl@carlh.net>
Tue, 27 Dec 2011 18:33:49 +0000 (18:33 +0000)
committerCarl Hetherington <carl@carlh.net>
Tue, 27 Dec 2011 18:33:49 +0000 (18:33 +0000)
overlaid mode.

git-svn-id: svn://localhost/ardour2/branches/3.0@11092 d708f5d6-7413-0410-9779-e7cbd77b26cf

gtk2_ardour/editor_drag.cc
libs/ardour/ardour/playlist.h

index 06f602d5a0c803227794c7a41c1f04bf40f9e982..bb59a4ad24ed9d38a07d1ce078047a9459541788 100644 (file)
@@ -961,9 +961,9 @@ RegionMoveDrag::finished_no_copy (
        RegionSelection new_views;
        PlaylistSet modified_playlists;
        PlaylistSet frozen_playlists;
-       PlaylistSet relayer_suspended_playlists;
 
-       list<pair<boost::shared_ptr<Region>, double> > pending_relayers;
+       list<pair<boost::shared_ptr<Region>, double> > pending_explicit_relayers;
+       Playlist::RegionList pending_implicit_relayers;
 
        if (_brushing) {
                /* all changes were made during motion event handlers */
@@ -1045,7 +1045,9 @@ RegionMoveDrag::finished_no_copy (
                        bool const explicit_relayer = dest_rtv->view()->layer_display() == Stacked || dest_rtv->view()->layer_display() == Expanded;
                        
                        if (explicit_relayer) {
-                               pending_relayers.push_back (make_pair (rv->region (), dest_layer));
+                               pending_explicit_relayers.push_back (make_pair (rv->region (), dest_layer));
+                       } else {
+                               pending_implicit_relayers.push_back (rv->region ());
                        }
 
                        /* freeze playlist to avoid lots of relayering in the case of a multi-region drag */
@@ -1054,6 +1056,7 @@ RegionMoveDrag::finished_no_copy (
 
                        if (r.second) {
                                playlist->freeze ();
+                               playlist->suspend_relayer ();
                        }
 
                        /* this movement may result in a crossfade being modified, so we need to get undo
@@ -1065,9 +1068,6 @@ RegionMoveDrag::finished_no_copy (
                                playlist->clear_changes ();
                        }
 
-                       relayer_suspended_playlists.insert (playlist);
-                       playlist->suspend_relayer ();
-
                        rv->region()->set_position (where);
 
                        _editor->session()->add_command (new StatefulDiffCommand (rv->region()));
@@ -1112,18 +1112,24 @@ RegionMoveDrag::finished_no_copy (
                _editor->selection->set (new_views);
        }
 
+       /* We can't use the normal mechanism for relayering, as some regions may require an explicit relayer
+          rather than an implicit one.  So we thaw before resuming relayering, then do the relayers
+          that we require.
+       */
+
        for (PlaylistSet::iterator p = frozen_playlists.begin(); p != frozen_playlists.end(); ++p) {
                (*p)->thaw();
-       }
-
-       for (PlaylistSet::iterator p = relayer_suspended_playlists.begin(); p != relayer_suspended_playlists.end(); ++p) {
                (*p)->resume_relayer ();
        }
-       
-       for (list<pair<boost::shared_ptr<Region>, double> >::iterator i = pending_relayers.begin(); i != pending_relayers.end(); ++i) {
+
+       for (list<pair<boost::shared_ptr<Region>, double> >::iterator i = pending_explicit_relayers.begin(); i != pending_explicit_relayers.end(); ++i) {
                i->first->playlist()->relayer (i->first, i->second);
        }
 
+       for (Playlist::RegionList::iterator i = pending_implicit_relayers.begin(); i != pending_implicit_relayers.end(); ++i) {
+               (*i)->playlist()->relayer (*i);
+       }
+       
        /* write commands for the accumulated diffs for all our modified playlists */
        add_stateful_diff_commands_for_playlists (modified_playlists);
 
index f3bf11458d0259b9639125ad16b9e6e4847eb3c2..9ad40e6eb91d35bdbc5c2f8b351d5e692784ec65 100644 (file)
@@ -225,6 +225,7 @@ public:
        framepos_t find_next_top_layer_position (framepos_t) const;
        uint32_t combine_ops() const { return _combine_ops; }
 
+       void relayer (boost::shared_ptr<Region>);
        void relayer (boost::shared_ptr<Region>, double);
        void suspend_relayer ();
        void resume_relayer ();
@@ -355,7 +356,6 @@ public:
        boost::shared_ptr<Playlist> cut (framepos_t start, framecnt_t cnt, bool result_is_hidden);
        boost::shared_ptr<Playlist> copy (framepos_t start, framecnt_t cnt, bool result_is_hidden);
 
-       void relayer (boost::shared_ptr<Region>);
        void relayer (RegionList const &);
 
        void begin_undo ();