From d838045f8b280231daf903753121279a1a35ec6a Mon Sep 17 00:00:00 2001
From: Peter Albrecht <albrecpe@gmail.com>
Date: Tue, 12 Dec 2023 16:32:14 +0100
Subject: [PATCH] Updated gui utils to handle replacing widgets in splitters

---
 .../SkillManagerMonitorWidgetController.cpp   |  6 +++--
 .../libraries/skills_gui/SkillMemoryGui.cpp   | 16 +++++++++++--
 .../libraries/skills_gui/SkillMemoryGui.h     |  8 +++++--
 .../RobotAPI/libraries/skills_gui/gui_utils.h | 24 +++++++++++++++----
 4 files changed, 43 insertions(+), 11 deletions(-)

diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidgetController.cpp b/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidgetController.cpp
index e4030a2d5..8e8e8e655 100644
--- a/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidgetController.cpp
+++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidgetController.cpp
@@ -164,10 +164,10 @@ namespace armarx
             widget.groupBoxSkillExecutions->layout(),
 
             widget.groupBoxSkills,
-            widget.splitter_2->layout(),
+            widget.splitter_2,
 
             widget.groupBoxSkillDetails,
-            widget.splitter_2->layout(),
+            widget.splitter_2,
 
             widget.updateWidgetLayout,
 
@@ -240,6 +240,7 @@ namespace armarx
     void
     SkillManagerMonitorWidgetController::connectGui()
     {
+        /*
         connect(this,
                 &SkillManagerMonitorWidgetController::disconnect,
                 this->mem_wrapper,
@@ -248,6 +249,7 @@ namespace armarx
                 &SkillManagerMonitorWidgetController::disconnect,
                 this->viewer,
                 &skills::gui::SkillMemoryGUI::disconnect);
+        */
     }
 
     SkillManagerMonitorWidgetController::~SkillManagerMonitorWidgetController()
diff --git a/source/RobotAPI/libraries/skills_gui/SkillMemoryGui.cpp b/source/RobotAPI/libraries/skills_gui/SkillMemoryGui.cpp
index d32f0dd86..faacc352f 100644
--- a/source/RobotAPI/libraries/skills_gui/SkillMemoryGui.cpp
+++ b/source/RobotAPI/libraries/skills_gui/SkillMemoryGui.cpp
@@ -7,15 +7,21 @@ namespace armarx::skills::gui
     SkillMemoryGUI::SkillMemoryGUI(QTreeWidget* _skillExecutionTreeWidget,
                                    QLayout* _skillExecutionTreeWidgetParentLayout,
                                    QGroupBox* _skillGroupBox,
-                                   QLayout* _skillGroupBoxParentLayout,
+                                   QSplitter* _skillGroupBoxParentLayout,
                                    QGroupBox* _skillDetailGroupBox,
-                                   QLayout* _skillDetailGroupBoxParentLayout,
+                                   QSplitter* _skillDetailGroupBoxParentLayout,
                                    QHBoxLayout* _updateWidgetLayout,
 
                                    std::shared_ptr<SkillManagerWrapper> _memory)
     {
         Logging::setTag("SkillMemoryGui");
 
+        // parameter check
+        ARMARX_CHECK(_skillExecutionTreeWidgetParentLayout);
+        ARMARX_CHECK(_skillGroupBoxParentLayout);
+        ARMARX_CHECK(_skillDetailGroupBoxParentLayout);
+        ARMARX_CHECK(_memory);
+
         // setup memory
         this->memory = _memory;
 
@@ -40,6 +46,12 @@ namespace armarx::skills::gui
             _skillDetailGroupBox, this->skillDetailGroupBox, _skillDetailGroupBoxParentLayout);
     }
 
+    void
+    SkillMemoryGUI::disconnect()
+    {
+        ARMARX_ERROR << "Not implemented";
+    }
+
     void
     SkillMemoryGUI::connectSignals()
     {
diff --git a/source/RobotAPI/libraries/skills_gui/SkillMemoryGui.h b/source/RobotAPI/libraries/skills_gui/SkillMemoryGui.h
index 5af80c8e3..b0b6baf22 100644
--- a/source/RobotAPI/libraries/skills_gui/SkillMemoryGui.h
+++ b/source/RobotAPI/libraries/skills_gui/SkillMemoryGui.h
@@ -2,6 +2,7 @@
 #define SKILLMEMORYGUI_H
 
 #include <QHBoxLayout>
+#include <QSplitter>
 #include <QTreeWidget>
 #include <QWidget>
 
@@ -24,14 +25,17 @@ namespace armarx::skills::gui
         SkillMemoryGUI(QTreeWidget* _skillExecutionTreeWidget,
                        QLayout* _skillExecutionTreeWidgetParentLayout,
                        QGroupBox* _skillGroupBox,
-                       QLayout* _skillGroupBoxParentLayout,
+                       QSplitter* _skillGroupBoxParentLayout,
                        QGroupBox* _skillDetailGroupBox,
-                       QLayout* _skillDetailGroupBoxParentLayout,
+                       QSplitter* _skillDetailGroupBoxParentLayout,
                        QHBoxLayout* _updateWidgetLayout,
 
                        std::shared_ptr<SkillManagerWrapper> _memory);
 
     public slots:
+        /**
+         * @brief Resets all widgets when disconnecting
+         */
         void disconnect();
 
     private:
diff --git a/source/RobotAPI/libraries/skills_gui/gui_utils.h b/source/RobotAPI/libraries/skills_gui/gui_utils.h
index 1b7b810ad..ea985c405 100644
--- a/source/RobotAPI/libraries/skills_gui/gui_utils.h
+++ b/source/RobotAPI/libraries/skills_gui/gui_utils.h
@@ -5,11 +5,12 @@
 #include <QSpinBox>
 #include <QWidget>
 
+#include "qsplitter.h"
+
 class QLayout;
 class QSplitter;
 class QTreeWidgetItem;
 
-
 namespace armarx::gui
 {
     /**
@@ -30,10 +31,9 @@ namespace armarx::gui
      */
     void clearItem(QTreeWidgetItem* item);
 
-
-
     template <class WidgetT>
-    void replaceWidget(WidgetT*& old, QWidget* neu, QLayout* parentLayout)
+    void
+    replaceWidget(WidgetT*& old, QWidget* neu, QLayout* parentLayout)
     {
         QLayoutItem* oldItem = parentLayout->replaceWidget(old, neu);
         if (oldItem)
@@ -44,6 +44,20 @@ namespace armarx::gui
         }
     }
 
+    template <class WidgetT>
+    void
+    replaceWidget(WidgetT*& old, QWidget* neu, QSplitter* parentLayout)
+    {
+        int index = parentLayout->indexOf(old);
+        QWidget* oldItem = parentLayout->replaceWidget(index, neu);
+        if (oldItem)
+        {
+            delete oldItem;
+            delete old;
+            old = nullptr;
+        }
+    }
+
     /**
      * @brief Let items in `layout` be children of a splitter.
      *
@@ -71,4 +85,4 @@ namespace armarx::gui
         int numDigits;
         int base;
     };
-}
+} // namespace armarx::gui
-- 
GitLab