From e42d780e96f93f2ce0d3bd0eb4a6f2e74d98ac2b Mon Sep 17 00:00:00 2001
From: Fabian Peller <fabian.peller-konrad@kit.edu>
Date: Wed, 15 Nov 2023 08:03:49 +0100
Subject: [PATCH] fix designated initializers. Readd missing method from MR

---
 .../SkillManagerMonitorWidgetController.cpp   | 50 +++++++++++++++++--
 .../SkillManagerMonitorWidgetController.h     | 14 ++++--
 .../provider/SkillProviderComponentPlugin.cpp |  7 +--
 3 files changed, 58 insertions(+), 13 deletions(-)

diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidgetController.cpp b/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidgetController.cpp
index 72a1aff30..4a6b6d898 100644
--- a/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidgetController.cpp
+++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidgetController.cpp
@@ -22,9 +22,12 @@
 
 #include "SkillManagerMonitorWidgetController.h"
 
+#include <optional>
 #include <regex>
 #include <string>
 
+#include <SimoxUtility/algorithm/string.h>
+
 #include <RobotAPI/libraries/skills/core/Skill.h>
 
 #include "aronTreeWidget/visitors/AronTreeWidgetConverter.h"
@@ -35,9 +38,11 @@
 #include "aronTreeWidget/modal/text/AronTreeWidgetTextInputModalController.h"
 
 // debug
+#include <QAction>
 #include <QClipboard>
 #include <QDoubleSpinBox>
 #include <QGridLayout>
+#include <QMenu>
 #include <QTextBrowser>
 
 #include <RobotAPI/libraries/aron/converter/json/NLohmannJSONConverter.h>
@@ -54,6 +59,9 @@
 //configSk
 namespace armarx
 {
+    const skills::SkillID SkillManagerMonitorWidgetController::SelectedSkill::UNK_SKILL_ID =
+        skills::SkillID{.providerId = ::std::nullopt, .skillName = skills::SkillID::UNKNOWN};
+
     QPointer<QDialog>
     SkillManagerMonitorWidgetController::getConfigDialog(QWidget* parent)
     {
@@ -88,6 +96,38 @@ namespace armarx
 // Others
 namespace armarx
 {
+    void
+    SkillManagerMonitorWidgetController::prepareAndRunMenu(const QPoint& pos)
+    {
+        QMenu* menu = new QMenu();
+
+        // Stop skill
+        QAction* stopSkillAction = new QAction("Stop Skill", this);
+        skills::SkillStatus currentStatus =
+            skillStatusUpdates.at(selectedSkill.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,
+                &QAction::triggered,
+                this,
+                &SkillManagerMonitorWidgetController::stopSkill);
+        connect(rerunSkillAction,
+                &QAction::triggered,
+                this,
+                &SkillManagerMonitorWidgetController::rerunSkillWithSimilarParams);
+
+        // Temporarily disable rerun-skill-Action
+        rerunSkillAction->setDisabled(true);
+
+        // open menu
+        menu->popup(widget.treeWidgetSkillExecutions->viewport()->mapToGlobal(pos));
+    }
+
     SkillExecutionInfoTreeWidgetItem*
     SkillExecutionInfoTreeWidgetItem::SearchRecursiveForMatch(
         SkillExecutionInfoTreeWidgetItem* haystack,
@@ -255,7 +295,7 @@ namespace armarx
 
         for (auto it = update.begin(); it != update.end();)
         {
-            if (boost::algorithm::to_lower_copy(skills::SkillID::FromIce(it->first).skillName)
+            if (simox::alg::to_lower(skills::SkillID::FromIce(it->first).skillName)
                     .find(this->currentSkillSearch.toLower().toStdString()))
             {
                 update.erase(it++);
@@ -540,10 +580,10 @@ namespace armarx
         char hostname[HOST_NAME_MAX];
         gethostname(hostname, HOST_NAME_MAX);
 
-        skills::SkillExecutionRequest req(selectedSkill.skillId,
-                                          "Skills.Manager GUI (hostname: " + std::string(hostname) +
-                                              ")",
-                                          params);
+        skills::SkillExecutionRequest req{
+            .skillId = selectedSkill.skillId,
+            .executorName = "Skills.Manager GUI (hostname: " + std::string(hostname) + ")",
+            .parameters = params};
 
         ARMARX_CHECK(selectedSkill.skillId.isFullySpecified()); // sanity check
         ARMARX_IMPORTANT << "Executing skill from GUI: " << selectedSkill.skillId << ".";
diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidgetController.h b/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidgetController.h
index 318ef468b..d20cb0835 100644
--- a/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidgetController.h
+++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidgetController.h
@@ -164,18 +164,22 @@ namespace armarx
         // User Input
         struct SelectedSkill
         {
+            static const skills::SkillID UNK_SKILL_ID;
+
             skills::SkillID skillId;
             skills::SkillExecutionID skillExecutionId;
 
             // make default constructable
             SelectedSkill() :
-                skillId({}, skills::SkillID::UNKNOWN),
-                skillExecutionId({{}, skills::SkillID::UNKNOWN},
-                                 skills::SkillExecutionID::UNKNOWN,
-                                 armarx::core::time::DateTime::Invalid())
+                skillId(UNK_SKILL_ID),
+                skillExecutionId{.skillId = UNK_SKILL_ID,
+                                 .executorName = skills::SkillExecutionID::UNKNOWN,
+                                 .executionStartedTime = armarx::core::time::DateTime::Invalid()}
             {
             }
-        } selectedSkill;
+        }
+
+        selectedSkill;
 
         void executeSkillWithParams(skills::SkillID skillId, aron::data::DictPtr params);
         void matchSkillUpdateToSearch(std::map<skills::manager::dto::SkillID,
diff --git a/source/RobotAPI/libraries/skills/provider/SkillProviderComponentPlugin.cpp b/source/RobotAPI/libraries/skills/provider/SkillProviderComponentPlugin.cpp
index e4d3235a3..a42d78082 100644
--- a/source/RobotAPI/libraries/skills/provider/SkillProviderComponentPlugin.cpp
+++ b/source/RobotAPI/libraries/skills/provider/SkillProviderComponentPlugin.cpp
@@ -190,9 +190,10 @@ namespace armarx::plugins
     {
         ARMARX_CHECK(executionRequest.skillId.isFullySpecified());
 
-        skills::SkillExecutionID executionId(executionRequest.skillId,
-                                             executionRequest.executorName,
-                                             armarx::core::time::DateTime::Now());
+        skills::SkillExecutionID executionId{.skillId = executionRequest.skillId,
+                                             .executorName = executionRequest.executorName,
+                                             .executionStartedTime =
+                                                 armarx::core::time::DateTime::Now()};
 
         skills::SkillStatusUpdate ret{
             {executionId, executionRequest.parameters, executionRequest.callbackInterface}};
-- 
GitLab