From 03ea41901bc8795a1c30e732c7fd16567e30bbb8 Mon Sep 17 00:00:00 2001
From: Rainer Kartmann <rainer.kartmann@kit.edu>
Date: Thu, 24 Jun 2021 15:43:54 +0200
Subject: [PATCH] Add reloading to Object/Class segment

---
 .../server/ObjectMemory/ObjectMemory.cpp      | 23 ++++++++++++-------
 .../armem/server/ObjectMemory/ObjectMemory.h  |  2 +-
 .../armem_objects/server/class/Segment.cpp    | 15 +++++++++++-
 .../armem_objects/server/class/Segment.h      |  3 +++
 4 files changed, 33 insertions(+), 10 deletions(-)

diff --git a/source/RobotAPI/components/armem/server/ObjectMemory/ObjectMemory.cpp b/source/RobotAPI/components/armem/server/ObjectMemory/ObjectMemory.cpp
index b6d997f68..8eed518e4 100644
--- a/source/RobotAPI/components/armem/server/ObjectMemory/ObjectMemory.cpp
+++ b/source/RobotAPI/components/armem/server/ObjectMemory/ObjectMemory.cpp
@@ -185,28 +185,35 @@ namespace armarx::armem::server::obj
     {
         using namespace armarx::RemoteGui::Client;
 
-        tab.instance.setup(*this);
-        tab.clazz.setup(classSegment);
+        tab.reset(new RemoteGuiTab);
+
+        tab->instance.setup(*this);
+        tab->clazz.setup(classSegment);
 
         HBoxLayout segments =
         {
-            tab.instance.group,
-            tab.clazz.group
+            tab->instance.group,
+            tab->clazz.group
         };
         VBoxLayout root =
         {
             segments,
             VSpacer()
         };
-        RemoteGui_createTab(Component::getName(), root, &tab);
+        RemoteGui_createTab(Component::getName(), root, tab.get());
     }
 
+
     void ObjectMemory::RemoteGui_update()
     {
         // Non-atomic variables need to be guarded by a mutex if accessed by multiple threads
-        tab.instance.update(*this);
-        tab.clazz.update(classSegment);
+        tab->instance.update(*this);
+        tab->clazz.update(classSegment);
+
+        if (tab->clazz.data.rebuild)
+        {
+            createRemoteGuiTab();
+        }
     }
 
 }
-
diff --git a/source/RobotAPI/components/armem/server/ObjectMemory/ObjectMemory.h b/source/RobotAPI/components/armem/server/ObjectMemory/ObjectMemory.h
index 2dfd668d1..a513016a3 100644
--- a/source/RobotAPI/components/armem/server/ObjectMemory/ObjectMemory.h
+++ b/source/RobotAPI/components/armem/server/ObjectMemory/ObjectMemory.h
@@ -122,7 +122,7 @@ namespace armarx::armem::server::obj
             instance::SegmentAdapter::RemoteGui instance;
             clazz::Segment::RemoteGui clazz;
         };
-        RemoteGuiTab tab;
+        std::unique_ptr<RemoteGuiTab> tab;
 
     };
 
diff --git a/source/RobotAPI/libraries/armem_objects/server/class/Segment.cpp b/source/RobotAPI/libraries/armem_objects/server/class/Segment.cpp
index 93989e18d..323a4df0d 100644
--- a/source/RobotAPI/libraries/armem_objects/server/class/Segment.cpp
+++ b/source/RobotAPI/libraries/armem_objects/server/class/Segment.cpp
@@ -79,7 +79,10 @@ namespace armarx::armem::server::obj::clazz
         std::vector<ObjectInfo> infos = objectFinder.findAllObjects(checkPaths);
 
         const MemoryID providerID = coreSegment->id().withProviderSegmentName(objectFinder.getPackageName());
-        coreSegment->addProviderSegment(providerID.providerSegmentName);
+        if (not coreSegment->hasProviderSegment(providerID.providerSegmentName))
+        {
+            coreSegment->addProviderSegment(providerID.providerSegmentName);
+        }
 
         ARMARX_INFO << "Loading up to " << infos.size() << " object classes from '"
                     << objectFinder.getPackageName() << "' ...";
@@ -225,12 +228,16 @@ namespace armarx::armem::server::obj::clazz
     {
         using namespace armarx::RemoteGui::Client;
 
+        reloadButton.setLabel("Reload");
+
         maxHistorySize.setValue(std::max(1, int(segment.p.maxHistorySize)));
         maxHistorySize.setRange(1, 1e6);
         infiniteHistory.setValue(segment.p.maxHistorySize == -1);
 
         GridLayout grid;
         int row = 0;
+        grid.add(reloadButton, {row, 0}, {1, 2});
+        row++;
         grid.add(Label("Max History Size"), {row, 0}).add(maxHistorySize, {row, 1});
         row++;
         grid.add(Label("Infinite History Size"), {row, 0}).add(infiniteHistory, {row, 1});
@@ -243,6 +250,12 @@ namespace armarx::armem::server::obj::clazz
 
     void Segment::RemoteGui::Data::update(Segment& segment)
     {
+        if (reloadButton.wasClicked())
+        {
+            std::scoped_lock lock(segment.memoryMutex);
+            segment.loadByObjectFinder();
+            rebuild = true;
+        }
         if (infiniteHistory.hasValueChanged() || maxHistorySize.hasValueChanged())
         {
             std::scoped_lock lock(segment.memoryMutex);
diff --git a/source/RobotAPI/libraries/armem_objects/server/class/Segment.h b/source/RobotAPI/libraries/armem_objects/server/class/Segment.h
index 7356e6a1d..88eaedbef 100644
--- a/source/RobotAPI/libraries/armem_objects/server/class/Segment.h
+++ b/source/RobotAPI/libraries/armem_objects/server/class/Segment.h
@@ -76,11 +76,14 @@ namespace armarx::armem::server::obj::clazz
             {
                 armarx::RemoteGui::Client::GroupBox group;
 
+                armarx::RemoteGui::Client::Button reloadButton;
                 armarx::RemoteGui::Client::IntSpinBox maxHistorySize;
                 armarx::RemoteGui::Client::CheckBox infiniteHistory;
 
                 void setup(const Segment& segment);
                 void update(Segment& segment);
+
+                bool rebuild = false;
             };
             Data data;
 
-- 
GitLab