diff --git a/source/RobotAPI/gui-plugins/ArMemMemoryViewer/ArMemMemoryViewerWidgetController.cpp b/source/RobotAPI/gui-plugins/ArMemMemoryViewer/ArMemMemoryViewerWidgetController.cpp index e0a08a3fe45a4add3e5a20dd42053694c24bb0cf..fcd59af3018b6459bf20d43281cff022439c93f2 100644 --- a/source/RobotAPI/gui-plugins/ArMemMemoryViewer/ArMemMemoryViewerWidgetController.cpp +++ b/source/RobotAPI/gui-plugins/ArMemMemoryViewer/ArMemMemoryViewerWidgetController.cpp @@ -86,6 +86,11 @@ namespace armarx replaceWidget(widget._queryTabWidget, queryTabs, widget.queryGroupBox->layout()); ARMARX_CHECK_NULL(widget._queryTabWidget); + instanceTree = new armem::InstanceTreeWidget(); + instanceTree->setStatusLabel(widget.statusLabel); + replaceWidget(widget._instanceTree, instanceTree, widget.instanceGroupBox->layout()); + ARMARX_CHECK_NULL(widget._instanceTree); + connect(this, &This::connected, this, &This::updateMemory); connect(widget.updateButton, &QPushButton::pressed, this, &This::updateMemory); @@ -110,8 +115,7 @@ namespace armarx connect(memoryTree, &armem::MemoryTreeWidget::updated, this, &This::memoryTreeUpdated); connect(memoryTree, &armem::MemoryTreeWidget::instanceSelected, this, &This::updateInstanceTree); - - // connect(this, &This::memoryTreeUpdated, this, &This::updateInstanceTree); + connect(instanceTree, &armem::InstanceTreeWidget::updated, this, &This::instanceTreeUpdated); } ArMemMemoryViewerWidgetController::~ArMemMemoryViewerWidgetController() @@ -198,6 +202,14 @@ namespace armarx } } + void ArMemMemoryViewerWidgetController::updateInstanceTree(const armem::MemoryID& id) + { + if (memoryData) + { + instanceTree->update(id, *memoryData); + } + } + void ArMemMemoryViewerWidgetController::updateMemoryTree(armem::Memory& memory) { armem::Time start = armem::Time::now(); @@ -212,50 +224,6 @@ namespace armarx } - void ArMemMemoryViewerWidgetController::updateInstanceTree(const armem::MemoryID& id) - { - if (!memoryData) - { - return; - } - - armem::EntityInstance* instance; - try - { - instance = &memoryData->getEntityInstance(id); - } - catch (const armem::error::ArMemError& e) - { - widget.statusLabel->setText(QString::fromStdString(e.what())); - return; - } - - QTreeWidgetItem* item = new QTreeWidgetItem(); - item->setText(0, QString::fromStdString(id.str())); - - if (!instance->data()) - { - item->setText(0, "(No data.)"); - } - else if (!instance->dataNavigator()) - { - item->setText(0, "(No introspection available.)"); - } - else - { - armem::QTreeWidgetAronDataVisitor visitor(item); - visitor.applyTo(*instance->dataNavigator()); - } - - widget.instanceTree->clear(); - widget.instanceTree->addTopLevelItem(item); - - item->setExpanded(true); - - emit instanceTreeUpdated(); - } - - const static std::string CONFIG_KEY_MEMORY = "MemoryName"; const static std::string CONFIG_KEY_DEBUG_OBSERVER = "DebugObserverName"; diff --git a/source/RobotAPI/gui-plugins/ArMemMemoryViewer/ArMemMemoryViewerWidgetController.h b/source/RobotAPI/gui-plugins/ArMemMemoryViewer/ArMemMemoryViewerWidgetController.h index d922212d16b5ea7ffc229dd22dcb2e28a931ea22..36d618adb8979f718747ac89702ad34cf11851fe 100644 --- a/source/RobotAPI/gui-plugins/ArMemMemoryViewer/ArMemMemoryViewerWidgetController.h +++ b/source/RobotAPI/gui-plugins/ArMemMemoryViewer/ArMemMemoryViewerWidgetController.h @@ -34,6 +34,7 @@ #include <RobotAPI/interface/armem/MemoryInterface.h> #include <RobotAPI/libraries/armem/client/MemoryReader.h> +#include <RobotAPI/libraries/armem_gui/InstanceTreeWidget.h> #include <RobotAPI/libraries/armem_gui/MemoryQueryWidget.h> #include <RobotAPI/libraries/armem_gui/MemoryTreeWidget.h> @@ -131,6 +132,7 @@ namespace armarx armem::MemoryTreeWidget* memoryTree; armem::MemoryQueryWidget* queryTabs; + armem::InstanceTreeWidget* instanceTree; std::string debugObserverName; diff --git a/source/RobotAPI/libraries/armem_gui/CMakeLists.txt b/source/RobotAPI/libraries/armem_gui/CMakeLists.txt index 506344f84c51cd19e40daf0727bc69f5149e0ef5..591625e957fdd1a8dbbcfd50f89c6d1f405690d7 100644 --- a/source/RobotAPI/libraries/armem_gui/CMakeLists.txt +++ b/source/RobotAPI/libraries/armem_gui/CMakeLists.txt @@ -10,11 +10,13 @@ set(LIBRARIES ) set(SOURCES + InstanceTreeWidget.cpp MemoryTreeWidget.cpp MemoryQueryWidget.cpp QTreeWidgetAronDataVisitor.cpp ) set(HEADERS + InstanceTreeWidget.h MemoryTreeWidget.h MemoryQueryWidget.h TreeWidgetBuilder.h diff --git a/source/RobotAPI/libraries/armem_gui/InstanceTreeWidget.cpp b/source/RobotAPI/libraries/armem_gui/InstanceTreeWidget.cpp new file mode 100644 index 0000000000000000000000000000000000000000..bbf77359d6ce9bf9a826aaa9e72141b3e6fbf53a --- /dev/null +++ b/source/RobotAPI/libraries/armem_gui/InstanceTreeWidget.cpp @@ -0,0 +1,89 @@ +#include "InstanceTreeWidget.h" + +#include <QHeaderView> +#include <QLabel> + +#include <SimoxUtility/algorithm/string.h> + +#include <ArmarXCore/core/exceptions/local/ExpressionException.h> + +#include <RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronObjectTypeNavigator.h> +#include <RobotAPI/libraries/armem_gui/QTreeWidgetAronDataVisitor.h> + + +namespace armarx::armem +{ + + InstanceTreeWidget::InstanceTreeWidget() + { + initWidget(); + } + + void InstanceTreeWidget::initWidget() + { + clear(); + QStringList columns; + columns.insert(int(Columns::KEY), "Key"); + columns.insert(int(Columns::TYPE), "Type"); + columns.insert(int(Columns::VALUE), "Value"); + setColumnCount(columns.size()); + setHeaderLabels(columns); + + // header()->setMinimumSectionSize(25); + // header()->resizeSection(int(Columns::KEY), 250); + // header()->setTextElideMode(Qt::TextElideMode::ElideRight); + } + + void InstanceTreeWidget::update(const MemoryID& id, const Memory& memory) + { + const armem::EntityInstance* instance; + try + { + instance = &memory.getEntityInstance(id); + } + catch (const armem::error::ArMemError& e) + { + if (statusLabel) + { + statusLabel->setText(QString::fromStdString(e.what())); + } + return; + }; + if (instance) + { + update(*instance); + } + } + + void InstanceTreeWidget::update(const EntityInstance& instance) + { + QTreeWidgetItem* item = new QTreeWidgetItem(); + item->setText(0, QString::fromStdString(instance.id().str())); + + if (!instance.data()) + { + item->setText(0, "(No data.)"); + } + else if (!instance.dataNavigator()) + { + item->setText(0, "(No introspection available.)"); + } + else + { + armem::QTreeWidgetAronDataVisitor visitor(item); + visitor.applyTo(*instance.dataNavigator()); + } + + clear(); + addTopLevelItem(item); + + item->setExpanded(true); + emit updated(); + } + + void InstanceTreeWidget::setStatusLabel(QLabel* statusLabel) + { + this->statusLabel = statusLabel; + } + +} diff --git a/source/RobotAPI/libraries/armem_gui/InstanceTreeWidget.h b/source/RobotAPI/libraries/armem_gui/InstanceTreeWidget.h new file mode 100644 index 0000000000000000000000000000000000000000..adb4de498c008d1eeb5592c01b062fe1966aa740 --- /dev/null +++ b/source/RobotAPI/libraries/armem_gui/InstanceTreeWidget.h @@ -0,0 +1,50 @@ +#pragma once + +#include <QTreeWidget> + +#include <RobotAPI/libraries/armem/memory/Memory.h> + +class QLabel; + + +namespace armarx::armem +{ + + class InstanceTreeWidget : public QTreeWidget + { + Q_OBJECT + public: + + InstanceTreeWidget(); + + void update(const MemoryID& id, const Memory& memory); + void update(const EntityInstance& instance); + + void setStatusLabel(QLabel* statusLabel); + + + signals: + + void updated(); + void instanceSelected(const MemoryID& id); + + + private slots: + + + private: + + void initWidget(); + + QLabel* statusLabel = nullptr; + + + enum class Columns + { + KEY = 0, + TYPE = 1, + VALUE = 2, + }; + }; + +}