From ae7b9ac5698c45405d6979a18ec721fc4e81d0c7 Mon Sep 17 00:00:00 2001
From: Rainer Kartmann <rainer.kartmann@kit.edu>
Date: Thu, 22 Apr 2021 18:02:29 +0200
Subject: [PATCH] Improve update of instance view (data now stays open while
 being updated)

---
 .../libraries/armem_gui/CMakeLists.txt        |  35 ++--
 .../instance/DataTreeBuilderBase.cpp          |  54 ------
 .../armem_gui/instance/InstanceView.cpp       |  16 +-
 .../armem_gui/instance/ValueDisplayVisitor.h  |  73 -------
 .../display_visitors/DataDisplayVisitor.cpp   |  76 ++++++++
 .../display_visitors/DataDisplayVisitor.h     |  37 ++++
 .../TypedDataDisplayVisitor.cpp               | 147 ++++++++++++++
 .../TypedDataDisplayVisitor.h                 |  56 ++++++
 .../armem_gui/instance/sanitize_typename.cpp  |  21 ++
 .../armem_gui/instance/sanitize_typename.h    |  12 ++
 .../armem_gui/instance/serialize_path.cpp     |  35 ++++
 .../armem_gui/instance/serialize_path.h       |  18 ++
 .../{ => tree_builders}/DataTreeBuilder.cpp   |  39 +---
 .../{ => tree_builders}/DataTreeBuilder.h     |  13 +-
 .../tree_builders/DataTreeBuilderBase.cpp     |  97 ++++++++++
 .../{ => tree_builders}/DataTreeBuilderBase.h |  21 +-
 .../tree_builders/TypedDataTreeBuilder.cpp    | 181 ++++++++++++++++++
 .../tree_builders/TypedDataTreeBuilder.h      |  63 ++++++
 .../{ => tree_visitors}/TreeDataVisitor.cpp   |   2 +-
 .../{ => tree_visitors}/TreeDataVisitor.h     |   4 +-
 .../TreeDataVisitorBase.cpp                   |   2 +-
 .../{ => tree_visitors}/TreeDataVisitorBase.h |   2 +-
 .../TreeTypedDataVisitor.cpp                  |  41 +---
 .../TreeTypedDataVisitor.h                    |  14 +-
 .../libraries/armem_gui/test/ArMemGuiTest.cpp |  10 +-
 .../navigator/visitors/TypedDataVisitor.h     | 145 +++-----------
 26 files changed, 844 insertions(+), 370 deletions(-)
 delete mode 100644 source/RobotAPI/libraries/armem_gui/instance/DataTreeBuilderBase.cpp
 delete mode 100644 source/RobotAPI/libraries/armem_gui/instance/ValueDisplayVisitor.h
 create mode 100644 source/RobotAPI/libraries/armem_gui/instance/display_visitors/DataDisplayVisitor.cpp
 create mode 100644 source/RobotAPI/libraries/armem_gui/instance/display_visitors/DataDisplayVisitor.h
 create mode 100644 source/RobotAPI/libraries/armem_gui/instance/display_visitors/TypedDataDisplayVisitor.cpp
 create mode 100644 source/RobotAPI/libraries/armem_gui/instance/display_visitors/TypedDataDisplayVisitor.h
 create mode 100644 source/RobotAPI/libraries/armem_gui/instance/sanitize_typename.cpp
 create mode 100644 source/RobotAPI/libraries/armem_gui/instance/sanitize_typename.h
 create mode 100644 source/RobotAPI/libraries/armem_gui/instance/serialize_path.cpp
 create mode 100644 source/RobotAPI/libraries/armem_gui/instance/serialize_path.h
 rename source/RobotAPI/libraries/armem_gui/instance/{ => tree_builders}/DataTreeBuilder.cpp (52%)
 rename source/RobotAPI/libraries/armem_gui/instance/{ => tree_builders}/DataTreeBuilder.h (66%)
 create mode 100644 source/RobotAPI/libraries/armem_gui/instance/tree_builders/DataTreeBuilderBase.cpp
 rename source/RobotAPI/libraries/armem_gui/instance/{ => tree_builders}/DataTreeBuilderBase.h (61%)
 create mode 100644 source/RobotAPI/libraries/armem_gui/instance/tree_builders/TypedDataTreeBuilder.cpp
 create mode 100644 source/RobotAPI/libraries/armem_gui/instance/tree_builders/TypedDataTreeBuilder.h
 rename source/RobotAPI/libraries/armem_gui/instance/{ => tree_visitors}/TreeDataVisitor.cpp (72%)
 rename source/RobotAPI/libraries/armem_gui/instance/{ => tree_visitors}/TreeDataVisitor.h (94%)
 rename source/RobotAPI/libraries/armem_gui/instance/{ => tree_visitors}/TreeDataVisitorBase.cpp (98%)
 rename source/RobotAPI/libraries/armem_gui/instance/{ => tree_visitors}/TreeDataVisitorBase.h (98%)
 rename source/RobotAPI/libraries/armem_gui/instance/{ => tree_visitors}/TreeTypedDataVisitor.cpp (62%)
 rename source/RobotAPI/libraries/armem_gui/instance/{ => tree_visitors}/TreeTypedDataVisitor.h (96%)

