From 73fc3e366825abb1073dc90781bb9cff5f3cb3d7 Mon Sep 17 00:00:00 2001
From: Peter Albrecht <albrecpe@gmail.com>
Date: Thu, 21 Dec 2023 15:25:38 +0100
Subject: [PATCH] fix: undefined behaviour if shown description was not
 included in search

---
 .../skill_details/SkillDetailsGroupBox.cpp          | 13 ++++++++++---
 .../skill_details/SkillDetailsTreeWidget.cpp        | 12 +++++++++---
 .../skill_details/SkillDetailsTreeWidget.h          |  2 ++
 3 files changed, 21 insertions(+), 6 deletions(-)

diff --git a/source/RobotAPI/libraries/skills_gui/skill_details/SkillDetailsGroupBox.cpp b/source/RobotAPI/libraries/skills_gui/skill_details/SkillDetailsGroupBox.cpp
index fdba9547e..bae1d2799 100644
--- a/source/RobotAPI/libraries/skills_gui/skill_details/SkillDetailsGroupBox.cpp
+++ b/source/RobotAPI/libraries/skills_gui/skill_details/SkillDetailsGroupBox.cpp
@@ -31,9 +31,16 @@ namespace armarx::skills::gui
         // construct skill id (with guaranteed valid provider)
         skills::SkillID skillId = {provider_opt, _skillId.skillName};
 
-        // We assert that the skill exists
-        ARMARX_CHECK(skills.count(skillId.providerId.value()) > 0);
-        ARMARX_CHECK(skills.at(skillId.providerId.value()).count(skillId) > 0);
+
+        // Maybe the search doesn't include the shown skill?
+        if (skills.count(skillId.providerId.value()) == 0 ||
+            skills.at(skillId.providerId.value()).count(skillId) == 0)
+        {
+            // reset details widget
+            skillDetailsTreeWidget->resetWidget();
+            return;
+        }
+
 
         // get skill description
         skills::SkillDescription descr = skills.at(skillId.providerId.value()).at(skillId);
diff --git a/source/RobotAPI/libraries/skills_gui/skill_details/SkillDetailsTreeWidget.cpp b/source/RobotAPI/libraries/skills_gui/skill_details/SkillDetailsTreeWidget.cpp
index ad95bf151..8d8eaaee2 100644
--- a/source/RobotAPI/libraries/skills_gui/skill_details/SkillDetailsTreeWidget.cpp
+++ b/source/RobotAPI/libraries/skills_gui/skill_details/SkillDetailsTreeWidget.cpp
@@ -34,9 +34,7 @@ namespace armarx::skills::gui
         // dont touch the widget if the skill id didn't change
         if (shownSkill.has_value() && skillId == shownSkill.value().skillId)
             return;
-        this->clear();
-        aronTreeWidgetController = nullptr;
-        skillsArgumentsTreeWidgetItem = nullptr;
+        this->resetWidget();
 
         {
             auto it = new QTreeWidgetItem(
@@ -154,5 +152,13 @@ namespace armarx::skills::gui
         aronTreeWidgetController->setFromAron(data);
     }
 
+    void
+    SkillDetailsTreeWidget::resetWidget()
+    {
+        this->clear();
+        aronTreeWidgetController = nullptr;
+        skillsArgumentsTreeWidgetItem = nullptr;
+    }
+
 
 } // namespace armarx::skills::gui
diff --git a/source/RobotAPI/libraries/skills_gui/skill_details/SkillDetailsTreeWidget.h b/source/RobotAPI/libraries/skills_gui/skill_details/SkillDetailsTreeWidget.h
index f6116a938..1617de1f7 100644
--- a/source/RobotAPI/libraries/skills_gui/skill_details/SkillDetailsTreeWidget.h
+++ b/source/RobotAPI/libraries/skills_gui/skill_details/SkillDetailsTreeWidget.h
@@ -24,6 +24,8 @@ namespace armarx::skills::gui
         void pasteCurrentConfig();
         void resetCurrentConfig();
 
+        void resetWidget();
+
     public slots:
         void disconnectGui();
         void updateGui();
-- 
GitLab