Fix deadlock.
[ardour.git] / libs / pbd / stateful.cc
index 79936c691f7edfcb01e2cd141f49d6b68277a6ea..c33418ce39fdcf82b3551aa3669e9a349e8e61d4 100644 (file)
@@ -40,7 +40,6 @@ int Stateful::loading_state_version = 0;
 
 Stateful::Stateful ()
         : _frozen (0)
-        , _no_property_changes (false)
         , _properties (new OwnedPropertyList)
 {
        _extra_xml = 0;
@@ -157,34 +156,39 @@ 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 owner_state 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);
                }
        }
@@ -195,7 +199,7 @@ Stateful::set_properties (XMLNode const & owner_state)
 }
 
 PropertyChange
-Stateful::set_properties (const PropertyList& property_list)
+Stateful::apply_changes (const PropertyList& property_list)
 {
        PropertyChange c;
        PropertyList::const_iterator p;
@@ -208,8 +212,13 @@ Stateful::set_properties (const PropertyList& property_list)
         
         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)) {
+
+                        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 {
@@ -220,6 +229,8 @@ Stateful::set_properties (const PropertyList& property_list)
        
        post_set ();
 
+       send_change (c);
+
        return c;
 }
 
@@ -230,7 +241,7 @@ 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);
        }
 }
 
@@ -300,15 +311,48 @@ Stateful::changed() const
 }
 
 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<Command*>& 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