Consolidate RegionsPropertyChanged signal emission (1/3)
This prepares to combine multiple RegionPropertyChanged signals (potentially thousands) into a single signal.
This commit is contained in:
parent
5af480083c
commit
2ff8f5a5de
@ -101,6 +101,10 @@ public:
|
||||
|
||||
static PBD::Signal2<void,boost::shared_ptr<ARDOUR::Region>, const PBD::PropertyChange&> RegionPropertyChanged;
|
||||
|
||||
static PBD::Signal2<void,boost::shared_ptr<RegionList>, const PBD::PropertyChange&> RegionsPropertyChanged;
|
||||
|
||||
typedef std::map <PBD::PropertyChange, RegionList> 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 &);
|
||||
|
@ -620,11 +620,16 @@ Playlist::flush_notifications (bool from_undo)
|
||||
crossfade_ranges.push_back ((*r)->range ());
|
||||
}
|
||||
|
||||
boost::shared_ptr<RegionList> 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<Region> (*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) {
|
||||
|
@ -87,6 +87,7 @@ namespace ARDOUR {
|
||||
}
|
||||
|
||||
PBD::Signal2<void,boost::shared_ptr<ARDOUR::Region>,const PropertyChange&> Region::RegionPropertyChanged;
|
||||
PBD::Signal2<void,boost::shared_ptr<ARDOUR::RegionList>,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<const Region> 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<const Region> 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<const Region> 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<Region> rptr = shared_from_this();
|
||||
RegionPropertyChanged (rptr, what_changed);
|
||||
if (_changemap) {
|
||||
(*_changemap)[what_changed].push_back (rptr);
|
||||
} else {
|
||||
boost::shared_ptr<RegionList> rl (new RegionList);
|
||||
rl->push_back (rptr);
|
||||
RegionsPropertyChanged (rl, what_changed);
|
||||
|
||||
RegionPropertyChanged (rptr, what_changed); // XXX remove me
|
||||
}
|
||||
} catch (...) {
|
||||
/* no shared_ptr available, relax; */
|
||||
}
|
||||
|
@ -42,8 +42,16 @@ ThawList::add (boost::shared_ptr<Region> 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<RegionList> rl (new RegionList (i->second));
|
||||
assert (rl->size () > 0);
|
||||
Region::RegionsPropertyChanged (rl, i->first);
|
||||
}
|
||||
clear ();
|
||||
}
|
||||
|
@ -662,7 +662,7 @@ Track::find_and_use_playlist (DataType dt, PBD::ID const & id)
|
||||
void
|
||||
update_region_visibility(boost::shared_ptr<Region> 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<Playlist> 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<RegionList> 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<RegionList> 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 */
|
||||
|
Loading…
Reference in New Issue
Block a user