From 2e287944f098de8377acf0cb42cf6cde6a9ea588 Mon Sep 17 00:00:00 2001
From: Mikhail Svechnikov <svechnikovmv@gmail.com>
Date: Fri, 10 Feb 2023 15:09:27 +0100
Subject: [PATCH] restore project notification about changed state

---
 GUI/View/Mask/MaskEditorActions.cpp           |  4 ++
 GUI/View/Mask/MaskEditorPropertyPanel.cpp     | 39 ++++++++++---------
 GUI/View/Mask/MaskGraphicsScene.cpp           | 20 +++++++++-
 GUI/View/Mask/MaskGraphicsScene.h             |  2 +
 .../Projection/ProjectionsEditorActions.cpp   |  2 +
 5 files changed, 46 insertions(+), 21 deletions(-)

diff --git a/GUI/View/Mask/MaskEditorActions.cpp b/GUI/View/Mask/MaskEditorActions.cpp
index 874b2a580e0..13eaccfa8de 100644
--- a/GUI/View/Mask/MaskEditorActions.cpp
+++ b/GUI/View/Mask/MaskEditorActions.cpp
@@ -15,6 +15,7 @@
 #include "GUI/View/Mask/MaskEditorActions.h"
 #include "GUI/Model/Device/MaskItems.h"
 #include "GUI/Model/Model/SessionModel.h"
+#include "GUI/Model/Project/ProjectDocument.h"
 #include "GUI/Util/ActionFactory.h"
 #include <QAction>
 #include <QItemSelectionModel>
@@ -112,6 +113,7 @@ void MaskEditorActions::onDeleteMaskAction()
         m_maskContainerModel->removeMaskAt(indexes.back().row());
         indexes = m_selectionModel->selectedIndexes();
     }
+    gProjectDocument.value()->setModified();
 }
 
 //! Performs switch of mask value for all selected items (true -> false, false -> true)
@@ -123,6 +125,7 @@ void MaskEditorActions::onToggleMaskValueAction()
         if (MaskItem* item = m_maskContainerModel->itemForIndex(itemIndex))
             item->setMaskValue(!item->maskValue());
     }
+    gProjectDocument.value()->setModified();
 }
 
 void MaskEditorActions::onBringToFrontAction()
@@ -160,6 +163,7 @@ void MaskEditorActions::changeMaskStackingOrder(MaskEditorFlags::Stacking value)
                 m_maskContainerModel->moveMask(row, new_row);
         }
     }
+    gProjectDocument.value()->setModified();
 }
 
 //! Returns true if at least one of MaskItems in the selection can be moved one level up
diff --git a/GUI/View/Mask/MaskEditorPropertyPanel.cpp b/GUI/View/Mask/MaskEditorPropertyPanel.cpp
index 9ff6e8cb7a4..b4954fb8caa 100644
--- a/GUI/View/Mask/MaskEditorPropertyPanel.cpp
+++ b/GUI/View/Mask/MaskEditorPropertyPanel.cpp
@@ -16,12 +16,12 @@
 #include "GUI/Model/Data/IntensityDataItem.h"
 #include "GUI/Model/Device/MaskItems.h"
 #include "GUI/Model/Model/SessionModel.h"
+#include "GUI/Model/Project/ProjectDocument.h"
 #include "GUI/View/Common/DoubleSpinBox.h"
 #include "GUI/View/Plot2D/IntensityDataPropertyWidget.h"
 #include "GUI/View/Tool/EditUtil.h"
 #include "GUI/View/Tool/GroupBoxCollapser.h"
 #include "GUI/View/Tool/LayoutUtils.h"
-
 #include <QCheckBox>
 #include <QFormLayout>
 #include <QGroupBox>
