diff --git a/source/RobotAPI/libraries/armem_gui/CMakeLists.txt b/source/RobotAPI/libraries/armem_gui/CMakeLists.txt index 46d1d14165082c0699fe074490a3c590e5c86543..37c18f5612466714cfede37105c7800667fd9575 100644 --- a/source/RobotAPI/libraries/armem_gui/CMakeLists.txt +++ b/source/RobotAPI/libraries/armem_gui/CMakeLists.txt @@ -16,15 +16,17 @@ set(LIBRARIES set(SOURCES MemoryViewer.cpp - PeriodicUpdateWidget.cpp - LTMControlWidget.cpp gui_utils.cpp lifecycle.cpp + LTMControlWidget.cpp + PeriodicUpdateWidget.cpp + + instance/GroupBox.cpp instance/ImageView.cpp instance/InstanceView.cpp - instance/InstanceViewWithToolBar.cpp + instance/WidgetsWithToolbar.cpp instance/sanitize_typename.cpp instance/serialize_path.cpp @@ -49,16 +51,17 @@ set(SOURCES set(HEADERS MemoryViewer.h - PeriodicUpdateWidget.h - LTMControlWidget.h - TreeWidgetBuilder.h gui_utils.h lifecycle.h + LTMControlWidget.h + PeriodicUpdateWidget.h + TreeWidgetBuilder.h + instance/GroupBox.h instance/ImageView.h instance/InstanceView.h - instance/InstanceViewWithToolBar.h + instance/WidgetsWithToolbar.h instance/sanitize_typename.h instance/serialize_path.h diff --git a/source/RobotAPI/libraries/armem_gui/instance/InstanceView.cpp b/source/RobotAPI/libraries/armem_gui/instance/InstanceView.cpp index 8e82b4a7e7457a31865f28819888b825ae2806c8..fbb6f669510458188e88ad598cc16e2d76276359 100644 --- a/source/RobotAPI/libraries/armem_gui/instance/InstanceView.cpp +++ b/source/RobotAPI/libraries/armem_gui/instance/InstanceView.cpp @@ -29,7 +29,7 @@ #include <RobotAPI/libraries/armem_gui/instance/tree_builders/DataTreeBuilder.h> #include <RobotAPI/libraries/armem_gui/instance/tree_builders/TypedDataTreeBuilder.h> -#include "InstanceViewWithToolBar.h" +#include "WidgetsWithToolbar.h" namespace armarx::armem::gui::instance @@ -80,6 +80,7 @@ namespace armarx::armem::gui::instance { item->setExpanded(true); } + treeItemMetadata->setExpanded(false); tree->setContextMenuPolicy(Qt::CustomContextMenu); connect(tree, &QTreeWidget::customContextMenuRequested, this, &This::prepareTreeContextMenu); @@ -146,13 +147,20 @@ namespace armarx::armem::gui::instance void InstanceView::addInstanceView(const wm::EntityInstance& instance, aron::typenavigator::ObjectNavigatorPtr aronType) { ARMARX_IMPORTANT << "Adding instance view with toolbar for instance: " << instance.id(); - InstanceViewWithToolBar* child = new InstanceViewWithToolBar(); - child->view->setStatusLabel(statusLabel); - child->view->setUseTypeInfo(useTypeInfo); + InstanceView* view = new InstanceView; + view->setStatusLabel(statusLabel); + view->setUseTypeInfo(useTypeInfo); + + WidgetsWithToolbar* child = new WidgetsWithToolbar(); + child->addWidget(view); + splitter->addWidget(child); - child->view->update(instance, aronType); + // Propagate this signal upwards. + connect(view, &InstanceView::memoryIdResolutionRequested, this, &This::memoryIdResolutionRequested); + + view->update(instance, aronType); } @@ -283,7 +291,18 @@ namespace armarx::armem::gui::instance } if (!imageView) { - imageView = ImageView(splitter); + WidgetsWithToolbar* toolbar = new WidgetsWithToolbar(); + + imageView = new ImageView(); + imageView->toolbar = toolbar; + toolbar->addWidget(imageView); + + splitter->addWidget(toolbar); + + connect(toolbar, &WidgetsWithToolbar::closing, [this]() + { + imageView = nullptr; + }); } imageView->elementPath = elementPath; updateImageView(currentInstance->data()); @@ -291,9 +310,8 @@ namespace armarx::armem::gui::instance void InstanceView::removeImageView() { - imageView->group->hide(); - imageView->group->deleteLater(); - imageView = std::nullopt; + imageView->toolbar->close(); + imageView = nullptr; } void InstanceView::requestMemoryIdResolution(const aron::Path& elementPath) @@ -405,28 +423,25 @@ namespace armarx::armem::gui::instance std::stringstream title; title << "Image element '" << imageView->elementPath.toString() << "'"; // of entity instance " << currentInstance->id(); - imageView->group->setTitle(QString::fromStdString(title.str())); + imageView->setTitle(QString::fromStdString(title.str())); imageView->view->setImage(QImage(imageData->getData(), shape.at(0), shape.at(1), format)); } - InstanceView::ImageView::ImageView(QSplitter* parent) + InstanceView::ImageView::ImageView() { - group = new QGroupBox(); - parent->addWidget(group); - - group->setLayout(new QHBoxLayout()); + setLayout(new QHBoxLayout()); int margin = 2; - group->layout()->setContentsMargins(margin, margin, margin, margin); + layout()->setContentsMargins(margin, margin, margin, margin); if (false) { - QFont font = group->font(); + QFont font = this->font(); font.setPointSizeF(font.pointSize() * 0.75); - group->setFont(font); + setFont(font); } view = new instance::ImageView(); - group->layout()->addWidget(view); + layout()->addWidget(view); } } diff --git a/source/RobotAPI/libraries/armem_gui/instance/InstanceView.h b/source/RobotAPI/libraries/armem_gui/instance/InstanceView.h index 371112ee51b44b1174971c1648958ae36904072e..504b0e9eaef4d7225a15b90598d0b7e51ad02692 100644 --- a/source/RobotAPI/libraries/armem_gui/instance/InstanceView.h +++ b/source/RobotAPI/libraries/armem_gui/instance/InstanceView.h @@ -3,6 +3,7 @@ #include <optional> #include <QWidget> +#include <QGroupBox> #include <RobotAPI/libraries/aron/core/navigator/type/container/Object.h> @@ -19,6 +20,7 @@ class QTreeWidgetItem; namespace armarx::armem::gui::instance { class ImageView; + class WidgetsWithToolbar; class InstanceView : public QWidget @@ -89,16 +91,17 @@ namespace armarx::armem::gui::instance QTreeWidgetItem* treeItemData; - class ImageView + class ImageView : public QGroupBox { public: - ImageView(QSplitter* parent); + ImageView(); - QGroupBox* group; instance::ImageView* view; aron::Path elementPath; + + WidgetsWithToolbar* toolbar; }; - std::optional<ImageView> imageView; + ImageView* imageView = nullptr; QLabel* statusLabel = nullptr; diff --git a/source/RobotAPI/libraries/armem_gui/instance/InstanceViewWithToolBar.cpp b/source/RobotAPI/libraries/armem_gui/instance/WidgetsWithToolbar.cpp similarity index 67% rename from source/RobotAPI/libraries/armem_gui/instance/InstanceViewWithToolBar.cpp rename to source/RobotAPI/libraries/armem_gui/instance/WidgetsWithToolbar.cpp index 0f0493a23ece7af2a7756e387a367408c3fa5873..b41ce7649aa21303658ed3a400f691e5efca1d0e 100644 --- a/source/RobotAPI/libraries/armem_gui/instance/InstanceViewWithToolBar.cpp +++ b/source/RobotAPI/libraries/armem_gui/instance/WidgetsWithToolbar.cpp @@ -20,7 +20,7 @@ * GNU General Public License */ -#include "InstanceViewWithToolBar.h" +#include "WidgetsWithToolbar.h" #include <QAction> #include <QHBoxLayout> @@ -36,32 +36,44 @@ namespace armarx::armem::gui::instance { - InstanceViewWithToolBar::InstanceViewWithToolBar(QWidget* parent) : QWidget(parent) + WidgetsWithToolbar::WidgetsWithToolbar(QWidget* parent) : QWidget(parent) { const int margin = 0; this->setContentsMargins(margin, margin, margin, margin); - QHBoxLayout* layout = new QHBoxLayout(); - this->setLayout(layout); - layout->setContentsMargins(margin, margin, margin, margin); - layout->setSpacing(0); + _layout = new QHBoxLayout(); + this->setLayout(_layout); + _layout->setContentsMargins(margin, margin, margin, margin); + _layout->setSpacing(0); - view = new InstanceView(); - toolbar = new QToolBar(); toolbar->setOrientation(Qt::Orientation::Vertical); toolbar->setContentsMargins(margin, margin, margin, margin); QAction* action = toolbar->addAction(QIcon(":/icons/dialog-close.ico"), "Close", [this]() { - ARMARX_IMPORTANT << "Closing instance view ..."; - this->deleteLater(); + this->close(); }); action->setToolTip("Remove this instance view"); - layout->addWidget(view); - layout->addWidget(toolbar); + _layout->addWidget(toolbar); + } + + + void WidgetsWithToolbar::addWidget(QWidget* widget) + { + ARMARX_CHECK_GREATER_EQUAL(_layout->count(), 1); + _layout->insertWidget(_layout->count() - 1, widget); + } + + void WidgetsWithToolbar::close() + { + // ARMARX_IMPORTANT << "Closing instance view ..."; + emit closing(); + + this->hide(); + this->deleteLater(); } } diff --git a/source/RobotAPI/libraries/armem_gui/instance/InstanceViewWithToolBar.h b/source/RobotAPI/libraries/armem_gui/instance/WidgetsWithToolbar.h similarity index 81% rename from source/RobotAPI/libraries/armem_gui/instance/InstanceViewWithToolBar.h rename to source/RobotAPI/libraries/armem_gui/instance/WidgetsWithToolbar.h index c486eeee4d1c7c00759a40a69dbc1de47ec96e3b..8d2f2a00aa0d2ee74d47f95ce88e49b85b3392e4 100644 --- a/source/RobotAPI/libraries/armem_gui/instance/InstanceViewWithToolBar.h +++ b/source/RobotAPI/libraries/armem_gui/instance/WidgetsWithToolbar.h @@ -31,24 +31,28 @@ class QToolBar; namespace armarx::armem::gui::instance { - - class InstanceView; - - class InstanceViewWithToolBar : public QWidget + class WidgetsWithToolbar : public QWidget { Q_OBJECT - using This = InstanceViewWithToolBar; + using This = WidgetsWithToolbar; public: - InstanceViewWithToolBar(QWidget* parent = nullptr); + WidgetsWithToolbar(QWidget* parent = nullptr); + void addWidget(QWidget* widget); public slots: + void close(); + + signals: + void closing(); + + protected slots: signals: @@ -59,13 +63,12 @@ namespace armarx::armem::gui::instance public: - InstanceView* view; - QToolBar* toolbar; private: + QHBoxLayout* _layout; }; }