diff --git a/source/RobotAPI/libraries/armem_gui/CMakeLists.txt b/source/RobotAPI/libraries/armem_gui/CMakeLists.txt
index bd74942ee..3a448d873 100644
--- a/source/RobotAPI/libraries/armem_gui/CMakeLists.txt
+++ b/source/RobotAPI/libraries/armem_gui/CMakeLists.txt
@@ -23,12 +23,19 @@ set(SOURCES
     instance/GroupBox.cpp
     instance/ImageView.cpp
     instance/InstanceView.cpp
-    instance/TreeDataVisitorBase.cpp
-    instance/TreeDataVisitor.cpp
-    instance/TreeTypedDataVisitor.cpp
+    instance/sanitize_typename.cpp
+    instance/serialize_path.cpp
 
-    instance/DataTreeBuilder.cpp
-    instance/DataTreeBuilderBase.cpp
+    instance/display_visitors/DataDisplayVisitor.cpp
+    instance/display_visitors/TypedDataDisplayVisitor.cpp
+
+    instance/tree_builders/DataTreeBuilder.cpp
+    instance/tree_builders/DataTreeBuilderBase.cpp
+    instance/tree_builders/TypedDataTreeBuilder.cpp
+
+    instance/tree_visitors/TreeDataVisitorBase.cpp
+    instance/tree_visitors/TreeDataVisitor.cpp
+    instance/tree_visitors/TreeTypedDataVisitor.cpp
 
     memory/GroupBox.cpp
     memory/TreeWidget.cpp
@@ -48,13 +55,19 @@ set(HEADERS
     instance/GroupBox.h
     instance/ImageView.h
     instance/InstanceView.h
-    instance/TreeDataVisitorBase.h
-    instance/TreeDataVisitor.h
-    instance/TreeTypedDataVisitor.h
+    instance/sanitize_typename.h
+    instance/serialize_path.h
+
+    instance/display_visitors/DataDisplayVisitor.h
+    instance/display_visitors/TypedDataDisplayVisitor.h
+
+    instance/tree_builders/DataTreeBuilder.h
+    instance/tree_builders/DataTreeBuilderBase.h
+    instance/tree_builders/TypedDataTreeBuilder.h
 
-    instance/DataTreeBuilder.h
-    instance/DataTreeBuilderBase.h
-    instance/ValueDisplayVisitor.h
+    instance/tree_visitors/TreeDataVisitorBase.h
+    instance/tree_visitors/TreeDataVisitor.h
+    instance/tree_visitors/TreeTypedDataVisitor.h
 
     memory/GroupBox.h
     memory/TreeWidget.h
diff --git a/source/RobotAPI/libraries/armem_gui/instance/DataTreeBuilderBase.cpp b/source/RobotAPI/libraries/armem_gui/instance/DataTreeBuilderBase.cpp
deleted file mode 100644
index 8e9e39364..000000000
--- a/source/RobotAPI/libraries/armem_gui/instance/DataTreeBuilderBase.cpp
+++ /dev/null
@@ -1,54 +0,0 @@
-#include "DataTreeBuilderBase.h"
-
-#include <ArmarXCore/core/exceptions/local/ExpressionException.h>
-
-#include "ValueDisplayVisitor.h"
-
-
-namespace armarx::armem::gui
-{
-
-    DataTreeBuilderBase::DataTreeBuilderBase()
-    {
-    }
-
-    DataTreeBuilderBase::~DataTreeBuilderBase()
-    {}
-
-    void DataTreeBuilderBase::setColumns(int key, int value, int type)
-    {
-        this->columnKey = key;
-        this->columnType = type;
-        this->columnValue = value;
-    }
-
-
-    QTreeWidgetItem* DataTreeBuilderBase::makeItem(const std::string& key) const
-    {
-        return new QTreeWidgetItem(QStringList{QString::fromStdString(key)});
-    }
-
-    QTreeWidgetItem* DataTreeBuilderBase::makeItem(size_t key) const
-    {
-        QTreeWidgetItem* item = new QTreeWidgetItem();
-        item->setData(0, Qt::UserRole, static_cast<int>(key));
-        return item;
-    }
-
-    void DataTreeBuilderBase::setRowTexts(QTreeWidgetItem* item, const std::string& key, const std::string& value, const std::string& typeName) const
-    {
-        item->setText(columnKey, QString::fromStdString(key));
-        item->setText(columnValue, QString::fromStdString(value));
-        item->setText(columnType, QString::fromStdString(typeName));
-    }
-
-
-    void DataTreeBuilderBase::setRowTexts(
-        QTreeWidgetItem* item, const std::string& key, aron::datanavigator::Navigator& data)
-    {
-        armarx::aron::ValueDisplayVisitor visitor;
-        visitor.applyTo(data);
-        setRowTexts(item, key, visitor.ss.str(), data.getName());
-    }
-
-}
diff --git a/source/RobotAPI/libraries/armem_gui/instance/InstanceView.cpp b/source/RobotAPI/libraries/armem_gui/instance/InstanceView.cpp
index ee4e8c937..ce0b62597 100644
--- a/source/RobotAPI/libraries/armem_gui/instance/InstanceView.cpp
+++ b/source/RobotAPI/libraries/armem_gui/instance/InstanceView.cpp
@@ -9,6 +9,7 @@
 #include <QLayout>
 #include <QMenu>
 #include <QSplitter>
+#include <QTreeWidget>
 #include <QVBoxLayout>
 
 #include <SimoxUtility/algorithm/string.h>
@@ -19,10 +20,10 @@
 #include <RobotAPI/libraries/aron/core/navigator/type/container/Object.h>
 
 #include <RobotAPI/libraries/armem_gui/gui_utils.h>
-#include <RobotAPI/libraries/armem_gui/instance/DataTreeBuilder.h>
-#include <RobotAPI/libraries/armem_gui/instance/TreeDataVisitor.h>
-#include <RobotAPI/libraries/armem_gui/instance/TreeTypedDataVisitor.h>
 #include <RobotAPI/libraries/armem_gui/instance/ImageView.h>
+#include <RobotAPI/libraries/armem_gui/instance/serialize_path.h>
+#include <RobotAPI/libraries/armem_gui/instance/tree_builders/DataTreeBuilder.h>
+#include <RobotAPI/libraries/armem_gui/instance/tree_builders/TypedDataTreeBuilder.h>
 
 
 namespace armarx::armem::gui::instance
@@ -156,10 +157,9 @@ namespace armarx::armem::gui::instance
         }
         else if (useTypeInfo && aronType)
         {
-            armarx::gui::clearItem(treeItemData);
-            TreeTypedDataVisitor visitor(treeItemData);
-            visitor.setColumns(int(Columns::KEY), int(Columns::VALUE), int(Columns::TYPE));
-            visitor.applyTo(*aronType, *data);
+            TypedDataTreeBuilder builder;
+            builder.setColumns(int(Columns::KEY), int(Columns::VALUE), int(Columns::TYPE));
+            builder.updateTree(treeItemData, *aronType, *data);
         }
         else
         {
@@ -213,7 +213,7 @@ namespace armarx::armem::gui::instance
             case aron::type::Descriptor::eIVTCByteImage:
             {
                 QStringList qpath = item->data(int(Columns::KEY), Qt::UserRole).toStringList();
-                aron::Path path = TreeTypedDataVisitor::deserializePath(qpath);
+                aron::Path path = deserializePath(qpath);
 
                 QAction* viewAction = new QAction("Show image");
                 menu.addAction(viewAction);
diff --git a/source/RobotAPI/libraries/armem_gui/instance/ValueDisplayVisitor.h b/source/RobotAPI/libraries/armem_gui/instance/ValueDisplayVisitor.h
deleted file mode 100644
index 9b7c92245..000000000
--- a/source/RobotAPI/libraries/armem_gui/instance/ValueDisplayVisitor.h
+++ /dev/null
@@ -1,73 +0,0 @@
-#pragma once
-
-#include <sstream>
-
-#include <RobotAPI/libraries/aron/core/navigator/visitors/DataVisitor.h>
-
-
-namespace armarx::aron
-{
-
-    struct ValueDisplayVisitor : public aron::visitor::DataVisitor
-    {
-        std::stringstream ss;
-
-
-        bool visitEnter(DictDataNavigator& n) override
-        {
-            ss << n.getChildren().size() << " items";
-            return false;
-        }
-        bool visitEnter(ListDataNavigator& n) override
-        {
-            ss << n.getChildren().size() << " items";
-            return false;
-        }
-
-        bool visit(BoolDataNavigator& b) override
-        {
-            if (b.getValue())
-            {
-                ss << "true";
-            }
-            else
-            {
-                ss << "false";
-            }
-            return false;
-        }
-        bool visit(DoubleDataNavigator& n) override
-        {
-            ss << n.getValue();
-            return false;
-        }
-        bool visit(FloatDataNavigator& n) override
-        {
-            ss << n.getValue();
-            return false;
-        }
-        bool visit(IntDataNavigator& n) override
-        {
-            ss << n.getValue();
-            return false;
-        }
-        bool visit(LongDataNavigator& n) override
-        {
-            ss << n.getValue();
-            return false;
-        }
-        bool visit(StringDataNavigator& n) override
-        {
-            ss << "'" << n.getValue() << "'";
-            return false;
-        }
-
-        bool visit(NDArrayDataNavigator& n) override
-        {
-            ss << "shape " << aron::datanavigator::NDArrayNavigator::DimensionsToString(n.getDimensions());
-            return false;
-        }
-
-    };
-
-}
diff --git a/source/RobotAPI/libraries/armem_gui/instance/display_visitors/DataDisplayVisitor.cpp b/source/RobotAPI/libraries/armem_gui/instance/display_visitors/DataDisplayVisitor.cpp
new file mode 100644
index 000000000..f41f5d4cb
--- /dev/null
+++ b/source/RobotAPI/libraries/armem_gui/instance/display_visitors/DataDisplayVisitor.cpp
@@ -0,0 +1,76 @@
+#include "DataDisplayVisitor.h"
+
+
+namespace armarx::aron
+{
+
+    std::string DataDisplayVisitor::getValue(DataNavigator& n)
+    {
+        DataDisplayVisitor v;
+        v.applyTo(n);
+        return v.value.str();
+    }
+
+    bool DataDisplayVisitor::visitEnter(DictDataNavigator& n)
+    {
+        value << n.childrenSize() << " items";
+        return false;
+    }
+
+    bool DataDisplayVisitor::visitEnter(ListDataNavigator& n)
+    {
+        value << n.childrenSize() << " items";
+        return false;
+    }
+
+    bool DataDisplayVisitor::visit(BoolDataNavigator& b)
+    {
+        if (b.getValue())
+        {
+            value << "true";
+        }
+        else
+        {
+            value << "false";
+        }
+        return false;
+    }
+
+    bool DataDisplayVisitor::visit(DoubleDataNavigator& n)
+    {
+        value << n.getValue();
+        return false;
+    }
+
+    bool DataDisplayVisitor::visit(FloatDataNavigator& n)
+    {
+        value << n.getValue();
+        return false;
+    }
+
+    bool DataDisplayVisitor::visit(IntDataNavigator& n)
+    {
+        value << n.getValue();
+        return false;
+    }
+
+    bool DataDisplayVisitor::visit(LongDataNavigator& n)
+    {
+        value << n.getValue();
+        return false;
+    }
+
+    bool DataDisplayVisitor::visit(StringDataNavigator& n)
+    {
+        value << "'" << n.getValue() << "'";
+        return false;
+    }
+
+    bool DataDisplayVisitor::visit(NDArrayDataNavigator& n)
+    {
+        value << "shape " << aron::datanavigator::NDArrayNavigator::DimensionsToString(n.getDimensions());
+        return false;
+    }
+
+
+}
diff --git a/source/RobotAPI/libraries/armem_gui/instance/display_visitors/DataDisplayVisitor.h b/source/RobotAPI/libraries/armem_gui/instance/display_visitors/DataDisplayVisitor.h
new file mode 100644
index 000000000..8f48a57f0
--- /dev/null
+++ b/source/RobotAPI/libraries/armem_gui/instance/display_visitors/DataDisplayVisitor.h
@@ -0,0 +1,37 @@
+#pragma once
+
+#include <sstream>
+
+#include <RobotAPI/libraries/aron/core/navigator/visitors/DataVisitor.h>
+
+
+namespace armarx::aron
+{
+
+    class DataDisplayVisitor : public aron::visitor::DataVisitor
+    {
+    public:
+
+        static std::string getValue(DataNavigator& n);
+
+
+    public:
+
+        std::stringstream value;
+
+
+        bool visitEnter(DictDataNavigator& n) override;
+        bool visitEnter(ListDataNavigator& n) override;
+
+        bool visit(BoolDataNavigator& b) override;
+        bool visit(DoubleDataNavigator& n) override;
+        bool visit(FloatDataNavigator& n) override;
+        bool visit(IntDataNavigator& n) override;
+        bool visit(LongDataNavigator& n) override;
+        bool visit(StringDataNavigator& n) override;
+
+        bool visit(NDArrayDataNavigator& n) override;
+
+    };
+
+}
diff --git a/source/RobotAPI/libraries/armem_gui/instance/display_visitors/TypedDataDisplayVisitor.cpp b/source/RobotAPI/libraries/armem_gui/instance/display_visitors/TypedDataDisplayVisitor.cpp
new file mode 100644
index 000000000..827d14a59
--- /dev/null
+++ b/source/RobotAPI/libraries/armem_gui/instance/display_visitors/TypedDataDisplayVisitor.cpp
@@ -0,0 +1,147 @@
+#include "TypedDataDisplayVisitor.h"
+
+#include <iomanip>      // std::setprecision
+
+#include <SimoxUtility/algorithm/string.h>
+
+#include <RobotAPI/libraries/aron/core/Exception.h>
+#include <RobotAPI/libraries/aron/converter/eigen/EigenConverter.h>
+#include <RobotAPI/libraries/armem/core/Time.h>
+
+#include "DataDisplayVisitor.h"
+
+
+namespace armarx::aron
+{
+
+    std::string TypedDataDisplayVisitor::getValue(TypeNavigator& type, DataNavigator& data)
+    {
+        TypedDataDisplayVisitor v;
+        bool r = v.applyTo(type, data);
+        ARMARX_CHECK(!r);
+        return v.value.str();
+    }
+
+    bool TypedDataDisplayVisitor::visitEnter(DictTypeNavigator&, DictDataNavigator& data)
+    {
+        value << DataDisplayVisitor::getValue(data);
+        return false;
+    }
+
+    bool TypedDataDisplayVisitor::visitEnter(ObjectTypeNavigator&, DictDataNavigator& data)
+    {
+        value << DataDisplayVisitor::getValue(data);
+        return false;
+    }
+
+    bool TypedDataDisplayVisitor::visitEnter(ListTypeNavigator&, ListDataNavigator& data)
+    {
+        value << DataDisplayVisitor::getValue(data);
+        return false;
+    }
+
+    bool TypedDataDisplayVisitor::visitEnter(TupleTypeNavigator&, ListDataNavigator& data)
+    {
+        value << DataDisplayVisitor::getValue(data);
+        return false;
+    }
+
+    bool TypedDataDisplayVisitor::visit(BoolTypeNavigator&, BoolDataNavigator& data)
+    {
+        value << DataDisplayVisitor::getValue(data);
+        return false;
+    }
+
+    bool TypedDataDisplayVisitor::visit(DoubleTypeNavigator&, DoubleDataNavigator& data)
+    {
+        value << DataDisplayVisitor::getValue(data);
+        return false;
+    }
+
+    bool TypedDataDisplayVisitor::visit(FloatTypeNavigator&, FloatDataNavigator& data)
+    {
+        value << DataDisplayVisitor::getValue(data);
+        return false;
+    }
+
+    bool TypedDataDisplayVisitor::visit(IntTypeNavigator&, IntDataNavigator& data)
+    {
+        value << DataDisplayVisitor::getValue(data);
+        return false;
+    }
+
+    bool TypedDataDisplayVisitor::visit(LongTypeNavigator&, LongDataNavigator& data)
+    {
+        value << DataDisplayVisitor::getValue(data);
+        return false;
+    }
+
+    bool TypedDataDisplayVisitor::visit(StringTypeNavigator&, StringDataNavigator& data)
+    {
+        value << DataDisplayVisitor::getValue(data);
+        return false;
+    }
+
+    bool TypedDataDisplayVisitor::visit(TimeTypeNavigator&, LongDataNavigator& data)
+    {
+        armem::Time time = armem::Time::microSeconds(data.getValue());
+        armem::toDateTimeMilliSeconds(time);
+        value << armem::toDateTimeMilliSeconds(time);
+        return false;
+    }
+
+    bool TypedDataDisplayVisitor::visit(EigenMatrixTypeNavigator&, NDArrayDataNavigator& data)
+    {
+        value << DataDisplayVisitor::getValue(data);
+        return false;
+    }
+
+    bool TypedDataDisplayVisitor::visit(EigenQuaternionTypeNavigator&, NDArrayDataNavigator& data)
+    {
+        value << DataDisplayVisitor::getValue(data);
+        return false;
+    }
+
+    bool TypedDataDisplayVisitor::visit(IVTCByteImageTypeNavigator&, NDArrayDataNavigator& data)
+    {
+        value << DataDisplayVisitor::getValue(data);
+        return false;
+    }
+
+    bool TypedDataDisplayVisitor::visit(OpenCVMatTypeNavigator&, NDArrayDataNavigator& data)
+    {
+        value << DataDisplayVisitor::getValue(data);
+        return false;
+    }
+
+    bool TypedDataDisplayVisitor::visit(PCLPointCloudTypeNavigator&, NDArrayDataNavigator& data)
+    {
+        value << DataDisplayVisitor::getValue(data);
+        return false;
+    }
+
+    bool TypedDataDisplayVisitor::visit(PoseTypeNavigator&, NDArrayDataNavigator& data)
+    {
+        const Eigen::Matrix4f pose = aron::converter::AronEigenConverter::ConvertToMatrix4f(data);
+        value << std::setprecision(2) << std::fixed;
+        value << pose.format(Eigen::IOFormat(Eigen::StreamPrecision, 0, coeffSep, "\n", "", "", "", ""));
+        return false;
+    }
+
+    bool TypedDataDisplayVisitor::visit(PositionTypeNavigator&, NDArrayDataNavigator& data)
+    {
+        const Eigen::Vector3f pos = aron::converter::AronEigenConverter::ConvertToVector3f(data);
+        value << std::setprecision(2) << std::fixed;
+        value << pos.format(Eigen::IOFormat(Eigen::StreamPrecision, 0, "", coeffSep, "", "", "", ""));
+        return false;
+    }
+
+    bool TypedDataDisplayVisitor::visit(OrientationTypeNavigator&, NDArrayDataNavigator& data)
+    {
+        const Eigen::Quaternionf quat = aron::converter::AronEigenConverter::ConvertToQuaternionf(data);
+        value << std::setprecision(2) << std::fixed;
+        value << quat.w() << coeffSep << "|" << coeffSep << quat.x() << coeffSep << quat.y() << coeffSep << quat.z();
+        return false;
+    }
+
+}
diff --git a/source/RobotAPI/libraries/armem_gui/instance/display_visitors/TypedDataDisplayVisitor.h b/source/RobotAPI/libraries/armem_gui/instance/display_visitors/TypedDataDisplayVisitor.h
new file mode 100644
index 000000000..3923b7d0d
--- /dev/null
+++ b/source/RobotAPI/libraries/armem_gui/instance/display_visitors/TypedDataDisplayVisitor.h
@@ -0,0 +1,56 @@
+#pragma once
+
+#include <sstream>
+#include <string>
+
+#include <RobotAPI/libraries/aron/core/navigator/visitors/TypedDataVisitor.h>
+
+
+namespace armarx::aron
+{
+
+    class TypedDataDisplayVisitor : public aron::visitor::TypedDataVisitor
+    {
+    public:
+
+        static std::string getValue(TypeNavigator& type, DataNavigator& data);
+
+
+    public:
+
+        std::stringstream value;
+
+
+        bool visitEnter(DictTypeNavigator&, DictDataNavigator& data) override;
+        bool visitEnter(ObjectTypeNavigator&, DictDataNavigator& data) override;
+
+        bool visitEnter(ListTypeNavigator&, ListDataNavigator& data) override;
+        bool visitEnter(TupleTypeNavigator&, ListDataNavigator& data) override;
+
+
+        bool visit(BoolTypeNavigator&, BoolDataNavigator& data) override;
+        bool visit(DoubleTypeNavigator&, DoubleDataNavigator& data) override;
+        bool visit(FloatTypeNavigator&, FloatDataNavigator& data) override;
+        bool visit(IntTypeNavigator&, IntDataNavigator& data) override;
+        bool visit(LongTypeNavigator&, LongDataNavigator& data) override;
+        bool visit(StringTypeNavigator&, StringDataNavigator& data) override;
+        bool visit(TimeTypeNavigator&, LongDataNavigator& data) override;
+
+
+        bool visit(EigenMatrixTypeNavigator&, NDArrayDataNavigator& data) override;
+        bool visit(EigenQuaternionTypeNavigator&, NDArrayDataNavigator& data) override;
+        bool visit(IVTCByteImageTypeNavigator&, NDArrayDataNavigator& data) override;
+        bool visit(OpenCVMatTypeNavigator&, NDArrayDataNavigator& data) override;
+        bool visit(PCLPointCloudTypeNavigator&, NDArrayDataNavigator& data) override;
+        bool visit(PoseTypeNavigator&, NDArrayDataNavigator& data) override;
+        bool visit(PositionTypeNavigator&, NDArrayDataNavigator& data) override;
+        bool visit(OrientationTypeNavigator&, NDArrayDataNavigator& data) override;
+
+
+    protected:
+
+        std::string coeffSep = "  ";
+
+    };
+
+}
diff --git a/source/RobotAPI/libraries/armem_gui/instance/sanitize_typename.cpp b/source/RobotAPI/libraries/armem_gui/instance/sanitize_typename.cpp
new file mode 100644
index 000000000..ac5494864
--- /dev/null
+++ b/source/RobotAPI/libraries/armem_gui/instance/sanitize_typename.cpp
@@ -0,0 +1,21 @@
+#include "sanitize_typename.h"
+
+#include <SimoxUtility/algorithm/string.h>
+
+
+std::string armarx::armem::gui::instance::sanitizeTypeName(const std::string& typeName)
+{
+    namespace s = simox::alg;
+    std::string n = typeName;
+    n = s::replace_all(n, "Aron", "");
+    n = s::replace_all(n, "Type", "");
+    n = s::replace_all(n, "type::", "");
+    if (s::starts_with(n, "Object<") && s::ends_with(n, ">"))
+    {
+        std::string begin = "Object<";
+        std::string end = ">";
+        n = n.substr(begin.size(), n.size() - begin.size() - end.size());
+    }
+    return n;
+
+}
diff --git a/source/RobotAPI/libraries/armem_gui/instance/sanitize_typename.h b/source/RobotAPI/libraries/armem_gui/instance/sanitize_typename.h
new file mode 100644
index 000000000..80c77acf2
--- /dev/null
+++ b/source/RobotAPI/libraries/armem_gui/instance/sanitize_typename.h
@@ -0,0 +1,12 @@
+#pragma once
+
+#include <string>
+
+
+namespace armarx::armem::gui::instance
+{
+
+    std::string sanitizeTypeName(const std::string& typeName);
+
+}
+
diff --git a/source/RobotAPI/libraries/armem_gui/instance/serialize_path.cpp b/source/RobotAPI/libraries/armem_gui/instance/serialize_path.cpp
new file mode 100644
index 000000000..a01b0b462
--- /dev/null
+++ b/source/RobotAPI/libraries/armem_gui/instance/serialize_path.cpp
@@ -0,0 +1,35 @@
+#include "serialize_path.h"
+
+#include <RobotAPI/libraries/aron/core/Path.h>
+
+#include <ArmarXCore/core/exceptions/local/ExpressionException.h>
+
+#include <SimoxUtility/algorithm/string.h>
+
+#include <QString>
+#include <QStringList>
+
+
+QStringList armarx::armem::gui::instance::serializePath(const aron::Path& path)
+{
+    QStringList qpath;
+    qpath.append(QString::fromStdString(path.getRootIdentifier()));
+    qpath.append(QString::fromStdString(path.getDelimeter()));
+    for (const std::string& item : path.getPath())
+    {
+        qpath.append(QString::fromStdString(item));
+    }
+    return qpath;
+}
+
+armarx::aron::Path armarx::armem::gui::instance::deserializePath(const QStringList& qpath)
+{
+    ARMARX_CHECK_GREATER_EQUAL(qpath.size(), 2);
+    std::vector<std::string> pathItems;
+    for (int i = 2; i < qpath.size(); ++i)
+    {
+        pathItems.push_back(qpath.at(i).toStdString());
+    }
+    aron::Path path(qpath.at(0).toStdString(), qpath.at(1).toStdString(), pathItems);
+    return path;
+}
diff --git a/source/RobotAPI/libraries/armem_gui/instance/serialize_path.h b/source/RobotAPI/libraries/armem_gui/instance/serialize_path.h
new file mode 100644
index 000000000..26517c6d1
--- /dev/null
+++ b/source/RobotAPI/libraries/armem_gui/instance/serialize_path.h
@@ -0,0 +1,18 @@
+#pragma once
+
+
+namespace armarx::aron
+{
+    class Path;
+}
+class QStringList;
+
+
+namespace armarx::armem::gui::instance
+{
+
+    QStringList serializePath(const aron::Path& path);
+    aron::Path deserializePath(const QStringList& qpath);
+
+}
+
diff --git a/source/RobotAPI/libraries/armem_gui/instance/DataTreeBuilder.cpp b/source/RobotAPI/libraries/armem_gui/instance/tree_builders/DataTreeBuilder.cpp
similarity index 52%
rename from source/RobotAPI/libraries/armem_gui/instance/DataTreeBuilder.cpp
rename to source/RobotAPI/libraries/armem_gui/instance/tree_builders/DataTreeBuilder.cpp
index 27e9f0142..07ccac886 100644
--- a/source/RobotAPI/libraries/armem_gui/instance/DataTreeBuilder.cpp
+++ b/source/RobotAPI/libraries/armem_gui/instance/tree_builders/DataTreeBuilder.cpp
@@ -1,11 +1,11 @@
 #include "DataTreeBuilder.h"
 
-#include <ArmarXCore/core/exceptions/local/ExpressionException.h>
+#include <QTreeWidgetItem>
 
 #include <RobotAPI/libraries/armem_gui/TreeWidgetBuilder.h>
 
 
-namespace armarx::armem::gui
+namespace armarx::armem::gui::instance
 {
 
     DataTreeBuilder::DataTreeBuilder()
@@ -14,18 +14,7 @@ namespace armarx::armem::gui
 
     void DataTreeBuilder::updateTree(QTreeWidgetItem* parent, aron::datanavigator::DictNavigator& data)
     {
-        using ContainerT = std::vector<std::string>;
-        const ContainerT keys = data.getAllKeys();
-
-        armarx::TreeWidgetBuilder<ContainerT> builder;
-        builder.setCompareFn([](const std::string & key, QTreeWidgetItem * item)
-        {
-            return armarx::detail::compare(key, item->text(0).toStdString());
-        });
-        builder.setMakeItemFn([this](const std::string & key)
-        {
-            return this->makeItem(key);
-        });
+        DictBuilder builder = getDictBuilder();
         builder.setUpdateItemFn([this, &data](const std::string & key, QTreeWidgetItem * item)
         {
             auto child = data.getElement(key);
@@ -33,37 +22,21 @@ namespace armarx::armem::gui
             return true;
         });
 
-        builder.updateTree(parent, keys);
+        builder.updateTree(parent, data.getAllKeys());
     }
 
     void DataTreeBuilder::updateTree(QTreeWidgetItem* parent, aron::datanavigator::ListNavigator& data)
     {
         auto children = data.getChildren();
 
-        using ContainerT = std::vector<size_t>;
-        ContainerT index;
-        index.reserve(children.size());
-        for (size_t i = 0; i < children.size(); ++i)
-        {
-            index.push_back(i);
-        }
-
-        armarx::TreeWidgetBuilder<ContainerT> builder;
-        builder.setCompareFn([](size_t key, QTreeWidgetItem * item)
-        {
-            return armarx::detail::compare(static_cast<int>(key), item->data(0, Qt::UserRole).toInt());
-        });
-        builder.setMakeItemFn([this](size_t key)
-        {
-            return this->makeItem(key);
-        });
+        ListBuilder builder = getListBuilder();
         builder.setUpdateItemFn([this, &children](size_t key, QTreeWidgetItem * item)
         {
             this->update(item, std::to_string(key), *children.at(key));
             return true;
         });
 
-        builder.updateTree(parent, index);
+        builder.updateTree(parent, getIndex(children.size()));
     }
 
 
diff --git a/source/RobotAPI/libraries/armem_gui/instance/DataTreeBuilder.h b/source/RobotAPI/libraries/armem_gui/instance/tree_builders/DataTreeBuilder.h
similarity index 66%
rename from source/RobotAPI/libraries/armem_gui/instance/DataTreeBuilder.h
rename to source/RobotAPI/libraries/armem_gui/instance/tree_builders/DataTreeBuilder.h
index ac5b4dfae..a9aa8471e 100644
--- a/source/RobotAPI/libraries/armem_gui/instance/DataTreeBuilder.h
+++ b/source/RobotAPI/libraries/armem_gui/instance/tree_builders/DataTreeBuilder.h
@@ -1,18 +1,14 @@
 #pragma once
 
-#include <sstream>
-#include <stack>
+#include <string>
 
-#include <QTreeWidget>
-#include <QLabel>
-
-#include <RobotAPI/libraries/aron/core/navigator/visitors/DataVisitor.h>
-#include <RobotAPI/libraries/armem_gui/TreeWidgetBuilder.h>
+#include <RobotAPI/libraries/aron/core/navigator/data/container/Dict.h>
+#include <RobotAPI/libraries/aron/core/navigator/data/container/List.h>
 
 #include "DataTreeBuilderBase.h"
 
 
-namespace armarx::armem::gui
+namespace armarx::armem::gui::instance
 {
 
     class DataTreeBuilder : public DataTreeBuilderBase
@@ -31,5 +27,4 @@ namespace armarx::armem::gui
 
     };
 
-
 }
diff --git a/source/RobotAPI/libraries/armem_gui/instance/tree_builders/DataTreeBuilderBase.cpp b/source/RobotAPI/libraries/armem_gui/instance/tree_builders/DataTreeBuilderBase.cpp
new file mode 100644
index 000000000..f837fe2fa
--- /dev/null
+++ b/source/RobotAPI/libraries/armem_gui/instance/tree_builders/DataTreeBuilderBase.cpp
@@ -0,0 +1,97 @@
+#include "DataTreeBuilderBase.h"
+
+#include <QTreeWidgetItem>
+
+#include <ArmarXCore/core/exceptions/local/ExpressionException.h>
+
+#include <RobotAPI/libraries/armem_gui/TreeWidgetBuilder.h>
+#include <RobotAPI/libraries/armem_gui/instance/display_visitors/DataDisplayVisitor.h>
+
+
+namespace armarx::armem::gui::instance
+{
+
+    DataTreeBuilderBase::DataTreeBuilderBase()
+    {
+    }
+
+    DataTreeBuilderBase::~DataTreeBuilderBase()
+    {}
+
+    void DataTreeBuilderBase::setColumns(int key, int value, int type)
+    {
+        this->columnKey = key;
+        this->columnType = type;
+        this->columnValue = value;
+    }
+
+
+    QTreeWidgetItem* DataTreeBuilderBase::makeItem(const std::string& key) const
+    {
+        return new QTreeWidgetItem(QStringList{QString::fromStdString(key)});
+    }
+
+    QTreeWidgetItem* DataTreeBuilderBase::makeItem(size_t key) const
+    {
+        QTreeWidgetItem* item = new QTreeWidgetItem();
+        item->setData(0, Qt::UserRole, static_cast<int>(key));
+        return item;
+    }
+
+    void DataTreeBuilderBase::setRowTexts(QTreeWidgetItem* item, const std::string& key, const std::string& value, const std::string& typeName) const
+    {
+        item->setText(columnKey, QString::fromStdString(key));
+        item->setText(columnValue, QString::fromStdString(value));
+        item->setText(columnType, QString::fromStdString(typeName));
+    }
+
+
+    void DataTreeBuilderBase::setRowTexts(
+        QTreeWidgetItem* item, const std::string& key, aron::datanavigator::Navigator& data)
+    {
+        const std::string value = armarx::aron::DataDisplayVisitor::getValue(data);
+        setRowTexts(item, key, value, data.getName());
+    }
+
+    DataTreeBuilderBase::DictBuilder DataTreeBuilderBase::getDictBuilder() const
+    {
+        DictBuilder builder;
+        builder.setCompareFn([](const std::string & key, QTreeWidgetItem * item)
+        {
+            return armarx::detail::compare(key, item->text(0).toStdString());
+        });
+        builder.setMakeItemFn([this](const std::string & key)
+        {
+            return this->makeItem(key);
+        });
+        return builder;
+    }
+
+
+    DataTreeBuilderBase::ListBuilder DataTreeBuilderBase::getListBuilder() const
+    {
+        ListBuilder builder;
+        builder.setCompareFn([](size_t key, QTreeWidgetItem * item)
+        {
+            return armarx::detail::compare(static_cast<int>(key), item->data(0, Qt::UserRole).toInt());
+        });
+        builder.setMakeItemFn([this](size_t key)
+        {
+            return this->makeItem(key);
+        });
+        return builder;
+    }
+
+
+    std::vector<size_t> DataTreeBuilderBase::getIndex(size_t size) const
+    {
+        std::vector<size_t> index;
+        index.reserve(size);
+        for (size_t i = 0; i < size; ++i)
+        {
+            index.push_back(i);
+        }
+        return index;
+    }
+
+}
diff --git a/source/RobotAPI/libraries/armem_gui/instance/DataTreeBuilderBase.h b/source/RobotAPI/libraries/armem_gui/instance/tree_builders/DataTreeBuilderBase.h
similarity index 61%
rename from source/RobotAPI/libraries/armem_gui/instance/DataTreeBuilderBase.h
rename to source/RobotAPI/libraries/armem_gui/instance/tree_builders/DataTreeBuilderBase.h
index fb2f11945..b26a422ea 100644
--- a/source/RobotAPI/libraries/armem_gui/instance/DataTreeBuilderBase.h
+++ b/source/RobotAPI/libraries/armem_gui/instance/tree_builders/DataTreeBuilderBase.h
@@ -1,11 +1,19 @@
 #pragma once
 
-#include <QTreeWidgetItem>
+#include <string>
 
 #include <RobotAPI/libraries/aron/core/navigator/data/Navigator.h>
 
 
-namespace armarx::armem::gui
+namespace armarx
+{
+    template <class ContainerT> struct TreeWidgetBuilder;
+}
+
+class QTreeWidgetItem;
+
+
+namespace armarx::armem::gui::instance
 {
 
     class DataTreeBuilderBase
@@ -20,13 +28,20 @@ namespace armarx::armem::gui
 
     protected:
 
+        using DictBuilder = armarx::TreeWidgetBuilder<std::vector<std::string>>;
+        using ListBuilder = armarx::TreeWidgetBuilder<std::vector<size_t>>;
+
+        DictBuilder getDictBuilder() const;
+        ListBuilder getListBuilder() const;
+        std::vector<size_t> getIndex(size_t size) const;
+
+
         QTreeWidgetItem* makeItem(const std::string& key) const;
         QTreeWidgetItem* makeItem(size_t key) const;
 
         void setRowTexts(QTreeWidgetItem* item, const std::string& key, const std::string& value, const std::string& typeName = "") const;
         void setRowTexts(QTreeWidgetItem* item, const std::string& key, aron::datanavigator::Navigator& data);
 
-
     public:
 
         int columnKey = 0;
diff --git a/source/RobotAPI/libraries/armem_gui/instance/tree_builders/TypedDataTreeBuilder.cpp b/source/RobotAPI/libraries/armem_gui/instance/tree_builders/TypedDataTreeBuilder.cpp
new file mode 100644
index 000000000..abe50eb82
--- /dev/null
+++ b/source/RobotAPI/libraries/armem_gui/instance/tree_builders/TypedDataTreeBuilder.cpp
@@ -0,0 +1,181 @@
+#include "TypedDataTreeBuilder.h"
+
+#include <QTreeWidgetItem>
+
+#include <RobotAPI/libraries/armem_gui/TreeWidgetBuilder.h>
+#include <RobotAPI/libraries/armem_gui/instance/serialize_path.h>
+#include <RobotAPI/libraries/armem_gui/instance/sanitize_typename.h>
+#include <RobotAPI/libraries/armem_gui/instance/display_visitors/TypedDataDisplayVisitor.h>
+
+
+namespace armarx::armem::gui::instance
+{
+
+    TypedDataTreeBuilder::TypedDataTreeBuilder()
+    {
+    }
+
+
+    void TypedDataTreeBuilder::updateTree(
+            QTreeWidgetItem* parent,
+            aron::typenavigator::DictNavigator& type,
+            aron::datanavigator::DictNavigator& data)
+    {
+        auto childType = type.getAcceptedType();
+        if (childType)
+        {
+            DictBuilder builder = getDictBuilder();
+            builder.setUpdateItemFn([this, &childType, &data](const std::string & key, QTreeWidgetItem * item)
+            {
+                auto childData = data.getElement(key);
+                if (childData)
+                {
+                    this->update(item, key, *childType, *childData);
+                }
+                return true;
+            });
+
+            builder.updateTree(parent, data.getAllKeys());
+        }
+    }
+
+    void TypedDataTreeBuilder::updateTree(
+            QTreeWidgetItem* parent,
+            aron::typenavigator::ObjectNavigator& type,
+            aron::datanavigator::DictNavigator& data)
+    {
+        DictBuilder builder = getDictBuilder();
+        builder.setUpdateItemFn([this, &type, &data](const std::string & key, QTreeWidgetItem * item)
+        {
+            auto childType = type.getMemberType(key);
+            auto childData = data.getElement(key);
+
+            if (childType && childData)
+            {
+                this->update(item, key, *childType, *childData);
+            }
+            return true;
+        });
+
+        builder.updateTree(parent, type.getAllKeys());
+    }
+
+
+    void TypedDataTreeBuilder::updateTree(QTreeWidgetItem* parent,
+            aron::typenavigator::ListNavigator& type,
+            aron::datanavigator::ListNavigator& data)
+    {
+        auto childType = type.getAcceptedType();
+        if (childType)
+        {
+            auto children = data.getChildren();
+
+            ListBuilder builder = getListBuilder();
+            builder.setUpdateItemFn([this, &children, &childType](size_t key, QTreeWidgetItem * item)
+            {
+                auto childData = children.at(key);
+                if (childData)
+                {
+                    this->update(item, std::to_string(key), *childType, *childData);
+                }
+                return true;
+            });
+
+            builder.updateTree(parent, getIndex(children.size()));
+        }
+    }
+
+    void TypedDataTreeBuilder::updateTree(
+            QTreeWidgetItem* parent,
+            aron::typenavigator::PairNavigator& type,
+            aron::datanavigator::ListNavigator& data)
+    {
+        ARMARX_CHECK_EQUAL(data.childrenSize(), 2);
+        auto childTypes = type.getAcceptedTypes();
+
+        ListBuilder builder = getListBuilder();
+        builder.setUpdateItemFn([this, &data, &childTypes](size_t i, QTreeWidgetItem * item)
+        {
+            auto childType = i == 0 ? childTypes.first : childTypes.second;
+            auto childData = data.getElement(static_cast<unsigned int>(i));
+
+            if (childType && childData)
+            {
+                this->update(item, std::to_string(i), *childType, *childData);
+            }
+            return true;
+        });
+
+        builder.updateTree(parent, getIndex(data.childrenSize()));
+    }
+
+    void TypedDataTreeBuilder::updateTree(
+            QTreeWidgetItem* parent,
+            aron::typenavigator::TupleNavigator& type,
+            aron::datanavigator::ListNavigator& data)
+    {
+        auto childTypes = type.getAcceptedTypes();
+
+        ListBuilder builder = getListBuilder();
+        builder.setUpdateItemFn([this, &data, &childTypes](size_t i, QTreeWidgetItem * item)
+        {
+            auto childType = childTypes.at(i);
+            auto childData = data.getElement(static_cast<unsigned int>(i));
+
+            if (childType && childData)
+            {
+                this->update(item, std::to_string(i), *childType, *childData);
+            }
+            return true;
+        });
+
+        builder.updateTree(parent, getIndex(type.getAcceptedTypes().size()));
+    }
+
+
+    void TypedDataTreeBuilder::update(
+            QTreeWidgetItem* item,
+            const std::string& key,
+            aron::typenavigator::Navigator& type,
+            aron::datanavigator::Navigator& data)
+    {
+        using namespace aron::typenavigator;
+
+        const std::string value = armarx::aron::TypedDataDisplayVisitor::getValue(type, data);
+        const std::string typeName = sanitizeTypeName(type.getName());
+        ARMARX_IMPORTANT << VAROUT(typeName);
+        setRowTexts(item, key, value, typeName);
+
+        item->setData(columnKey, Qt::UserRole, serializePath(data.getPath()));
+        item->setData(columnType, Qt::UserRole, static_cast<int>(type.getDescriptor()));
+
+        if (auto t = dynamic_cast<ObjectNavigator*>(&type))
+        {
+            _updateTree<aron::datanavigator::DictNavigator>(item, *t, data);
+        }
+        else if (auto t = dynamic_cast<DictNavigator*>(&type))
+        {
+            _updateTree<aron::datanavigator::DictNavigator>(item, *t, data);
+        }
+        else if (auto t = dynamic_cast<ListNavigator*>(&type))
+        {
+            _updateTree<aron::datanavigator::ListNavigator>(item, *t, data);
+        }
+        else if (auto t = dynamic_cast<PairNavigator*>(&type))
+        {
+            _updateTree<aron::datanavigator::ListNavigator>(item, *t, data);
+        }
+        else if (auto t = dynamic_cast<TupleNavigator*>(&type))
+        {
+            _updateTree<aron::datanavigator::ListNavigator>(item, *t, data);
+        }
+    }
+
+    template <class DataT, class TypeT>
+    void TypedDataTreeBuilder::_updateTree(QTreeWidgetItem* item, TypeT& type, aron::datanavigator::Navigator& data)
+    {
+        DataT& dataCast = dynamic_cast<DataT&>(data);
+        updateTree(item, type, dataCast);
+    }
+
+}
diff --git a/source/RobotAPI/libraries/armem_gui/instance/tree_builders/TypedDataTreeBuilder.h b/source/RobotAPI/libraries/armem_gui/instance/tree_builders/TypedDataTreeBuilder.h
new file mode 100644
index 000000000..57580a1f6
--- /dev/null
+++ b/source/RobotAPI/libraries/armem_gui/instance/tree_builders/TypedDataTreeBuilder.h
@@ -0,0 +1,63 @@
+#pragma once
+
+#include <string>
+
+#include <RobotAPI/libraries/aron/core/navigator/data/Navigator.h>
+#include <RobotAPI/libraries/aron/core/navigator/data/container/Dict.h>
+#include <RobotAPI/libraries/aron/core/navigator/data/container/List.h>
+
+#include <RobotAPI/libraries/aron/core/navigator/type/Navigator.h>
+#include <RobotAPI/libraries/aron/core/navigator/type/container/Dict.h>
+#include <RobotAPI/libraries/aron/core/navigator/type/container/List.h>
+#include <RobotAPI/libraries/aron/core/navigator/type/container/Object.h>
+#include <RobotAPI/libraries/aron/core/navigator/type/container/Pair.h>
+#include <RobotAPI/libraries/aron/core/navigator/type/container/Tuple.h>
+
+#include "DataTreeBuilderBase.h"
+
+
+class QStringList;
+
+
+namespace armarx::armem::gui::instance
+{
+
+    class TypedDataTreeBuilder : public DataTreeBuilderBase
+    {
+    public:
+
+        TypedDataTreeBuilder();
+
+
+        void updateTree(QTreeWidgetItem* parent,
+                        aron::typenavigator::DictNavigator& type,
+                        aron::datanavigator::DictNavigator& data);
+        void updateTree(QTreeWidgetItem* parent,
+                        aron::typenavigator::ObjectNavigator& type,
+                        aron::datanavigator::DictNavigator& data);
+
+        void updateTree(QTreeWidgetItem* parent,
+                        aron::typenavigator::ListNavigator& type,
+                        aron::datanavigator::ListNavigator& data);
+        void updateTree(QTreeWidgetItem* parent,
+                        aron::typenavigator::PairNavigator& type,
+                        aron::datanavigator::ListNavigator& data);
+        void updateTree(QTreeWidgetItem* parent,
+                        aron::typenavigator::TupleNavigator& type,
+                        aron::datanavigator::ListNavigator& data);
+
+
+    protected:
+
+        void update(QTreeWidgetItem* item,
+                    const std::string& key,
+                    aron::typenavigator::Navigator& type,
+                    aron::datanavigator::Navigator& data);
+
+        template <class DataT, class TypeT>
+        void _updateTree(QTreeWidgetItem* item, TypeT& type, aron::datanavigator::Navigator& data);
+
+    };
+
+
+}
diff --git a/source/RobotAPI/libraries/armem_gui/instance/TreeDataVisitor.cpp b/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeDataVisitor.cpp
similarity index 72%
rename from source/RobotAPI/libraries/armem_gui/instance/TreeDataVisitor.cpp
rename to source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeDataVisitor.cpp
index 0d1721ef2..8bc5889d2 100644
--- a/source/RobotAPI/libraries/armem_gui/instance/TreeDataVisitor.cpp
+++ b/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeDataVisitor.cpp
@@ -3,7 +3,7 @@
 #include <ArmarXCore/core/exceptions/local/ExpressionException.h>
 
 
-namespace armarx::armem::gui
+namespace armarx::armem::gui::instance
 {
 
 }
diff --git a/source/RobotAPI/libraries/armem_gui/instance/TreeDataVisitor.h b/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeDataVisitor.h
similarity index 94%
rename from source/RobotAPI/libraries/armem_gui/instance/TreeDataVisitor.h
rename to source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeDataVisitor.h
index b751084bf..61d76bcfc 100644
--- a/source/RobotAPI/libraries/armem_gui/instance/TreeDataVisitor.h
+++ b/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeDataVisitor.h
@@ -8,10 +8,10 @@
 
 #include <RobotAPI/libraries/aron/core/navigator/visitors/DataVisitor.h>
 
-#include "TreeDataVisitorBase.h"
+#include <RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeDataVisitorBase.h>
 
 
-namespace armarx::armem::gui
+namespace armarx::armem::gui::instance
 {
 
     class TreeDataVisitor :
diff --git a/source/RobotAPI/libraries/armem_gui/instance/TreeDataVisitorBase.cpp b/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeDataVisitorBase.cpp
similarity index 98%
rename from source/RobotAPI/libraries/armem_gui/instance/TreeDataVisitorBase.cpp
rename to source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeDataVisitorBase.cpp
index 70a84dd7d..87cd2ffb9 100644
--- a/source/RobotAPI/libraries/armem_gui/instance/TreeDataVisitorBase.cpp
+++ b/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeDataVisitorBase.cpp
@@ -3,7 +3,7 @@
 #include <ArmarXCore/core/exceptions/local/ExpressionException.h>
 
 
-namespace armarx::armem::gui
+namespace armarx::armem::gui::instance
 {
 
     TreeDataVisitorBase::TreeDataVisitorBase()
diff --git a/source/RobotAPI/libraries/armem_gui/instance/TreeDataVisitorBase.h b/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeDataVisitorBase.h
similarity index 98%
rename from source/RobotAPI/libraries/armem_gui/instance/TreeDataVisitorBase.h
rename to source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeDataVisitorBase.h
index cb6d4152a..c9d4ab0cd 100644
--- a/source/RobotAPI/libraries/armem_gui/instance/TreeDataVisitorBase.h
+++ b/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeDataVisitorBase.h
@@ -9,7 +9,7 @@
 #include <RobotAPI/libraries/aron/core/navigator/visitors/DataVisitor.h>
 
 
-namespace armarx::armem::gui
+namespace armarx::armem::gui::instance
 {
 
     class TreeDataVisitorBase
diff --git a/source/RobotAPI/libraries/armem_gui/instance/TreeTypedDataVisitor.cpp b/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedDataVisitor.cpp
similarity index 62%
rename from source/RobotAPI/libraries/armem_gui/instance/TreeTypedDataVisitor.cpp
rename to source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedDataVisitor.cpp
index 9a37a20ef..c4ed919f9 100644
--- a/source/RobotAPI/libraries/armem_gui/instance/TreeTypedDataVisitor.cpp
+++ b/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedDataVisitor.cpp
@@ -11,24 +11,9 @@
 #include <RobotAPI/libraries/armem/core.h>
 
 
-namespace armarx::armem::gui
+namespace armarx::armem::gui::instance
 {
 
-    std::string TreeTypedDataVisitor::sanitizeTypeName(const std::string& typeName) const
-    {
-        namespace s = simox::alg;
-        std::string n = typeName;
-        n = s::replace_all(n, "Aron", "");
-        n = s::replace_all(n, "Type", "");
-        if (s::starts_with(n, "Object<") && s::ends_with(n, ">"))
-        {
-            std::string begin = "Object<";
-            std::string end = ">";
-            n = n.substr(begin.size(), n.size() - begin.size() - end.size());
-        }
-        return n;
-    }
-
     QTreeWidgetItem* TreeTypedDataVisitor::makeItem(const std::string& key, NDArrayDataNavigator& data, const PoseTypeNavigator& type) const
     {
         QTreeWidgetItem* item = makeItem<NDArrayDataNavigator, PoseTypeNavigator>(key, data, type);
@@ -68,28 +53,4 @@ namespace armarx::armem::gui
         ss << quat.w() << coeffSep << "|" << coeffSep << quat.x() << coeffSep << quat.y() << coeffSep << quat.z();
     }
 
-    QStringList TreeTypedDataVisitor::serializePath(const aron::Path& path)
-    {
-        QStringList qpath;
-        qpath.append(QString::fromStdString(path.getRootIdentifier()));
-        qpath.append(QString::fromStdString(path.getDelimeter()));
-        for (const std::string& item : path.getPath())
-        {
-            qpath.append(QString::fromStdString(item));
-        }
-        return qpath;
-    }
-
-    aron::Path TreeTypedDataVisitor::deserializePath(const QStringList& qpath)
-    {
-        ARMARX_CHECK_GREATER_EQUAL(qpath.size(), 2);
-        std::vector<std::string> pathItems;
-        for (int i = 2; i < qpath.size(); ++i)
-        {
-            pathItems.push_back(qpath.at(i).toStdString());
-        }
-        aron::Path path(qpath.at(0).toStdString(), qpath.at(1).toStdString(), pathItems);
-        return path;
-    }
-
 }
diff --git a/source/RobotAPI/libraries/armem_gui/instance/TreeTypedDataVisitor.h b/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedDataVisitor.h
similarity index 96%
rename from source/RobotAPI/libraries/armem_gui/instance/TreeTypedDataVisitor.h
rename to source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedDataVisitor.h
index 0aa19b4a7..fb1c1baa5 100644
--- a/source/RobotAPI/libraries/armem_gui/instance/TreeTypedDataVisitor.h
+++ b/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedDataVisitor.h
@@ -7,10 +7,14 @@
 #include <QLabel>
 
 #include <RobotAPI/libraries/aron/core/navigator/visitors/TypedDataVisitor.h>
-#include "TreeDataVisitorBase.h"
 
+#include <RobotAPI/libraries/armem_gui/instance/sanitize_typename.h>
+#include <RobotAPI/libraries/armem_gui/instance/serialize_path.h>
 
-namespace armarx::armem::gui
+#include <RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeDataVisitorBase.h>
+
+
+namespace armarx::armem::gui::instance
 {
 
     class TreeTypedDataVisitor :
@@ -123,12 +127,6 @@ namespace armarx::armem::gui
         }
 
 
-        std::string sanitizeTypeName(const std::string& typeName) const;
-
-        static QStringList serializePath(const aron::Path& path);
-        static aron::Path deserializePath(const QStringList& qpath);
-
-
     protected:
 
         template <class DataNavigatorT, class TypeNavigatorT>
diff --git a/source/RobotAPI/libraries/armem_gui/test/ArMemGuiTest.cpp b/source/RobotAPI/libraries/armem_gui/test/ArMemGuiTest.cpp
index 5ecf962db..d1e0e4a01 100644
--- a/source/RobotAPI/libraries/armem_gui/test/ArMemGuiTest.cpp
+++ b/source/RobotAPI/libraries/armem_gui/test/ArMemGuiTest.cpp
@@ -29,13 +29,13 @@
 
 #include <iostream>
 
-#include <RobotAPI/libraries/armem_gui/instance/TreeTypedDataVisitor.h>
+#include <RobotAPI/libraries/armem_gui/instance/sanitize_typename.h>
+
+using namespace armarx::armem::gui::instance;
 
 
 BOOST_AUTO_TEST_CASE(test_sanitizeTypeName)
 {
-    armarx::armem::gui::TreeTypedDataVisitor v;
-
-    BOOST_CHECK_EQUAL(v.sanitizeTypeName("AronDictType<AronFloatType>"), "Dict<Float>");
-    BOOST_CHECK_EQUAL(v.sanitizeTypeName("AronListType<AronFloatType>"), "List<Float>");
+    BOOST_CHECK_EQUAL(sanitizeTypeName("AronDictType<AronFloatType>"), "Dict<Float>");
+    BOOST_CHECK_EQUAL(sanitizeTypeName("AronListType<AronFloatType>"), "List<Float>");
 }
diff --git a/source/RobotAPI/libraries/aron/core/navigator/visitors/TypedDataVisitor.h b/source/RobotAPI/libraries/aron/core/navigator/visitors/TypedDataVisitor.h
index 77c73fe08..f577903a4 100644
--- a/source/RobotAPI/libraries/aron/core/navigator/visitors/TypedDataVisitor.h
+++ b/source/RobotAPI/libraries/aron/core/navigator/visitors/TypedDataVisitor.h
@@ -229,153 +229,129 @@ namespace armarx::aron::visitor
         virtual bool visitEnter(DictTypeNavigator& type, const std::string& key, DictDataNavigator& data)
         {
             (void) key;
-            visitEnter(type, data);
-            return true;
+            return visitEnter(type, data);
         }
         virtual bool visitExit(DictTypeNavigator& type, const std::string& key, DictDataNavigator& data)
         {
             (void) key;
-            visitExit(type, data);
-            return true;
+            return visitExit(type, data);
         }
 
         virtual bool visitEnter(ObjectTypeNavigator& type, const std::string& key, DictDataNavigator& data)
         {
             (void) key;
-            visitEnter(type, data);
-            return true;
+            return visitEnter(type, data);
         }
         virtual bool visitExit(ObjectTypeNavigator& type, const std::string& key, DictDataNavigator& data)
         {
             (void) key;
-            visitExit(type, data);
-            return true;
+            return visitExit(type, data);
         }
 
         virtual bool visitEnter(ListTypeNavigator& type, const std::string& key, ListDataNavigator& data)
         {
             (void) key;
-            visitEnter(type, data);
-            return true;
+            return visitEnter(type, data);
         }
         virtual bool visitExit(ListTypeNavigator& type, const std::string& key, ListDataNavigator& data)
         {
             (void) key;
-            visitExit(type, data);
-            return true;
+            return visitExit(type, data);
         }
 
         virtual bool visitEnter(TupleTypeNavigator& type, const std::string& key, ListDataNavigator& data)
         {
             (void) key;
-            visitEnter(type, data);
-            return true;
+            return visitEnter(type, data);
         }
         virtual bool visitExit(TupleTypeNavigator& type, const std::string& key, ListDataNavigator& data)
         {
             (void) key;
-            visitExit(type, data);
-            return true;
+            return visitExit(type, data);
         }
 
 
         virtual bool visit(BoolTypeNavigator& type, const std::string& key, BoolDataNavigator& data)
         {
             (void) key;
-            visit(type, data);
-            return true;
+            return visit(type, data);
         }
         virtual bool visit(DoubleTypeNavigator& type, const std::string& key, DoubleDataNavigator& data)
         {
             (void) key;
-            visit(type, data);
-            return true;
+            return visit(type, data);
         }
         virtual bool visit(FloatTypeNavigator& type, const std::string& key, FloatDataNavigator& data)
         {
             (void) key;
-            visit(type, data);
-            return true;
+            return visit(type, data);
         }
         virtual bool visit(IntTypeNavigator& type, const std::string& key, IntDataNavigator& data)
         {
             (void) key;
-            visit(type, data);
-            return true;
+            return visit(type, data);
         }
         virtual bool visit(LongTypeNavigator& type, const std::string& key, LongDataNavigator& data)
         {
             (void) key;
-            visit(type, data);
-            return true;
+            return visit(type, data);
         }
         virtual bool visit(StringTypeNavigator& type, const std::string& key, StringDataNavigator& data)
         {
             (void) key;
-            visit(type, data);
-            return true;
+            return visit(type, data);
         }
         virtual bool visit(TimeTypeNavigator& type, const std::string& key, LongDataNavigator& data)
         {
             (void) key;
-            visit(type, data);
-            return true;
+            return visit(type, data);
         }
         virtual bool visit(TimeTypeNavigator& type, const std::string& key, const IceUtil::Time& data)
         {
             (void) key;
-            visit(type, data);
-            return true;
+            return visit(type, data);
         }
 
 
         virtual bool visit(EigenMatrixTypeNavigator& type, const std::string& key, NDArrayDataNavigator& data)
         {
             (void) type, (void) key;
-            visit(type, data);
-            return true;
+            return visit(type, data);
         }
         virtual bool visit(EigenQuaternionTypeNavigator& type, const std::string& key, NDArrayDataNavigator& data)
         {
             (void) type, (void) key;
-            visit(type, data);
-            return true;
+            return visit(type, data);
         }
         virtual bool visit(IVTCByteImageTypeNavigator& type, const std::string& key, NDArrayDataNavigator& data)
         {
             (void) type, (void) key;
-            visit(type, data);
-            return true;
+            return visit(type, data);
         }
         virtual bool visit(OpenCVMatTypeNavigator& type, const std::string& key, NDArrayDataNavigator& data)
         {
             (void) type, (void) key;
-            visit(type, data);
-            return true;
+            return visit(type, data);
         }
         virtual bool visit(PCLPointCloudTypeNavigator& type, const std::string& key, NDArrayDataNavigator& data)
         {
             (void) type, (void) key;
-            visit(type, data);
-            return true;
+            return visit(type, data);
         }
         virtual bool visit(PoseTypeNavigator& type, const std::string& key, NDArrayDataNavigator& data)
         {
             (void) type, (void) key;
-            visit(type, data);
-            return true;
+            return visit(type, data);
         }
         virtual bool visit(PositionTypeNavigator& type, const std::string& key, NDArrayDataNavigator& data)
         {
             (void) type, (void) key;
-            visit(type, data);
-            return true;
+            return visit(type, data);
         }
         virtual bool visit(OrientationTypeNavigator& type, const std::string& key, NDArrayDataNavigator& data)
         {
             (void) type, (void) key;
-            visit(type, data);
-            return true;
+            return visit(type, data);
         }
 
 
@@ -392,76 +368,3 @@ namespace armarx::aron::visitor
     };
 
 }
-
-
-/* Copy-and-paste example below.
- * Remove functions you don't need.
- * Add `const std::string& key, ` to parameter list if you need an items's key
- * in the parent container.
- */
-
-#if 0
-
-struct MyDerivedAronTypeVisitor : public armarx::aron::visitor::AronTypeVisitor
-{
-
-    bool visitEnter(DictTypeNavigator& dict) override
-    {
-        (void) dict;
-        return true;
-    }
-    bool visitExit(DictTypeNavigator& dict) override
-    {
-        (void) dict;
-        return true;
-    }
-    bool visitEnter(ListTypeNavigator& list) override
-    {
-        (void) list;
-        return true;
-    }
-    bool visitExit(ListTypeNavigator& list) override
-    {
-        (void) list;
-        return true;
-    }
-
-    bool visit(BoolTypeNavigator& b) override
-    {
-        (void) b;
-        return true;
-    }
-    bool visit(DoubleTypeNavigator& d) override
-    {
-        (void) d;
-        return true;
-    }
-    bool visit(FloatTypeNavigator& f) override
-    {
-        (void) f;
-        return true;
-    }
-    bool visit(IntTypeNavigator& i) override
-    {
-        (void) i;
-        return true;
-    }
-    bool visit(LongTypeNavigator& l) override
-    {
-        (void) l;
-        return true;
-    }
-    bool visit(NDArrayTypeNavigator& array) override
-    {
-        (void) array;
-        return true;
-    }
-    bool visit(StringTypeNavigator& string) override
-    {
-        (void) string;
-        return true;
-    }
-
-};
-
-#endif
-- 
GitLab