X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fgui_object.cc;h=e9f93e0ebccaf21099f000990e15ee5770f89e44;hb=ba7bbd1d51ff97af0572bfccfa9ffb3fd2a1cdbd;hp=2b516d04dac97e64b16bf0230cd6f14d329cec6f;hpb=3396a9a851180ef73c6af9c42fc63897bb965390;p=ardour.git diff --git a/gtk2_ardour/gui_object.cc b/gtk2_ardour/gui_object.cc index 2b516d04da..e9f93e0ebc 100644 --- a/gtk2_ardour/gui_object.cc +++ b/gtk2_ardour/gui_object.cc @@ -21,55 +21,81 @@ #include #include "gui_object.h" -#include "i18n.h" +#include "pbd/i18n.h" using std::string; +/*static*/ XMLNode * +GUIObjectState::get_node (const XMLNode* parent, const string& id) +{ + XMLNodeList const & children = parent->children (); + for (XMLNodeList::const_iterator i = children.begin(); i != children.end(); ++i) { + if ((*i)->name() != X_("Object")) { + continue; + } + if ((*i)->has_property_with_value(X_("id"), id)) { + return *i; + } + } + return 0; +} + +/*static*/ XMLNode * +GUIObjectState::get_or_add_node (XMLNode* parent, const string& id) +{ + XMLNode* child = get_node (parent, id); + if (!child) { + child = new XMLNode (X_("Object")); + child->set_property (X_("id"), id); + parent->add_child_nocopy (*child); + } + return child; +} + + const string GUIObjectState::xml_node_name (X_("GUIObjectState")); GUIObjectState::GUIObjectState () : _state (X_("GUIObjectState")) { - } XMLNode * -GUIObjectState::find_node (const string& id) const +GUIObjectState::get_or_add_node (const string& id) { - 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; - } + std::map ::iterator i = object_map.find (id); + if (i != object_map.end()) { + return i->second; } - - return 0; + //assert (get_node (&_state, id) == 0); // XXX performance penalty due to get_node() + XMLNode* child = new XMLNode (X_("Object")); + child->set_property (X_("id"), id); + _state.add_child_nocopy (*child); + object_map[id] = child; + return child; } -/** 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. - */ +void +GUIObjectState::remove_node (const std::string& id) +{ + object_map.erase (id); + _state.remove_nodes_and_delete(X_("id"), id ); +} -string +string GUIObjectState::get_string (const string& id, const string& prop_name, bool* empty) { - XMLNode* child = find_node (id); - if (!child) { + std::map ::const_iterator i = object_map.find (id); + if (i == object_map.end()) { + //assert (get_node (&_state, id) == 0); // XXX performance penalty due to get_node() if (empty) { *empty = true; } return string (); } + //assert (get_node (&_state, id) == i->second); // XXX performance penalty due to get_node() - XMLProperty* p = child->property (prop_name); + XMLProperty const * p (i->second->property (prop_name)); if (!p) { if (empty) { *empty = true; @@ -97,7 +123,20 @@ GUIObjectState::set_state (const XMLNode& node) return -1; } + object_map.clear (); _state = node; + + XMLNodeList const & children (_state.children ()); + for (XMLNodeList::const_iterator i = children.begin(); i != children.end(); ++i) { + if ((*i)->name() != X_("Object")) { + continue; + } + XMLProperty const * prop = (*i)->property (X_("id")); + if (!prop) { + continue; + } + object_map[prop->value ()] = *i; + } return 0; } @@ -107,30 +146,13 @@ GUIObjectState::load (const XMLNode& node) (void) set_state (node); } -GUIObjectState& -GUIObjectState::operator= (const GUIObjectState& other) -{ - _state = other._state; - return *this; -} - std::list GUIObjectState::all_ids () const { std::list ids; - 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) { - ids.push_back (p->value ()); - } + for (std::map ::const_iterator i = object_map.begin (); + i != object_map.end (); ++i) { + ids.push_back (i->first); } - return ids; } - -