@@ -175,12 +175,12 @@ void MaskEditorPropertyPanel::createMaskEditorUI()
     auto* maskItem = m_currentMaskItem; // shorthand
     // -- mask value (only if not RoI)
     if (!dynamic_cast<RegionOfInterestItem*>(maskItem)) {
-        const auto maskValueGetter = [=] { return maskItem->maskValue(); };
-        const auto maskValueSetter = [=](bool b) { maskItem->setMaskValue(b); };
+        const auto maskValueGetter = [maskItem] { return maskItem->maskValue(); };
+        const auto maskValueSetter = [maskItem](bool b) { maskItem->setMaskValue(b); };
         addMaskCheckBox("Mask value", maskValueGetter, maskValueSetter);
     }
     // -- mask visibility
-    const auto visibilityValueGetter = [=] { return maskItem->isVisibleValue(); };
+    const auto visibilityValueGetter = [maskItem] { return maskItem->isVisibleValue(); };
     const auto visibilityValueSetter = [=](bool b) {
         m_inhibitSelectionChange = true;
         maskItem->setIsVisibleValue(b);
@@ -191,46 +191,47 @@ void MaskEditorPropertyPanel::createMaskEditorUI()
     // -- name (only if not RoI)
     if (!dynamic_cast<RegionOfInterestItem*>(maskItem)) {
         auto* edit = new QLineEdit(maskItem->maskName(), m_maskPropertiesLayout->parentWidget());
-        connect(edit, &QLineEdit::textEdited, [=](const QString& t) { maskItem->setMaskName(t); });
+        connect(edit, &QLineEdit::textEdited, [maskItem](const QString& t) { maskItem->setMaskName(t); });
+        connect(edit, &QLineEdit::editingFinished, [] { gProjectDocument.value()->setModified(); });
         m_maskPropertiesLayout->addRow("Name:", edit);
     }
 
     if (auto* c = dynamic_cast<RectangleItem*>(maskItem)) {
         addMaskSpinBox(
-            "xlow", [=] { return c->xLow(); }, [=](double v) { c->setXLow(v); },
+            "xlow", [c] { return c->xLow(); }, [c](double v) { c->setXLow(v); },
             RealLimits::limitless());
         addMaskSpinBox(
-            "ylow", [=] { return c->yLow(); }, [=](double v) { c->setYLow(v); },
+            "ylow", [c] { return c->yLow(); }, [c](double v) { c->setYLow(v); },
             RealLimits::limitless());
         addMaskSpinBox(
-            "xup", [=] { return c->xUp(); }, [=](double v) { c->setXUp(v); },
+            "xup", [c] { return c->xUp(); }, [c](double v) { c->setXUp(v); },
             RealLimits::limitless());
         addMaskSpinBox(
-            "yup", [=] { return c->yUp(); }, [=](double v) { c->setYUp(v); },
+            "yup", [c] { return c->yUp(); }, [c](double v) { c->setYUp(v); },
             RealLimits::limitless());
     } else if (auto* c = dynamic_cast<EllipseItem*>(maskItem)) {
         addMaskSpinBox(
-            "X center", [=] { return c->xCenter(); }, [=](double v) { c->setXCenter(v); },
+            "X center", [c] { return c->xCenter(); }, [c](double v) { c->setXCenter(v); },
             RealLimits::limitless());
         addMaskSpinBox(
-            "Y center", [=] { return c->yCenter(); }, [=](double v) { c->setYCenter(v); },
+            "Y center", [c] { return c->yCenter(); }, [c](double v) { c->setYCenter(v); },
             RealLimits::limitless());
         addMaskSpinBox(
-            "X radius", [=] { return c->xRadius(); }, [=](double v) { c->setXRadius(v); },
+            "X radius", [c] { return c->xRadius(); }, [c](double v) { c->setXRadius(v); },
             RealLimits::nonnegative());
         addMaskSpinBox(
-            "Y radius", [=] { return c->yRadius(); }, [=](double v) { c->setYRadius(v); },
+            "Y radius", [c] { return c->yRadius(); }, [c](double v) { c->setYRadius(v); },
             RealLimits::nonnegative());
         addMaskSpinBox(
-            "Angle", [=] { return c->angle(); }, [=](double v) { c->setAngle(v); },
+            "Angle", [c] { return c->angle(); }, [c](double v) { c->setAngle(v); },
             RealLimits::limitless());
     } else if (auto* c = dynamic_cast<VerticalLineItem*>(maskItem))
         addMaskSpinBox(
-            "X position", [=] { return c->posX(); }, [=](double v) { c->setPosX(v); },
+            "X position", [c] { return c->posX(); }, [c](double v) { c->setPosX(v); },
             RealLimits::limitless());
     else if (auto* c = dynamic_cast<HorizontalLineItem*>(maskItem))
         addMaskSpinBox(
-            "Y position", [=] { return c->posY(); }, [=](double v) { c->setPosY(v); },
+            "Y position", [c] { return c->posY(); }, [c](double v) { c->setPosY(v); },
             RealLimits::limitless());
 }
 
