From 5ac8a0fc626f406ad55bc46bb14c8a3105fdcf86 Mon Sep 17 00:00:00 2001 From: Peter Albrecht <albrecpe@gmail.com> Date: Tue, 12 Dec 2023 16:58:49 +0100 Subject: [PATCH] Implemented context menu for executions tree --- .../libraries/skills_gui/SkillMemoryGui.cpp | 7 +++- .../libraries/skills_gui/SkillMemoryGui.h | 2 +- .../executions/SkillExecutionTreeWidget.cpp | 41 +++++++++++++++++++ .../executions/SkillExecutionTreeWidget.h | 6 ++- .../skills_gui/memory/SkillManagerWrapper.cpp | 16 ++++++-- 5 files changed, 66 insertions(+), 6 deletions(-) diff --git a/source/RobotAPI/libraries/skills_gui/SkillMemoryGui.cpp b/source/RobotAPI/libraries/skills_gui/SkillMemoryGui.cpp index faacc352f..127930695 100644 --- a/source/RobotAPI/libraries/skills_gui/SkillMemoryGui.cpp +++ b/source/RobotAPI/libraries/skills_gui/SkillMemoryGui.cpp @@ -22,6 +22,11 @@ namespace armarx::skills::gui ARMARX_CHECK(_skillDetailGroupBoxParentLayout); ARMARX_CHECK(_memory); + ARMARX_CHECK(_skillExecutionTreeWidget); + ARMARX_CHECK(_skillGroupBox); + ARMARX_CHECK(_skillDetailGroupBox); + ARMARX_CHECK(_updateWidgetLayout); + // setup memory this->memory = _memory; @@ -47,7 +52,7 @@ namespace armarx::skills::gui } void - SkillMemoryGUI::disconnect() + SkillMemoryGUI::resetGui() { ARMARX_ERROR << "Not implemented"; } diff --git a/source/RobotAPI/libraries/skills_gui/SkillMemoryGui.h b/source/RobotAPI/libraries/skills_gui/SkillMemoryGui.h index b0b6baf22..b49123cae 100644 --- a/source/RobotAPI/libraries/skills_gui/SkillMemoryGui.h +++ b/source/RobotAPI/libraries/skills_gui/SkillMemoryGui.h @@ -36,7 +36,7 @@ namespace armarx::skills::gui /** * @brief Resets all widgets when disconnecting */ - void disconnect(); + void resetGui(); private: void connectSignals(); diff --git a/source/RobotAPI/libraries/skills_gui/executions/SkillExecutionTreeWidget.cpp b/source/RobotAPI/libraries/skills_gui/executions/SkillExecutionTreeWidget.cpp index aab0b484f..8e53e9708 100644 --- a/source/RobotAPI/libraries/skills_gui/executions/SkillExecutionTreeWidget.cpp +++ b/source/RobotAPI/libraries/skills_gui/executions/SkillExecutionTreeWidget.cpp @@ -1,7 +1,48 @@ #include "SkillExecutionTreeWidget.h" +#include <QMenu> + namespace armarx::skills::gui { + + void + SkillExecutionTreeWidget::runContextMenu(const QPoint& pos) + { + QMenu* menu = new QMenu(); + + // Stop skill + QAction* stopSkillAction = new QAction("Stop execution", this); + skills::SkillStatus currentStatus = + memory->getLatestUpdate().statuses.at(selectedExecution.skillExecutionId).status; + stopSkillAction->setDisabled(currentStatus == skills::SkillStatus::Aborted || + currentStatus == skills::SkillStatus::Failed || + currentStatus == skills::SkillStatus::Succeeded); + + QAction* rerunSkillAction = new QAction("Re-run with similar params", this); + menu->addAction(stopSkillAction); + menu->addAction(rerunSkillAction); + connect(stopSkillAction, + SIGNAL(stopSkillAction.triggered()), + this, + SIGNAL(stopSelectedExecution())); + connect(rerunSkillAction, + SIGNAL(rerunSkillAction.triggered()), + this, + SIGNAL(rerunSkillWithSimilarParams())); + + // Temporarily disable rerun-skill-Action + rerunSkillAction->setDisabled(true); + + // open menu + menu->popup(this->viewport()->mapToGlobal(pos)); + } + + void + SkillExecutionTreeWidget::stopSelectedExecution() + { + memory->stopExecution(this->selectedExecution.skillExecutionId); + } + /* void SkillExecutionTreeWidget::refresh() diff --git a/source/RobotAPI/libraries/skills_gui/executions/SkillExecutionTreeWidget.h b/source/RobotAPI/libraries/skills_gui/executions/SkillExecutionTreeWidget.h index 87231431a..2dc6b8a3f 100644 --- a/source/RobotAPI/libraries/skills_gui/executions/SkillExecutionTreeWidget.h +++ b/source/RobotAPI/libraries/skills_gui/executions/SkillExecutionTreeWidget.h @@ -35,14 +35,18 @@ namespace armarx::skills::gui SelectedExecution& getSelectedExecution(); + signals: + void rerunSkillWithSimilarParams(); private slots: void stopAllExecutions(); void executionSelectionChanged(QTreeWidgetItem* current, QTreeWidgetItem* previous); void refresh(); + void runContextMenu(const QPoint& pos); + void stopSelectedExecution(); private: void setupUi(); - SkillExecutionID selectedExecution; + SelectedExecution selectedExecution; }; } // namespace armarx::skills::gui diff --git a/source/RobotAPI/libraries/skills_gui/memory/SkillManagerWrapper.cpp b/source/RobotAPI/libraries/skills_gui/memory/SkillManagerWrapper.cpp index 818d88227..66b8a2b62 100644 --- a/source/RobotAPI/libraries/skills_gui/memory/SkillManagerWrapper.cpp +++ b/source/RobotAPI/libraries/skills_gui/memory/SkillManagerWrapper.cpp @@ -73,15 +73,25 @@ namespace armarx::skills::gui void SkillManagerWrapper::disconnect() { - std::scoped_lock l(mutex_memory); - this->memory = nullptr; + // clear memory + { + std::scoped_lock l(mutex_memory); + this->memory = nullptr; + } + + // clear stored data + { + std::scoped_lock d(mutex_snapshot); + this->snapshot.skills.clear(); + this->snapshot.statuses.clear(); + } } const SkillManagerWrapper::Snapshot SkillManagerWrapper::getLatestUpdate() { // We *want* to make a const copy, since a reference to the snapshot would not necessarily be thread safe. - // If this is too slow, this class might implement wrapper functions for the maps. This would not scale well. + // If this is too slow, this class might implement wrapper functions for the maps. std::scoped_lock l(mutex_snapshot); return snapshot; } -- GitLab