From c8d22b1acbbdb22dd14ea3da24eb66e106bc04a9 Mon Sep 17 00:00:00 2001 From: Mikhail Svechnikov <m.svechnikov@fz-juelich.de> Date: Tue, 3 Dec 2024 14:46:51 +0100 Subject: [PATCH] select only one mask --- GUI/View/Canvas/MaskEditorCanvas.cpp | 2 +- GUI/View/Scene/MaskGraphicsScene.cpp | 50 ++++++++++++++++++++++++---- GUI/View/Scene/MaskGraphicsScene.h | 6 +++- GUI/View/Setup/Data2DToolbar.cpp | 2 +- 4 files changed, 50 insertions(+), 10 deletions(-) diff --git a/GUI/View/Canvas/MaskEditorCanvas.cpp b/GUI/View/Canvas/MaskEditorCanvas.cpp index 040d801ae53..4350548774b 100644 --- a/GUI/View/Canvas/MaskEditorCanvas.cpp +++ b/GUI/View/Canvas/MaskEditorCanvas.cpp @@ -69,7 +69,7 @@ MaskEditorCanvas::MaskEditorCanvas() , m_status_label(new PlotStatusLabel({m_scene->colorMap()})) , m_data_item(nullptr) { - setCanvasMode(Canvas2DMode::PAN_ZOOM); + setCanvasMode(Canvas2DMode::SELECTION); setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); setMinimumSize(400, 400); diff --git a/GUI/View/Scene/MaskGraphicsScene.cpp b/GUI/View/Scene/MaskGraphicsScene.cpp index c5af5ab8c0a..2e75c59aeab 100644 --- a/GUI/View/Scene/MaskGraphicsScene.cpp +++ b/GUI/View/Scene/MaskGraphicsScene.cpp @@ -86,6 +86,9 @@ MaskGraphicsScene::MaskGraphicsScene() m_viewport = new Viewport(m_plot.get()); addItem(m_viewport); // takes ownership + + connect(this, &MaskGraphicsScene::selectionChanged, this, + &MaskGraphicsScene::onSceneSelectionChanged); } MaskGraphicsScene::~MaskGraphicsScene() = default; @@ -117,6 +120,11 @@ void MaskGraphicsScene::associateItems(Data2DItem* data_item) m_prjns = data_item->prjnsRW(); ASSERT(m_masks); ASSERT(m_prjns); + + connect(m_masks, &MasksSet::setChanged, this, &MaskGraphicsScene::onSetChanged, + Qt::UniqueConnection); + connect(m_prjns, &MasksSet::setChanged, this, &MaskGraphicsScene::onSetChanged, + Qt::UniqueConnection); } void MaskGraphicsScene::updateSize(const QSize& newSize) @@ -190,6 +198,9 @@ void MaskGraphicsScene::onActivityChanged(Canvas2DMode::Flag mode) void MaskGraphicsScene::mousePressEvent(QGraphicsSceneMouseEvent* event) { + // forbid multiple visual selection + event->setModifiers(Qt::NoModifier); + if (event->buttons() & Qt::LeftButton) m_mouse_is_pressed = true; @@ -197,7 +208,7 @@ void MaskGraphicsScene::mousePressEvent(QGraphicsSceneMouseEvent* event) if (m_drawing_in_progress) cancelCurrentDrawing(); else - makeViewAtMousePosSelected(event); + selectOnlyItemAtMousePos(event); return; } @@ -235,6 +246,8 @@ void MaskGraphicsScene::mouseMoveEvent(QGraphicsSceneMouseEvent* event) void MaskGraphicsScene::mouseReleaseEvent(QGraphicsSceneMouseEvent* event) { + event->setModifiers(Qt::NoModifier); + m_mouse_is_pressed = false; if (!m_drawing_in_progress) @@ -242,12 +255,13 @@ void MaskGraphicsScene::mouseReleaseEvent(QGraphicsSceneMouseEvent* event) else if (Canvas2DMode::basedOnRectangle(m_mode)) { if (m_active_mask) { // drawing ended up with item drawn, let's make it selected - if (IOverlay* overlay = m_mask2overlay[m_active_mask]) - overlay->setSelected(true); + selectOnlyItemAtMousePos(event); + ASSERT(selectedItems().size() == 1); + ASSERT(selectedItems().first() == m_mask2overlay[m_active_mask]); } else { // drawing ended without item to be draw (too short mouse move) // making item beneath of mouse release position to be selected - makeViewAtMousePosSelected(event); + selectOnlyItemAtMousePos(event); } setDrawingInProgress(false); } @@ -396,6 +410,16 @@ void MaskGraphicsScene::removeOverlay(const OverlayItem* item) } } +void MaskGraphicsScene::onSetChanged() +{ + qInfo() << "onSetChanged"; +} + +void MaskGraphicsScene::onSceneSelectionChanged() +{ + qInfo() << "onSceneSelectionChanged"; +} + void MaskGraphicsScene::setDrawingInProgress(bool value) { m_drawing_in_progress = value; @@ -405,10 +429,22 @@ void MaskGraphicsScene::setDrawingInProgress(bool value) m_active_mask = nullptr; } -void MaskGraphicsScene::makeViewAtMousePosSelected(QGraphicsSceneMouseEvent* event) +void MaskGraphicsScene::selectOnlyItemAtMousePos(QGraphicsSceneMouseEvent* event) { - if (QGraphicsItem* graphicsItem = itemAt(event->scenePos(), QTransform())) - graphicsItem->setSelected(true); + blockSignals(true); + + auto old_selection = selectedItems(); + for (QGraphicsItem* otherItem : old_selection) + otherItem->setSelected(false); + + if (QGraphicsItem* clickedItem = itemAt(event->scenePos(), QTransform())) + if (clickedItem != m_viewport) + clickedItem->setSelected(true); + + blockSignals(false); + + if (old_selection != selectedItems()) + emit selectionChanged(); } //! Processes RectangleItem and EllipseItem drawing. diff --git a/GUI/View/Scene/MaskGraphicsScene.h b/GUI/View/Scene/MaskGraphicsScene.h index ccd03de8b51..be8669055df 100644 --- a/GUI/View/Scene/MaskGraphicsScene.h +++ b/GUI/View/Scene/MaskGraphicsScene.h @@ -47,6 +47,7 @@ public: ColorMap* colorMap() { return m_plot.get(); } signals: + void mouseSelectionChanged(); void itemContextMenuRequest(const QPoint& point); void lineItemProcessed(); void lineItemMoved(LineItem* sender); @@ -68,9 +69,12 @@ private: IOverlay* registerOverlay(OverlayItem* item); void removeOverlay(const OverlayItem* item); + void onSetChanged(); + void onSceneSelectionChanged(); + void setDrawingInProgress(bool value); - void makeViewAtMousePosSelected(QGraphicsSceneMouseEvent* event); + void selectOnlyItemAtMousePos(QGraphicsSceneMouseEvent* event); void processRectangleOrEllipseItem(QGraphicsSceneMouseEvent* event); void processPolygonItem(QGraphicsSceneMouseEvent* event); diff --git a/GUI/View/Setup/Data2DToolbar.cpp b/GUI/View/Setup/Data2DToolbar.cpp index 3ddbc53a42d..9bf18730a9a 100644 --- a/GUI/View/Setup/Data2DToolbar.cpp +++ b/GUI/View/Setup/Data2DToolbar.cpp @@ -35,6 +35,7 @@ Data2DToolbar::Data2DToolbar(bool mask_tools) selection_button->setIcon(QIcon(":/images/mask/arrow.svg")); selection_button->setToolTip("Select/modify mask"); selection_button->setCheckable(true); + selection_button->setChecked(true); addWidget(selection_button); m_activity_button_group->addButton(selection_button, Canvas2DMode::SELECTION); @@ -43,7 +44,6 @@ Data2DToolbar::Data2DToolbar(bool mask_tools) pan_button->setToolTip("Pan/zoom mode (space)\n" "Drag axes with the mouse, use mouse wheel to zoom in/out"); pan_button->setCheckable(true); - pan_button->setChecked(true); addWidget(pan_button); m_activity_button_group->addButton(pan_button, Canvas2DMode::PAN_ZOOM); -- GitLab