From 7639b16901798800466c3c9064ce3793a5c07a1f Mon Sep 17 00:00:00 2001 From: albrecpe <albrecpe@gmail.com> Date: Mon, 11 Mar 2024 23:54:05 +0100 Subject: [PATCH] Adapt search to handle offline filtering --- .../skills_gui/memory/SkillManagerWrapper.cpp | 48 ++++++++++++------- .../skills_gui/memory/SkillManagerWrapper.h | 8 ++-- .../skills_gui/skills/SkillGroupBox.cpp | 20 ++++++-- .../skills_gui/skills/SkillGroupBox.h | 7 ++- .../skills_gui/skills/SkillTreeWidget.cpp | 10 ++-- .../skills_gui/skills/SkillTreeWidget.h | 2 +- 6 files changed, 62 insertions(+), 33 deletions(-) diff --git a/source/RobotAPI/libraries/skills_gui/memory/SkillManagerWrapper.cpp b/source/RobotAPI/libraries/skills_gui/memory/SkillManagerWrapper.cpp index 5e8888473..1b7b492b5 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 a3352ad1c..e191e1f96 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 acb9219dc..bec357e60 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 239247deb..11604f2a2 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 44cfa5be6..a9ebcdd98 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 d0fa3880d..f94bdcaae 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); -- GitLab