From 98786ba3aabde67289de2f61b138efecd282da1e Mon Sep 17 00:00:00 2001
From: Peter Albrecht <albrecpe@gmail.com>
Date: Mon, 29 Jan 2024 14:58:19 +0100
Subject: [PATCH] Add wildcard functionality to skill search

---
 .../skills_gui/memory/SkillManagerWrapper.cpp | 27 ++++++++++++++++---
 1 file changed, 24 insertions(+), 3 deletions(-)

diff --git a/source/RobotAPI/libraries/skills_gui/memory/SkillManagerWrapper.cpp b/source/RobotAPI/libraries/skills_gui/memory/SkillManagerWrapper.cpp
index 92277c0eb..ff35703b3 100644
--- a/source/RobotAPI/libraries/skills_gui/memory/SkillManagerWrapper.cpp
+++ b/source/RobotAPI/libraries/skills_gui/memory/SkillManagerWrapper.cpp
@@ -54,6 +54,24 @@ namespace armarx::skills::gui
         }
     }
 
+    // check if search strings occur in the skill name in order
+    bool
+    matches(std::string skillName, std::vector<std::string>& searches)
+    {
+        size_t index = 0;
+        for (std::string& substring : searches)
+        {
+            size_t occurance = skillName.find(substring, index);
+            if (occurance == std::string::npos)
+                return false;
+
+
+            // we found an occurance
+            index = occurance;
+        }
+        return true;
+    }
+
     void
     SkillManagerWrapper::filterSkillUpdate(
         std::map<skills::manager::dto::SkillID, skills::manager::dto::SkillDescription>& update)
@@ -64,13 +82,16 @@ namespace armarx::skills::gui
             return;
         }
 
-        // TODO: whitespace to wildcard
+        std::vector<std::string> substrings = simox::alg::split(currentSkillSearch);
+        for (auto& string : substrings)
+        {
+            simox::alg::to_lower(string);
+        }
 
-        std::string key = simox::alg::to_lower(this->currentSkillSearch);
 
         for (auto it = update.begin(); it != update.end();)
         {
-            if (simox::alg::to_lower(skills::SkillID::FromIce(it->first).skillName).find(key))
+            if (not matches(skills::SkillID::FromIce(it->first).skillName, substrings))
             {
                 it = update.erase(it);
             }
-- 
GitLab