OSC: Changed gainVCA to gainfader as VCA is already used.
[ardour.git] / gtk2_ardour / gui_object.cc
index 857ee3a770f7a9ef8ded97489a25c4fa8364739f..3128e61f3ab44c2ab0a8e7c4c80435bf7d91c0f3 100644 (file)
 */
 
 #include <iostream>
-#include <iomanip>
 #include <sstream>
 
-#include <boost/variant/static_visitor.hpp>
-
 #include "gui_object.h"
 #include "i18n.h"
 
@@ -30,63 +27,98 @@ using std::string;
 
 const string GUIObjectState::xml_node_name (X_("GUIObjectState"));
 
-GUIObjectState::~GUIObjectState ()
+GUIObjectState::GUIObjectState ()
+       : _state (X_("GUIObjectState"))
 {
-       clear_maps ();
+
 }
 
+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;
+               }
+
+               XMLProperty* p = (*i)->property (X_("id"));
+               if (p && p->value() == id) {
+                       return *i;
+               }
+       }
+
+       return 0;
+}
+
+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->add_property (X_("id"), id);
+               parent->add_child_nocopy (*child);
+       }
+
+       return child;
+}
+
+XMLNode *
+GUIObjectState::get_or_add_node (const string& id)
+{
+       return get_or_add_node (&_state, id);
+}
+
+/** Remove node with provided id.
+ *  @param id property of Object node to look for.
+ */
+
 void
-GUIObjectState::clear_maps ()
+GUIObjectState::remove_node (const std::string& id)
 {
-       _property_maps.clear ();
+       _state.remove_nodes_and_delete(X_("id"), id );
 }
 
-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;
-    }
-#if 0
-    void operator() (const double& d) {
-           stream << std::setprecision (12) << d;
-    }
-#endif
-
-    void operator() (const std::string& s) {
-           stream << s;
-    }
-
-  private:
-    std::ostream& stream;
-};
+/** 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.
+ */
 
-XMLNode&
-GUIObjectState::get_state () const
+string
+GUIObjectState::get_string (const string& id, const string& prop_name, bool* empty)
 {
-       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());
+       XMLNode* child = get_node (&_state, id);
+
+       if (!child) {
+               if (empty) {
+                       *empty = true;
                }
-               
-               root->add_child_nocopy (*id_node);
+               return string ();
        }
 
+       XMLProperty* p = child->property (prop_name);
+       if (!p) {
+               if (empty) {
+                       *empty = true;
+               }
+               return string ();
+       }
 
-       return *root;
+       if (empty) {
+               *empty = false;
+       }
+
+       return p->value ();
+}
+
+XMLNode&
+GUIObjectState::get_state () const
+{
+       return *new XMLNode (_state);
 }
 
 int
@@ -95,48 +127,34 @@ 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)
 {
        (void) set_state (node);
 }
 
-GUIObjectState&
-GUIObjectState::operator= (const GUIObjectState& other)
+std::list<string>
+GUIObjectState::all_ids () const
 {
-       _property_maps = other._property_maps;
+       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 *this;
+               XMLProperty* p = (*i)->property (X_("id"));
+               if (p) {
+                       ids.push_back (p->value ());
+               }
+       }
+
+       return ids;
 }
+
+