From 59a4a8429c4093404572c9a8745428438f8b4a62 Mon Sep 17 00:00:00 2001
From: Rainer Kartmann <rainer.kartmann@kit.edu>
Date: Fri, 30 Apr 2021 13:43:52 +0200
Subject: [PATCH] Move LTM control in MemoryViewer

---
 .../ArMemMemoryViewerWidget.ui                | 62 ++++++++++---------
 .../ArMemMemoryViewerWidgetController.cpp     |  2 +-
 .../libraries/armem_gui/MemoryViewer.cpp      | 33 ++++++----
 .../libraries/armem_gui/MemoryViewer.h        | 18 +++---
 .../libraries/armem_gui/memory/TreeWidget.cpp | 34 +++++-----
 .../libraries/armem_gui/memory/TreeWidget.h   |  4 +-
 6 files changed, 80 insertions(+), 73 deletions(-)

diff --git a/source/RobotAPI/gui-plugins/ArMemMemoryViewer/ArMemMemoryViewerWidget.ui b/source/RobotAPI/gui-plugins/ArMemMemoryViewer/ArMemMemoryViewerWidget.ui
index 3e94dc5e5..819331b5f 100644
--- a/source/RobotAPI/gui-plugins/ArMemMemoryViewer/ArMemMemoryViewerWidget.ui
+++ b/source/RobotAPI/gui-plugins/ArMemMemoryViewer/ArMemMemoryViewerWidget.ui
@@ -15,39 +15,43 @@
   </property>
   <layout class="QVBoxLayout" name="verticalLayout">
    <item>
-    <layout class="QHBoxLayout" name="ltmControlWidgetLayout">
-     <property name="spacing">
-      <number>6</number>
-     </property>
+    <layout class="QHBoxLayout" name="topRowLayout">
      <item>
-      <spacer name="horizontalSpacer_2">
-       <property name="orientation">
-        <enum>Qt::Horizontal</enum>
-       </property>
-       <property name="sizeHint" stdset="0">
-        <size>
-         <width>40</width>
-         <height>20</height>
-        </size>
-       </property>
-      </spacer>
+      <layout class="QHBoxLayout" name="updateWidgetLayout">
+       <item>
+        <spacer name="horizontalSpacer">
+         <property name="orientation">
+          <enum>Qt::Horizontal</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>40</width>
+           <height>20</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+      </layout>
      </item>
-    </layout>
-   </item>
-   <item>
-    <layout class="QHBoxLayout" name="updateWidgetLayout">
      <item>
-      <spacer name="horizontalSpacer">
-       <property name="orientation">
-        <enum>Qt::Horizontal</enum>
-       </property>
-       <property name="sizeHint" stdset="0">
-        <size>
-         <width>40</width>
-         <height>20</height>
-        </size>
+      <layout class="QHBoxLayout" name="ltmControlWidgetLayout">
+       <property name="spacing">
+        <number>6</number>
        </property>
-      </spacer>
+       <item>
+        <spacer name="horizontalSpacer_2">
+         <property name="orientation">
+          <enum>Qt::Horizontal</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>40</width>
+           <height>20</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+      </layout>
      </item>
     </layout>
    </item>
