X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fpbd%2Fpbd%2Fstateful.h;h=36c6fe28c7184cac9633cf7c9efb564716816834;hb=7a6e86c9f9bef8db74b755db659794c4a859f36d;hp=78b9eb7b3b4057e897cfb9d743ef156ba399285f;hpb=db8b575c30845bafc34b87bacd52129c95d1c478;p=ardour.git diff --git a/libs/pbd/pbd/stateful.h b/libs/pbd/pbd/stateful.h index 78b9eb7b3b..36c6fe28c7 100644 --- a/libs/pbd/pbd/stateful.h +++ b/libs/pbd/pbd/stateful.h @@ -48,12 +48,10 @@ class Stateful { virtual XMLNode& get_state (void) = 0; virtual int set_state (const XMLNode&, int version) = 0; - /* derived types do not have to implement this, but probably should - give it serious attention. - */ - virtual bool set_property (const PropertyBase&) { return false; } - 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); @@ -63,17 +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 */ @@ -82,28 +88,42 @@ class Stateful { static int current_state_version; static int loading_state_version; + virtual void suspend_property_changes (); + virtual void resume_property_changes (); + + bool property_changes_suspended() const { return g_atomic_int_get (&_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; + PBD::PropertyChange _pending_changed; + Glib::Mutex _lock; std::string _xml_node_name; ///< name of node to use for this object in XML OwnedPropertyList* _properties; + + virtual void send_change (const PropertyChange&); + /** derived classes can implement this in order to process a property change + within thaw() just before send_change() is called. + */ + virtual void mid_thaw (const PropertyChange&) { } + + private: + PBD::ID _id; + int32_t _stateful_frozen; }; } // namespace PBD