From d6ad5a66551411adf9f15a21f560a957d6be3a22 Mon Sep 17 00:00:00 2001 From: Mikhail Svechnikov <m.svechnikov@fz-juelich.de> Date: Mon, 9 Dec 2024 10:09:20 +0100 Subject: [PATCH] fix "bulb" action compatibility issues --- GUI/View/Canvas/MaskEditorCanvas.cpp | 10 ++++++++-- GUI/View/Overlay/IMaskOverlay.cpp | 4 ++-- GUI/View/Scene/MaskGraphicsScene.cpp | 4 +++- GUI/View/Scene/MaskGraphicsScene.h | 3 ++- GUI/View/Setup/MasksPanel.cpp | 5 ++--- GUI/View/Setup/MasksPanel.h | 1 - 6 files changed, 17 insertions(+), 10 deletions(-) diff --git a/GUI/View/Canvas/MaskEditorCanvas.cpp b/GUI/View/Canvas/MaskEditorCanvas.cpp index 4350548774b..4cdfd68225a 100644 --- a/GUI/View/Canvas/MaskEditorCanvas.cpp +++ b/GUI/View/Canvas/MaskEditorCanvas.cpp @@ -131,8 +131,6 @@ void MaskEditorCanvas::updateCanvas(Data2DItem* data_item) void MaskEditorCanvas::changeMaskDisplay(bool pixelized) { - m_scene->clearSelection(); // important to avoid crash (unsubscribe while calling subscribers) - ASSERT(m_data_item); if (pixelized) { @@ -152,9 +150,17 @@ void MaskEditorCanvas::changeMaskDisplay(bool pixelized) m_data_item->setInterpolated(m_backup_interpolated); } + // avoid excessive signaling because hiding overlays automatically causes their unselection + m_scene->connectOverlaySelection(false); + if (const auto* container = m_data_item->masks()) for (MaskItem* t : *container) t->setIsVisible(!pixelized && t->wasVisible()); + + m_scene->connectOverlaySelection(true); + + // trigger reselecting the overlay of the current mask item + emit m_data_item->masksRW()->setChanged(); } void MaskEditorCanvas::exportPlot() const diff --git a/GUI/View/Overlay/IMaskOverlay.cpp b/GUI/View/Overlay/IMaskOverlay.cpp index 9f3ff23df79..8c4406275c6 100644 --- a/GUI/View/Overlay/IMaskOverlay.cpp +++ b/GUI/View/Overlay/IMaskOverlay.cpp @@ -88,9 +88,9 @@ void IMaskOverlay::onVisibilityChange() m_block_on_property_change = true; if (auto* maskItem = dynamic_cast<MaskItem*>(parameterizedItem())) - this->setVisible(maskItem->isVisible()); + setVisible(maskItem->isVisible()); else - this->hide(); + hide(); onPropertyChange(); update(); diff --git a/GUI/View/Scene/MaskGraphicsScene.cpp b/GUI/View/Scene/MaskGraphicsScene.cpp index 34f448b487a..71c9279aed0 100644 --- a/GUI/View/Scene/MaskGraphicsScene.cpp +++ b/GUI/View/Scene/MaskGraphicsScene.cpp @@ -533,7 +533,9 @@ void MaskGraphicsScene::onSceneSelectionChanged() connectProjSet(false); if (!selectedMaskOverlay()) { - m_masks->setCurrentIndex(-1); + // if mask is not selected because it was hidden, do not switch Set to unselected state + if (m_masks->currentItem()->isVisible()) + m_masks->setCurrentIndex(-1); m_prjns->setCurrentIndex(-1); } else { const MaskItem* selected_item = maskItemForOverlay(selectedMaskOverlay()); diff --git a/GUI/View/Scene/MaskGraphicsScene.h b/GUI/View/Scene/MaskGraphicsScene.h index d47ef241863..175ec24bec3 100644 --- a/GUI/View/Scene/MaskGraphicsScene.h +++ b/GUI/View/Scene/MaskGraphicsScene.h @@ -47,6 +47,8 @@ public: ColorMap* colorMap() { return m_plot.get(); } + void connectOverlaySelection(bool isConnected); + signals: void mouseSelectionChanged(); void itemContextMenuRequest(const QPoint& point); @@ -81,7 +83,6 @@ private: void connectMaskSet(bool isConnected); void connectProjSet(bool isConnected); - void connectOverlaySelection(bool isConnected); void setDrawingInProgress(bool value); diff --git a/GUI/View/Setup/MasksPanel.cpp b/GUI/View/Setup/MasksPanel.cpp index 7872a8c3ee2..0a09c8953d9 100644 --- a/GUI/View/Setup/MasksPanel.cpp +++ b/GUI/View/Setup/MasksPanel.cpp @@ -103,8 +103,8 @@ void MasksPanel::updateMaskEditor() check_box->setChecked(t->maskValue()); connect(check_box, &QCheckBox::stateChanged, [t, check_box] { ASSERT(check_box); - t->setMaskValue(check_box->isChecked()); ASSERT(t); + t->setMaskValue(check_box->isChecked()); emit t->maskGeometryChanged(); gDoc->setModified(); }); @@ -116,11 +116,10 @@ void MasksPanel::updateMaskEditor() check_box->setChecked(t->isVisible()); connect(check_box, &QCheckBox::stateChanged, [this, t, check_box] { ASSERT(check_box); - m_keep_selection = true; ASSERT(t); t->setIsVisible(check_box->isChecked()); t->setWasVisible(check_box->isChecked()); - m_keep_selection = false; + emit m_set_source()->setChanged(); // reselect the overlay of the current mask item emit t->maskGeometryChanged(); gDoc->setModified(); }); diff --git a/GUI/View/Setup/MasksPanel.h b/GUI/View/Setup/MasksPanel.h index 51e129d9963..4d8daf30d60 100644 --- a/GUI/View/Setup/MasksPanel.h +++ b/GUI/View/Setup/MasksPanel.h @@ -41,7 +41,6 @@ private: std::function<MasksSet*()> m_set_source; SetView* m_set_view; QFormLayout* m_editor_layout; - bool m_keep_selection = false; bool m_mask_not_prjn; }; -- GitLab