diff --git a/source/RobotAPI/gui-plugins/ArMemMemoryViewer/ArMemMemoryViewerWidgetController.cpp b/source/RobotAPI/gui-plugins/ArMemMemoryViewer/ArMemMemoryViewerWidgetController.cpp
index f313b6951..83d1d8743 100644
--- a/source/RobotAPI/gui-plugins/ArMemMemoryViewer/ArMemMemoryViewerWidgetController.cpp
+++ b/source/RobotAPI/gui-plugins/ArMemMemoryViewer/ArMemMemoryViewerWidgetController.cpp
@@ -41,9 +41,9 @@ namespace armarx
         widget.setupUi(getWidget());
 
         viewer = std::make_unique<MemoryViewer>(
-                     widget.ltmControlWidgetLayout,
 
                      widget.updateWidgetLayout,
+                     widget.ltmControlWidgetLayout,
 
                      widget.memoryGroupBox,
                      widget.treesLayout,
diff --git a/source/RobotAPI/libraries/armem_gui/MemoryViewer.cpp b/source/RobotAPI/libraries/armem_gui/MemoryViewer.cpp
index 3f40956a6..447b35332 100644
--- a/source/RobotAPI/libraries/armem_gui/MemoryViewer.cpp
+++ b/source/RobotAPI/libraries/armem_gui/MemoryViewer.cpp
@@ -27,36 +27,43 @@
 namespace armarx::armem::gui
 {
     MemoryViewer::MemoryViewer(
-        QBoxLayout* ltmControlWidgetLayout,
         QBoxLayout* updateWidgetLayout,
-        QGroupBox* _memoryGroupBox, QLayout* memoryGroupBoxParentLayout,
-        QGroupBox* _instanceGroupBox, QLayout* instanceGroupBoxParentLayout,
-        QLabel* statusLabel)
+        QBoxLayout* ltmControlWidgetLayout,
+        QGroupBox* memoryGroupBox, QLayout* memoryGroupBoxParentLayout,
+        QGroupBox* instanceGroupBox, QLayout* instanceGroupBoxParentLayout,
+        QLabel* statusLabel
+    )
     {
         Logging::setTag("MemoryViewer");
 
         this->statusLabel = statusLabel;
         this->statusLabel->clear();
 
-        // LTM Control
-        this->ltmControlWidgetLayout = ltmControlWidgetLayout;
-        ltmControlWidget = new armem::gui::LTMControlWidget();
-        ltmControlWidgetLayout->insertWidget(0, ltmControlWidget);
-
         // Update timer
         this->updateWidgetLayout = updateWidgetLayout;
         updateWidget = new armem::gui::PeriodicUpdateWidget(2.0, 60);
         updateWidgetLayout->insertWidget(0, updateWidget);
 
+        // LTM Control
+        if (ltmControlWidgetLayout)
+        {
+            this->ltmControlWidgetLayout = ltmControlWidgetLayout;
+            ltmControlWidget = new armem::gui::LTMControlWidget();
+            ltmControlWidgetLayout->addWidget(ltmControlWidget);
+        }
+
+        // Memory View
         memoryGroup = new armem::gui::MemoryGroupBox();
-        armarx::gui::replaceWidget(_memoryGroupBox, memoryGroup, memoryGroupBoxParentLayout);
-        ARMARX_CHECK_NULL(_memoryGroupBox);
+        armarx::gui::replaceWidget(memoryGroupBox, memoryGroup, memoryGroupBoxParentLayout);
+        ARMARX_CHECK_NULL(memoryGroupBox);
 
+        // Instance View
         this->instanceGroup = new armem::gui::InstanceGroupBox();
-        armarx::gui::replaceWidget(_instanceGroupBox, instanceGroup, instanceGroupBoxParentLayout);
+        armarx::gui::replaceWidget(instanceGroupBox, instanceGroup, instanceGroupBoxParentLayout);
         this->instanceGroup->setStatusLabel(statusLabel);
-        ARMARX_CHECK_NULL(_instanceGroupBox);
+        ARMARX_CHECK_NULL(instanceGroupBox);
 
+        // Connections
         //connect(this, &This::connected, this, &This::updateMemory);
 
         connect(ltmControlWidget, &armem::gui::LTMControlWidget::store, this, &This::store);
diff --git a/source/RobotAPI/libraries/armem_gui/MemoryViewer.h b/source/RobotAPI/libraries/armem_gui/MemoryViewer.h
index c2c2e6f4c..19ab5000d 100644
--- a/source/RobotAPI/libraries/armem_gui/MemoryViewer.h
+++ b/source/RobotAPI/libraries/armem_gui/MemoryViewer.h
@@ -44,10 +44,10 @@ namespace armarx::armem::gui
     public:
 
         MemoryViewer(
-            QBoxLayout* ltmControlWidgetLayout,
             QBoxLayout* updateWidgetLayout,
-            QGroupBox* _memoryGroupBox, QLayout* memoryGroupBoxParentLayout,
-            QGroupBox* _instanceGroupBox, QLayout* instanceGroupBoxParentLayout,
+            QBoxLayout* ltmControlWidgetLayout,
+            QGroupBox* memoryGroupBox, QLayout* memoryGroupBoxParentLayout,
+            QGroupBox* instanceGroupBox, QLayout* instanceGroupBoxParentLayout,
             QLabel* statusLabel
         );
 
@@ -106,15 +106,15 @@ namespace armarx::armem::gui
         std::map<std::string, armem::client::Reader> memoryReaders;
         std::map<std::string, std::optional<armem::wm::Memory>> memoryData;
 
-        QLayout* ltmControlWidgetLayout;
-        armem::gui::LTMControlWidget* ltmControlWidget;
+        QLayout* updateWidgetLayout = nullptr;
+        armem::gui::PeriodicUpdateWidget* updateWidget = nullptr;
 
-        QLayout* updateWidgetLayout;
-        armem::gui::PeriodicUpdateWidget* updateWidget;
+        QLayout* ltmControlWidgetLayout = nullptr;
+        armem::gui::LTMControlWidget* ltmControlWidget = nullptr;
 
-        armem::gui::MemoryGroupBox* memoryGroup;
+        armem::gui::MemoryGroupBox* memoryGroup = nullptr;
 
-        armem::gui::InstanceGroupBox* instanceGroup;
+        armem::gui::InstanceGroupBox* instanceGroup = nullptr;
 
         QLabel* statusLabel = nullptr;
 
diff --git a/source/RobotAPI/libraries/armem_gui/memory/TreeWidget.cpp b/source/RobotAPI/libraries/armem_gui/memory/TreeWidget.cpp
index 3d4c50f66..a410033a4 100644
--- a/source/RobotAPI/libraries/armem_gui/memory/TreeWidget.cpp
+++ b/source/RobotAPI/libraries/armem_gui/memory/TreeWidget.cpp
@@ -74,7 +74,7 @@ namespace armarx::armem::gui::memory
         });
         workingmemoryCoreSegmentBuilder.setUpdateItemFn([this](const std::string&, const wm::CoreSegment & coreSeg, QTreeWidgetItem * coreSegItem)
         {
-            updateTypedContainerItem(coreSeg, coreSegItem);
+            updateContainerItem(coreSeg, coreSegItem);
             updateChildren(coreSeg, coreSegItem);
             return true;
         });
