diff --git a/source/RobotAPI/libraries/skills_gui/memory/SkillManagerWrapper.cpp b/source/RobotAPI/libraries/skills_gui/memory/SkillManagerWrapper.cpp index 5e88884733237797998522e242bfd88c6ab7ce74..1b7b492b5c24dcc87f536eccb2dffae29a94ca89 100644 --- a/source/RobotAPI/libraries/skills_gui/memory/SkillManagerWrapper.cpp +++ b/source/RobotAPI/libraries/skills_gui/memory/SkillManagerWrapper.cpp @@ -74,16 +74,20 @@ namespace armarx::skills::gui return true; } - void - SkillManagerWrapper::filterSkillUpdate( - std::map<skills::manager::dto::SkillID, skills::manager::dto::SkillDescription>& update) + SkillManagerWrapper::Snapshot + SkillManagerWrapper::filterUpdate(Snapshot update) { // empty search => do not filter if (this->currentSkillSearch.empty()) { - return; + return update; } + Snapshot filtered; + + // for now we don't change the executions + filtered.statuses = update.statuses; + std::vector<std::string> substrings; { @@ -95,18 +99,27 @@ namespace armarx::skills::gui } - for (auto it = update.begin(); it != update.end();) + for (auto& provider_and_descrMap : update.skills) { - if (not matches(simox::alg::to_lower(skills::SkillID::FromIce(it->first).skillName), - substrings)) - { - it = update.erase(it); - } - else + using DescriptionMap = std::map<skills::SkillID, skills::SkillDescription>; + + DescriptionMap& descriptionMap = provider_and_descrMap.second; + skills::ProviderID provider = provider_and_descrMap.first; + + for (auto& skill_and_description : descriptionMap) { - ++it; + skills::SkillID sid = skill_and_description.first; + skills::SkillDescription descr = skill_and_description.second; + + if (matches(simox::alg::to_lower(sid.skillName), substrings)) + { + // add to map + filtered.skills[provider][sid] = descr; + } } } + + return filtered; } SkillMap @@ -125,9 +138,6 @@ namespace armarx::skills::gui auto managerSkills = memory->getSkillDescriptions(); - this->filterSkillUpdate(managerSkills); - - for (const auto& [sid, desc] : managerSkills) { auto description = skills::SkillDescription::FromIce(desc); @@ -179,6 +189,7 @@ namespace armarx::skills::gui SkillManagerWrapper::acceptSearchRequest(std::string const& search) { this->currentSkillSearch = search; + emit searchAccepted(); } void @@ -221,7 +232,7 @@ namespace armarx::skills::gui snapshot.skills = fetchSkillsFromMemory(); // notify registered widgets of update - emit updateAvailable(this->snapshot); + emit updateAvailable(filterUpdate(snapshot)); } const std::optional<ProviderID> @@ -252,7 +263,10 @@ namespace armarx::skills::gui SkillManagerWrapper::getSkills() { std::scoped_lock l(mutex_snapshot); - return snapshot.skills; + + Snapshot filtered = filterUpdate(snapshot); + + return filtered.skills; } StatusMap diff --git a/source/RobotAPI/libraries/skills_gui/memory/SkillManagerWrapper.h b/source/RobotAPI/libraries/skills_gui/memory/SkillManagerWrapper.h index a3352ad1c7f5a79c77d9fa0b0430377b831133c6..e191e1f963d82b29abeafe0535fe5f50a384bda3 100644 --- a/source/RobotAPI/libraries/skills_gui/memory/SkillManagerWrapper.h +++ b/source/RobotAPI/libraries/skills_gui/memory/SkillManagerWrapper.h @@ -81,6 +81,7 @@ namespace armarx::skills::gui signals: void connectionUpdate(std::string const& message, std::string const& error); void updateAvailable(Snapshot update); + void searchAccepted(); public slots: /** @@ -126,11 +127,10 @@ namespace armarx::skills::gui StatusMap fetchExecutionsFromMemory(); /** - * @brief Modifies the given map to match the search. - * @param update The map to modify. + * @brief Returns the given snapshot, matching the search. + * @param update The snapshot to modify. */ - void filterSkillUpdate(std::map<skills::manager::dto::SkillID, - skills::manager::dto::SkillDescription>& update); + Snapshot filterUpdate(Snapshot update); // config // TODO: perhaps use proper config file for the gui diff --git a/source/RobotAPI/libraries/skills_gui/skills/SkillGroupBox.cpp b/source/RobotAPI/libraries/skills_gui/skills/SkillGroupBox.cpp index acb9219dc5ed5c7566b287dd4b8cccf4dd4c2f0d..bec357e6054091c294bc04c8dbad0ae6aee900d5 100644 --- a/source/RobotAPI/libraries/skills_gui/skills/SkillGroupBox.cpp +++ b/source/RobotAPI/libraries/skills_gui/skills/SkillGroupBox.cpp @@ -18,6 +18,18 @@ namespace armarx::skills::gui setTitle(QString::fromStdString(observerName)); } + void + SkillGroupBox::updateGui(SkillManagerWrapper::Snapshot update) + { + skillTreeWidget->updateGui(update.skills); + } + + void + SkillGroupBox::searchCallback() + { + this->skillTreeWidget->updateGui(memory->getSkills()); + } + void SkillGroupBox::setupUi() { @@ -58,16 +70,16 @@ namespace armarx::skills::gui &SkillGroupBox::searchRequest, this->memory.get(), &SkillManagerWrapper::acceptSearchRequest); + connect(memory.get(), + &SkillManagerWrapper::searchAccepted, + this, + &SkillGroupBox::searchCallback); connect(skillTreeWidget, &SkillTreeWidget::updateSkillDetails, this, &SkillGroupBox::updateSkillDetails); - // update - connect( - this, &SkillGroupBox::updateGui, this->skillTreeWidget, &SkillTreeWidget::updateGui); - // disconnect connect( this, &SkillGroupBox::disconnectGui, skillTreeWidget, &SkillTreeWidget::disconnectGui); diff --git a/source/RobotAPI/libraries/skills_gui/skills/SkillGroupBox.h b/source/RobotAPI/libraries/skills_gui/skills/SkillGroupBox.h index 239247deb28f4694af0b783f6147e83bf49d52eb..11604f2a24710b35faf10b129c2e9c63f35d8051 100644 --- a/source/RobotAPI/libraries/skills_gui/skills/SkillGroupBox.h +++ b/source/RobotAPI/libraries/skills_gui/skills/SkillGroupBox.h @@ -36,11 +36,14 @@ namespace armarx::skills::gui void disconnectGui(); - void updateGui(SkillManagerWrapper::Snapshot update); - public slots: void connectGui(std::string observerName); + void updateGui(SkillManagerWrapper::Snapshot update); + + // is called, after the search has been accepted in the memory wrapper. + void searchCallback(); + private slots: /** * Takes string from line edit and emits the search request. diff --git a/source/RobotAPI/libraries/skills_gui/skills/SkillTreeWidget.cpp b/source/RobotAPI/libraries/skills_gui/skills/SkillTreeWidget.cpp index 44cfa5be656dc612483d5ac732ecd23bae331480..a9ebcdd98cfbde9b54abcb929504dd384e0a7c5f 100644 --- a/source/RobotAPI/libraries/skills_gui/skills/SkillTreeWidget.cpp +++ b/source/RobotAPI/libraries/skills_gui/skills/SkillTreeWidget.cpp @@ -25,7 +25,7 @@ namespace armarx::skills::gui } void - SkillTreeWidget::updateGui(SkillManagerWrapper::Snapshot update) + SkillTreeWidget::updateGui(SkillMap update) { setSortingEnabled(false); @@ -37,7 +37,7 @@ namespace armarx::skills::gui auto providerName = providerItem->text(0).toStdString(); skills::ProviderID providerId{.providerName = providerName}; - if (update.skills.find(providerId) == update.skills.end()) + if (update.find(providerId) == update.end()) { providerItem = nullptr; // reset auto remove = this->takeTopLevelItem(i); @@ -48,8 +48,8 @@ namespace armarx::skills::gui ++i; // sanity check - ARMARX_CHECK(update.skills.count(providerId) > 0); - auto& providedSkills = update.skills.at(providerId); + ARMARX_CHECK(update.count(providerId) > 0); + auto& providedSkills = update.at(providerId); int j = 0; while (j < providerItem->childCount()) @@ -74,7 +74,7 @@ namespace armarx::skills::gui } // update tree view. Add new elements - for (const auto& [providerId, providedSkills] : update.skills) + for (const auto& [providerId, providedSkills] : update) { bool newProvider = false; QTreeWidgetItem* providerItem = nullptr; diff --git a/source/RobotAPI/libraries/skills_gui/skills/SkillTreeWidget.h b/source/RobotAPI/libraries/skills_gui/skills/SkillTreeWidget.h index d0fa3880d8ff65c20696835d89845c5e8f018a87..f94bdcaae2d62dd45dc10f8a98f6916117a0eb4d 100644 --- a/source/RobotAPI/libraries/skills_gui/skills/SkillTreeWidget.h +++ b/source/RobotAPI/libraries/skills_gui/skills/SkillTreeWidget.h @@ -45,7 +45,7 @@ namespace armarx::skills::gui public slots: void disconnectGui(); - void updateGui(SkillManagerWrapper::Snapshot update); + void updateGui(SkillMap update); private slots: void skillSelectionChanged(QTreeWidgetItem* current, int column);