@@ -243,7 +244,7 @@ void MaskEditorPropertyPanel::addMaskSpinBox(const QString& label, function<doub
     spinBox->setValue(getter());
 
     connect(spinBox, &QDoubleSpinBox::valueChanged, this,
-            [=](double newValue) { setter(newValue); });
+            [setter](double newVal) { setter(newVal); gProjectDocument.value()->setModified(); });
     connect(m_currentMaskItem, &MaskItem::maskGeometryChanged, spinBox, [=] {
         QSignalBlocker b(spinBox);
         spinBox->setValue(getter());
@@ -257,9 +258,9 @@ void MaskEditorPropertyPanel::addMaskCheckBox(const QString& title, function<boo
 {
     auto* checkBox = new QCheckBox(title, m_maskPropertiesLayout->parentWidget());
     checkBox->setChecked(getter());
-    connect(checkBox, &QCheckBox::stateChanged, [=]() { setter(checkBox->isChecked()); });
+    connect(checkBox, &QCheckBox::stateChanged, this, [setter, checkBox]() { setter(checkBox->isChecked()); gProjectDocument.value()->setModified(); });
 
-    connect(m_currentMaskItem, &MaskItem::maskVisibilityChanged, this, [=]() {
+    connect(m_currentMaskItem, &MaskItem::maskVisibilityChanged, this, [checkBox, getter]() {
         QSignalBlocker b(checkBox);
         checkBox->setChecked(getter());
     });
diff --git a/GUI/View/Mask/MaskGraphicsScene.cpp b/GUI/View/Mask/MaskGraphicsScene.cpp
index 342736ceecf..5146edcee99 100644
--- a/GUI/View/Mask/MaskGraphicsScene.cpp
+++ b/GUI/View/Mask/MaskGraphicsScene.cpp
@@ -18,6 +18,7 @@
 #include "GUI/Model/Data/ProjectionItems.h"
 #include "GUI/Model/Device/MaskItems.h"
 #include "GUI/Model/MakeItem/ItemFactory.h"
+#include "GUI/Model/Project/ProjectDocument.h"
 #include "GUI/Util/Error.h"
 #include "GUI/View/Mask/ColorMapSceneAdaptor.h"
 #include "GUI/View/Mask/MaskGraphicsProxy.h"
@@ -235,6 +236,9 @@ void MaskGraphicsScene::onSceneSelectionChanged()
 
     m_block_selection = true;
 
+    if (!m_selectionModel)
+        return;
+
     m_selectionModel->clearSelection();
 
     for (QGraphicsItem* graphicsItem : selectedItems()) {
@@ -250,6 +254,9 @@ void MaskGraphicsScene::onSceneSelectionChanged()
 
 void MaskGraphicsScene::mousePressEvent(QGraphicsSceneMouseEvent* event)
 {
+    if (Qt::LeftButton)
+        m_mouse_is_pressed = true;
+
     if (event->buttons() & Qt::RightButton) {
         if (isDrawingInProgress())
             cancelCurrentDrawing();
@@ -294,6 +301,8 @@ void MaskGraphicsScene::mouseMoveEvent(QGraphicsSceneMouseEvent* event)
 
 void MaskGraphicsScene::mouseReleaseEvent(QGraphicsSceneMouseEvent* event)
 {
+    m_mouse_is_pressed = false;
+
     if (isDrawingInProgress()) {
         if (m_context.isRectangleShapeMode()) {
             clearSelection();
@@ -420,6 +429,12 @@ IShape2DView* MaskGraphicsScene::addViewForItem(MaskItemObject* item)
     return view;
 }
 
+void MaskGraphicsScene::onMaskMove()
+{
+    if(m_mouse_is_pressed)
+        gProjectDocument.value()->setModified(); // manual mask movement
+}
+
 //! Removes single view from scene.
 
 void MaskGraphicsScene::removeItemViewFromScene(MaskItemObject *item)
@@ -543,7 +558,9 @@ bool MaskGraphicsScene::isDrawingInProgress() const
 void MaskGraphicsScene::setDrawingInProgress(bool value)
 {
     m_context.setDrawingInProgress(value);
-    if (!value)
+    if (value)
+        gProjectDocument.value()->setModified(); // manual mask creation
+    else
         m_currentItem = nullptr;
 }
 
@@ -691,7 +708,6 @@ void MaskGraphicsScene::processLineItem(QGraphicsSceneMouseEvent* event)
     m_maskContainerItem->updateMaskNames();
     dynamic_cast<MaskItem*>(m_currentItem)->setMaskValue(m_context.getMaskValue());
 
-    subscribeMaskItem(m_currentItem);
     emit lineItemProcessed();
 
     setDrawingInProgress(false);
diff --git a/GUI/View/Mask/MaskGraphicsScene.h b/GUI/View/Mask/MaskGraphicsScene.h
index c1e6ef6cebf..aa6c89bb58d 100644
--- a/GUI/View/Mask/MaskGraphicsScene.h
+++ b/GUI/View/Mask/MaskGraphicsScene.h
@@ -68,6 +68,7 @@ private slots:
     void onSessionSelectionChanged(const QItemSelection& /* selected */,
                                    const QItemSelection& /* deselected */);
     void onSceneSelectionChanged();
+    void onMaskMove();
 
 protected:
     void mousePressEvent(QGraphicsSceneMouseEvent* event) override;
@@ -117,6 +118,7 @@ private:
     MaskGraphicsProxy* m_proxy = nullptr;
     QSharedPointer<ISceneAdaptor> m_adaptor;
     bool m_block_selection = false;
+    bool m_mouse_is_pressed = false;
     IntensityDataItem* m_intensityItem = nullptr;
     MaskItemObject* m_currentItem = nullptr;
     QPointF m_currentMousePosition;
diff --git a/GUI/View/Projection/ProjectionsEditorActions.cpp b/GUI/View/Projection/ProjectionsEditorActions.cpp
index e4381961da7..af2d15549ec 100644
--- a/GUI/View/Projection/ProjectionsEditorActions.cpp
+++ b/GUI/View/Projection/ProjectionsEditorActions.cpp
@@ -16,6 +16,7 @@
 #include "GUI/Model/Data/IntensityDataItem.h"
 #include "GUI/Model/Data/ProjectionItems.h"
 #include "GUI/Model/Model/SessionModel.h"
+#include "GUI/Model/Project/ProjectDocument.h"
 #include "GUI/View/Projection/SaveProjectionsAssistant.h"
 #include <QAction>
 #include <QItemSelectionModel>
@@ -77,6 +78,7 @@ void ProjectionsEditorActions::onDeleteAction()
         m_maskContainerModel->removeMaskAt(indexes.back().row());
         indexes = m_selectionModel->selectedIndexes();
     }
+    gProjectDocument.value()->setModified();
 }
 
 //! Performs saving of projections in ascii file
-- 
GitLab