From ae7b9ac5698c45405d6979a18ec721fc4e81d0c7 Mon Sep 17 00:00:00 2001 From: Rainer Kartmann <rainer.kartmann@kit.edu> Date: Thu, 22 Apr 2021 18:02:29 +0200 Subject: [PATCH] Improve update of instance view (data now stays open while being updated) --- .../libraries/armem_gui/CMakeLists.txt | 35 ++-- .../instance/DataTreeBuilderBase.cpp | 54 ------ .../armem_gui/instance/InstanceView.cpp | 16 +- .../armem_gui/instance/ValueDisplayVisitor.h | 73 ------- .../display_visitors/DataDisplayVisitor.cpp | 76 ++++++++ .../display_visitors/DataDisplayVisitor.h | 37 ++++ .../TypedDataDisplayVisitor.cpp | 147 ++++++++++++++ .../TypedDataDisplayVisitor.h | 56 ++++++ .../armem_gui/instance/sanitize_typename.cpp | 21 ++ .../armem_gui/instance/sanitize_typename.h | 12 ++ .../armem_gui/instance/serialize_path.cpp | 35 ++++ .../armem_gui/instance/serialize_path.h | 18 ++ .../{ => tree_builders}/DataTreeBuilder.cpp | 39 +--- .../{ => tree_builders}/DataTreeBuilder.h | 13 +- .../tree_builders/DataTreeBuilderBase.cpp | 97 ++++++++++ .../{ => tree_builders}/DataTreeBuilderBase.h | 21 +- .../tree_builders/TypedDataTreeBuilder.cpp | 181 ++++++++++++++++++ .../tree_builders/TypedDataTreeBuilder.h | 63 ++++++ .../{ => tree_visitors}/TreeDataVisitor.cpp | 2 +- .../{ => tree_visitors}/TreeDataVisitor.h | 4 +- .../TreeDataVisitorBase.cpp | 2 +- .../{ => tree_visitors}/TreeDataVisitorBase.h | 2 +- .../TreeTypedDataVisitor.cpp | 41 +--- .../TreeTypedDataVisitor.h | 14 +- .../libraries/armem_gui/test/ArMemGuiTest.cpp | 10 +- .../navigator/visitors/TypedDataVisitor.h | 145 +++----------- 26 files changed, 844 insertions(+), 370 deletions(-) delete mode 100644 source/RobotAPI/libraries/armem_gui/instance/DataTreeBuilderBase.cpp delete mode 100644 source/RobotAPI/libraries/armem_gui/instance/ValueDisplayVisitor.h create mode 100644 source/RobotAPI/libraries/armem_gui/instance/display_visitors/DataDisplayVisitor.cpp create mode 100644 source/RobotAPI/libraries/armem_gui/instance/display_visitors/DataDisplayVisitor.h create mode 100644 source/RobotAPI/libraries/armem_gui/instance/display_visitors/TypedDataDisplayVisitor.cpp create mode 100644 source/RobotAPI/libraries/armem_gui/instance/display_visitors/TypedDataDisplayVisitor.h create mode 100644 source/RobotAPI/libraries/armem_gui/instance/sanitize_typename.cpp create mode 100644 source/RobotAPI/libraries/armem_gui/instance/sanitize_typename.h create mode 100644 source/RobotAPI/libraries/armem_gui/instance/serialize_path.cpp create mode 100644 source/RobotAPI/libraries/armem_gui/instance/serialize_path.h rename source/RobotAPI/libraries/armem_gui/instance/{ => tree_builders}/DataTreeBuilder.cpp (52%) rename source/RobotAPI/libraries/armem_gui/instance/{ => tree_builders}/DataTreeBuilder.h (66%) create mode 100644 source/RobotAPI/libraries/armem_gui/instance/tree_builders/DataTreeBuilderBase.cpp rename source/RobotAPI/libraries/armem_gui/instance/{ => tree_builders}/DataTreeBuilderBase.h (61%) create mode 100644 source/RobotAPI/libraries/armem_gui/instance/tree_builders/TypedDataTreeBuilder.cpp create mode 100644 source/RobotAPI/libraries/armem_gui/instance/tree_builders/TypedDataTreeBuilder.h rename source/RobotAPI/libraries/armem_gui/instance/{ => tree_visitors}/TreeDataVisitor.cpp (72%) rename source/RobotAPI/libraries/armem_gui/instance/{ => tree_visitors}/TreeDataVisitor.h (94%) rename source/RobotAPI/libraries/armem_gui/instance/{ => tree_visitors}/TreeDataVisitorBase.cpp (98%) rename source/RobotAPI/libraries/armem_gui/instance/{ => tree_visitors}/TreeDataVisitorBase.h (98%) rename source/RobotAPI/libraries/armem_gui/instance/{ => tree_visitors}/TreeTypedDataVisitor.cpp (62%) rename source/RobotAPI/libraries/armem_gui/instance/{ => tree_visitors}/TreeTypedDataVisitor.h (96%) diff --git a/source/RobotAPI/libraries/armem_gui/CMakeLists.txt b/source/RobotAPI/libraries/armem_gui/CMakeLists.txt index bd74942ee..3a448d873 100644 --- a/source/RobotAPI/libraries/armem_gui/CMakeLists.txt +++ b/source/RobotAPI/libraries/armem_gui/CMakeLists.txt @@ -23,12 +23,19 @@ set(SOURCES instance/GroupBox.cpp instance/ImageView.cpp instance/InstanceView.cpp - instance/TreeDataVisitorBase.cpp - instance/TreeDataVisitor.cpp - instance/TreeTypedDataVisitor.cpp + instance/sanitize_typename.cpp + instance/serialize_path.cpp - instance/DataTreeBuilder.cpp - instance/DataTreeBuilderBase.cpp + instance/display_visitors/DataDisplayVisitor.cpp + instance/display_visitors/TypedDataDisplayVisitor.cpp + + instance/tree_builders/DataTreeBuilder.cpp + instance/tree_builders/DataTreeBuilderBase.cpp + instance/tree_builders/TypedDataTreeBuilder.cpp + + instance/tree_visitors/TreeDataVisitorBase.cpp + instance/tree_visitors/TreeDataVisitor.cpp + instance/tree_visitors/TreeTypedDataVisitor.cpp memory/GroupBox.cpp memory/TreeWidget.cpp @@ -48,13 +55,19 @@ set(HEADERS instance/GroupBox.h instance/ImageView.h instance/InstanceView.h - instance/TreeDataVisitorBase.h - instance/TreeDataVisitor.h - instance/TreeTypedDataVisitor.h + instance/sanitize_typename.h + instance/serialize_path.h + + instance/display_visitors/DataDisplayVisitor.h + instance/display_visitors/TypedDataDisplayVisitor.h + + instance/tree_builders/DataTreeBuilder.h + instance/tree_builders/DataTreeBuilderBase.h + instance/tree_builders/TypedDataTreeBuilder.h - instance/DataTreeBuilder.h - instance/DataTreeBuilderBase.h - instance/ValueDisplayVisitor.h + instance/tree_visitors/TreeDataVisitorBase.h + instance/tree_visitors/TreeDataVisitor.h + instance/tree_visitors/TreeTypedDataVisitor.h memory/GroupBox.h memory/TreeWidget.h diff --git a/source/RobotAPI/libraries/armem_gui/instance/DataTreeBuilderBase.cpp b/source/RobotAPI/libraries/armem_gui/instance/DataTreeBuilderBase.cpp deleted file mode 100644 index 8e9e39364..000000000 --- a/source/RobotAPI/libraries/armem_gui/instance/DataTreeBuilderBase.cpp +++ /dev/null @@ -1,54 +0,0 @@ -#include "DataTreeBuilderBase.h" - -#include <ArmarXCore/core/exceptions/local/ExpressionException.h> - -#include "ValueDisplayVisitor.h" - - -namespace armarx::armem::gui -{ - - DataTreeBuilderBase::DataTreeBuilderBase() - { - } - - DataTreeBuilderBase::~DataTreeBuilderBase() - {} - - void DataTreeBuilderBase::setColumns(int key, int value, int type) - { - this->columnKey = key; - this->columnType = type; - this->columnValue = value; - } - - - QTreeWidgetItem* DataTreeBuilderBase::makeItem(const std::string& key) const - { - return new QTreeWidgetItem(QStringList{QString::fromStdString(key)}); - } - - QTreeWidgetItem* DataTreeBuilderBase::makeItem(size_t key) const - { - QTreeWidgetItem* item = new QTreeWidgetItem(); - item->setData(0, Qt::UserRole, static_cast<int>(key)); - return item; - } - - void DataTreeBuilderBase::setRowTexts(QTreeWidgetItem* item, const std::string& key, const std::string& value, const std::string& typeName) const - { - item->setText(columnKey, QString::fromStdString(key)); - item->setText(columnValue, QString::fromStdString(value)); - item->setText(columnType, QString::fromStdString(typeName)); - } - - - void DataTreeBuilderBase::setRowTexts( - QTreeWidgetItem* item, const std::string& key, aron::datanavigator::Navigator& data) - { - armarx::aron::ValueDisplayVisitor visitor; - visitor.applyTo(data); - setRowTexts(item, key, visitor.ss.str(), data.getName()); - } - -} diff --git a/source/RobotAPI/libraries/armem_gui/instance/InstanceView.cpp b/source/RobotAPI/libraries/armem_gui/instance/InstanceView.cpp index ee4e8c937..ce0b62597 100644 --- a/source/RobotAPI/libraries/armem_gui/instance/InstanceView.cpp +++ b/source/RobotAPI/libraries/armem_gui/instance/InstanceView.cpp @@ -9,6 +9,7 @@ #include <QLayout> #include <QMenu> #include <QSplitter> +#include <QTreeWidget> #include <QVBoxLayout> #include <SimoxUtility/algorithm/string.h> @@ -19,10 +20,10 @@ #include <RobotAPI/libraries/aron/core/navigator/type/container/Object.h> #include <RobotAPI/libraries/armem_gui/gui_utils.h> -#include <RobotAPI/libraries/armem_gui/instance/DataTreeBuilder.h> -#include <RobotAPI/libraries/armem_gui/instance/TreeDataVisitor.h> -#include <RobotAPI/libraries/armem_gui/instance/TreeTypedDataVisitor.h> #include <RobotAPI/libraries/armem_gui/instance/ImageView.h> +#include <RobotAPI/libraries/armem_gui/instance/serialize_path.h> +#include <RobotAPI/libraries/armem_gui/instance/tree_builders/DataTreeBuilder.h> +#include <RobotAPI/libraries/armem_gui/instance/tree_builders/TypedDataTreeBuilder.h> namespace armarx::armem::gui::instance @@ -156,10 +157,9 @@ namespace armarx::armem::gui::instance } else if (useTypeInfo && aronType) { - armarx::gui::clearItem(treeItemData); - TreeTypedDataVisitor visitor(treeItemData); - visitor.setColumns(int(Columns::KEY), int(Columns::VALUE), int(Columns::TYPE)); - visitor.applyTo(*aronType, *data); + TypedDataTreeBuilder builder; + builder.setColumns(int(Columns::KEY), int(Columns::VALUE), int(Columns::TYPE)); + builder.updateTree(treeItemData, *aronType, *data); } else { @@ -213,7 +213,7 @@ namespace armarx::armem::gui::instance case aron::type::Descriptor::eIVTCByteImage: { QStringList qpath = item->data(int(Columns::KEY), Qt::UserRole).toStringList(); - aron::Path path = TreeTypedDataVisitor::deserializePath(qpath); + aron::Path path = deserializePath(qpath); QAction* viewAction = new QAction("Show image"); menu.addAction(viewAction); diff --git a/source/RobotAPI/libraries/armem_gui/instance/ValueDisplayVisitor.h b/source/RobotAPI/libraries/armem_gui/instance/ValueDisplayVisitor.h deleted file mode 100644 index 9b7c92245..000000000 --- a/source/RobotAPI/libraries/armem_gui/instance/ValueDisplayVisitor.h +++ /dev/null @@ -1,73 +0,0 @@ -#pragma once - -#include <sstream> - -#include <RobotAPI/libraries/aron/core/navigator/visitors/DataVisitor.h> - - -namespace armarx::aron -{ - - struct ValueDisplayVisitor : public aron::visitor::DataVisitor - { - std::stringstream ss; - - - bool visitEnter(DictDataNavigator& n) override - { - ss << n.getChildren().size() << " items"; - return false; - } - bool visitEnter(ListDataNavigator& n) override - { - ss << n.getChildren().size() << " items"; - return false; - } - - bool visit(BoolDataNavigator& b) override - { - if (b.getValue()) - { - ss << "true"; - } - else - { - ss << "false"; - } - return false; - } - bool visit(DoubleDataNavigator& n) override - { - ss << n.getValue(); - return false; - } - bool visit(FloatDataNavigator& n) override - { - ss << n.getValue(); - return false; - } - bool visit(IntDataNavigator& n) override - { - ss << n.getValue(); - return false; - } - bool visit(LongDataNavigator& n) override - { - ss << n.getValue(); - return false; - } - bool visit(StringDataNavigator& n) override - { - ss << "'" << n.getValue() << "'"; - return false; - } - - bool visit(NDArrayDataNavigator& n) override - { - ss << "shape " << aron::datanavigator::NDArrayNavigator::DimensionsToString(n.getDimensions()); - return false; - } - - }; - -} diff --git a/source/RobotAPI/libraries/armem_gui/instance/display_visitors/DataDisplayVisitor.cpp b/source/RobotAPI/libraries/armem_gui/instance/display_visitors/DataDisplayVisitor.cpp new file mode 100644 index 000000000..f41f5d4cb --- /dev/null +++ b/source/RobotAPI/libraries/armem_gui/instance/display_visitors/DataDisplayVisitor.cpp @@ -0,0 +1,76 @@ +#include "DataDisplayVisitor.h" + + +namespace armarx::aron +{ + + std::string DataDisplayVisitor::getValue(DataNavigator& n) + { + DataDisplayVisitor v; + v.applyTo(n); + return v.value.str(); + } + + bool DataDisplayVisitor::visitEnter(DictDataNavigator& n) + { + value << n.childrenSize() << " items"; + return false; + } + + bool DataDisplayVisitor::visitEnter(ListDataNavigator& n) + { + value << n.childrenSize() << " items"; + return false; + } + + bool DataDisplayVisitor::visit(BoolDataNavigator& b) + { + if (b.getValue()) + { + value << "true"; + } + else + { + value << "false"; + } + return false; + } + + bool DataDisplayVisitor::visit(DoubleDataNavigator& n) + { + value << n.getValue(); + return false; + } + + bool DataDisplayVisitor::visit(FloatDataNavigator& n) + { + value << n.getValue(); + return false; + } + + bool DataDisplayVisitor::visit(IntDataNavigator& n) + { + value << n.getValue(); + return false; + } + + bool DataDisplayVisitor::visit(LongDataNavigator& n) + { + value << n.getValue(); + return false; + } + + bool DataDisplayVisitor::visit(StringDataNavigator& n) + { + value << "'" << n.getValue() << "'"; + return false; + } + + bool DataDisplayVisitor::visit(NDArrayDataNavigator& n) + { + value << "shape " << aron::datanavigator::NDArrayNavigator::DimensionsToString(n.getDimensions()); + return false; + } + + +} diff --git a/source/RobotAPI/libraries/armem_gui/instance/display_visitors/DataDisplayVisitor.h b/source/RobotAPI/libraries/armem_gui/instance/display_visitors/DataDisplayVisitor.h new file mode 100644 index 000000000..8f48a57f0 --- /dev/null +++ b/source/RobotAPI/libraries/armem_gui/instance/display_visitors/DataDisplayVisitor.h @@ -0,0 +1,37 @@ +#pragma once + +#include <sstream> + +#include <RobotAPI/libraries/aron/core/navigator/visitors/DataVisitor.h> + + +namespace armarx::aron +{ + + class DataDisplayVisitor : public aron::visitor::DataVisitor + { + public: + + static std::string getValue(DataNavigator& n); + + + public: + + std::stringstream value; + + + bool visitEnter(DictDataNavigator& n) override; + bool visitEnter(ListDataNavigator& n) override; + + bool visit(BoolDataNavigator& b) override; + bool visit(DoubleDataNavigator& n) override; + bool visit(FloatDataNavigator& n) override; + bool visit(IntDataNavigator& n) override; + bool visit(LongDataNavigator& n) override; + bool visit(StringDataNavigator& n) override; + + bool visit(NDArrayDataNavigator& n) override; + + }; + +} diff --git a/source/RobotAPI/libraries/armem_gui/instance/display_visitors/TypedDataDisplayVisitor.cpp b/source/RobotAPI/libraries/armem_gui/instance/display_visitors/TypedDataDisplayVisitor.cpp new file mode 100644 index 000000000..827d14a59 --- /dev/null +++ b/source/RobotAPI/libraries/armem_gui/instance/display_visitors/TypedDataDisplayVisitor.cpp @@ -0,0 +1,147 @@ +#include "TypedDataDisplayVisitor.h" + +#include <iomanip> // std::setprecision + +#include <SimoxUtility/algorithm/string.h> + +#include <RobotAPI/libraries/aron/core/Exception.h> +#include <RobotAPI/libraries/aron/converter/eigen/EigenConverter.h> +#include <RobotAPI/libraries/armem/core/Time.h> + +#include "DataDisplayVisitor.h" + + +namespace armarx::aron +{ + + std::string TypedDataDisplayVisitor::getValue(TypeNavigator& type, DataNavigator& data) + { + TypedDataDisplayVisitor v; + bool r = v.applyTo(type, data); + ARMARX_CHECK(!r); + return v.value.str(); + } + + bool TypedDataDisplayVisitor::visitEnter(DictTypeNavigator&, DictDataNavigator& data) + { + value << DataDisplayVisitor::getValue(data); + return false; + } + + bool TypedDataDisplayVisitor::visitEnter(ObjectTypeNavigator&, DictDataNavigator& data) + { + value << DataDisplayVisitor::getValue(data); + return false; + } + + bool TypedDataDisplayVisitor::visitEnter(ListTypeNavigator&, ListDataNavigator& data) + { + value << DataDisplayVisitor::getValue(data); + return false; + } + + bool TypedDataDisplayVisitor::visitEnter(TupleTypeNavigator&, ListDataNavigator& data) + { + value << DataDisplayVisitor::getValue(data); + return false; + } + + bool TypedDataDisplayVisitor::visit(BoolTypeNavigator&, BoolDataNavigator& data) + { + value << DataDisplayVisitor::getValue(data); + return false; + } + + bool TypedDataDisplayVisitor::visit(DoubleTypeNavigator&, DoubleDataNavigator& data) + { + value << DataDisplayVisitor::getValue(data); + return false; + } + + bool TypedDataDisplayVisitor::visit(FloatTypeNavigator&, FloatDataNavigator& data) + { + value << DataDisplayVisitor::getValue(data); + return false; + } + + bool TypedDataDisplayVisitor::visit(IntTypeNavigator&, IntDataNavigator& data) + { + value << DataDisplayVisitor::getValue(data); + return false; + } + + bool TypedDataDisplayVisitor::visit(LongTypeNavigator&, LongDataNavigator& data) + { + value << DataDisplayVisitor::getValue(data); + return false; + } + + bool TypedDataDisplayVisitor::visit(StringTypeNavigator&, StringDataNavigator& data) + { + value << DataDisplayVisitor::getValue(data); + return false; + } + + bool TypedDataDisplayVisitor::visit(TimeTypeNavigator&, LongDataNavigator& data) + { + armem::Time time = armem::Time::microSeconds(data.getValue()); + armem::toDateTimeMilliSeconds(time); + value << armem::toDateTimeMilliSeconds(time); + return false; + } + + bool TypedDataDisplayVisitor::visit(EigenMatrixTypeNavigator&, NDArrayDataNavigator& data) + { + value << DataDisplayVisitor::getValue(data); + return false; + } + + bool TypedDataDisplayVisitor::visit(EigenQuaternionTypeNavigator&, NDArrayDataNavigator& data) + { + value << DataDisplayVisitor::getValue(data); + return false; + } + + bool TypedDataDisplayVisitor::visit(IVTCByteImageTypeNavigator&, NDArrayDataNavigator& data) + { + value << DataDisplayVisitor::getValue(data); + return false; + } + + bool TypedDataDisplayVisitor::visit(OpenCVMatTypeNavigator&, NDArrayDataNavigator& data) + { + value << DataDisplayVisitor::getValue(data); + return false; + } + + bool TypedDataDisplayVisitor::visit(PCLPointCloudTypeNavigator&, NDArrayDataNavigator& data) + { + value << DataDisplayVisitor::getValue(data); + return false; + } + + bool TypedDataDisplayVisitor::visit(PoseTypeNavigator&, NDArrayDataNavigator& data) + { + const Eigen::Matrix4f pose = aron::converter::AronEigenConverter::ConvertToMatrix4f(data); + value << std::setprecision(2) << std::fixed; + value << pose.format(Eigen::IOFormat(Eigen::StreamPrecision, 0, coeffSep, "\n", "", "", "", "")); + return false; + } + + bool TypedDataDisplayVisitor::visit(PositionTypeNavigator&, NDArrayDataNavigator& data) + { + const Eigen::Vector3f pos = aron::converter::AronEigenConverter::ConvertToVector3f(data); + value << std::setprecision(2) << std::fixed; + value << pos.format(Eigen::IOFormat(Eigen::StreamPrecision, 0, "", coeffSep, "", "", "", "")); + return false; + } + + bool TypedDataDisplayVisitor::visit(OrientationTypeNavigator&, NDArrayDataNavigator& data) + { + const Eigen::Quaternionf quat = aron::converter::AronEigenConverter::ConvertToQuaternionf(data); + value << std::setprecision(2) << std::fixed; + value << quat.w() << coeffSep << "|" << coeffSep << quat.x() << coeffSep << quat.y() << coeffSep << quat.z(); + return false; + } + +} diff --git a/source/RobotAPI/libraries/armem_gui/instance/display_visitors/TypedDataDisplayVisitor.h b/source/RobotAPI/libraries/armem_gui/instance/display_visitors/TypedDataDisplayVisitor.h new file mode 100644 index 000000000..3923b7d0d --- /dev/null +++ b/source/RobotAPI/libraries/armem_gui/instance/display_visitors/TypedDataDisplayVisitor.h @@ -0,0 +1,56 @@ +#pragma once + +#include <sstream> +#include <string> + +#include <RobotAPI/libraries/aron/core/navigator/visitors/TypedDataVisitor.h> + + +namespace armarx::aron +{ + + class TypedDataDisplayVisitor : public aron::visitor::TypedDataVisitor + { + public: + + static std::string getValue(TypeNavigator& type, DataNavigator& data); + + + public: + + std::stringstream value; + + + bool visitEnter(DictTypeNavigator&, DictDataNavigator& data) override; + bool visitEnter(ObjectTypeNavigator&, DictDataNavigator& data) override; + + bool visitEnter(ListTypeNavigator&, ListDataNavigator& data) override; + bool visitEnter(TupleTypeNavigator&, ListDataNavigator& data) override; + + + bool visit(BoolTypeNavigator&, BoolDataNavigator& data) override; + bool visit(DoubleTypeNavigator&, DoubleDataNavigator& data) override; + bool visit(FloatTypeNavigator&, FloatDataNavigator& data) override; + bool visit(IntTypeNavigator&, IntDataNavigator& data) override; + bool visit(LongTypeNavigator&, LongDataNavigator& data) override; + bool visit(StringTypeNavigator&, StringDataNavigator& data) override; + bool visit(TimeTypeNavigator&, LongDataNavigator& data) override; + + + bool visit(EigenMatrixTypeNavigator&, NDArrayDataNavigator& data) override; + bool visit(EigenQuaternionTypeNavigator&, NDArrayDataNavigator& data) override; + bool visit(IVTCByteImageTypeNavigator&, NDArrayDataNavigator& data) override; + bool visit(OpenCVMatTypeNavigator&, NDArrayDataNavigator& data) override; + bool visit(PCLPointCloudTypeNavigator&, NDArrayDataNavigator& data) override; + bool visit(PoseTypeNavigator&, NDArrayDataNavigator& data) override; + bool visit(PositionTypeNavigator&, NDArrayDataNavigator& data) override; + bool visit(OrientationTypeNavigator&, NDArrayDataNavigator& data) override; + + + protected: + + std::string coeffSep = " "; + + }; + +} diff --git a/source/RobotAPI/libraries/armem_gui/instance/sanitize_typename.cpp b/source/RobotAPI/libraries/armem_gui/instance/sanitize_typename.cpp new file mode 100644 index 000000000..ac5494864 --- /dev/null +++ b/source/RobotAPI/libraries/armem_gui/instance/sanitize_typename.cpp @@ -0,0 +1,21 @@ +#include "sanitize_typename.h" + +#include <SimoxUtility/algorithm/string.h> + + +std::string armarx::armem::gui::instance::sanitizeTypeName(const std::string& typeName) +{ + namespace s = simox::alg; + std::string n = typeName; + n = s::replace_all(n, "Aron", ""); + n = s::replace_all(n, "Type", ""); + n = s::replace_all(n, "type::", ""); + if (s::starts_with(n, "Object<") && s::ends_with(n, ">")) + { + std::string begin = "Object<"; + std::string end = ">"; + n = n.substr(begin.size(), n.size() - begin.size() - end.size()); + } + return n; + +} diff --git a/source/RobotAPI/libraries/armem_gui/instance/sanitize_typename.h b/source/RobotAPI/libraries/armem_gui/instance/sanitize_typename.h new file mode 100644 index 000000000..80c77acf2 --- /dev/null +++ b/source/RobotAPI/libraries/armem_gui/instance/sanitize_typename.h @@ -0,0 +1,12 @@ +#pragma once + +#include <string> + + +namespace armarx::armem::gui::instance +{ + + std::string sanitizeTypeName(const std::string& typeName); + +} + diff --git a/source/RobotAPI/libraries/armem_gui/instance/serialize_path.cpp b/source/RobotAPI/libraries/armem_gui/instance/serialize_path.cpp new file mode 100644 index 000000000..a01b0b462 --- /dev/null +++ b/source/RobotAPI/libraries/armem_gui/instance/serialize_path.cpp @@ -0,0 +1,35 @@ +#include "serialize_path.h" + +#include <RobotAPI/libraries/aron/core/Path.h> + +#include <ArmarXCore/core/exceptions/local/ExpressionException.h> + +#include <SimoxUtility/algorithm/string.h> + +#include <QString> +#include <QStringList> + + +QStringList armarx::armem::gui::instance::serializePath(const aron::Path& path) +{ + QStringList qpath; + qpath.append(QString::fromStdString(path.getRootIdentifier())); + qpath.append(QString::fromStdString(path.getDelimeter())); + for (const std::string& item : path.getPath()) + { + qpath.append(QString::fromStdString(item)); + } + return qpath; +} + +armarx::aron::Path armarx::armem::gui::instance::deserializePath(const QStringList& qpath) +{ + ARMARX_CHECK_GREATER_EQUAL(qpath.size(), 2); + std::vector<std::string> pathItems; + for (int i = 2; i < qpath.size(); ++i) + { + pathItems.push_back(qpath.at(i).toStdString()); + } + aron::Path path(qpath.at(0).toStdString(), qpath.at(1).toStdString(), pathItems); + return path; +} diff --git a/source/RobotAPI/libraries/armem_gui/instance/serialize_path.h b/source/RobotAPI/libraries/armem_gui/instance/serialize_path.h new file mode 100644 index 000000000..26517c6d1 --- /dev/null +++ b/source/RobotAPI/libraries/armem_gui/instance/serialize_path.h @@ -0,0 +1,18 @@ +#pragma once + + +namespace armarx::aron +{ + class Path; +} +class QStringList; + + +namespace armarx::armem::gui::instance +{ + + QStringList serializePath(const aron::Path& path); + aron::Path deserializePath(const QStringList& qpath); + +} + diff --git a/source/RobotAPI/libraries/armem_gui/instance/DataTreeBuilder.cpp b/source/RobotAPI/libraries/armem_gui/instance/tree_builders/DataTreeBuilder.cpp similarity index 52% rename from source/RobotAPI/libraries/armem_gui/instance/DataTreeBuilder.cpp rename to source/RobotAPI/libraries/armem_gui/instance/tree_builders/DataTreeBuilder.cpp index 27e9f0142..07ccac886 100644 --- a/source/RobotAPI/libraries/armem_gui/instance/DataTreeBuilder.cpp +++ b/source/RobotAPI/libraries/armem_gui/instance/tree_builders/DataTreeBuilder.cpp @@ -1,11 +1,11 @@ #include "DataTreeBuilder.h" -#include <ArmarXCore/core/exceptions/local/ExpressionException.h> +#include <QTreeWidgetItem> #include <RobotAPI/libraries/armem_gui/TreeWidgetBuilder.h> -namespace armarx::armem::gui +namespace armarx::armem::gui::instance { DataTreeBuilder::DataTreeBuilder() @@ -14,18 +14,7 @@ namespace armarx::armem::gui void DataTreeBuilder::updateTree(QTreeWidgetItem* parent, aron::datanavigator::DictNavigator& data) { - using ContainerT = std::vector<std::string>; - const ContainerT keys = data.getAllKeys(); - - armarx::TreeWidgetBuilder<ContainerT> builder; - builder.setCompareFn([](const std::string & key, QTreeWidgetItem * item) - { - return armarx::detail::compare(key, item->text(0).toStdString()); - }); - builder.setMakeItemFn([this](const std::string & key) - { - return this->makeItem(key); - }); + DictBuilder builder = getDictBuilder(); builder.setUpdateItemFn([this, &data](const std::string & key, QTreeWidgetItem * item) { auto child = data.getElement(key); @@ -33,37 +22,21 @@ namespace armarx::armem::gui return true; }); - builder.updateTree(parent, keys); + builder.updateTree(parent, data.getAllKeys()); } void DataTreeBuilder::updateTree(QTreeWidgetItem* parent, aron::datanavigator::ListNavigator& data) { auto children = data.getChildren(); - using ContainerT = std::vector<size_t>; - ContainerT index; - index.reserve(children.size()); - for (size_t i = 0; i < children.size(); ++i) - { - index.push_back(i); - } - - armarx::TreeWidgetBuilder<ContainerT> builder; - builder.setCompareFn([](size_t key, QTreeWidgetItem * item) - { - return armarx::detail::compare(static_cast<int>(key), item->data(0, Qt::UserRole).toInt()); - }); - builder.setMakeItemFn([this](size_t key) - { - return this->makeItem(key); - }); + ListBuilder builder = getListBuilder(); builder.setUpdateItemFn([this, &children](size_t key, QTreeWidgetItem * item) { this->update(item, std::to_string(key), *children.at(key)); return true; }); - builder.updateTree(parent, index); + builder.updateTree(parent, getIndex(children.size())); } diff --git a/source/RobotAPI/libraries/armem_gui/instance/DataTreeBuilder.h b/source/RobotAPI/libraries/armem_gui/instance/tree_builders/DataTreeBuilder.h similarity index 66% rename from source/RobotAPI/libraries/armem_gui/instance/DataTreeBuilder.h rename to source/RobotAPI/libraries/armem_gui/instance/tree_builders/DataTreeBuilder.h index ac5b4dfae..a9aa8471e 100644 --- a/source/RobotAPI/libraries/armem_gui/instance/DataTreeBuilder.h +++ b/source/RobotAPI/libraries/armem_gui/instance/tree_builders/DataTreeBuilder.h @@ -1,18 +1,14 @@ #pragma once -#include <sstream> -#include <stack> +#include <string> -#include <QTreeWidget> -#include <QLabel> - -#include <RobotAPI/libraries/aron/core/navigator/visitors/DataVisitor.h> -#include <RobotAPI/libraries/armem_gui/TreeWidgetBuilder.h> +#include <RobotAPI/libraries/aron/core/navigator/data/container/Dict.h> +#include <RobotAPI/libraries/aron/core/navigator/data/container/List.h> #include "DataTreeBuilderBase.h" -namespace armarx::armem::gui +namespace armarx::armem::gui::instance { class DataTreeBuilder : public DataTreeBuilderBase @@ -31,5 +27,4 @@ namespace armarx::armem::gui }; - } diff --git a/source/RobotAPI/libraries/armem_gui/instance/tree_builders/DataTreeBuilderBase.cpp b/source/RobotAPI/libraries/armem_gui/instance/tree_builders/DataTreeBuilderBase.cpp new file mode 100644 index 000000000..f837fe2fa --- /dev/null +++ b/source/RobotAPI/libraries/armem_gui/instance/tree_builders/DataTreeBuilderBase.cpp @@ -0,0 +1,97 @@ +#include "DataTreeBuilderBase.h" + +#include <QTreeWidgetItem> + +#include <ArmarXCore/core/exceptions/local/ExpressionException.h> + +#include <RobotAPI/libraries/armem_gui/TreeWidgetBuilder.h> +#include <RobotAPI/libraries/armem_gui/instance/display_visitors/DataDisplayVisitor.h> + + +namespace armarx::armem::gui::instance +{ + + DataTreeBuilderBase::DataTreeBuilderBase() + { + } + + DataTreeBuilderBase::~DataTreeBuilderBase() + {} + + void DataTreeBuilderBase::setColumns(int key, int value, int type) + { + this->columnKey = key; + this->columnType = type; + this->columnValue = value; + } + + + QTreeWidgetItem* DataTreeBuilderBase::makeItem(const std::string& key) const + { + return new QTreeWidgetItem(QStringList{QString::fromStdString(key)}); + } + + QTreeWidgetItem* DataTreeBuilderBase::makeItem(size_t key) const + { + QTreeWidgetItem* item = new QTreeWidgetItem(); + item->setData(0, Qt::UserRole, static_cast<int>(key)); + return item; + } + + void DataTreeBuilderBase::setRowTexts(QTreeWidgetItem* item, const std::string& key, const std::string& value, const std::string& typeName) const + { + item->setText(columnKey, QString::fromStdString(key)); + item->setText(columnValue, QString::fromStdString(value)); + item->setText(columnType, QString::fromStdString(typeName)); + } + + + void DataTreeBuilderBase::setRowTexts( + QTreeWidgetItem* item, const std::string& key, aron::datanavigator::Navigator& data) + { + const std::string value = armarx::aron::DataDisplayVisitor::getValue(data); + setRowTexts(item, key, value, data.getName()); + } + + DataTreeBuilderBase::DictBuilder DataTreeBuilderBase::getDictBuilder() const + { + DictBuilder builder; + builder.setCompareFn([](const std::string & key, QTreeWidgetItem * item) + { + return armarx::detail::compare(key, item->text(0).toStdString()); + }); + builder.setMakeItemFn([this](const std::string & key) + { + return this->makeItem(key); + }); + return builder; + } + + + DataTreeBuilderBase::ListBuilder DataTreeBuilderBase::getListBuilder() const + { + ListBuilder builder; + builder.setCompareFn([](size_t key, QTreeWidgetItem * item) + { + return armarx::detail::compare(static_cast<int>(key), item->data(0, Qt::UserRole).toInt()); + }); + builder.setMakeItemFn([this](size_t key) + { + return this->makeItem(key); + }); + return builder; + } + + + std::vector<size_t> DataTreeBuilderBase::getIndex(size_t size) const + { + std::vector<size_t> index; + index.reserve(size); + for (size_t i = 0; i < size; ++i) + { + index.push_back(i); + } + return index; + } + +} diff --git a/source/RobotAPI/libraries/armem_gui/instance/DataTreeBuilderBase.h b/source/RobotAPI/libraries/armem_gui/instance/tree_builders/DataTreeBuilderBase.h similarity index 61% rename from source/RobotAPI/libraries/armem_gui/instance/DataTreeBuilderBase.h rename to source/RobotAPI/libraries/armem_gui/instance/tree_builders/DataTreeBuilderBase.h index fb2f11945..b26a422ea 100644 --- a/source/RobotAPI/libraries/armem_gui/instance/DataTreeBuilderBase.h +++ b/source/RobotAPI/libraries/armem_gui/instance/tree_builders/DataTreeBuilderBase.h @@ -1,11 +1,19 @@ #pragma once -#include <QTreeWidgetItem> +#include <string> #include <RobotAPI/libraries/aron/core/navigator/data/Navigator.h> -namespace armarx::armem::gui +namespace armarx +{ + template <class ContainerT> struct TreeWidgetBuilder; +} + +class QTreeWidgetItem; + + +namespace armarx::armem::gui::instance { class DataTreeBuilderBase @@ -20,13 +28,20 @@ namespace armarx::armem::gui protected: + using DictBuilder = armarx::TreeWidgetBuilder<std::vector<std::string>>; + using ListBuilder = armarx::TreeWidgetBuilder<std::vector<size_t>>; + + DictBuilder getDictBuilder() const; + ListBuilder getListBuilder() const; + std::vector<size_t> getIndex(size_t size) const; + + QTreeWidgetItem* makeItem(const std::string& key) const; QTreeWidgetItem* makeItem(size_t key) const; void setRowTexts(QTreeWidgetItem* item, const std::string& key, const std::string& value, const std::string& typeName = "") const; void setRowTexts(QTreeWidgetItem* item, const std::string& key, aron::datanavigator::Navigator& data); - public: int columnKey = 0; diff --git a/source/RobotAPI/libraries/armem_gui/instance/tree_builders/TypedDataTreeBuilder.cpp b/source/RobotAPI/libraries/armem_gui/instance/tree_builders/TypedDataTreeBuilder.cpp new file mode 100644 index 000000000..abe50eb82 --- /dev/null +++ b/source/RobotAPI/libraries/armem_gui/instance/tree_builders/TypedDataTreeBuilder.cpp @@ -0,0 +1,181 @@ +#include "TypedDataTreeBuilder.h" + +#include <QTreeWidgetItem> + +#include <RobotAPI/libraries/armem_gui/TreeWidgetBuilder.h> +#include <RobotAPI/libraries/armem_gui/instance/serialize_path.h> +#include <RobotAPI/libraries/armem_gui/instance/sanitize_typename.h> +#include <RobotAPI/libraries/armem_gui/instance/display_visitors/TypedDataDisplayVisitor.h> + + +namespace armarx::armem::gui::instance +{ + + TypedDataTreeBuilder::TypedDataTreeBuilder() + { + } + + + void TypedDataTreeBuilder::updateTree( + QTreeWidgetItem* parent, + aron::typenavigator::DictNavigator& type, + aron::datanavigator::DictNavigator& data) + { + auto childType = type.getAcceptedType(); + if (childType) + { + DictBuilder builder = getDictBuilder(); + builder.setUpdateItemFn([this, &childType, &data](const std::string & key, QTreeWidgetItem * item) + { + auto childData = data.getElement(key); + if (childData) + { + this->update(item, key, *childType, *childData); + } + return true; + }); + + builder.updateTree(parent, data.getAllKeys()); + } + } + + void TypedDataTreeBuilder::updateTree( + QTreeWidgetItem* parent, + aron::typenavigator::ObjectNavigator& type, + aron::datanavigator::DictNavigator& data) + { + DictBuilder builder = getDictBuilder(); + builder.setUpdateItemFn([this, &type, &data](const std::string & key, QTreeWidgetItem * item) + { + auto childType = type.getMemberType(key); + auto childData = data.getElement(key); + + if (childType && childData) + { + this->update(item, key, *childType, *childData); + } + return true; + }); + + builder.updateTree(parent, type.getAllKeys()); + } + + + void TypedDataTreeBuilder::updateTree(QTreeWidgetItem* parent, + aron::typenavigator::ListNavigator& type, + aron::datanavigator::ListNavigator& data) + { + auto childType = type.getAcceptedType(); + if (childType) + { + auto children = data.getChildren(); + + ListBuilder builder = getListBuilder(); + builder.setUpdateItemFn([this, &children, &childType](size_t key, QTreeWidgetItem * item) + { + auto childData = children.at(key); + if (childData) + { + this->update(item, std::to_string(key), *childType, *childData); + } + return true; + }); + + builder.updateTree(parent, getIndex(children.size())); + } + } + + void TypedDataTreeBuilder::updateTree( + QTreeWidgetItem* parent, + aron::typenavigator::PairNavigator& type, + aron::datanavigator::ListNavigator& data) + { + ARMARX_CHECK_EQUAL(data.childrenSize(), 2); + auto childTypes = type.getAcceptedTypes(); + + ListBuilder builder = getListBuilder(); + builder.setUpdateItemFn([this, &data, &childTypes](size_t i, QTreeWidgetItem * item) + { + auto childType = i == 0 ? childTypes.first : childTypes.second; + auto childData = data.getElement(static_cast<unsigned int>(i)); + + if (childType && childData) + { + this->update(item, std::to_string(i), *childType, *childData); + } + return true; + }); + + builder.updateTree(parent, getIndex(data.childrenSize())); + } + + void TypedDataTreeBuilder::updateTree( + QTreeWidgetItem* parent, + aron::typenavigator::TupleNavigator& type, + aron::datanavigator::ListNavigator& data) + { + auto childTypes = type.getAcceptedTypes(); + + ListBuilder builder = getListBuilder(); + builder.setUpdateItemFn([this, &data, &childTypes](size_t i, QTreeWidgetItem * item) + { + auto childType = childTypes.at(i); + auto childData = data.getElement(static_cast<unsigned int>(i)); + + if (childType && childData) + { + this->update(item, std::to_string(i), *childType, *childData); + } + return true; + }); + + builder.updateTree(parent, getIndex(type.getAcceptedTypes().size())); + } + + + void TypedDataTreeBuilder::update( + QTreeWidgetItem* item, + const std::string& key, + aron::typenavigator::Navigator& type, + aron::datanavigator::Navigator& data) + { + using namespace aron::typenavigator; + + const std::string value = armarx::aron::TypedDataDisplayVisitor::getValue(type, data); + const std::string typeName = sanitizeTypeName(type.getName()); + ARMARX_IMPORTANT << VAROUT(typeName); + setRowTexts(item, key, value, typeName); + + item->setData(columnKey, Qt::UserRole, serializePath(data.getPath())); + item->setData(columnType, Qt::UserRole, static_cast<int>(type.getDescriptor())); + + if (auto t = dynamic_cast<ObjectNavigator*>(&type)) + { + _updateTree<aron::datanavigator::DictNavigator>(item, *t, data); + } + else if (auto t = dynamic_cast<DictNavigator*>(&type)) + { + _updateTree<aron::datanavigator::DictNavigator>(item, *t, data); + } + else if (auto t = dynamic_cast<ListNavigator*>(&type)) + { + _updateTree<aron::datanavigator::ListNavigator>(item, *t, data); + } + else if (auto t = dynamic_cast<PairNavigator*>(&type)) + { + _updateTree<aron::datanavigator::ListNavigator>(item, *t, data); + } + else if (auto t = dynamic_cast<TupleNavigator*>(&type)) + { + _updateTree<aron::datanavigator::ListNavigator>(item, *t, data); + } + } + + template <class DataT, class TypeT> + void TypedDataTreeBuilder::_updateTree(QTreeWidgetItem* item, TypeT& type, aron::datanavigator::Navigator& data) + { + DataT& dataCast = dynamic_cast<DataT&>(data); + updateTree(item, type, dataCast); + } + +} diff --git a/source/RobotAPI/libraries/armem_gui/instance/tree_builders/TypedDataTreeBuilder.h b/source/RobotAPI/libraries/armem_gui/instance/tree_builders/TypedDataTreeBuilder.h new file mode 100644 index 000000000..57580a1f6 --- /dev/null +++ b/source/RobotAPI/libraries/armem_gui/instance/tree_builders/TypedDataTreeBuilder.h @@ -0,0 +1,63 @@ +#pragma once + +#include <string> + +#include <RobotAPI/libraries/aron/core/navigator/data/Navigator.h> +#include <RobotAPI/libraries/aron/core/navigator/data/container/Dict.h> +#include <RobotAPI/libraries/aron/core/navigator/data/container/List.h> + +#include <RobotAPI/libraries/aron/core/navigator/type/Navigator.h> +#include <RobotAPI/libraries/aron/core/navigator/type/container/Dict.h> +#include <RobotAPI/libraries/aron/core/navigator/type/container/List.h> +#include <RobotAPI/libraries/aron/core/navigator/type/container/Object.h> +#include <RobotAPI/libraries/aron/core/navigator/type/container/Pair.h> +#include <RobotAPI/libraries/aron/core/navigator/type/container/Tuple.h> + +#include "DataTreeBuilderBase.h" + + +class QStringList; + + +namespace armarx::armem::gui::instance +{ + + class TypedDataTreeBuilder : public DataTreeBuilderBase + { + public: + + TypedDataTreeBuilder(); + + + void updateTree(QTreeWidgetItem* parent, + aron::typenavigator::DictNavigator& type, + aron::datanavigator::DictNavigator& data); + void updateTree(QTreeWidgetItem* parent, + aron::typenavigator::ObjectNavigator& type, + aron::datanavigator::DictNavigator& data); + + void updateTree(QTreeWidgetItem* parent, + aron::typenavigator::ListNavigator& type, + aron::datanavigator::ListNavigator& data); + void updateTree(QTreeWidgetItem* parent, + aron::typenavigator::PairNavigator& type, + aron::datanavigator::ListNavigator& data); + void updateTree(QTreeWidgetItem* parent, + aron::typenavigator::TupleNavigator& type, + aron::datanavigator::ListNavigator& data); + + + protected: + + void update(QTreeWidgetItem* item, + const std::string& key, + aron::typenavigator::Navigator& type, + aron::datanavigator::Navigator& data); + + template <class DataT, class TypeT> + void _updateTree(QTreeWidgetItem* item, TypeT& type, aron::datanavigator::Navigator& data); + + }; + + +} diff --git a/source/RobotAPI/libraries/armem_gui/instance/TreeDataVisitor.cpp b/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeDataVisitor.cpp similarity index 72% rename from source/RobotAPI/libraries/armem_gui/instance/TreeDataVisitor.cpp rename to source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeDataVisitor.cpp index 0d1721ef2..8bc5889d2 100644 --- a/source/RobotAPI/libraries/armem_gui/instance/TreeDataVisitor.cpp +++ b/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeDataVisitor.cpp @@ -3,7 +3,7 @@ #include <ArmarXCore/core/exceptions/local/ExpressionException.h> -namespace armarx::armem::gui +namespace armarx::armem::gui::instance { } diff --git a/source/RobotAPI/libraries/armem_gui/instance/TreeDataVisitor.h b/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeDataVisitor.h similarity index 94% rename from source/RobotAPI/libraries/armem_gui/instance/TreeDataVisitor.h rename to source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeDataVisitor.h index b751084bf..61d76bcfc 100644 --- a/source/RobotAPI/libraries/armem_gui/instance/TreeDataVisitor.h +++ b/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeDataVisitor.h @@ -8,10 +8,10 @@ #include <RobotAPI/libraries/aron/core/navigator/visitors/DataVisitor.h> -#include "TreeDataVisitorBase.h" +#include <RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeDataVisitorBase.h> -namespace armarx::armem::gui +namespace armarx::armem::gui::instance { class TreeDataVisitor : diff --git a/source/RobotAPI/libraries/armem_gui/instance/TreeDataVisitorBase.cpp b/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeDataVisitorBase.cpp similarity index 98% rename from source/RobotAPI/libraries/armem_gui/instance/TreeDataVisitorBase.cpp rename to source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeDataVisitorBase.cpp index 70a84dd7d..87cd2ffb9 100644 --- a/source/RobotAPI/libraries/armem_gui/instance/TreeDataVisitorBase.cpp +++ b/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeDataVisitorBase.cpp @@ -3,7 +3,7 @@ #include <ArmarXCore/core/exceptions/local/ExpressionException.h> -namespace armarx::armem::gui +namespace armarx::armem::gui::instance { TreeDataVisitorBase::TreeDataVisitorBase() diff --git a/source/RobotAPI/libraries/armem_gui/instance/TreeDataVisitorBase.h b/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeDataVisitorBase.h similarity index 98% rename from source/RobotAPI/libraries/armem_gui/instance/TreeDataVisitorBase.h rename to source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeDataVisitorBase.h index cb6d4152a..c9d4ab0cd 100644 --- a/source/RobotAPI/libraries/armem_gui/instance/TreeDataVisitorBase.h +++ b/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeDataVisitorBase.h @@ -9,7 +9,7 @@ #include <RobotAPI/libraries/aron/core/navigator/visitors/DataVisitor.h> -namespace armarx::armem::gui +namespace armarx::armem::gui::instance { class TreeDataVisitorBase diff --git a/source/RobotAPI/libraries/armem_gui/instance/TreeTypedDataVisitor.cpp b/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedDataVisitor.cpp similarity index 62% rename from source/RobotAPI/libraries/armem_gui/instance/TreeTypedDataVisitor.cpp rename to source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedDataVisitor.cpp index 9a37a20ef..c4ed919f9 100644 --- a/source/RobotAPI/libraries/armem_gui/instance/TreeTypedDataVisitor.cpp +++ b/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedDataVisitor.cpp @@ -11,24 +11,9 @@ #include <RobotAPI/libraries/armem/core.h> -namespace armarx::armem::gui +namespace armarx::armem::gui::instance { - std::string TreeTypedDataVisitor::sanitizeTypeName(const std::string& typeName) const - { - namespace s = simox::alg; - std::string n = typeName; - n = s::replace_all(n, "Aron", ""); - n = s::replace_all(n, "Type", ""); - if (s::starts_with(n, "Object<") && s::ends_with(n, ">")) - { - std::string begin = "Object<"; - std::string end = ">"; - n = n.substr(begin.size(), n.size() - begin.size() - end.size()); - } - return n; - } - QTreeWidgetItem* TreeTypedDataVisitor::makeItem(const std::string& key, NDArrayDataNavigator& data, const PoseTypeNavigator& type) const { QTreeWidgetItem* item = makeItem<NDArrayDataNavigator, PoseTypeNavigator>(key, data, type); @@ -68,28 +53,4 @@ namespace armarx::armem::gui ss << quat.w() << coeffSep << "|" << coeffSep << quat.x() << coeffSep << quat.y() << coeffSep << quat.z(); } - QStringList TreeTypedDataVisitor::serializePath(const aron::Path& path) - { - QStringList qpath; - qpath.append(QString::fromStdString(path.getRootIdentifier())); - qpath.append(QString::fromStdString(path.getDelimeter())); - for (const std::string& item : path.getPath()) - { - qpath.append(QString::fromStdString(item)); - } - return qpath; - } - - aron::Path TreeTypedDataVisitor::deserializePath(const QStringList& qpath) - { - ARMARX_CHECK_GREATER_EQUAL(qpath.size(), 2); - std::vector<std::string> pathItems; - for (int i = 2; i < qpath.size(); ++i) - { - pathItems.push_back(qpath.at(i).toStdString()); - } - aron::Path path(qpath.at(0).toStdString(), qpath.at(1).toStdString(), pathItems); - return path; - } - } diff --git a/source/RobotAPI/libraries/armem_gui/instance/TreeTypedDataVisitor.h b/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedDataVisitor.h similarity index 96% rename from source/RobotAPI/libraries/armem_gui/instance/TreeTypedDataVisitor.h rename to source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedDataVisitor.h index 0aa19b4a7..fb1c1baa5 100644 --- a/source/RobotAPI/libraries/armem_gui/instance/TreeTypedDataVisitor.h +++ b/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedDataVisitor.h @@ -7,10 +7,14 @@ #include <QLabel> #include <RobotAPI/libraries/aron/core/navigator/visitors/TypedDataVisitor.h> -#include "TreeDataVisitorBase.h" +#include <RobotAPI/libraries/armem_gui/instance/sanitize_typename.h> +#include <RobotAPI/libraries/armem_gui/instance/serialize_path.h> -namespace armarx::armem::gui +#include <RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeDataVisitorBase.h> + + +namespace armarx::armem::gui::instance { class TreeTypedDataVisitor : @@ -123,12 +127,6 @@ namespace armarx::armem::gui } - std::string sanitizeTypeName(const std::string& typeName) const; - - static QStringList serializePath(const aron::Path& path); - static aron::Path deserializePath(const QStringList& qpath); - - protected: template <class DataNavigatorT, class TypeNavigatorT> diff --git a/source/RobotAPI/libraries/armem_gui/test/ArMemGuiTest.cpp b/source/RobotAPI/libraries/armem_gui/test/ArMemGuiTest.cpp index 5ecf962db..d1e0e4a01 100644 --- a/source/RobotAPI/libraries/armem_gui/test/ArMemGuiTest.cpp +++ b/source/RobotAPI/libraries/armem_gui/test/ArMemGuiTest.cpp @@ -29,13 +29,13 @@ #include <iostream> -#include <RobotAPI/libraries/armem_gui/instance/TreeTypedDataVisitor.h> +#include <RobotAPI/libraries/armem_gui/instance/sanitize_typename.h> + +using namespace armarx::armem::gui::instance; BOOST_AUTO_TEST_CASE(test_sanitizeTypeName) { - armarx::armem::gui::TreeTypedDataVisitor v; - - BOOST_CHECK_EQUAL(v.sanitizeTypeName("AronDictType<AronFloatType>"), "Dict<Float>"); - BOOST_CHECK_EQUAL(v.sanitizeTypeName("AronListType<AronFloatType>"), "List<Float>"); + BOOST_CHECK_EQUAL(sanitizeTypeName("AronDictType<AronFloatType>"), "Dict<Float>"); + BOOST_CHECK_EQUAL(sanitizeTypeName("AronListType<AronFloatType>"), "List<Float>"); } diff --git a/source/RobotAPI/libraries/aron/core/navigator/visitors/TypedDataVisitor.h b/source/RobotAPI/libraries/aron/core/navigator/visitors/TypedDataVisitor.h index 77c73fe08..f577903a4 100644 --- a/source/RobotAPI/libraries/aron/core/navigator/visitors/TypedDataVisitor.h +++ b/source/RobotAPI/libraries/aron/core/navigator/visitors/TypedDataVisitor.h @@ -229,153 +229,129 @@ namespace armarx::aron::visitor virtual bool visitEnter(DictTypeNavigator& type, const std::string& key, DictDataNavigator& data) { (void) key; - visitEnter(type, data); - return true; + return visitEnter(type, data); } virtual bool visitExit(DictTypeNavigator& type, const std::string& key, DictDataNavigator& data) { (void) key; - visitExit(type, data); - return true; + return visitExit(type, data); } virtual bool visitEnter(ObjectTypeNavigator& type, const std::string& key, DictDataNavigator& data) { (void) key; - visitEnter(type, data); - return true; + return visitEnter(type, data); } virtual bool visitExit(ObjectTypeNavigator& type, const std::string& key, DictDataNavigator& data) { (void) key; - visitExit(type, data); - return true; + return visitExit(type, data); } virtual bool visitEnter(ListTypeNavigator& type, const std::string& key, ListDataNavigator& data) { (void) key; - visitEnter(type, data); - return true; + return visitEnter(type, data); } virtual bool visitExit(ListTypeNavigator& type, const std::string& key, ListDataNavigator& data) { (void) key; - visitExit(type, data); - return true; + return visitExit(type, data); } virtual bool visitEnter(TupleTypeNavigator& type, const std::string& key, ListDataNavigator& data) { (void) key; - visitEnter(type, data); - return true; + return visitEnter(type, data); } virtual bool visitExit(TupleTypeNavigator& type, const std::string& key, ListDataNavigator& data) { (void) key; - visitExit(type, data); - return true; + return visitExit(type, data); } virtual bool visit(BoolTypeNavigator& type, const std::string& key, BoolDataNavigator& data) { (void) key; - visit(type, data); - return true; + return visit(type, data); } virtual bool visit(DoubleTypeNavigator& type, const std::string& key, DoubleDataNavigator& data) { (void) key; - visit(type, data); - return true; + return visit(type, data); } virtual bool visit(FloatTypeNavigator& type, const std::string& key, FloatDataNavigator& data) { (void) key; - visit(type, data); - return true; + return visit(type, data); } virtual bool visit(IntTypeNavigator& type, const std::string& key, IntDataNavigator& data) { (void) key; - visit(type, data); - return true; + return visit(type, data); } virtual bool visit(LongTypeNavigator& type, const std::string& key, LongDataNavigator& data) { (void) key; - visit(type, data); - return true; + return visit(type, data); } virtual bool visit(StringTypeNavigator& type, const std::string& key, StringDataNavigator& data) { (void) key; - visit(type, data); - return true; + return visit(type, data); } virtual bool visit(TimeTypeNavigator& type, const std::string& key, LongDataNavigator& data) { (void) key; - visit(type, data); - return true; + return visit(type, data); } virtual bool visit(TimeTypeNavigator& type, const std::string& key, const IceUtil::Time& data) { (void) key; - visit(type, data); - return true; + return visit(type, data); } virtual bool visit(EigenMatrixTypeNavigator& type, const std::string& key, NDArrayDataNavigator& data) { (void) type, (void) key; - visit(type, data); - return true; + return visit(type, data); } virtual bool visit(EigenQuaternionTypeNavigator& type, const std::string& key, NDArrayDataNavigator& data) { (void) type, (void) key; - visit(type, data); - return true; + return visit(type, data); } virtual bool visit(IVTCByteImageTypeNavigator& type, const std::string& key, NDArrayDataNavigator& data) { (void) type, (void) key; - visit(type, data); - return true; + return visit(type, data); } virtual bool visit(OpenCVMatTypeNavigator& type, const std::string& key, NDArrayDataNavigator& data) { (void) type, (void) key; - visit(type, data); - return true; + return visit(type, data); } virtual bool visit(PCLPointCloudTypeNavigator& type, const std::string& key, NDArrayDataNavigator& data) { (void) type, (void) key; - visit(type, data); - return true; + return visit(type, data); } virtual bool visit(PoseTypeNavigator& type, const std::string& key, NDArrayDataNavigator& data) { (void) type, (void) key; - visit(type, data); - return true; + return visit(type, data); } virtual bool visit(PositionTypeNavigator& type, const std::string& key, NDArrayDataNavigator& data) { (void) type, (void) key; - visit(type, data); - return true; + return visit(type, data); } virtual bool visit(OrientationTypeNavigator& type, const std::string& key, NDArrayDataNavigator& data) { (void) type, (void) key; - visit(type, data); - return true; + return visit(type, data); } @@ -392,76 +368,3 @@ namespace armarx::aron::visitor }; } - - -/* Copy-and-paste example below. - * Remove functions you don't need. - * Add `const std::string& key, ` to parameter list if you need an items's key - * in the parent container. - */ - -#if 0 - -struct MyDerivedAronTypeVisitor : public armarx::aron::visitor::AronTypeVisitor -{ - - bool visitEnter(DictTypeNavigator& dict) override - { - (void) dict; - return true; - } - bool visitExit(DictTypeNavigator& dict) override - { - (void) dict; - return true; - } - bool visitEnter(ListTypeNavigator& list) override - { - (void) list; - return true; - } - bool visitExit(ListTypeNavigator& list) override - { - (void) list; - return true; - } - - bool visit(BoolTypeNavigator& b) override - { - (void) b; - return true; - } - bool visit(DoubleTypeNavigator& d) override - { - (void) d; - return true; - } - bool visit(FloatTypeNavigator& f) override - { - (void) f; - return true; - } - bool visit(IntTypeNavigator& i) override - { - (void) i; - return true; - } - bool visit(LongTypeNavigator& l) override - { - (void) l; - return true; - } - bool visit(NDArrayTypeNavigator& array) override - { - (void) array; - return true; - } - bool visit(StringTypeNavigator& string) override - { - (void) string; - return true; - } - -}; - -#endif -- GitLab