XMLNode* child = new XMLNode (PBD::capitalize (property_name()));
history_node->add_child_nocopy (*child);
-
+
/* record the change described in our change member */
if (!_changes.added.empty()) {
void get_value (XMLNode & node) const {
for (typename Container::const_iterator i = _val.begin(); i != _val.end(); ++i) {
node.add_child_nocopy ((*i)->get_state ());
- }
+ }
}
bool changed () const {
return !_changes.added.empty() || !_changes.removed.empty();
}
-
+
void clear_changes () {
_changes.added.clear ();
_changes.removed.clear ();
}
/** Given a record of changes to this property, pass it to a callback that will
- * update the property in some appropriate way.
+ * update the property in some appropriate way.
*
* This exists because simply using std::sequence methods to add/remove items
* from the property is far too simplistic - the semantics of add/remove may
if (!changed ()) {
return;
}
-
+
/* Create a property with just the changes and not the actual values */
SequenceProperty<Container>* a = create ();
a->_changes = _changes;
changes.add (a);
-
+
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::const_iterator i = a->changes().added.begin(); i != a->changes().added.end(); ++i) {
(*i)->DropReferences.connect_same_thread (*cmd, boost::bind (&Destructible::drop_references, cmd));
}
XMLNodeList const children = node.children ();
/* find the node for this property name */
-
+
std::string const c = capitalize (property_name ());
XMLNodeList::const_iterator i = children.begin();
while (i != children.end() && (*i)->name() != c) {
}
/* create a property with the changes */
-
+
SequenceProperty<Container>* p = create ();
XMLNodeList const & grandchildren = (*i)->children ();
}
_val.clear ();
}
-
- typename Container::size_type size() const {
+
+ typename Container::size_type size() const {
return _val.size();
}
- bool empty() const {
+ bool empty() const {
return _val.empty();
}
return _val = other;
}
- typename Container::reference front() {
+ typename Container::reference front() {
return _val.front ();
}
- typename Container::const_reference front() const {
+ typename Container::const_reference front() const {
return _val.front ();
}
- typename Container::reference back() {
+ typename Container::reference back() {
return _val.back ();
}
- typename Container::const_reference back() const {
+ typename Container::const_reference back() const {
return _val.back ();
}
- void sort() {
+ void sort() {
_val.sort ();
}
template<class BinaryPredicate> void sort(BinaryPredicate comp) {
_val.sort (comp);
}
-
+
const ChangeRecord& changes () const { return _changes; }
protected:
, _changes (p._changes)
, _update_callback (p._update_callback)
{}
-
+
Container _val; ///< our actual container of things
ChangeRecord _changes; ///< changes to the container (adds/removes) that have happened since clear_changes() was last called
boost::function<void(const ChangeRecord&)> _update_callback;
-private:
+private:
virtual SequenceProperty<Container>* create () const = 0;
};