From 5f371f0bbfadca7971c4a3b624b031ba83a322c9 Mon Sep 17 00:00:00 2001
From: Peter Albrecht <albrecpe@gmail.com>
Date: Thu, 21 Dec 2023 16:23:47 +0100
Subject: [PATCH] feature: stop all button

---
 .../SkillManagerMonitorWidgetController.cpp      |  2 ++
 .../libraries/skills_gui/SkillMemoryGui.cpp      | 13 +++++++++++++
 .../libraries/skills_gui/SkillMemoryGui.h        |  5 ++++-
 .../executions/SkillExecutionTreeWidget.cpp      | 16 ----------------
 .../executions/SkillExecutionTreeWidget.h        |  1 -
 .../skills_gui/memory/SkillManagerWrapper.cpp    | 16 ++++++++++++++++
 .../skills_gui/memory/SkillManagerWrapper.h      |  5 +++++
 7 files changed, 40 insertions(+), 18 deletions(-)

diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidgetController.cpp b/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidgetController.cpp
index fecab0d3e..39c7763ac 100644
--- a/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidgetController.cpp
+++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidgetController.cpp
@@ -174,6 +174,8 @@ namespace armarx
             widget.skillDescription,
             widget.skillDescription->parentWidget()->layout(),
 
+            widget.stopAllLayout,
+
             this->mem_wrapper);
 
         connectSignals();
diff --git a/source/RobotAPI/libraries/skills_gui/SkillMemoryGui.cpp b/source/RobotAPI/libraries/skills_gui/SkillMemoryGui.cpp
index 51e0f3a96..119bd2b23 100644
--- a/source/RobotAPI/libraries/skills_gui/SkillMemoryGui.cpp
+++ b/source/RobotAPI/libraries/skills_gui/SkillMemoryGui.cpp
@@ -15,6 +15,8 @@ namespace armarx::skills::gui
                                    QWidget* skillDescription,
                                    QLayout* skillDescriptionParentLayout,
 
+                                   QLayout* stopAllLayout,
+
                                    std::shared_ptr<SkillManagerWrapper> _memory)
     {
         Logging::setTag("SkillMemoryGui");
@@ -58,6 +60,11 @@ namespace armarx::skills::gui
         _skillGroupBoxParentLayout->insertWidget(0, this->skillDetailGroupBox);
         _skillGroupBoxParentLayout->insertWidget(0, this->skillGroupBox);
 
+        // setup stop all button
+        stopAllButton = new QPushButton(QString::fromStdString(STOP_ALL_BUTTON_TEXT));
+        stopAllButton->setStyleSheet("background-color: red");
+        stopAllLayout->addWidget(stopAllButton);
+
         setupUi();
     }
 
@@ -107,5 +114,11 @@ namespace armarx::skills::gui
         // timer -> update
         connect(
             this->updateWidget, &PeriodicUpdateWidget::update, this, &SkillMemoryGUI::updateGui);
+
+        // stop all
+        connect(stopAllButton,
+                &QPushButton::clicked,
+                memory.get(),
+                &SkillManagerWrapper::stopAllExecutions);
     }
 } // namespace armarx::skills::gui
diff --git a/source/RobotAPI/libraries/skills_gui/SkillMemoryGui.h b/source/RobotAPI/libraries/skills_gui/SkillMemoryGui.h
index 537dc4fc6..bf01a13a4 100644
--- a/source/RobotAPI/libraries/skills_gui/SkillMemoryGui.h
+++ b/source/RobotAPI/libraries/skills_gui/SkillMemoryGui.h
@@ -22,6 +22,7 @@ namespace armarx::skills::gui
         Q_OBJECT
 
     public:
+        static const constexpr char* STOP_ALL_BUTTON_TEXT = "Stop all executions";
         SkillMemoryGUI(QTreeWidget* _skillExecutionTreeWidget,
                        QLayout* _skillExecutionTreeWidgetParentLayout,
                        QGroupBox* _skillGroupBox,
@@ -33,6 +34,8 @@ namespace armarx::skills::gui
                        QWidget* skillDescription,
                        QLayout* skillDescriptionParentLayout,
 
+                       QLayout* stopAllLayout,
+
                        std::shared_ptr<SkillManagerWrapper> _memory);
 
     signals:
