diff --git a/libs/ardour/ardour/region.h b/libs/ardour/ardour/region.h index 2b20669305..b66b3b8e7d 100644 --- a/libs/ardour/ardour/region.h +++ b/libs/ardour/ardour/region.h @@ -101,6 +101,10 @@ public: static PBD::Signal2, const PBD::PropertyChange&> RegionPropertyChanged; + static PBD::Signal2, const PBD::PropertyChange&> RegionsPropertyChanged; + + typedef std::map ChangeMap; + virtual ~Region(); /** Note: changing the name of a Region does not constitute an edit */ @@ -366,6 +370,11 @@ public: void drop_sources (); + /* Allow to collect RegionsPropertyChanged signal emissions */ + void set_changemap (ChangeMap* changemap) { + _changemap = changemap; + } + protected: virtual XMLNode& state (); @@ -478,6 +487,8 @@ private: mutable RegionEditState _first_edit; layer_t _layer; + ChangeMap* _changemap; + void register_properties (); void use_sources (SourceList const &); diff --git a/libs/ardour/playlist.cc b/libs/ardour/playlist.cc index 2dda48c08c..b4c64c88e3 100644 --- a/libs/ardour/playlist.cc +++ b/libs/ardour/playlist.cc @@ -620,11 +620,16 @@ Playlist::flush_notifications (bool from_undo) crossfade_ranges.push_back ((*r)->range ()); } + boost::shared_ptr rl (new RegionList); for (s = pending_removes.begin (); s != pending_removes.end (); ++s) { crossfade_ranges.push_back ((*s)->range ()); remove_dependents (*s); RegionRemoved (boost::weak_ptr (*s)); /* EMIT SIGNAL */ - Region::RegionPropertyChanged (*s, Properties::hidden); + rl->push_back (*s); + Region::RegionPropertyChanged (*s, Properties::hidden); // XXX remove me + } + if (rl->size () > 0) { + Region::RegionsPropertyChanged (rl, Properties::hidden); } for (s = pending_adds.begin (); s != pending_adds.end (); ++s) { diff --git a/libs/ardour/region.cc b/libs/ardour/region.cc index ddf5918889..66640a55b0 100644 --- a/libs/ardour/region.cc +++ b/libs/ardour/region.cc @@ -87,6 +87,7 @@ namespace ARDOUR { } PBD::Signal2,const PropertyChange&> Region::RegionPropertyChanged; +PBD::Signal2,const PropertyChange&> Region::RegionsPropertyChanged; void Region::make_property_quarks () @@ -262,6 +263,7 @@ Region::Region (Session& s, samplepos_t start, samplecnt_t length, const string& , _last_position (0) , _first_edit (EditChangesNothing) , _layer (0) + , _changemap (0) { register_properties (); @@ -277,6 +279,7 @@ Region::Region (const SourceList& srcs) , _last_position (0) , _first_edit (EditChangesNothing) , _layer (0) + , _changemap (0) { register_properties (); @@ -297,6 +300,7 @@ Region::Region (boost::shared_ptr other) , _last_position(other->_last_position) \ , _first_edit (EditChangesNothing) , _layer (other->_layer) + , _changemap (other->_changemap) { register_properties (); @@ -359,6 +363,7 @@ Region::Region (boost::shared_ptr other, MusicSample offset) , _last_position(other->_last_position) \ , _first_edit (EditChangesNothing) , _layer (other->_layer) + , _changemap (other->_changemap) { register_properties (); @@ -415,6 +420,7 @@ Region::Region (boost::shared_ptr other, const SourceList& srcs) , _last_position (other->_last_position) , _first_edit (EditChangesID) , _layer (other->_layer) + , _changemap (other->_changemap) { register_properties (); @@ -1490,12 +1496,20 @@ Region::send_change (const PropertyChange& what_changed) if (!Stateful::property_changes_suspended()) { /* Try and send a shared_pointer unless this is part of the constructor. - If so, do nothing. - */ + * If so, do nothing. + */ try { boost::shared_ptr rptr = shared_from_this(); - RegionPropertyChanged (rptr, what_changed); + if (_changemap) { + (*_changemap)[what_changed].push_back (rptr); + } else { + boost::shared_ptr rl (new RegionList); + rl->push_back (rptr); + RegionsPropertyChanged (rl, what_changed); + + RegionPropertyChanged (rptr, what_changed); // XXX remove me + } } catch (...) { /* no shared_ptr available, relax; */ } diff --git a/libs/ardour/thawlist.cc b/libs/ardour/thawlist.cc index cf7e110a0c..5e94477e9a 100644 --- a/libs/ardour/thawlist.cc +++ b/libs/ardour/thawlist.cc @@ -42,8 +42,16 @@ ThawList::add (boost::shared_ptr r) void ThawList::release () { + Region::ChangeMap cm; for (RegionList::iterator i = begin (); i != end (); ++i) { + (*i)->set_changemap (&cm); (*i)->resume_property_changes (); + (*i)->set_changemap (0); + } + for (Region::ChangeMap::const_iterator i = cm.begin (); i != cm.end (); ++i) { + boost::shared_ptr rl (new RegionList (i->second)); + assert (rl->size () > 0); + Region::RegionsPropertyChanged (rl, i->first); } clear (); } diff --git a/libs/ardour/track.cc b/libs/ardour/track.cc index 89321100ac..f1b3119e2b 100644 --- a/libs/ardour/track.cc +++ b/libs/ardour/track.cc @@ -662,7 +662,7 @@ Track::find_and_use_playlist (DataType dt, PBD::ID const & id) void update_region_visibility(boost::shared_ptr r) { - Region::RegionPropertyChanged(r, Properties::hidden); + Region::RegionPropertyChanged(r, Properties::hidden); // XXX remove me } @@ -683,9 +683,20 @@ Track::use_playlist (DataType dt, boost::shared_ptr p) _playlists[dt] = p; } - //allow all regions of prior and new playlists to update their visibility? - if (old) old->foreach_region(update_region_visibility); - if (p) p->foreach_region(update_region_visibility); + if (old) { + boost::shared_ptr rl (new RegionList (old->region_list_property ().rlist ())); + if (rl->size () > 0) { + Region::RegionsPropertyChanged (rl, Properties::hidden); + } + old->foreach_region(update_region_visibility); // XXX remove me + } + if (p) { + boost::shared_ptr rl (new RegionList (p->region_list_property ().rlist ())); + if (rl->size () > 0) { + Region::RegionsPropertyChanged (rl, Properties::hidden); + } + p->foreach_region(update_region_visibility); // XXX remove me + } _session.set_dirty (); PlaylistChanged (); /* EMIT SIGNAL */