diff --git a/source/RobotAPI/libraries/skills_gui/SkillMemoryGui.cpp b/source/RobotAPI/libraries/skills_gui/SkillMemoryGui.cpp index 4d74cf11e2b5c208a30eb553c986a9636dabd562..ac0cfaa2420a1dd2d11d01b77a4fb38c02a62fc6 100644 --- a/source/RobotAPI/libraries/skills_gui/SkillMemoryGui.cpp +++ b/source/RobotAPI/libraries/skills_gui/SkillMemoryGui.cpp @@ -105,22 +105,25 @@ namespace armarx::skills::gui &PeriodicUpdateWidget::startTimerIfEnabled); connect(this, &SkillMemoryGUI::connectGui, skillGroupBox, &SkillGroupBox::connectGui); - // update cascade - connect(this, &SkillMemoryGUI::updateGui, skillGroupBox, &SkillGroupBox::updateGui); + // timer + connect(this->updateWidget, + &PeriodicUpdateWidget::update, + this->memory.get(), + &SkillManagerWrapper::updateFromMemory); + + // updates + connect(this->memory.get(), + &SkillManagerWrapper::updateAvailable, + this, + &SkillMemoryGUI::updateGui); + + connect(this, &SkillMemoryGUI::updateGui, this->skillGroupBox, &SkillGroupBox::updateGui); - // we don't want to update the skill details periodically, update can be triggered manually - /* - connect( - this, &SkillMemoryGUI::updateGui, skillDetailGroupBox, &SkillDetailGroupBox::updateGui); - */ connect(this, &SkillMemoryGUI::updateGui, - skillExecutionTreeWidget, - &SkillExecutionTreeWidget::updateExecutions); + this->skillExecutionTreeWidget, + &SkillExecutionTreeWidget::updateGui); - // timer -> update - connect( - this->updateWidget, &PeriodicUpdateWidget::update, this, &SkillMemoryGUI::updateGui); // stop all connect(stopAllButton, diff --git a/source/RobotAPI/libraries/skills_gui/SkillMemoryGui.h b/source/RobotAPI/libraries/skills_gui/SkillMemoryGui.h index 648f7cee806866a36363559267f68c537f203c1c..09c26b287bc62ebd08ff3ee58366285bfc419860 100644 --- a/source/RobotAPI/libraries/skills_gui/SkillMemoryGui.h +++ b/source/RobotAPI/libraries/skills_gui/SkillMemoryGui.h @@ -52,10 +52,7 @@ namespace armarx::skills::gui */ void connectGui(std::string observerName); - /** - * @brief Notify widgets to update themselves - */ - void updateGui(); + void updateGui(SkillManagerWrapper::Snapshot update); private: void setupUi(); diff --git a/source/RobotAPI/libraries/skills_gui/executions/SkillExecutionTreeWidget.cpp b/source/RobotAPI/libraries/skills_gui/executions/SkillExecutionTreeWidget.cpp index 2699e41f2eb5dcd9e30c053a9c69e429b0496be4..780c2bb728874f9865d7147ee2a17be55e925527 100644 --- a/source/RobotAPI/libraries/skills_gui/executions/SkillExecutionTreeWidget.cpp +++ b/source/RobotAPI/libraries/skills_gui/executions/SkillExecutionTreeWidget.cpp @@ -140,13 +140,14 @@ namespace armarx::skills::gui } void - SkillExecutionTreeWidget::updateExecutions() + SkillExecutionTreeWidget::updateGui(SkillManagerWrapper::Snapshot update) { - auto currentManagerStatuses = memory->getExecutions(); - if (currentManagerStatuses.empty()) + if (update.statuses.empty()) + { return; + } - for (const auto& [k, v] : currentManagerStatuses) + for (const auto& [k, v] : update.statuses) { skills::SkillExecutionID executionId = k; skills::SkillStatusUpdate statusUpdate = v; diff --git a/source/RobotAPI/libraries/skills_gui/executions/SkillExecutionTreeWidget.h b/source/RobotAPI/libraries/skills_gui/executions/SkillExecutionTreeWidget.h index 795045302b4b47655e196e4cea566d53140f90d6..09fbdae081ed61aed705a278cbc903c053f30a80 100644 --- a/source/RobotAPI/libraries/skills_gui/executions/SkillExecutionTreeWidget.h +++ b/source/RobotAPI/libraries/skills_gui/executions/SkillExecutionTreeWidget.h @@ -9,6 +9,7 @@ namespace armarx::skills::gui { + using StatusMap = std::map<skills::SkillExecutionID, skills::SkillStatusUpdate>; class SkillExecutionTreeWidget : public QTreeWidget, public MemoryCommunicatorBase { @@ -38,7 +39,7 @@ namespace armarx::skills::gui public slots: void disconnectGui(); - void updateExecutions(); + void updateGui(SkillManagerWrapper::Snapshot update); private slots: void executionSelectionChanged(QTreeWidgetItem* current, QTreeWidgetItem* previous); diff --git a/source/RobotAPI/libraries/skills_gui/memory/SkillManagerWrapper.cpp b/source/RobotAPI/libraries/skills_gui/memory/SkillManagerWrapper.cpp index 25119c9a1c5957970765ca6fe63cdb506d34f4c0..5e88884733237797998522e242bfd88c6ab7ce74 100644 --- a/source/RobotAPI/libraries/skills_gui/memory/SkillManagerWrapper.cpp +++ b/source/RobotAPI/libraries/skills_gui/memory/SkillManagerWrapper.cpp @@ -221,8 +221,7 @@ namespace armarx::skills::gui snapshot.skills = fetchSkillsFromMemory(); // notify registered widgets of update - emit skillUpdate(snapshot.skills); - emit statusUpdate(snapshot.statuses); + emit updateAvailable(this->snapshot); } const std::optional<ProviderID> diff --git a/source/RobotAPI/libraries/skills_gui/memory/SkillManagerWrapper.h b/source/RobotAPI/libraries/skills_gui/memory/SkillManagerWrapper.h index f6f797c8e76a4e7b97e1040df4126b5cd69a8c54..a3352ad1c7f5a79c77d9fa0b0430377b831133c6 100644 --- a/source/RobotAPI/libraries/skills_gui/memory/SkillManagerWrapper.h +++ b/source/RobotAPI/libraries/skills_gui/memory/SkillManagerWrapper.h @@ -67,10 +67,20 @@ namespace armarx::skills::gui */ StatusMap getExecutions(); + struct Snapshot + { + StatusMap statuses; + SkillMap skills; + + // default constructor (construct empty) + Snapshot() : statuses({}), skills({}) + { + } + }; + signals: void connectionUpdate(std::string const& message, std::string const& error); - void skillUpdate(SkillMap update); - void statusUpdate(StatusMap update); + void updateAvailable(Snapshot update); public slots: /** @@ -101,17 +111,6 @@ namespace armarx::skills::gui armarx::skills::manager::dti::SkillManagerInterfacePrx memory; std::string currentSkillSearch = ""; - struct Snapshot - { - StatusMap statuses; - SkillMap skills; - - // default constructor (construct empty) - Snapshot() : statuses({}), skills({}) - { - } - }; - Snapshot snapshot; /** diff --git a/source/RobotAPI/libraries/skills_gui/skill_details/SkillDetailsGroupBox.h b/source/RobotAPI/libraries/skills_gui/skill_details/SkillDetailsGroupBox.h index f777490cfba0c7d45b83f601ec69ea2d91903728..1723870bc6fb5a0c32c24efad41d17c9baf0fb58 100644 --- a/source/RobotAPI/libraries/skills_gui/skill_details/SkillDetailsGroupBox.h +++ b/source/RobotAPI/libraries/skills_gui/skill_details/SkillDetailsGroupBox.h @@ -32,14 +32,9 @@ namespace armarx::skills::gui signals: void disconnectGui(); - /** - * @brief Notify widgets to update themselves - */ - void updateGui(); - public slots: /** - * @brief Update subwidgets of an updated skill selection. + * @brief Notify subwidgets of an updated skill selection. * @param skillId */ void updateSkillDetails(skills::SkillID& skillId); diff --git a/source/RobotAPI/libraries/skills_gui/skills/SkillGroupBox.cpp b/source/RobotAPI/libraries/skills_gui/skills/SkillGroupBox.cpp index 91fb11c021677e96890a001a0538fc6cf98f4aa0..acb9219dc5ed5c7566b287dd4b8cccf4dd4c2f0d 100644 --- a/source/RobotAPI/libraries/skills_gui/skills/SkillGroupBox.cpp +++ b/source/RobotAPI/libraries/skills_gui/skills/SkillGroupBox.cpp @@ -64,11 +64,12 @@ namespace armarx::skills::gui this, &SkillGroupBox::updateSkillDetails); + // update + connect( + this, &SkillGroupBox::updateGui, this->skillTreeWidget, &SkillTreeWidget::updateGui); + // disconnect connect( this, &SkillGroupBox::disconnectGui, skillTreeWidget, &SkillTreeWidget::disconnectGui); - - // update cascade - connect(this, &SkillGroupBox::updateGui, skillTreeWidget, &SkillTreeWidget::updateSkills); } } // namespace armarx::skills::gui diff --git a/source/RobotAPI/libraries/skills_gui/skills/SkillGroupBox.h b/source/RobotAPI/libraries/skills_gui/skills/SkillGroupBox.h index 2ac6044ba72807ef300ae48fa19fe53d9230d1f3..239247deb28f4694af0b783f6147e83bf49d52eb 100644 --- a/source/RobotAPI/libraries/skills_gui/skills/SkillGroupBox.h +++ b/source/RobotAPI/libraries/skills_gui/skills/SkillGroupBox.h @@ -36,10 +36,7 @@ namespace armarx::skills::gui void disconnectGui(); - /** - * @brief Notify widgets to update themselves - */ - void updateGui(); + void updateGui(SkillManagerWrapper::Snapshot update); public slots: void connectGui(std::string observerName); diff --git a/source/RobotAPI/libraries/skills_gui/skills/SkillTreeWidget.cpp b/source/RobotAPI/libraries/skills_gui/skills/SkillTreeWidget.cpp index 142a387ccbe0c7860b2f0f26169abcb9e74456c2..44cfa5be656dc612483d5ac732ecd23bae331480 100644 --- a/source/RobotAPI/libraries/skills_gui/skills/SkillTreeWidget.cpp +++ b/source/RobotAPI/libraries/skills_gui/skills/SkillTreeWidget.cpp @@ -25,10 +25,9 @@ namespace armarx::skills::gui } void - SkillTreeWidget::updateSkills() + SkillTreeWidget::updateGui(SkillManagerWrapper::Snapshot update) { setSortingEnabled(false); - const auto skills = memory->getSkills(); // update tree view. Remove non-existing elements int i = 0; @@ -38,7 +37,7 @@ namespace armarx::skills::gui auto providerName = providerItem->text(0).toStdString(); skills::ProviderID providerId{.providerName = providerName}; - if (skills.find(providerId) == skills.end()) + if (update.skills.find(providerId) == update.skills.end()) { providerItem = nullptr; // reset auto remove = this->takeTopLevelItem(i); @@ -49,8 +48,8 @@ namespace armarx::skills::gui ++i; // sanity check - ARMARX_CHECK(skills.count(providerId) > 0); - auto& providedSkills = skills.at(providerId); + ARMARX_CHECK(update.skills.count(providerId) > 0); + auto& providedSkills = update.skills.at(providerId); int j = 0; while (j < providerItem->childCount()) @@ -75,7 +74,7 @@ namespace armarx::skills::gui } // update tree view. Add new elements - for (const auto& [providerId, providedSkills] : skills) + for (const auto& [providerId, providedSkills] : update.skills) { 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 61ec5cc85314d0318a951e8216a620d1f1d9a7c8..d0fa3880d8ff65c20696835d89845c5e8f018a87 100644 --- a/source/RobotAPI/libraries/skills_gui/skills/SkillTreeWidget.h +++ b/source/RobotAPI/libraries/skills_gui/skills/SkillTreeWidget.h @@ -9,6 +9,8 @@ namespace armarx::skills::gui { + using SkillMap = + std::map<skills::ProviderID, std::map<skills::SkillID, skills::SkillDescription>>; class SkillTreeWidget : public QTreeWidget, public MemoryCommunicatorBase { @@ -42,7 +44,8 @@ namespace armarx::skills::gui public slots: void disconnectGui(); - void updateSkills(); + + void updateGui(SkillManagerWrapper::Snapshot update); private slots: void skillSelectionChanged(QTreeWidgetItem* current, int column);