X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fpbd%2Fpbd%2Fstateful.h;h=36c6fe28c7184cac9633cf7c9efb564716816834;hb=7a6e86c9f9bef8db74b755db659794c4a859f36d;hp=550db5a24ea15c96dd8ecd95f7c31332348d7c1e;hpb=6edccc3070b813157ffcd4014ec8dd7fa6ed9ce7;p=ardour.git diff --git a/libs/pbd/pbd/stateful.h b/libs/pbd/pbd/stateful.h index 550db5a24e..36c6fe28c7 100644 --- a/libs/pbd/pbd/stateful.h +++ b/libs/pbd/pbd/stateful.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2000 Paul Davis + Copyright (C) 2000-2010 Paul Davis This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -21,33 +21,112 @@ #define __pbd_stateful_h__ #include -#include +#include +#include + +#include "pbd/id.h" +#include "pbd/xml++.h" +#include "pbd/property_basics.h" +#include "pbd/signals.h" class XMLNode; +namespace PBD { + +namespace sys { + class path; +} + +class PropertyList; +class OwnedPropertyList; + +/** Base class for objects with saveable and undoable state */ class Stateful { public: - Stateful(); + Stateful (); virtual ~Stateful(); virtual XMLNode& get_state (void) = 0; + virtual int set_state (const XMLNode&, int version) = 0; + + virtual bool apply_changes (PropertyBase const &); + PropertyChange apply_changes (PropertyList const &); + + const OwnedPropertyList& properties() const { return *_properties; } - virtual int set_state (const XMLNode&) = 0; + void add_property (PropertyBase& s); - /* Extra XML nodes */ + /* Extra XML node: so that 3rd parties can attach state to the XMLNode + representing the state of this object. + */ 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; + bool changed() const; + + /* create a property list from an XMLNode + */ + virtual PropertyList* property_factory (const XMLNode&) const; - virtual void add_instant_xml (XMLNode&, const std::string& dir); - XMLNode *instant_xml (const std::string& str, const std::string& dir); - const PBD::ID& id() const { return _id; } + /* How stateful's notify of changes to their properties + */ + PBD::Signal1 PropertyChanged; + 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 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 &); + + /* 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 (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 + #endif /* __pbd_stateful_h__ */