X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fgui_object.h;h=c9082807fbebfbfd453b350b7c9c21bee2779802;hb=4bfc5ddf71728c1f14a3fbff5dab4986fbabe15c;hp=849665670f2c60a8e99842108d11fc657c2d6171;hpb=80972784e348aa51522e562b3d6b250745c489f0;p=ardour.git diff --git a/gtk2_ardour/gui_object.h b/gtk2_ardour/gui_object.h index 849665670f..c9082807fb 100644 --- a/gtk2_ardour/gui_object.h +++ b/gtk2_ardour/gui_object.h @@ -28,44 +28,50 @@ #include "pbd/xml++.h" #include "pbd/id.h" -class GUIObjectState { - private: - typedef boost::variant Variant; - typedef std::map PropertyMap; - - public: - typedef std::map StringPropertyMap; - - ~GUIObjectState(); - - StringPropertyMap::const_iterator begin () const; - StringPropertyMap::const_iterator end () const; - - XMLNode& get_state () const; - int set_state (const XMLNode&); +class GUIObjectState +{ +public: + GUIObjectState (); static const std::string xml_node_name; void load (const XMLNode&); - GUIObjectState& operator= (const GUIObjectState& other); + int set_state (const XMLNode&); + XMLNode& get_state () const; + /** Get a string from our state. + * @param id property of Object node to look for. + * @param prop_name name of the Object property to return. + * @param empty if non-0, filled in with true if the property is currently non-existant, otherwise false. + * @return value of property `prop_name', or empty. + */ std::string get_string (const std::string& id, const std::string& prop_name, bool* empty = 0); - template void set (const std::string& id, const std::string& prop_name, const T& val) { - StringPropertyMap::iterator i = _property_maps.find (id); - - if (i != _property_maps.end()) { - i->second[prop_name] = val; - } else { - _property_maps[id] = PropertyMap(); - _property_maps[id][prop_name] = val; - } + template void set_property (const std::string& id, const std::string& prop_name, const T& val) { + XMLNode* child = get_or_add_node (id); + child->set_property (prop_name.c_str(), val); } - private: - StringPropertyMap _property_maps; - void clear_maps (); -}; + /** Remove node with provided id. + * @param id property of Object node to look for. + */ + void remove_node (const std::string& id); + std::list all_ids () const; + + XMLNode* get_or_add_node (const std::string &); + static XMLNode* get_node (const XMLNode *, const std::string &); + static XMLNode* get_or_add_node (XMLNode *, const std::string &); + + private: + // no copy construction. object_map saves pointers to _state XMLNodes + // use set_state(get_state()) + GUIObjectState (const GUIObjectState& other); + + XMLNode _state; + // ideally we'd use a O(1) hash table here, + // but O(log(N)) is fine already. + std::map object_map; +}; #endif /* __gtk_ardour_gui_object_h__ */