Move some RegionListProperty methods up to SequenceProperty.

git-svn-id: svn://localhost/ardour2/branches/3.0@7668 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Carl Hetherington 2010-08-22 23:53:00 +00:00
parent 71a4796dc3
commit 74801c3212
3 changed files with 50 additions and 46 deletions

View file

@ -65,22 +65,13 @@ class RegionListProperty : public PBD::SequenceProperty<std::list<boost::shared_
RegionListProperty (Playlist&); RegionListProperty (Playlist&);
boost::shared_ptr<Region> lookup_id (const PBD::ID& id); boost::shared_ptr<Region> lookup_id (const PBD::ID& id);
void diff (PBD::PropertyList& undo, PBD::PropertyList& redo, Command*) const;
bool involves (boost::shared_ptr<Region>);
private: private:
friend class Playlist; PBD::SequenceProperty<std::list<boost::shared_ptr<Region> > >* create () const;
std::list<boost::shared_ptr<Region> > rlist() { return _val; }
friend class Playlist;
/* we live and die with our playlist, no lifetime management needed */ /* we live and die with our playlist, no lifetime management needed */
Playlist& _playlist; Playlist& _playlist;
/* create a copy of this RegionListProperty that only
has what is needed for use in a history list command. This
means that it won't contain the actual region list but
will have the added/removed list.
*/
RegionListProperty* copy_for_history () const;
}; };
class Playlist : public SessionObject class Playlist : public SessionObject

View file

@ -124,41 +124,9 @@ RegionListProperty::lookup_id (const ID& id)
return ret; return ret;
} }
RegionListProperty* SequenceProperty<std::list<boost::shared_ptr<Region> > >* RegionListProperty::create () const
RegionListProperty::copy_for_history () const
{ {
RegionListProperty* copy = new RegionListProperty (_playlist); return new RegionListProperty (_playlist);
/* this is all we need */
copy->_change = _change;
return copy;
}
void
RegionListProperty::diff (PropertyList& undo, PropertyList& redo, Command* cmd) const
{
if (changed()) {
/* list of the removed/added regions since clear_history() was last called */
RegionListProperty* a = copy_for_history ();
/* the same list, but with removed/added lists swapped (for undo purposes) */
RegionListProperty* b = copy_for_history ();
b->invert_changes ();
if (cmd) {
/* whenever one of the regions emits DropReferences, make sure
that the Destructible we've been told to notify hears about
it. the Destructible is likely to be the Command being built
with this diff().
*/
for (set<boost::shared_ptr<Region> >::iterator i = a->change().added.begin(); i != a->change().added.end(); ++i) {
(*i)->DropReferences.connect_same_thread (*cmd, boost::bind (&Destructible::drop_references, cmd));
}
}
undo.add (b);
redo.add (a);
}
} }
Playlist::Playlist (Session& sess, string nom, DataType type, bool hide) Playlist::Playlist (Session& sess, string nom, DataType type, bool hide)

View file

@ -30,6 +30,7 @@
#include "pbd/convert.h" #include "pbd/convert.h"
#include "pbd/id.h" #include "pbd/id.h"
#include "pbd/property_basics.h" #include "pbd/property_basics.h"
#include "pbd/property_list.h"
namespace PBD { namespace PBD {
@ -193,6 +194,34 @@ class SequenceProperty : public PropertyBase
_update_callback (cr); _update_callback (cr);
} }
void diff (PBD::PropertyList& undo, PBD::PropertyList& redo, Command* cmd) const {
if (changed ()) {
/* list of the removed/added items since clear_history() was last called */
SequenceProperty<Container>* a = copy_for_history ();
/* the same list, but with removed/added lists swapped (for undo purposes) */
SequenceProperty<Container>* b = copy_for_history ();
b->invert_changes ();
if (cmd) {
/* whenever one of the items emits DropReferences, make sure
that the Destructible we've been told to notify hears about
it. the Destructible is likely to be the Command being built
with this diff().
*/
for (typename ChangeContainer::iterator i = a->change().added.begin(); i != a->change().added.end(); ++i) {
(*i)->DropReferences.connect_same_thread (*cmd, boost::bind (&Destructible::drop_references, cmd));
}
}
undo.add (b);
redo.add (a);
}
}
Container rlist() { return _val; }
/* Wrap salient methods of Sequence /* Wrap salient methods of Sequence
*/ */
@ -332,6 +361,22 @@ class SequenceProperty : public PropertyBase
return true; return true;
} }
private:
virtual SequenceProperty<Container>* create () const = 0;
/* create a copy of this ListSequenceProperty that only
has what is needed for use in a history list command. This
means that it won't contain the actual item list but
will have the added/removed list.
*/
SequenceProperty<Container>* copy_for_history () const {
SequenceProperty<Container>* copy = create ();
/* this is all we need */
copy->_change = _change;
return copy;
}
}; };
} }