@@ -65,7 +68,7 @@ namespace armarx::skills::gui
 
         PeriodicUpdateWidget* updateWidget = nullptr;
 
-        SkillDescriptionWidget* skillDescriptionWidget = nullptr;
+        QPushButton* stopAllButton = nullptr;
     };
 } // namespace armarx::skills::gui
 
diff --git a/source/RobotAPI/libraries/skills_gui/executions/SkillExecutionTreeWidget.cpp b/source/RobotAPI/libraries/skills_gui/executions/SkillExecutionTreeWidget.cpp
index a9e5a4d00..4f7400c2f 100644
--- a/source/RobotAPI/libraries/skills_gui/executions/SkillExecutionTreeWidget.cpp
+++ b/source/RobotAPI/libraries/skills_gui/executions/SkillExecutionTreeWidget.cpp
@@ -122,22 +122,6 @@ namespace armarx::skills::gui
         return selectedExecution.skillExecutionId.skillId.skillName != skills::SkillID::UNKNOWN;
     }
 
-    void
-    SkillExecutionTreeWidget::stopAllExecutions()
-    {
-        for (ssize_t i = 0; i < this->topLevelItemCount(); ++i)
-        {
-            auto item = dynamic_cast<SkillExecutionTreeWidgetItem*>(this->topLevelItem(i));
-
-            if (!item)
-            {
-                continue;
-            }
-
-            memory->stopExecution(item->getExecutionId());
-        }
-    }
-
     void
     SkillExecutionTreeWidget::executionSelectionChanged(QTreeWidgetItem* current,
                                                         QTreeWidgetItem* previous)
diff --git a/source/RobotAPI/libraries/skills_gui/executions/SkillExecutionTreeWidget.h b/source/RobotAPI/libraries/skills_gui/executions/SkillExecutionTreeWidget.h
index cd1d37989..0c7e2ffba 100644
--- a/source/RobotAPI/libraries/skills_gui/executions/SkillExecutionTreeWidget.h
+++ b/source/RobotAPI/libraries/skills_gui/executions/SkillExecutionTreeWidget.h
@@ -53,7 +53,6 @@ namespace armarx::skills::gui
         void updateExecutions();
 
     private slots:
-        void stopAllExecutions();
         void executionSelectionChanged(QTreeWidgetItem* current, QTreeWidgetItem* previous);
         void runContextMenu(const QPoint& pos);
         void stopSelectedExecution();
diff --git a/source/RobotAPI/libraries/skills_gui/memory/SkillManagerWrapper.cpp b/source/RobotAPI/libraries/skills_gui/memory/SkillManagerWrapper.cpp
index 35b30d482..01e4f0c92 100644
--- a/source/RobotAPI/libraries/skills_gui/memory/SkillManagerWrapper.cpp
+++ b/source/RobotAPI/libraries/skills_gui/memory/SkillManagerWrapper.cpp
@@ -163,6 +163,22 @@ namespace armarx::skills::gui
         this->currentSkillSearch = search;
     }
 
+    void
+    SkillManagerWrapper::stopAllExecutions()
+    {
+        ARMARX_IMPORTANT << "Stopping all running executions.";
+        const auto& executions = this->fetchExecutions();
+        for (auto& [executionId, status] : executions)
+        {
+            // select all running executions...
+            if (!status.hasBeenTerminated())
+            {
+                // ... and kill them.
+                this->stopExecution(executionId, 3);
+            }
+        }
+    }
+
     const std::optional<ProviderID>
     SkillManagerWrapper::findFirstProvider(SkillMap const& map, SkillID const& skillId)
     {
diff --git a/source/RobotAPI/libraries/skills_gui/memory/SkillManagerWrapper.h b/source/RobotAPI/libraries/skills_gui/memory/SkillManagerWrapper.h
index 363f8eef2..dfa915459 100644
--- a/source/RobotAPI/libraries/skills_gui/memory/SkillManagerWrapper.h
+++ b/source/RobotAPI/libraries/skills_gui/memory/SkillManagerWrapper.h
@@ -79,6 +79,11 @@ namespace armarx::skills::gui
          */
         void acceptSearchRequest(std::string const& search);
 
+        /**
+         * @brief Stops all available (and running) executions.
+         */
+        void stopAllExecutions();
+
     private:
         mutable std::mutex mutex_memory;
 
-- 
GitLab