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