@@ -86,7 +86,7 @@ namespace armarx::armem::gui::memory
         });
         workingmemoryProvSegmentBuilder.setUpdateItemFn([this](const std::string&, const wm::ProviderSegment & provSeg, QTreeWidgetItem * provSegItem)
         {
-            updateTypedContainerItem(provSeg, provSegItem);
+            updateContainerItem(provSeg, provSegItem);
             updateChildren(provSeg, provSegItem);
             return true;
         });
@@ -279,28 +279,26 @@ namespace armarx::armem::gui::memory
 
     template <class... T>
     void TreeWidget::updateContainerItem(
-        const armem::wm::detail::MemoryContainer<T...>& container, QTreeWidgetItem* item)
+        const base::detail::MemoryContainerBase<T...>& container, QTreeWidgetItem* item)
     {
         updateItemItem(container, item);
         item->setText(int(Columns::SIZE), QString::number(container.size()));
-    }
 
-    template <class... T>
-    void TreeWidget::updateTypedContainerItem(
-        const armem::wm::detail::TypedEntityContainer<T...>& container, QTreeWidgetItem* item)
-    {
-        updateContainerItem(container, item);
-        std::string typeName;
-        if (container.aronType())
-        {
-            typeName = container.aronType()->getName();
-            typeName = instance::sanitizeTypeName(typeName);
-        }
-        else
+        if constexpr(std::is_base_of_v<base::detail::AronTyped, base::detail::MemoryContainerBase<T...>>)
         {
-            typeName = "(no Aron type)";
+            const base::detail::AronTyped& cast = dynamic_cast<const base::detail::AronTyped&>(container);
+            std::string typeName;
+            if (cast.aronType())
+            {
+                typeName = cast.aronType()->getName();
+                typeName = instance::sanitizeTypeName(typeName);
+            }
+            else
+            {
+                typeName = "(no Aron type)";
+            }
+            item->setText(int(Columns::TYPE), QString::fromStdString(typeName));
         }
-        item->setText(int(Columns::TYPE), QString::fromStdString(typeName));
     }
 
 }
diff --git a/source/RobotAPI/libraries/armem_gui/memory/TreeWidget.h b/source/RobotAPI/libraries/armem_gui/memory/TreeWidget.h
index 1ce801920..2bcf0fa1b 100644
--- a/source/RobotAPI/libraries/armem_gui/memory/TreeWidget.h
+++ b/source/RobotAPI/libraries/armem_gui/memory/TreeWidget.h
@@ -71,9 +71,7 @@ namespace armarx::armem::gui::memory
 
         void updateItemItem(const armem::base::detail::MemoryItem& level, QTreeWidgetItem* item);
         template <class... T>
-        void updateContainerItem(const armem::wm::detail::MemoryContainer<T...>& container, QTreeWidgetItem* item);
-        template <class... T>
-        void updateTypedContainerItem(const armem::wm::detail::TypedEntityContainer<T...>& container, QTreeWidgetItem* item);
+        void updateContainerItem(const armem::base::detail::MemoryContainerBase<T...>& container, QTreeWidgetItem* item);
 
 
     private:
-- 
GitLab