From e3e1bb8a2923d9a203dc145fbf2e47009b40d294 Mon Sep 17 00:00:00 2001
From: Joseph Mirabel <jmirabel@laas.fr>
Date: Fri, 29 May 2015 20:13:10 +0200
Subject: [PATCH] Enhance findings of Node by name.

---
 .../gepetto/viewer/corba/windows-manager.h    |  1 +
 src/windows-manager.cpp                       | 21 +++++++++++++++++--
 2 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/include/gepetto/viewer/corba/windows-manager.h b/include/gepetto/viewer/corba/windows-manager.h
index 468c3f6..894c9d6 100644
--- a/include/gepetto/viewer/corba/windows-manager.h
+++ b/include/gepetto/viewer/corba/windows-manager.h
@@ -57,6 +57,7 @@ namespace graphics {
             static VisibilityMode getVisibility(const std::string& visibilityName);
             static WireFrameMode getWire(const std::string& wireName);
             static LightingMode getLight(const std::string& lightName);
+            NodePtr_t find (const std::string name, GroupNodePtr_t group = GroupNodePtr_t());
             void initParent(const std::string& nodeName, NodePtr_t node);
             void addNode(const std::string& nodeName, NodePtr_t node);
             void addGroup(const std::string& groupName, GroupNodePtr_t group);
diff --git a/src/windows-manager.cpp b/src/windows-manager.cpp
index a8b52dc..f09812d 100644
--- a/src/windows-manager.cpp
+++ b/src/windows-manager.cpp
@@ -142,6 +142,22 @@ namespace graphics {
         return parentName;
     }
 
+    NodePtr_t WindowsManager::find (const std::string name, GroupNodePtr_t group)
+    {
+      std::map<std::string, NodePtr_t>::iterator it
+        = nodes_.find (name);
+      if (it == nodes_.end ()) {
+        std::string::size_type slash = name.find_first_of ('/');
+        if (slash == std::string::npos)
+          return NodePtr_t ();
+        std::map<std::string, GroupNodePtr_t>::iterator itg
+          = groupNodes_.find (name.substr (0, slash));
+        if (itg == groupNodes_.end ())
+          return NodePtr_t ();
+        return find (name.substr (slash + 1), itg->second);
+      }
+      return it->second;
+    }
 
     void WindowsManager::initParent (const std::string& nodeName,
             NodePtr_t node)
@@ -755,14 +771,15 @@ namespace graphics {
             const value_type* configurationCorba)
     {
         const std::string nodeName (nodeNameCorba);
-        if (nodes_.find (nodeName) == nodes_.end ()) {
+        NodePtr_t updatedNode = find (nodeName);
+        if (!updatedNode) {
             //no node named nodeName
             std::cout << "No Node named \"" << nodeName << "\"" << std::endl;
             return false;
         }
         else {
             NodeConfiguration newNodeConfiguration;
-            newNodeConfiguration.node = nodes_[nodeName];
+            newNodeConfiguration.node = updatedNode;
             try {
                 newNodeConfiguration.position =
                     WindowsManager::corbaConfToOsgVec3 (configurationCorba);
-- 
GitLab