diff options
author | Carl Hetherington <carl@carlh.net> | 2012-01-20 18:02:43 +0000 |
---|---|---|
committer | Carl Hetherington <carl@carlh.net> | 2012-01-20 18:02:43 +0000 |
commit | 3396a9a851180ef73c6af9c42fc63897bb965390 (patch) | |
tree | a6551979b48528e94ab9a8d663f9baeb14fc7bf2 /gtk2_ardour/gui_object.cc | |
parent | d03d0363a469a98753a546570bda79f59cba405c (diff) |
Simplify GUIOBjectState a bit by just walking the XML
directly rather than maintaining internal data
structures.
git-svn-id: svn://localhost/ardour2/branches/3.0@11287 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour/gui_object.cc')
-rw-r--r-- | gtk2_ardour/gui_object.cc | 160 |
1 files changed, 55 insertions, 105 deletions
diff --git a/gtk2_ardour/gui_object.cc b/gtk2_ardour/gui_object.cc index fa708b25ad..2b516d04da 100644 --- a/gtk2_ardour/gui_object.cc +++ b/gtk2_ardour/gui_object.cc @@ -18,11 +18,8 @@ */ #include <iostream> -#include <iomanip> #include <sstream> -#include <boost/variant/static_visitor.hpp> - #include "gui_object.h" #include "i18n.h" @@ -30,92 +27,67 @@ using std::string; const string GUIObjectState::xml_node_name (X_("GUIObjectState")); -GUIObjectState::~GUIObjectState () +GUIObjectState::GUIObjectState () + : _state (X_("GUIObjectState")) { - clear_maps (); + } -void -GUIObjectState::clear_maps () +XMLNode * +GUIObjectState::find_node (const string& id) const { - _property_maps.clear (); + XMLNodeList const & children = _state.children (); + for (XMLNodeList::const_iterator i = children.begin(); i != children.end(); ++i) { + if ((*i)->name() != X_("Object")) { + continue; + } + + XMLProperty* p = (*i)->property (X_("id")); + if (p && p->value() == id) { + return *i; + } + } + + return 0; } -class gos_string_vistor : public boost::static_visitor<> { - public: - gos_string_vistor (std::ostream& o) - : stream (o) {} - - void operator() (const int64_t& i) { - stream << i; - } - - void operator() (const std::string& s) { - stream << s; - } - - private: - std::ostream& stream; -}; - -std::string -GUIObjectState::get_string (const std::string& id, const std::string& prop_name, bool* empty) +/** 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. + */ + +string +GUIObjectState::get_string (const string& id, const string& prop_name, bool* empty) { - StringPropertyMap::iterator i = _property_maps.find (id); - - if (i == _property_maps.end()) { + XMLNode* child = find_node (id); + if (!child) { if (empty) { *empty = true; } - return string(); + return string (); } - - const PropertyMap& pmap (i->second); - PropertyMap::const_iterator p = pmap.find (prop_name); - - if (p == pmap.end()) { + + XMLProperty* p = child->property (prop_name); + if (!p) { if (empty) { *empty = true; } - return string(); + return string (); } - - std::stringstream ss; - gos_string_vistor gsv (ss); - - boost::apply_visitor (gsv, p->second); if (empty) { *empty = false; } - - return ss.str (); + + return p->value (); } XMLNode& GUIObjectState::get_state () const { - XMLNode* root = new XMLNode (xml_node_name); - - for (StringPropertyMap::const_iterator i = _property_maps.begin(); i != _property_maps.end(); ++i) { - - const PropertyMap& pmap (i->second); - XMLNode* id_node = new XMLNode (X_("Object")); - - id_node->add_property ("id", i->first); - - for (PropertyMap::const_iterator p = pmap.begin(); p != pmap.end(); ++p) { - std::stringstream ss; - gos_string_vistor gsv (ss); - boost::apply_visitor (gsv, p->second); - id_node->add_property (p->first.c_str(), ss.str()); - } - - root->add_child_nocopy (*id_node); - } - - - return *root; + return *new XMLNode (_state); } int @@ -124,38 +96,11 @@ GUIObjectState::set_state (const XMLNode& node) if (node.name() != xml_node_name) { return -1; } - - clear_maps (); - - for (XMLNodeList::const_iterator i = node.children().begin(); i != node.children().end(); ++i) { - if ((*i)->name() == X_("Object")) { - - XMLNode* child = (*i); - const XMLProperty* idp = child->property (X_("id")); - - if (!idp) { - continue; - } - - string id (idp->value()); - - for (XMLPropertyList::const_iterator p = child->properties().begin(); p != child->properties().end(); ++p) { - /* note that this always sets the property with - a string value, and so is not equivalent to - a call made by the program that passed a - scalar. - */ - if ((*p)->name() != X_("id")) { - set (id, (*p)->name(), (*p)->value()); - } - } - } - } + _state = node; return 0; } - void GUIObjectState::load (const XMLNode& node) { @@ -165,22 +110,27 @@ GUIObjectState::load (const XMLNode& node) GUIObjectState& GUIObjectState::operator= (const GUIObjectState& other) { - _property_maps = other._property_maps; - + _state = other._state; return *this; } -/** @return begin iterator into our StringPropertyMap */ -GUIObjectState::StringPropertyMap::const_iterator -GUIObjectState::begin () const +std::list<string> +GUIObjectState::all_ids () const { - return _property_maps.begin (); -} + std::list<string> ids; + XMLNodeList const & children = _state.children (); + for (XMLNodeList::const_iterator i = children.begin(); i != children.end(); ++i) { + if ((*i)->name() != X_("Object")) { + continue; + } -/** @return end iterator into our StringPropertyMap */ -GUIObjectState::StringPropertyMap::const_iterator -GUIObjectState::end () const -{ - return _property_maps.end (); + XMLProperty* p = (*i)->property (X_("id")); + if (p) { + ids.push_back (p->value ()); + } + } + + return ids; } + |