diff --git a/source/RobotAPI/libraries/armem_gui/instance/InstanceView.cpp b/source/RobotAPI/libraries/armem_gui/instance/InstanceView.cpp index 3bbb2ee55a87be3216386a0f847b40829b4bb785..708ba87395db5d8e696cf9dbaa4ee174eb23c61b 100644 --- a/source/RobotAPI/libraries/armem_gui/instance/InstanceView.cpp +++ b/source/RobotAPI/libraries/armem_gui/instance/InstanceView.cpp @@ -446,7 +446,7 @@ namespace armarx::armem::gui::instance std::vector<QAction*> InstanceView::makeActionsCopyDataToClipboard() { - return makeCopyActions(currentInstance->data()); + return makeCopyActions(currentInstance->data(), currentAronType); } std::vector<QAction*> InstanceView::makeActionsCopyDataToClipboard(const aron::Path& path) @@ -454,7 +454,21 @@ namespace armarx::armem::gui::instance try { aron::data::VariantPtr element = currentInstance->data()->navigateAbsolute(path); - return makeCopyActions(element); + aron::type::VariantPtr elementType = nullptr; + if (currentAronType) + { + // There doesn't seem to be a way to check whether the path exists + // without potentially throwing an exception. + try + { + elementType = currentAronType->navigateAbsolute(path); + } + catch (const aron::error::AronException& e) + { + // No type available, elementType remains nullptr. + } + } + return makeCopyActions(element, elementType); } catch (const aron::error::AronException& e) { @@ -463,18 +477,17 @@ namespace armarx::armem::gui::instance return {}; } - std::vector<QAction*> InstanceView::makeCopyActions(const aron::data::VariantPtr& element) + std::vector<QAction*> InstanceView::makeCopyActions( + const aron::data::VariantPtr& element, + const aron::type::VariantPtr& elementType) { QAction* easyJsonAction = new QAction("Copy data to clipboard as easy JSON"); - connect(easyJsonAction, &QAction::triggered, [this, element]() + connect(easyJsonAction, &QAction::triggered, [this, element, elementType]() { try { TreeTypedJSONConverter conv; - // TODO(phesch): Type hierarchy doesn't match data hierarchy - armarx::aron::data::visitRecursive(conv, currentInstance->data(), currentAronType); - //nlohmann::json json = - // aron::converter::AronNlohmannJSONConverter::ConvertToNlohmannJSON(element); + armarx::aron::data::visitRecursive(conv, element, elementType); QClipboard* clipboard = QApplication::clipboard(); clipboard->setText(QString::fromStdString(conv.getJSON().dump(2))); QApplication::processEvents(); diff --git a/source/RobotAPI/libraries/armem_gui/instance/InstanceView.h b/source/RobotAPI/libraries/armem_gui/instance/InstanceView.h index 982d277db1febb68070290d3c86a3f06c602b990..970af2b6e45698cd342950a1ffe4f6612877d000 100644 --- a/source/RobotAPI/libraries/armem_gui/instance/InstanceView.h +++ b/source/RobotAPI/libraries/armem_gui/instance/InstanceView.h @@ -84,7 +84,9 @@ namespace armarx::armem::gui::instance QAction* makeActionCopyMemoryID(const MemoryID& id); std::vector<QAction*> makeActionsCopyDataToClipboard(); std::vector<QAction*> makeActionsCopyDataToClipboard(const aron::Path& path); - std::vector<QAction*> makeCopyActions(const aron::data::VariantPtr& element); + std::vector<QAction*> makeCopyActions( + const aron::data::VariantPtr& element, + const aron::type::VariantPtr& elementType); private: diff --git a/source/RobotAPI/libraries/armem_gui/instance/tree_builders/TypedDataTreeBuilder.cpp b/source/RobotAPI/libraries/armem_gui/instance/tree_builders/TypedDataTreeBuilder.cpp index e2537e0c5f94b382ea00920eb79f168e50b73331..de85c11c08080c88c5f5d72f5b00900547a66fbc 100644 --- a/source/RobotAPI/libraries/armem_gui/instance/tree_builders/TypedDataTreeBuilder.cpp +++ b/source/RobotAPI/libraries/armem_gui/instance/tree_builders/TypedDataTreeBuilder.cpp @@ -249,6 +249,9 @@ namespace armarx::armem::gui::instance { this->setRowTexts(item, key, data); + item->setData(columnKey, Qt::UserRole, + data ? instance::serializePath(data->getPath()) : QStringList()); + if (auto cast = aron::data::Dict::DynamicCast(data)) { DataTreeBuilder builder; diff --git a/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedJSONConverter.cpp b/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedJSONConverter.cpp index d0f2f4c77863e680bc644a219370a41aac8f4a79..f80717342b3bc98dc1ebf9b7a72a4b274ede768a 100644 --- a/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedJSONConverter.cpp +++ b/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedJSONConverter.cpp @@ -4,10 +4,10 @@ #include <ArmarXCore/core/logging/Logging.h> -#include <RobotAPI/libraries/aron/core/data/variant/All.h> -#include <RobotAPI/libraries/aron/core/Exception.h> #include <RobotAPI/libraries/armem/core/Time.h> #include <RobotAPI/libraries/aron/converter/eigen/EigenConverter.h> +#include <RobotAPI/libraries/aron/core/Exception.h> +#include <RobotAPI/libraries/aron/core/data/variant/All.h> namespace armarx::armem::gui::instance { @@ -27,6 +27,34 @@ namespace armarx::armem::gui::instance return obj; } + /* We override this method because we need to handle untyped members in the hierarchy. + * The other get*Elements() methods will either not be called with a null type or can handle it. + */ + TreeTypedJSONConverter::MapElements + TreeTypedJSONConverter::getObjectElements(DataInput& elementData, TypeInput& elementType) + { + std::map<std::string, std::pair<aron::data::VariantPtr, aron::type::VariantPtr>> ret; + auto data = aron::data::Dict::DynamicCastAndCheck(elementData); + auto type = aron::type::Object::DynamicCastAndCheck(elementType); + + if (data) + { + for (const auto& [key, e] : data->getElements()) + { + if (type && type->hasMemberType(key)) + { + auto memberType = type->getMemberType(key); + ret.insert({key, {e, memberType}}); + } + else + { + ret.insert({key, {e, nullptr}}); + } + } + } + return ret; + } + void TreeTypedJSONConverter::visitObjectOnEnter(DataInput& elementData, TypeInput& /*elementType*/) { diff --git a/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedJSONConverter.h b/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedJSONConverter.h index 7a112979e7baa9e01460cc98d00c3d74a0d846e5..901021de0b67a556cf5adcc62635ebee8704d9d9 100644 --- a/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedJSONConverter.h +++ b/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedJSONConverter.h @@ -17,6 +17,8 @@ namespace armarx::armem::gui::instance const nlohmann::json& getJSON(); + MapElements getObjectElements(DataInput& elementData, TypeInput& elementType) override; + void visitObjectOnEnter(DataInput& elementData, TypeInput& elementType) override; void visitObjectOnExit(DataInput& elementData, TypeInput& elementType) override; void visitDictOnEnter(DataInput& elementData, TypeInput& elementType) override;