X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fpbd%2Fpbd%2Fstateful.h;h=ab09b7aa84d79b1efd8981cbc17af7f3b3f78dd5;hb=e3329000557015ce54691235769db8821e75666b;hp=5c1f079bc6d47240e1d9b0d47a9882dbd6545502;hpb=f30402d073aeae5d24462416407e73d1e0314e71;p=ardour.git diff --git a/libs/pbd/pbd/stateful.h b/libs/pbd/pbd/stateful.h index 5c1f079bc6..ab09b7aa84 100644 --- a/libs/pbd/pbd/stateful.h +++ b/libs/pbd/pbd/stateful.h @@ -24,6 +24,7 @@ #include #include +#include "pbd/libpbd_visibility.h" #include "pbd/id.h" #include "pbd/xml++.h" #include "pbd/property_basics.h" @@ -41,7 +42,7 @@ class PropertyList; class OwnedPropertyList; /** Base class for objects with saveable and undoable state */ -class Stateful { +class LIBPBD_API Stateful { public: Stateful (); virtual ~Stateful(); @@ -61,16 +62,20 @@ 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_changes (); virtual void clear_owned_changes (); PropertyList* get_changes_as_properties (Command *) const; - virtual void rdiff (std::vector &) const; + virtual void rdiff (std::vector &) const; bool changed() const; /* create a property list from an XMLNode @@ -87,13 +92,12 @@ 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 &); PropertyChange set_values (XMLNode const &); @@ -102,15 +106,12 @@ class Stateful { 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; @@ -120,7 +121,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