X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fpbd%2Fpbd%2Fstateful.h;h=4808bc2911f816b3e6e5634342dab488a5bd0433;hb=0aac62e013e15e380001dafae39d554f8765a4a1;hp=4352e8820159c6758999076bf48ff1025effa2b0;hpb=afc5e3bd0251dbcdbde27036569eb1acab026991;p=ardour.git diff --git a/libs/pbd/pbd/stateful.h b/libs/pbd/pbd/stateful.h index 4352e88201..4808bc2911 100644 --- a/libs/pbd/pbd/stateful.h +++ b/libs/pbd/pbd/stateful.h @@ -48,9 +48,10 @@ class Stateful { virtual XMLNode& get_state (void) = 0; virtual int set_state (const XMLNode&, int version) = 0; - virtual bool set_property (const PropertyBase&); - PropertyChange set_properties (const PropertyList&); + virtual bool apply_changes (PropertyBase const &); + PropertyChange apply_changes (PropertyList const &); + const OwnedPropertyList& properties() const { return *_properties; } void add_property (PropertyBase& s); @@ -60,19 +61,25 @@ class Stateful { */ void add_extra_xml (XMLNode&); - XMLNode *extra_xml (const std::string& str); + XMLNode *extra_xml (const std::string& str, bool add_if_missing = false); + void save_extra_xml (const XMLNode&); const PBD::ID& id() const { return _id; } + bool set_id (const XMLNode&); + void set_id (const std::string&); + void reset_id (); /* history management */ - void clear_history (); - void diff (PropertyList&, PropertyList&) const; + void clear_changes (); + virtual void clear_owned_changes (); + PropertyList* get_changes_as_properties (Command *) const; + virtual void rdiff (std::vector &) const; bool changed() const; /* create a property list from an XMLNode */ - virtual PropertyList* property_factory(const XMLNode&) const { return 0; } + virtual PropertyList* property_factory (const XMLNode&) const; /* How stateful's notify of changes to their properties */ @@ -84,32 +91,26 @@ class Stateful { virtual void suspend_property_changes (); virtual void resume_property_changes (); - void unlock_property_changes () { _no_property_changes = false; } - void block_property_changes () { _no_property_changes = true; } - + bool property_changes_suspended() const { return g_atomic_int_get (const_cast(&_stateful_frozen)) > 0; } + protected: - void add_instant_xml (XMLNode&, const sys::path& directory_path); - XMLNode *instant_xml (const std::string& str, const sys::path& directory_path); + void add_instant_xml (XMLNode&, const std::string& directory_path); + XMLNode *instant_xml (const std::string& str, const std::string& directory_path); void add_properties (XMLNode &); - /* derived types can call this from ::set_state() (or elsewhere) - to get basic property setting done. - */ - PropertyChange set_properties (XMLNode const &); + + PropertyChange set_values (XMLNode const &); /* derived classes can implement this to do cross-checking of property values after either a PropertyList or XML driven property change. */ - virtual void post_set () { }; + virtual void post_set (const PropertyChange&) { }; XMLNode *_extra_xml; XMLNode *_instant_xml; - PBD::ID _id; - int32_t _frozen; - bool _no_property_changes; PBD::PropertyChange _pending_changed; - Glib::Mutex _lock; + Glib::Threads::Mutex _lock; std::string _xml_node_name; ///< name of node to use for this object in XML OwnedPropertyList* _properties; @@ -119,7 +120,10 @@ class Stateful { within thaw() just before send_change() is called. */ virtual void mid_thaw (const PropertyChange&) { } - bool property_changes_suspended() const { return g_atomic_int_get (&_frozen) > 0; } + + private: + PBD::ID _id; + gint _stateful_frozen; }; } // namespace PBD