diff --git a/source/RobotAPI/libraries/armem_gui/instance/InstanceView.cpp b/source/RobotAPI/libraries/armem_gui/instance/InstanceView.cpp index bcfce34f33b01afabf9c65cb897d2c9cd1d9f58b..8a61ecd6de4053dac87894685e2b011aec824245 100644 --- a/source/RobotAPI/libraries/armem_gui/instance/InstanceView.cpp +++ b/source/RobotAPI/libraries/armem_gui/instance/InstanceView.cpp @@ -261,6 +261,14 @@ namespace armarx::armem::gui::instance menu.addAction(action); } } + else if (item == this->treeItemData && currentInstance.has_value()) + { + QAction* action = makeActionCopyDataToClipboard(); + if (action) + { + menu.addAction(action); + } + } else if (item->parent() == nullptr) { return; // Other top level item => no context menu. @@ -330,7 +338,11 @@ namespace armarx::armem::gui::instance const std::optional<aron::Path> elementPath = getElementPath(item); if (elementPath) { - menu.addAction(makeActionCopyDataToClipboard(elementPath.value())); + QAction* action = makeActionCopyDataToClipboard(elementPath.value()); + if (action) + { + menu.addAction(action); + } } if (menu.actions().size() > 0) @@ -421,15 +433,32 @@ namespace armarx::armem::gui::instance return action; } + QAction* InstanceView::makeActionCopyDataToClipboard() + { + return makeCopyAction(currentInstance->data()); + } + QAction* InstanceView::makeActionCopyDataToClipboard(const aron::Path& path) { - QAction* action = new QAction("Copy data to clipboard as JSON"); + try + { + aron::data::VariantPtr element = currentInstance->data()->navigateAbsolute(path); + return makeCopyAction(element); + } + catch (const aron::error::AronException& e) + { + ARMARX_WARNING << "Could not convert Aron data to JSON: " << e.getReason(); + } + return nullptr; + } - connect(action, &QAction::triggered, [this, path]() + QAction* InstanceView::makeCopyAction(const aron::data::VariantPtr& element) + { + QAction* action = new QAction("Copy data to clipboard as JSON"); + connect(action, &QAction::triggered, [this, element]() { try { - aron::data::VariantPtr element = currentInstance->data()->navigateAbsolute(path); TreeTypedJSONConverter conv; // TODO(phesch): Type hierarchy doesn't match data hierarchy armarx::aron::data::visitRecursive(conv, currentInstance->data(), currentAronType); @@ -448,7 +477,6 @@ namespace armarx::armem::gui::instance return action; } - void InstanceView::showImageView(const aron::Path& elementPath) { if (not currentInstance) diff --git a/source/RobotAPI/libraries/armem_gui/instance/InstanceView.h b/source/RobotAPI/libraries/armem_gui/instance/InstanceView.h index 1dc2ce13ec8fadad24072d9301817ceca7779a64..75e41ab9cb4c61f6267e74454d261dff48488ac9 100644 --- a/source/RobotAPI/libraries/armem_gui/instance/InstanceView.h +++ b/source/RobotAPI/libraries/armem_gui/instance/InstanceView.h @@ -79,7 +79,9 @@ namespace armarx::armem::gui::instance QAction* makeActionResolveMemoryID(const MemoryID& id); QAction* makeActionCopyMemoryID(const MemoryID& id); + QAction* makeActionCopyDataToClipboard(); QAction* makeActionCopyDataToClipboard(const aron::Path& path); + QAction* makeCopyAction(const aron::data::VariantPtr& element); private: 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 f4cf3788da6cfb911d9dba4ad11b0aea234af1e6..b7d157c746d3b4c5dfc99f7bc91fddefe5405af9 100644 --- a/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedJSONConverter.cpp +++ b/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedJSONConverter.cpp @@ -36,7 +36,7 @@ namespace armarx::armem::gui::instance } catch (const aron::error::AronException& e) { - ARMARX_WARNING << "Object did not have a path." << e.getReason(); + // This happens when we start at the top-level object. } jsonStack.push({key, nlohmann::json(nlohmann::json::value_t::object)}); }