X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fpbd%2Fstateful.cc;h=e65eb8d0700c5393140f565abd1a79f5bc119feb;hb=8fcf7e6a0785556602df0502a4c02707a432f0b6;hp=36a0d747786d0cd6b90cea55dd43f47be177fd08;hpb=afc5e3bd0251dbcdbde27036569eb1acab026991;p=ardour.git diff --git a/libs/pbd/stateful.cc b/libs/pbd/stateful.cc index 36a0d74778..e65eb8d070 100644 --- a/libs/pbd/stateful.cc +++ b/libs/pbd/stateful.cc @@ -39,9 +39,8 @@ int Stateful::current_state_version = 0; int Stateful::loading_state_version = 0; Stateful::Stateful () - : _frozen (0) - , _no_property_changes (false) - , _properties (new OwnedPropertyList) + : _frozen (0) + , _properties (new OwnedPropertyList) { _extra_xml = 0; _instant_xml = 0; @@ -49,7 +48,7 @@ Stateful::Stateful () Stateful::~Stateful () { - delete _properties; + delete _properties; // Do not delete _extra_xml. The use of add_child_nocopy() // means it needs to live on indefinately. @@ -157,87 +156,99 @@ Stateful::instant_xml (const string& str, const sys::path& directory_path) return 0; } -/** Forget about any old state for this object */ +/** Forget about any changes to this object's properties */ void -Stateful::clear_history () +Stateful::clear_changes () { for (OwnedPropertyList::iterator i = _properties->begin(); i != _properties->end(); ++i) { - i->second->clear_history (); + i->second->clear_changes (); } } -void -Stateful::diff (PropertyList& before, PropertyList& after) const +PropertyList * +Stateful::get_changes_as_properties (Command* cmd) const { + PropertyList* pl = new PropertyList; + for (OwnedPropertyList::const_iterator i = _properties->begin(); i != _properties->end(); ++i) { - i->second->diff (before, after); + i->second->get_changes_as_properties (*pl, cmd); } + + return pl; } -/** Set state of some/all _properties from an XML node. - * @param node Node. - * @return PropertyChanges made. +/** Set our property values from an XML node. + * Derived types can call this from ::set_state() (or elsewhere) + * to get basic property setting done. + * @return IDs of properties that were changed. */ PropertyChange -Stateful::set_properties (XMLNode const & owner_state) +Stateful::set_values (XMLNode const & node) { PropertyChange c; - + for (OwnedPropertyList::iterator i = _properties->begin(); i != _properties->end(); ++i) { - if (i->second->set_state_from_owner_state (owner_state)) { + if (i->second->set_value (node)) { c.add (i->first); } } - post_set (); + post_set (c); return c; } PropertyChange -Stateful::set_properties (const PropertyList& property_list) +Stateful::apply_changes (const PropertyList& property_list) { PropertyChange c; PropertyList::const_iterator p; - DEBUG_TRACE (DEBUG::Stateful, string_compose ("Stateful %1 setting properties from list of %2\n", this, property_list.size())); + DEBUG_TRACE (DEBUG::Stateful, string_compose ("Stateful %1 setting properties from list of %2\n", this, property_list.size())); - for (PropertyList::const_iterator pp = property_list.begin(); pp != property_list.end(); ++pp) { - DEBUG_TRACE (DEBUG::Stateful, string_compose ("in plist: %1\n", pp->second->property_name())); - } - - for (PropertyList::const_iterator i = property_list.begin(); i != property_list.end(); ++i) { - if ((p = _properties->find (i->first)) != _properties->end()) { - DEBUG_TRACE (DEBUG::Stateful, string_compose ("actually setting property %1\n", p->second->property_name())); - if (set_property (*i->second)) { + for (PropertyList::const_iterator pp = property_list.begin(); pp != property_list.end(); ++pp) { + DEBUG_TRACE (DEBUG::Stateful, string_compose ("in plist: %1\n", pp->second->property_name())); + } + + for (PropertyList::const_iterator i = property_list.begin(); i != property_list.end(); ++i) { + if ((p = _properties->find (i->first)) != _properties->end()) { + + DEBUG_TRACE ( + DEBUG::Stateful, + string_compose ("actually setting property %1 using %2\n", p->second->property_name(), i->second->property_name()) + ); + + if (apply_changes (*i->second)) { c.add (i->first); } } else { - DEBUG_TRACE (DEBUG::Stateful, string_compose ("passed in property %1 not found in own property list\n", - i->second->property_name())); - } + DEBUG_TRACE (DEBUG::Stateful, string_compose ("passed in property %1 not found in own property list\n", + i->second->property_name())); + } } - post_set (); + post_set (c); + + send_change (c); return c; } /** Add property states to an XML node. - * @param node Node. + * @param owner_state Node. */ void Stateful::add_properties (XMLNode& owner_state) { for (OwnedPropertyList::iterator i = _properties->begin(); i != _properties->end(); ++i) { - i->second->add_state_to_owner_state (owner_state); + i->second->get_value (owner_state); } } void Stateful::add_property (PropertyBase& s) { - _properties->add (s); + _properties->add (s); } void @@ -261,7 +272,7 @@ Stateful::send_change (const PropertyChange& what_changed) void Stateful::suspend_property_changes () { - _frozen++; + _frozen++; } void @@ -282,33 +293,66 @@ Stateful::resume_property_changes () } } - mid_thaw (what_changed); + mid_thaw (what_changed); - send_change (what_changed); + send_change (what_changed); } bool Stateful::changed() const { for (OwnedPropertyList::const_iterator i = _properties->begin(); i != _properties->end(); ++i) { - if (i->second->changed()) { - return true; - } - } + if (i->second->changed()) { + return true; + } + } - return false; + return false; } bool -Stateful::set_property (const PropertyBase& prop) +Stateful::apply_changes (const PropertyBase& prop) { OwnedPropertyList::iterator i = _properties->find (prop.property_id()); if (i == _properties->end()) { return false; } - i->second->set_state_from_property (&prop); + i->second->apply_changes (&prop); return true; } +PropertyList* +Stateful::property_factory (const XMLNode& history_node) const +{ + PropertyList* prop_list = new PropertyList; + + for (OwnedPropertyList::const_iterator i = _properties->begin(); i != _properties->end(); ++i) { + PropertyBase* prop = i->second->clone_from_xml (history_node); + + if (prop) { + prop_list->add (prop); + } + } + + return prop_list; +} + +void +Stateful::rdiff (vector& cmds) const +{ + for (OwnedPropertyList::const_iterator i = _properties->begin(); i != _properties->end(); ++i) { + i->second->rdiff (cmds); + } +} + +void +Stateful::clear_owned_changes () +{ + for (OwnedPropertyList::iterator i = _properties->begin(); i != _properties->end(); ++i) { + i->second->clear_owned_changes (); + } +} + + } // namespace PBD