diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidget.ui b/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidget.ui index 82569fa85833ef3eb89476da914b7ba02606864b..73bb1a8f75b1148c43452758f2cad2c742ca4346 100644 --- a/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidget.ui +++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidget.ui @@ -97,44 +97,7 @@ <property name="title"> <string>Manager</string> </property> - <layout class="QGridLayout" name="gridLayout"> - <item row="5" column="0" colspan="3"> - <widget class="QTreeWidget" name="treeWidgetSkills"> - <column> - <property name="text"> - <string>Skill</string> - </property> - </column> - <column> - <property name="text"> - <string>HasInputType</string> - </property> - </column> - <column> - <property name="text"> - <string>HasOutputType</string> - </property> - </column> - </widget> - </item> - <item row="4" column="1"> - <widget class="QPushButton" name="pushButtonSearch"> - <property name="text"> - <string>Search</string> - </property> - </widget> - </item> - <item row="4" column="0"> - <widget class="QLineEdit" name="lineEditSearch"> - <property name="text"> - <string/> - </property> - <property name="placeholderText"> - <string>Search...</string> - </property> - </widget> - </item> - </layout> + <layout class="QGridLayout" name="gridLayout"/> </widget> <widget class="QGroupBox" name="groupBoxSkillDetails"> <property name="enabled"> @@ -149,140 +112,7 @@ <property name="title"> <string>Skill Details</string> </property> - <layout class="QVBoxLayout" name="verticalLayout"> - <item> - <widget class="QSplitter" name="splitter_2"> - <property name="enabled"> - <bool>true</bool> - </property> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - <property name="childrenCollapsible"> - <bool>false</bool> - </property> - <widget class="QWidget" name="groupBoxSkillDetailsTop" native="true"> - <layout class="QVBoxLayout" name="verticalLayout_2"> - <property name="leftMargin"> - <number>0</number> - </property> - <property name="topMargin"> - <number>0</number> - </property> - <property name="rightMargin"> - <number>0</number> - </property> - <property name="bottomMargin"> - <number>0</number> - </property> - <item> - <layout class="QGridLayout" name="gridLayout_5"> - <item row="0" column="0"> - <widget class="QPushButton" name="pushButtonPaste"> - <property name="text"> - <string>Set args from clipboard</string> - </property> - </widget> - </item> - <item row="0" column="3"> - <widget class="QPushButton" name="pushButtonReset"> - <property name="text"> - <string>Reset args to profile</string> - </property> - </widget> - </item> - <item row="1" column="0" colspan="4"> - <widget class="QComboBox" name="comboBoxProfiles"> - <item> - <property name="text"> - <string><No Profile selected. Using root></string> - </property> - </item> - </widget> - </item> - <item row="0" column="1"> - <widget class="QPushButton" name="pushButtonCopy"> - <property name="text"> - <string>Copy args to clipboard</string> - </property> - </widget> - </item> - <item row="0" column="2"> - <widget class="QLabel" name="label_2"> - <property name="text"> - <string/> - </property> - </widget> - </item> - </layout> - </item> - <item> - <widget class="QWidget" name="skillDescription" native="true"/> - </item> - </layout> - </widget> - <widget class="QWidget" name="groupBoxSkillDetailsBottom" native="true"> - <layout class="QVBoxLayout" name="verticalLayout_3"> - <property name="leftMargin"> - <number>0</number> - </property> - <property name="topMargin"> - <number>0</number> - </property> - <property name="rightMargin"> - <number>0</number> - </property> - <property name="bottomMargin"> - <number>0</number> - </property> - <item> - <widget class="QTreeWidget" name="treeWidgetSkillDetails"> - <property name="contextMenuPolicy"> - <enum>Qt::CustomContextMenu</enum> - </property> - <property name="editTriggers"> - <set>QAbstractItemView::DoubleClicked|QAbstractItemView::EditKeyPressed</set> - </property> - <column> - <property name="text"> - <string>Key</string> - </property> - </column> - <column> - <property name="text"> - <string>Value</string> - </property> - </column> - <column> - <property name="text"> - <string>Type</string> - </property> - </column> - <column> - <property name="text"> - <string>defaultValue (hidden in GUI)</string> - </property> - </column> - </widget> - </item> - <item> - <widget class="QPushButton" name="pushButtonExecuteSkill"> - <property name="text"> - <string>Request Execution</string> - </property> - </widget> - </item> - </layout> - </widget> - </widget> - </item> - </layout> + <layout class="QVBoxLayout" name="verticalLayout"/> </widget> </widget> </widget> diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidgetController.cpp b/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidgetController.cpp index 39c7763acd8192772b6a159246b3d0c6f3e83ac7..909f514ba4e3cbc3034d6a8d3b2c9195d0f1e581 100644 --- a/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidgetController.cpp +++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidgetController.cpp @@ -58,8 +58,6 @@ //configSk namespace armarx { - const skills::SkillID SkillManagerMonitorWidgetController::SelectedSkill::UNK_SKILL_ID = - skills::SkillID{.providerId = ::std::nullopt, .skillName = skills::SkillID::UNKNOWN}; QPointer<QDialog> SkillManagerMonitorWidgetController::getConfigDialog(QWidget* parent) @@ -95,62 +93,6 @@ namespace armarx // Others namespace armarx { - /* - void - SkillManagerMonitorWidgetController::prepareAndRunMenu(const QPoint& pos) - { - QMenu* menu = new QMenu(); - - // Stop skill - QAction* stopSkillAction = new QAction("Stop execution", this); - skills::SkillStatus currentStatus = - skillStatusUpdates.at(selectedSkill.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, - &QAction::triggered, - this, - &SkillManagerMonitorWidgetController::stopSkill); - connect(rerunSkillAction, - &QAction::triggered, - this, - &SkillManagerMonitorWidgetController::rerunSkillWithSimilarParams); - - // Temporarily disable rerun-skill-Action - rerunSkillAction->setDisabled(true); - - // open menu - menu->popup(widget.treeWidgetSkillExecutions->viewport()->mapToGlobal(pos)); - } - - SkillExecutionInfoTreeWidgetItem* - SkillExecutionInfoTreeWidgetItem::SearchRecursiveForMatch( - SkillExecutionInfoTreeWidgetItem* haystack, - const skills::SkillExecutionID& needle) - { - if (!haystack) - { - return nullptr; - } - - if (needle == haystack->executionId) - { - return haystack; - } - for (int i = 0; i < haystack->childCount(); ++i) - { - auto el = static_cast<SkillExecutionInfoTreeWidgetItem*>(haystack->child(i)); - return SkillExecutionInfoTreeWidgetItem::SearchRecursiveForMatch(el, needle); - } - return nullptr; - } -*/ - SkillManagerMonitorWidgetController::SkillManagerMonitorWidgetController() { @@ -171,77 +113,11 @@ namespace armarx widget.updateWidgetLayout, - widget.skillDescription, - widget.skillDescription->parentWidget()->layout(), - widget.stopAllLayout, this->mem_wrapper); connectSignals(); - /* - this->updateWidget = new PeriodicUpdateWidget(2.0, 60); - widget.updateWidgetLayout->insertWidget(0, updateWidget); - - this->stopAllButton = new QPushButton("Stop all executions"); - widget.stopAllLayout->addWidget(stopAllButton); - - - skillDescriptionWidget = new SkillDescriptionWidget(); - widget.skillDescription->parentWidget()->layout()->replaceWidget(widget.skillDescription, - skillDescriptionWidget); - widget.skillDescription = skillDescriptionWidget; - - - - connect(this->stopAllButton, - &QPushButton::clicked, - this, - &SkillManagerMonitorWidgetController::stopAllExecutions); - connect(widget.treeWidgetSkillExecutions, - &QTreeWidget::customContextMenuRequested, - this, - &SkillManagerMonitorWidgetController::prepareAndRunMenu); - - connect(updateWidget, - &armarx::PeriodicUpdateWidget::update, - this, - &SkillManagerMonitorWidgetController::refreshSkillsAndExecutions); - - connect(widget.pushButtonCopy, - &QPushButton::clicked, - this, - &SkillManagerMonitorWidgetController::copyCurrentConfig); - connect(widget.pushButtonPaste, - &QPushButton::clicked, - this, - &SkillManagerMonitorWidgetController::pasteCurrentConfig); - - connect(widget.pushButtonExecuteSkill, - &QPushButton::clicked, - this, - &SkillManagerMonitorWidgetController::executeSelectedSkill); - - connect(widget.treeWidgetSkills, - &QTreeWidget::currentItemChanged, - this, - &SkillManagerMonitorWidgetController::skillSelectionChanged); - - connect(widget.treeWidgetSkillExecutions, - &QTreeWidget::currentItemChanged, - this, - &SkillManagerMonitorWidgetController::skillExecutionSelectionChanged); - - connect(widget.pushButtonSearch, - &QPushButton::clicked, - this, - &SkillManagerMonitorWidgetController::searchSkills); - // alternatively run search when pressing enter - connect(widget.lineEditSearch, - &QLineEdit::returnPressed, - this, - &SkillManagerMonitorWidgetController::searchSkills); -*/ } void @@ -292,567 +168,4 @@ namespace armarx emit disconnectGui(); } - /* - void - SkillManagerMonitorWidgetController::searchSkills() - { - this->currentSkillSearch = widget.lineEditSearch->text(); - } - - void - SkillManagerMonitorWidgetController::refreshSkillsAndExecutions() - { - refreshSkills(); - refreshExecutions(); - } - - void - SkillManagerMonitorWidgetController::matchSkillUpdateToSearch( - std::map<skills::manager::dto::SkillID, skills::manager::dto::SkillDescription>& update) - { - - if (this->currentSkillSearch.isEmpty()) - { - return; - } - - // TODO: whitespace to wildcard - - std::string search = this->currentSkillSearch.toLower().toStdString(); - std::transform(search.begin(), search.end(), search.begin(), - [](unsigned char c){ return std::tolower(c); }); - - for (auto it = update.begin(); it != update.end();) - { - if (simox::alg::to_lower(skills::SkillID::FromIce(it->first).skillName) - .find(this->currentSkillSearch.toLower().toStdString())) - { - it = update.erase(it); - } - else - { - ++it; - } - } - - } - - void - SkillManagerMonitorWidgetController::refreshSkills() - { - if (!memory) - { - // check if null - return; - } - - - // remove non-existing ones - try - { - std::scoped_lock l(updateMutex); - - auto managerSkills = memory->getSkillDescriptions(); - this->matchSkillUpdateToSearch(managerSkills); - - // completely recreate internal skills map - skills.clear(); - for (const auto& [sid, desc] : managerSkills) - { - auto description = skills::SkillDescription::FromIce(desc); - auto skillId = skills::SkillID::FromIce(sid); - auto providerId = skillId.providerId.value_or( - skills::ProviderID{.providerName = "UNKNOWN PROVIDER NAME"}); - - ARMARX_CHECK(skillId.isFullySpecified()); - - auto& providedSkillsMap = skills[providerId]; // create new if not existent - providedSkillsMap.insert({skillId, description}); - } - - // update tree view. Remove non-existing elements - int i = 0; - while (i < widget.treeWidgetSkills->topLevelItemCount()) - { - auto* providerItem = widget.treeWidgetSkills->topLevelItem(i); - auto providerName = providerItem->text(0).toStdString(); - skills::ProviderID providerId{.providerName = providerName}; - - if (skills.find(providerId) == skills.end()) - { - providerItem = nullptr; // reset - auto remove = widget.treeWidgetSkills->takeTopLevelItem(i); - delete remove; - continue; - } - - ++i; - auto& providedSkills = skills.at(providerId); - - int j = 0; - while (j < providerItem->childCount()) - { - auto* skillItem = providerItem->child(j); - auto skillName = skillItem->text(0).toStdString(); - - skills::SkillID skillId{.providerId = - skills::ProviderID{.providerName = providerName}, - .skillName = skillName}; - - if (providedSkills.find(skillId) == providedSkills.end()) - { - skillItem = nullptr; - auto remove = providerItem->takeChild(j); - delete remove; - continue; - } - - ++j; - } - } - - // update tree view. Add new elements - for (const auto& [providerId, providedSkills] : skills) - { - QTreeWidgetItem* providerItem = nullptr; - for (int i = 0; i < widget.treeWidgetSkills->topLevelItemCount(); ++i) - { - auto el = widget.treeWidgetSkills->topLevelItem(i); - auto providerName = el->text(0).toStdString(); - skills::ProviderID elProviderId{.providerName = providerName}; - - if (providerId == elProviderId) - { - providerItem = el; - break; - } - } - - if (!providerItem) - { - providerItem = new QTreeWidgetItem(widget.treeWidgetSkills); - providerItem->setText(0, QString::fromStdString(providerId.providerName)); - } - - for (const auto& [skillId, skill] : providedSkills) - { - QTreeWidgetItem* skillItem = nullptr; - for (int i = 0; i < providerItem->childCount(); ++i) - { - auto el = providerItem->child(i); - auto skillName = el->text(0).toStdString(); - skills::SkillID elSkillId{providerId, skillName}; - - if (skillId == elSkillId) - { - skillItem = el; - break; - } - } - - if (!skillItem) - { - skillItem = new SkillInfoTreeWidgetItem(skill, providerItem); - skillItem->setText(0, QString::fromStdString(skillId.skillName)); - } - } - } - } - catch (...) - { - // perhaps the manager died during the method? - } - } - - void - SkillManagerMonitorWidgetController::refreshExecutions() - { - static std::map<skills::SkillStatus, std::string> ExecutionStatus2String = { - // Main states - {skills::SkillStatus::Constructing, "Constructing"}, - {skills::SkillStatus::Initializing, "Initializing"}, - {skills::SkillStatus::Preparing, "Preparing"}, - {skills::SkillStatus::Running, "Running"}, - - // Terminating - {skills::SkillStatus::Aborted, "Aborted"}, - {skills::SkillStatus::Failed, "Failed"}, - {skills::SkillStatus::Succeeded, "Succeeded"}}; - - if (!memory) - { - // check if null - return; - } - - try - { - std::scoped_lock l(updateMutex); - - auto currentManagerStatuses = memory->getSkillExecutionStatuses(); - - for (const auto& [k, v] : currentManagerStatuses) - { - auto executionId = skills::SkillExecutionID::FromIce(k); - auto statusUpdate = skills::SkillStatusUpdate::FromIce(v); - - // update maps - skillStatusUpdates[executionId] = statusUpdate; - //skillExecutionParams.insert_or_assign(executionId, - // statusUpdate.usedParameterization); - - SkillExecutionInfoTreeWidgetItem* found = nullptr; - for (int i = 0; i < widget.treeWidgetSkillExecutions->topLevelItemCount(); ++i) - { - auto c = static_cast<SkillExecutionInfoTreeWidgetItem*>( - widget.treeWidgetSkillExecutions->topLevelItem(i)); - - found = - SkillExecutionInfoTreeWidgetItem::SearchRecursiveForMatch(c, executionId); - - if (found) - { - for (std::pair<skills::SkillStatus, std::string> i : ExecutionStatus2String) - { - if (i.first == statusUpdate.status) - { - found->setText(3, QString::fromStdString(i.second)); - } - } - - break; - } - } - - if (!found) - { - // TODO: Sort to executor! - auto item = new SkillExecutionInfoTreeWidgetItem(executionId); - - item->setText(0, - QString::fromStdString( - executionId.executionStartedTime.toDateTimeString())); - item->setText(1, QString::fromStdString(executionId.executorName)); - item->setText(2, QString::fromStdString(executionId.skillId.toString())); - for (std::pair<skills::SkillStatus, std::string> i : ExecutionStatus2String) - { - if (i.first == statusUpdate.status) - { - item->setText(3, QString::fromStdString(i.second)); - } - } - - widget.treeWidgetSkillExecutions->insertTopLevelItem(0, item); - } - } - } - catch (...) - { - // perhaps the manager died during the method? - } - } - - void - SkillManagerMonitorWidgetController::executeSelectedSkill() - { - auto data = getConfigAsAron(); - executeSkillWithParams(selectedSkill.skillId, data); - } - - void - SkillManagerMonitorWidgetController::rerunSkillWithSimilarParams() - { - // TODO: disabled until skillparameterization is replaced - //skills::SkillParameterization selectedExecutionParams = - //skillExecutionParams.at(selectedSkill.skillExecutionId); - //executeSkillWithParams(selectedSkill.skillExecutionId.skillId, - // selectedExecutionParams.parameterization); - - executeSelectedSkill(); - } - - - void - SkillManagerMonitorWidgetController::executeSkillWithParams(skills::SkillID skillId, - aron::data::DictPtr params) - { - std::scoped_lock l(updateMutex); - - auto providerId = skillId.providerId; - if (!providerId.has_value()) - { - return; - } - const auto& skillDescriptions = skills.at(providerId.value()); - if (skillDescriptions.find(skillId) == skillDescriptions.end()) - { - return; - } - - char hostname[HOST_NAME_MAX]; - gethostname(hostname, HOST_NAME_MAX); - - skills::SkillExecutionRequest req{ - .skillId = selectedSkill.skillId, - .executorName = "Skills.Manager GUI (hostname: " + std::string(hostname) + ")", - .parameters = params}; - - ARMARX_CHECK(selectedSkill.skillId.isFullySpecified()); // sanity check - ARMARX_IMPORTANT << "Executing skill from GUI: " << selectedSkill.skillId << "."; - // Note that we execute the skill in a seperate thread so that the GUI thread does not freeze. - memory->begin_executeSkill(req.toManagerIce()); - } - - void - SkillManagerMonitorWidgetController::stopAllExecutions() - { - QTreeWidget const* tree = widget.treeWidgetSkillExecutions; - - int const max_retries = 3; - int left_retries = max_retries; - bool retry = false; - - do - { - retry = false; - - for (ssize_t i = 0; i < tree->topLevelItemCount(); ++i) - { - SkillExecutionInfoTreeWidgetItem const* item = - dynamic_cast<SkillExecutionInfoTreeWidgetItem*>( - widget.treeWidgetSkillExecutions->topLevelItem(i)); - - if (not item) - { - // At this point, dynamic-casting failed and we don't know anything about the - // type. - ARMARX_ERROR << "Cannot stop unknown skill."; - retry = true; - continue; - } - - try - { - ARMARX_INFO << "Aborting skill '" << item->executionId.skillId.skillName - << "'..."; - memory->abortSkillAsync(item->executionId.toManagerIce()); - } - catch (Ice::Exception const& e) - { - retry = true; - ARMARX_ERROR << "Unhandeled Ice exception while aborting skill '" - << item->executionId.skillId.skillName << "'."; - } - catch (...) - { - retry = true; - ARMARX_ERROR << "Unhandled error while aborting skill '" - << item->executionId.skillId.skillName << "'."; - } - } - - if (retry) - { - left_retries -= 1; - - if (left_retries > 0) - { - ARMARX_WARNING << "There where errors aborting skills. Retrying..."; - } - else - { - ARMARX_ERROR << "Couldn't abort all skills after " << max_retries - << " tries. Giving up."; - retry = false; - } - } - } while (retry); - } - - void - SkillManagerMonitorWidgetController::stopSkill() - { - std::scoped_lock l(updateMutex); - - if (selectedSkill.skillExecutionId.skillId.fullySpecified()) - { - ARMARX_INFO << "The user requested to stop a skill, which was not fully specified!"; - return; - } - - const auto& skillDescriptions = skills.at(*selectedSkill.skillId.providerId); - if (!skillDescriptions.count(selectedSkill.skillId.skillName)) - { - return; - } - - ARMARX_INFO << "Stopping skill from GUI: " << selectedSkill.skillExecutionId.toString(); - - memory->abortSkillAsync(selectedSkill.skillExecutionId.toManagerIce()); - } - - void - SkillManagerMonitorWidgetController::skillExecutionSelectionChanged(QTreeWidgetItem* current, - QTreeWidgetItem*) - { - std::scoped_lock l(updateMutex); - widget.groupBoxSkillExecutions->setEnabled(false); - - if (!current) - { - // gui has died? - return; - } - - auto c = static_cast<SkillExecutionInfoTreeWidgetItem*>(current); - selectedSkill.skillExecutionId = c->executionId; - widget.groupBoxSkillExecutions->setEnabled(true); - } - - void - SkillManagerMonitorWidgetController::skillSelectionChanged(QTreeWidgetItem* current, - QTreeWidgetItem*) - { - std::scoped_lock l(updateMutex); - widget.groupBoxSkillDetails->setEnabled(false); - - if (!current) - { - // gui has died? - return; - } - - if (!current->parent()) - { - // no parent available. Perhaps provider clicked? Reset selected skill. - selectedSkill.skillId = SelectedSkill::UNK_SKILL_ID; - return; - } - - auto c = static_cast<SkillInfoTreeWidgetItem*>(current); - auto skillDescription = c->skillDescription; - - - if (selectedSkill.skillId == skillDescription.skillId) - { - // no change - return; - } - - selectedSkill.skillId = skillDescription.skillId; - - // setup groupBox - widget.groupBoxSkillDetails->setTitle( - QString::fromStdString(selectedSkill.skillId.toString())); - widget.groupBoxSkillDetails->setEnabled(true); - - // setup table view - widget.treeWidgetSkillDetails->clear(); - aronTreeWidgetController = nullptr; - skillsArgumentsTreeWidgetItem = nullptr; - - // We assert that the skill exists - ARMARX_CHECK(skills.count(*selectedSkill.skillId.providerId) > 0); - ARMARX_CHECK(skills.at(*selectedSkill.skillId.providerId).count(selectedSkill.skillId) > 0); - auto skillDesc = skills.at(*selectedSkill.skillId.providerId).at(selectedSkill.skillId); - - { - auto it = new QTreeWidgetItem(widget.treeWidgetSkillDetails, - {QString::fromStdString("Name"), - QString::fromStdString(skillDesc.skillId.skillName)}); - widget.treeWidgetSkillDetails->addTopLevelItem(it); - } - - { - auto it = new QTreeWidgetItem(widget.treeWidgetSkillDetails, - {QString::fromStdString("Description"), - QString::fromStdString(skillDesc.description)}); - widget.treeWidgetSkillDetails->addTopLevelItem(it); - } - - { - auto it = new QTreeWidgetItem( - widget.treeWidgetSkillDetails, - {QString::fromStdString("Timeout"), - QString::fromStdString(std::to_string(skillDesc.timeout.toMilliSeconds())) + - " ms"}); - widget.treeWidgetSkillDetails->addTopLevelItem(it); - } - - // select root profile - widget.comboBoxProfiles->setCurrentIndex(0); - - // remove any profile - while (widget.comboBoxProfiles->count() > 1) - { - widget.comboBoxProfiles->removeItem(1); - } - - // add new profiles for this skill - // TODO: Where stored? - - skillsArgumentsTreeWidgetItem = new QTreeWidgetItem(widget.treeWidgetSkillDetails, - {QString::fromStdString("Arguments")}); - auto aron_args = skillDesc.parametersType; - auto default_args_of_profile = skillDesc.rootProfileDefaults; - - aronTreeWidgetController = - std::make_shared<AronTreeWidgetController>(widget.treeWidgetSkillDetails, - skillsArgumentsTreeWidgetItem, - aron_args, - default_args_of_profile); - - // automatically expand args - skillsArgumentsTreeWidgetItem->setExpanded(true); - } - - aron::data::DictPtr - SkillManagerMonitorWidgetController::getConfigAsAron() const - { - // create argument aron (if there is an accepted type set) - if (aronTreeWidgetController) - { - return aronTreeWidgetController->convertToAron(); - } - return nullptr; - } - - void - SkillManagerMonitorWidgetController::copyCurrentConfig() - { - auto data = getConfigAsAron(); - if (!data) - { - return; - } - - auto json = aron::data::converter::AronNlohmannJSONConverter::ConvertToNlohmannJSON(data); - QClipboard* clipboard = QApplication::clipboard(); - clipboard->setText(QString::fromStdString(json.dump(2))); - } - - void - SkillManagerMonitorWidgetController::pasteCurrentConfig() - { - QClipboard* clipboard = QApplication::clipboard(); - std::string s = clipboard->text().toStdString(); - nlohmann::json json = nlohmann::json::parse(s); - auto data = - aron::data::converter::AronNlohmannJSONConverter::ConvertFromNlohmannJSONObject(json); - - if (!aronTreeWidgetController) - { - return; - } - - aronTreeWidgetController->setFromAron(data); - } - - void - SkillManagerMonitorWidgetController::resetCurrentConfig() - { - // TODO - } -*/ - } // namespace armarx diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidgetController.h b/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidgetController.h index 800bd6b22f0742229831be1a48bca6d44fb2b69a..ca80a304b536833542ad35957423e6dbdc029267 100644 --- a/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidgetController.h +++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidgetController.h @@ -33,7 +33,6 @@ #include <ArmarXGui/libraries/ArmarXGuiBase/ArmarXGuiPlugin.h> #include <ArmarXGui/libraries/SimpleConfigDialog/SimpleConfigDialog.h> -#include "RobotAPI/gui-plugins/SkillManagerPlugin/PeriodicUpdateWidget.h" #include <RobotAPI/gui-plugins/SkillManagerPlugin/ui_SkillManagerMonitorWidget.h> #include <RobotAPI/interface/skills/SkillMemoryInterface.h> #include <RobotAPI/libraries/aron/core/data/variant/All.h> @@ -44,56 +43,8 @@ #include <RobotAPI/libraries/skills/core/SkillStatusUpdate.h> #include <RobotAPI/libraries/skills_gui/SkillMemoryGui.h> -#include "aronTreeWidget/AronTreeWidgetController.h" - namespace armarx { - class SkillDescriptionWidget; - - class SkillInfoTreeWidgetItem : public QTreeWidgetItem - { - public: - SkillInfoTreeWidgetItem(const skills::SkillDescription& desc, QTreeWidgetItem* parent) : - QTreeWidgetItem(parent), skillDescription(desc) - { - } - - SkillInfoTreeWidgetItem(const skills::SkillDescription& desc, QTreeWidget* parent) : - QTreeWidgetItem(parent), skillDescription(desc) - { - } - - skills::SkillDescription skillDescription; - }; - - class SkillExecutionInfoTreeWidgetItem : public QTreeWidgetItem - { - //Q_OBJECT - public: - SkillExecutionInfoTreeWidgetItem(const skills::SkillExecutionID& id, - QTreeWidgetItem* parent) : - QTreeWidgetItem(parent), executionId(id) - { - } - - // After constructing an item, it must be manually inserted into the tree! - SkillExecutionInfoTreeWidgetItem(const skills::SkillExecutionID& id) : executionId(id) - { - } - - // When using this constructor, the new item will be appended to the bottom of the tree! - SkillExecutionInfoTreeWidgetItem(const skills::SkillExecutionID& id, QTreeWidget* parent) : - QTreeWidgetItem(parent), executionId(id) - { - } - - static SkillExecutionInfoTreeWidgetItem* - SearchRecursiveForMatch(SkillExecutionInfoTreeWidgetItem* el, - const skills::SkillExecutionID& needle); - - skills::SkillExecutionID executionId; - }; - class ARMARXCOMPONENT_IMPORT_EXPORT SkillManagerMonitorWidgetController : public armarx::ArmarXComponentWidgetControllerTemplate<SkillManagerMonitorWidgetController> { @@ -128,93 +79,17 @@ namespace armarx void disconnectGui(); void connectGui(std::string observerName); - private slots: - /* - void skillSelectionChanged(QTreeWidgetItem* current, QTreeWidgetItem* previous); - void skillExecutionSelectionChanged(QTreeWidgetItem* current, QTreeWidgetItem* previous); - - void stopAllExecutions(); - void stopSkill(); // TODO: rename - void executeSelectedSkill(); - - void refreshSkills(); - void refreshExecutions(); - void refreshSkillsAndExecutions(); - - void copyCurrentConfig(); - void pasteCurrentConfig(); - void resetCurrentConfig(); - - void prepareAndRunMenu(const QPoint& pos); - void rerunSkillWithSimilarParams(); - - void searchSkills(); -*/ - - - private: - aron::data::DictPtr getConfigAsAron() const; - private: - /** - * Widget Form - */ + armarx::skills::manager::dti::SkillManagerInterfacePrx memory; Ui::SkillManagerMonitorWidget widget; std::unique_ptr<armarx::skills::gui::SkillMemoryGUI> viewer = nullptr; QPointer<SimpleConfigDialog> dialog; - QString currentSkillSearch; std::string observerName = "SkillManager"; - skills::manager::dti::SkillManagerInterfacePrx memory = nullptr; std::shared_ptr<skills::gui::SkillManagerWrapper> mem_wrapper = nullptr; - // Data taken from observer (snapshot of it) - mutable std::mutex updateMutex; - std::map<skills::ProviderID, std::map<skills::SkillID, skills::SkillDescription>> skills = - {}; - std::map<skills::SkillExecutionID, skills::SkillStatusUpdate> skillStatusUpdates = {}; - - // store copies (!) of skill descriptions - //std::map<skills::SkillExecutionID, skills::SkillParameterization> skillExecutionParams = {}; - - // User Input - struct SelectedSkill - { - static const skills::SkillID UNK_SKILL_ID; - - skills::SkillID skillId; - skills::SkillExecutionID skillExecutionId; - - // make default constructable - SelectedSkill() : - skillId(UNK_SKILL_ID), - skillExecutionId{.skillId = UNK_SKILL_ID, - .executorName = skills::SkillExecutionID::UNKNOWN, - .executionStartedTime = armarx::core::time::DateTime::Invalid()} - { - } - } - - selectedSkill; - - /* - void executeSkillWithParams(skills::SkillID skillId, aron::data::DictPtr params); - void matchSkillUpdateToSearch(std::map<skills::manager::dto::SkillID, - skills::manager::dto::SkillDescription>& update); -*/ - void connectSignals(); - - PeriodicUpdateWidget* updateWidget = - nullptr; // TODO: this should not be held by the controller! - QPushButton* stopAllButton = nullptr; // also this. Oh well... - - // Helper to get the treeWidgetItem easily - QTreeWidgetItem* skillsArgumentsTreeWidgetItem = nullptr; - AronTreeWidgetControllerPtr aronTreeWidgetController = nullptr; - SkillDescriptionWidget* skillDescriptionWidget = nullptr; - // connected flag std::atomic_bool connected = false; };