mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-07 07:14:56 +01:00
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
5 changed files with 57 additions and 8 deletions
|
|
@ -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<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();
|
virtual ~Region();
|
||||||
|
|
||||||
/** Note: changing the name of a Region does not constitute an edit */
|
/** Note: changing the name of a Region does not constitute an edit */
|
||||||
|
|
@ -366,6 +370,11 @@ public:
|
||||||
|
|
||||||
void drop_sources ();
|
void drop_sources ();
|
||||||
|
|
||||||
|
/* Allow to collect RegionsPropertyChanged signal emissions */
|
||||||
|
void set_changemap (ChangeMap* changemap) {
|
||||||
|
_changemap = changemap;
|
||||||
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual XMLNode& state ();
|
virtual XMLNode& state ();
|
||||||
|
|
||||||
|
|
@ -478,6 +487,8 @@ private:
|
||||||
mutable RegionEditState _first_edit;
|
mutable RegionEditState _first_edit;
|
||||||
layer_t _layer;
|
layer_t _layer;
|
||||||
|
|
||||||
|
ChangeMap* _changemap;
|
||||||
|
|
||||||
void register_properties ();
|
void register_properties ();
|
||||||
|
|
||||||
void use_sources (SourceList const &);
|
void use_sources (SourceList const &);
|
||||||
|
|
|
||||||
|
|
@ -620,11 +620,16 @@ Playlist::flush_notifications (bool from_undo)
|
||||||
crossfade_ranges.push_back ((*r)->range ());
|
crossfade_ranges.push_back ((*r)->range ());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
boost::shared_ptr<RegionList> rl (new RegionList);
|
||||||
for (s = pending_removes.begin (); s != pending_removes.end (); ++s) {
|
for (s = pending_removes.begin (); s != pending_removes.end (); ++s) {
|
||||||
crossfade_ranges.push_back ((*s)->range ());
|
crossfade_ranges.push_back ((*s)->range ());
|
||||||
remove_dependents (*s);
|
remove_dependents (*s);
|
||||||
RegionRemoved (boost::weak_ptr<Region> (*s)); /* EMIT SIGNAL */
|
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) {
|
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::Region>,const PropertyChange&> Region::RegionPropertyChanged;
|
||||||
|
PBD::Signal2<void,boost::shared_ptr<ARDOUR::RegionList>,const PropertyChange&> Region::RegionsPropertyChanged;
|
||||||
|
|
||||||
void
|
void
|
||||||
Region::make_property_quarks ()
|
Region::make_property_quarks ()
|
||||||
|
|
@ -262,6 +263,7 @@ Region::Region (Session& s, samplepos_t start, samplecnt_t length, const string&
|
||||||
, _last_position (0)
|
, _last_position (0)
|
||||||
, _first_edit (EditChangesNothing)
|
, _first_edit (EditChangesNothing)
|
||||||
, _layer (0)
|
, _layer (0)
|
||||||
|
, _changemap (0)
|
||||||
{
|
{
|
||||||
register_properties ();
|
register_properties ();
|
||||||
|
|
||||||
|
|
@ -277,6 +279,7 @@ Region::Region (const SourceList& srcs)
|
||||||
, _last_position (0)
|
, _last_position (0)
|
||||||
, _first_edit (EditChangesNothing)
|
, _first_edit (EditChangesNothing)
|
||||||
, _layer (0)
|
, _layer (0)
|
||||||
|
, _changemap (0)
|
||||||
{
|
{
|
||||||
register_properties ();
|
register_properties ();
|
||||||
|
|
||||||
|
|
@ -297,6 +300,7 @@ Region::Region (boost::shared_ptr<const Region> other)
|
||||||
, _last_position(other->_last_position) \
|
, _last_position(other->_last_position) \
|
||||||
, _first_edit (EditChangesNothing)
|
, _first_edit (EditChangesNothing)
|
||||||
, _layer (other->_layer)
|
, _layer (other->_layer)
|
||||||
|
, _changemap (other->_changemap)
|
||||||
{
|
{
|
||||||
register_properties ();
|
register_properties ();
|
||||||
|
|
||||||
|
|
@ -359,6 +363,7 @@ Region::Region (boost::shared_ptr<const Region> other, MusicSample offset)
|
||||||
, _last_position(other->_last_position) \
|
, _last_position(other->_last_position) \
|
||||||
, _first_edit (EditChangesNothing)
|
, _first_edit (EditChangesNothing)
|
||||||
, _layer (other->_layer)
|
, _layer (other->_layer)
|
||||||
|
, _changemap (other->_changemap)
|
||||||
{
|
{
|
||||||
register_properties ();
|
register_properties ();
|
||||||
|
|
||||||
|
|
@ -415,6 +420,7 @@ Region::Region (boost::shared_ptr<const Region> other, const SourceList& srcs)
|
||||||
, _last_position (other->_last_position)
|
, _last_position (other->_last_position)
|
||||||
, _first_edit (EditChangesID)
|
, _first_edit (EditChangesID)
|
||||||
, _layer (other->_layer)
|
, _layer (other->_layer)
|
||||||
|
, _changemap (other->_changemap)
|
||||||
{
|
{
|
||||||
register_properties ();
|
register_properties ();
|
||||||
|
|
||||||
|
|
@ -1490,12 +1496,20 @@ Region::send_change (const PropertyChange& what_changed)
|
||||||
if (!Stateful::property_changes_suspended()) {
|
if (!Stateful::property_changes_suspended()) {
|
||||||
|
|
||||||
/* Try and send a shared_pointer unless this is part of the constructor.
|
/* Try and send a shared_pointer unless this is part of the constructor.
|
||||||
If so, do nothing.
|
* If so, do nothing.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
try {
|
try {
|
||||||
boost::shared_ptr<Region> rptr = shared_from_this();
|
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 (...) {
|
} catch (...) {
|
||||||
/* no shared_ptr available, relax; */
|
/* no shared_ptr available, relax; */
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -42,8 +42,16 @@ ThawList::add (boost::shared_ptr<Region> r)
|
||||||
void
|
void
|
||||||
ThawList::release ()
|
ThawList::release ()
|
||||||
{
|
{
|
||||||
|
Region::ChangeMap cm;
|
||||||
for (RegionList::iterator i = begin (); i != end (); ++i) {
|
for (RegionList::iterator i = begin (); i != end (); ++i) {
|
||||||
|
(*i)->set_changemap (&cm);
|
||||||
(*i)->resume_property_changes ();
|
(*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 ();
|
clear ();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -662,7 +662,7 @@ Track::find_and_use_playlist (DataType dt, PBD::ID const & id)
|
||||||
void
|
void
|
||||||
update_region_visibility(boost::shared_ptr<Region> r)
|
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;
|
_playlists[dt] = p;
|
||||||
}
|
}
|
||||||
|
|
||||||
//allow all regions of prior and new playlists to update their visibility?
|
if (old) {
|
||||||
if (old) old->foreach_region(update_region_visibility);
|
boost::shared_ptr<RegionList> rl (new RegionList (old->region_list_property ().rlist ()));
|
||||||
if (p) p->foreach_region(update_region_visibility);
|
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 ();
|
_session.set_dirty ();
|
||||||
PlaylistChanged (); /* EMIT SIGNAL */
|
PlaylistChanged (); /* EMIT SIGNAL */
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue