From 5ac8a0fc626f406ad55bc46bb14c8a3105fdcf86 Mon Sep 17 00:00:00 2001
From: Peter Albrecht <albrecpe@gmail.com>
Date: Tue, 12 Dec 2023 16:58:49 +0100
Subject: [PATCH] Implemented context menu for executions tree

---
 .../libraries/skills_gui/SkillMemoryGui.cpp   |  7 +++-
 .../libraries/skills_gui/SkillMemoryGui.h     |  2 +-
 .../executions/SkillExecutionTreeWidget.cpp   | 41 +++++++++++++++++++
 .../executions/SkillExecutionTreeWidget.h     |  6 ++-
 .../skills_gui/memory/SkillManagerWrapper.cpp | 16 ++++++--
 5 files changed, 66 insertions(+), 6 deletions(-)

diff --git a/source/RobotAPI/libraries/skills_gui/SkillMemoryGui.cpp b/source/RobotAPI/libraries/skills_gui/SkillMemoryGui.cpp
index faacc352f..127930695 100644
--- a/source/RobotAPI/libraries/skills_gui/SkillMemoryGui.cpp
+++ b/source/RobotAPI/libraries/skills_gui/SkillMemoryGui.cpp
@@ -22,6 +22,11 @@ namespace armarx::skills::gui
         ARMARX_CHECK(_skillDetailGroupBoxParentLayout);
         ARMARX_CHECK(_memory);
 
+        ARMARX_CHECK(_skillExecutionTreeWidget);
+        ARMARX_CHECK(_skillGroupBox);
+        ARMARX_CHECK(_skillDetailGroupBox);
+        ARMARX_CHECK(_updateWidgetLayout);
+
         // setup memory
         this->memory = _memory;
 
@@ -47,7 +52,7 @@ namespace armarx::skills::gui
     }
 
     void
-    SkillMemoryGUI::disconnect()
+    SkillMemoryGUI::resetGui()
     {
         ARMARX_ERROR << "Not implemented";
     }
diff --git a/source/RobotAPI/libraries/skills_gui/SkillMemoryGui.h b/source/RobotAPI/libraries/skills_gui/SkillMemoryGui.h
index b0b6baf22..b49123cae 100644
--- a/source/RobotAPI/libraries/skills_gui/SkillMemoryGui.h
+++ b/source/RobotAPI/libraries/skills_gui/SkillMemoryGui.h
@@ -36,7 +36,7 @@ namespace armarx::skills::gui
         /**
          * @brief Resets all widgets when disconnecting
          */
-        void disconnect();
+        void resetGui();
 
     private:
         void connectSignals();
diff --git a/source/RobotAPI/libraries/skills_gui/executions/SkillExecutionTreeWidget.cpp b/source/RobotAPI/libraries/skills_gui/executions/SkillExecutionTreeWidget.cpp
index aab0b484f..8e53e9708 100644
--- a/source/RobotAPI/libraries/skills_gui/executions/SkillExecutionTreeWidget.cpp
+++ b/source/RobotAPI/libraries/skills_gui/executions/SkillExecutionTreeWidget.cpp
@@ -1,7 +1,48 @@
 #include "SkillExecutionTreeWidget.h"
 
+#include <QMenu>
+
 namespace armarx::skills::gui
 {
+
+    void
+    SkillExecutionTreeWidget::runContextMenu(const QPoint& pos)
+    {
+        QMenu* menu = new QMenu();
+
+        // Stop skill
+        QAction* stopSkillAction = new QAction("Stop execution", this);
+        skills::SkillStatus currentStatus =
+            memory->getLatestUpdate().statuses.at(selectedExecution.skillExecutionId).status;
+        stopSkillAction->setDisabled(currentStatus == skills::SkillStatus::Aborted ||
+                                     currentStatus == skills::SkillStatus::Failed ||
+                                     currentStatus == skills::SkillStatus::Succeeded);
+
+        QAction* rerunSkillAction = new QAction("Re-run with similar params", this);
+        menu->addAction(stopSkillAction);
+        menu->addAction(rerunSkillAction);
+        connect(stopSkillAction,
+                SIGNAL(stopSkillAction.triggered()),
+                this,
+                SIGNAL(stopSelectedExecution()));
+        connect(rerunSkillAction,
+                SIGNAL(rerunSkillAction.triggered()),
+                this,
+                SIGNAL(rerunSkillWithSimilarParams()));
+
+        // Temporarily disable rerun-skill-Action
+        rerunSkillAction->setDisabled(true);
+
+        // open menu
+        menu->popup(this->viewport()->mapToGlobal(pos));
+    }
+
+    void
+    SkillExecutionTreeWidget::stopSelectedExecution()
+    {
+        memory->stopExecution(this->selectedExecution.skillExecutionId);
+    }
+
     /*
     void
     SkillExecutionTreeWidget::refresh()
diff --git a/source/RobotAPI/libraries/skills_gui/executions/SkillExecutionTreeWidget.h b/source/RobotAPI/libraries/skills_gui/executions/SkillExecutionTreeWidget.h
index 87231431a..2dc6b8a3f 100644
--- a/source/RobotAPI/libraries/skills_gui/executions/SkillExecutionTreeWidget.h
+++ b/source/RobotAPI/libraries/skills_gui/executions/SkillExecutionTreeWidget.h
@@ -35,14 +35,18 @@ namespace armarx::skills::gui
 
         SelectedExecution& getSelectedExecution();
 
+    signals:
+        void rerunSkillWithSimilarParams();
     private slots:
         void stopAllExecutions();
         void executionSelectionChanged(QTreeWidgetItem* current, QTreeWidgetItem* previous);
         void refresh();
+        void runContextMenu(const QPoint& pos);
+        void stopSelectedExecution();
 
     private:
         void setupUi();
-        SkillExecutionID selectedExecution;
+        SelectedExecution selectedExecution;
     };
 } // namespace armarx::skills::gui
 
diff --git a/source/RobotAPI/libraries/skills_gui/memory/SkillManagerWrapper.cpp b/source/RobotAPI/libraries/skills_gui/memory/SkillManagerWrapper.cpp
index 818d88227..66b8a2b62 100644
--- a/source/RobotAPI/libraries/skills_gui/memory/SkillManagerWrapper.cpp
+++ b/source/RobotAPI/libraries/skills_gui/memory/SkillManagerWrapper.cpp
@@ -73,15 +73,25 @@ namespace armarx::skills::gui
     void
     SkillManagerWrapper::disconnect()
     {
-        std::scoped_lock l(mutex_memory);
-        this->memory = nullptr;
+        // clear memory
+        {
+            std::scoped_lock l(mutex_memory);
+            this->memory = nullptr;
+        }
+
+        // clear stored data
+        {
+            std::scoped_lock d(mutex_snapshot);
+            this->snapshot.skills.clear();
+            this->snapshot.statuses.clear();
+        }
     }
 
     const SkillManagerWrapper::Snapshot
     SkillManagerWrapper::getLatestUpdate()
     {
         // We *want* to make a const copy, since a reference to the snapshot would not necessarily be thread safe.
-        // If this is too slow, this class might implement wrapper functions for the maps. This would not scale well.
+        // If this is too slow, this class might implement wrapper functions for the maps.
         std::scoped_lock l(mutex_snapshot);
         return snapshot;
     }
-- 
GitLab