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:
parent
71a4796dc3
commit
74801c3212
@ -59,28 +59,19 @@ namespace Properties {
|
||||
extern PBD::PropertyDescriptor<bool> regions;
|
||||
}
|
||||
|
||||
class RegionListProperty : public PBD::SequenceProperty<std::list<boost::shared_ptr<Region > > >
|
||||
class RegionListProperty : public PBD::SequenceProperty<std::list<boost::shared_ptr<Region> > >
|
||||
{
|
||||
public:
|
||||
RegionListProperty (Playlist&);
|
||||
|
||||
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:
|
||||
friend class Playlist;
|
||||
std::list<boost::shared_ptr<Region> > rlist() { return _val; }
|
||||
PBD::SequenceProperty<std::list<boost::shared_ptr<Region> > >* create () const;
|
||||
|
||||
friend class Playlist;
|
||||
/* we live and die with our playlist, no lifetime management needed */
|
||||
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
|
||||
|
@ -124,41 +124,9 @@ RegionListProperty::lookup_id (const ID& id)
|
||||
return ret;
|
||||
}
|
||||
|
||||
RegionListProperty*
|
||||
RegionListProperty::copy_for_history () const
|
||||
SequenceProperty<std::list<boost::shared_ptr<Region> > >* RegionListProperty::create () const
|
||||
{
|
||||
RegionListProperty* copy = 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);
|
||||
}
|
||||
return new RegionListProperty (_playlist);
|
||||
}
|
||||
|
||||
Playlist::Playlist (Session& sess, string nom, DataType type, bool hide)
|
||||
|
@ -30,6 +30,7 @@
|
||||
#include "pbd/convert.h"
|
||||
#include "pbd/id.h"
|
||||
#include "pbd/property_basics.h"
|
||||
#include "pbd/property_list.h"
|
||||
|
||||
namespace PBD {
|
||||
|
||||
@ -193,6 +194,34 @@ class SequenceProperty : public PropertyBase
|
||||
_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
|
||||
*/
|
||||
|
||||
@ -332,6 +361,22 @@ class SequenceProperty : public PropertyBase
|
||||
|
||||
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;
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user