From 149aa99bbb84a6bc8a4faf0309de35e10f574caf Mon Sep 17 00:00:00 2001
From: "Joachim Wuttke (o)" <j.wuttke@fz-juelich.de>
Date: Thu, 7 Dec 2023 15:53:56 +0100
Subject: [PATCH 01/18] MaskItem internally use DoubleProperty

---
 GUI/Model/Mask/MaskItems.cpp | 33 +++++++++++++---------
 GUI/Model/Mask/MaskItems.h   | 53 ++++++++++++++++++------------------
 2 files changed, 47 insertions(+), 39 deletions(-)

diff --git a/GUI/Model/Mask/MaskItems.cpp b/GUI/Model/Mask/MaskItems.cpp
index 8887dfa3d4a..3740badd52e 100644
--- a/GUI/Model/Mask/MaskItems.cpp
+++ b/GUI/Model/Mask/MaskItems.cpp
@@ -57,6 +57,7 @@ void MaskItem::setMaskValue(bool mask_value)
     m_maskValue = mask_value;
     emit maskVisibilityChanged();
 }
+
 void MaskItem::setIsVisible(bool visible)
 {
     m_isVisible = visible;
@@ -127,24 +128,25 @@ std::unique_ptr<IShape2D> RectangleItem::createShape() const
     double yup = yUp();
     return std::make_unique<Rectangle>(xlow, ylow, xup, yup);
 }
+
 void RectangleItem::setXLow(double val)
 {
-    m_xLow = val;
+    m_xLow.setValue(val);
     emit maskGeometryChanged();
 }
 void RectangleItem::setYLow(double val)
 {
-    m_yLow = val;
+    m_yLow.setValue(val);
     emit maskGeometryChanged();
 }
 void RectangleItem::setXUp(double val)
 {
-    m_xUp = val;
+    m_xUp.setValue(val);
     emit maskGeometryChanged();
 }
 void RectangleItem::setYUp(double val)
 {
-    m_yUp = val;
+    m_yUp.setValue(val);
     emit maskGeometryChanged();
 }
 
@@ -234,14 +236,15 @@ std::unique_ptr<IShape2D> RegionOfInterestItem::createShape() const
 /* ------------------------------------------------------------------------- */
 
 PolygonPointItem::PolygonPointItem() = default;
+
 void PolygonPointItem::setPosX(double val)
 {
-    m_posX = val;
+    m_posX.setValue(val);
     emit maskGeometryChanged();
 }
 void PolygonPointItem::setPosY(double val)
 {
-    m_posY = val;
+    m_posY.setValue(val);
     emit maskGeometryChanged();
 }
 
@@ -282,6 +285,7 @@ std::unique_ptr<IShape2D> PolygonItem::createShape() const
     }
     return std::make_unique<Polygon>(x, y);
 }
+
 void PolygonItem::setIsClosed(bool closed)
 {
     m_isClosed = closed;
@@ -366,9 +370,10 @@ std::unique_ptr<IShape2D> VerticalLineItem::createShape() const
 {
     return std::make_unique<VerticalLine>(posX());
 }
+
 void VerticalLineItem::setPosX(double val)
 {
-    m_posX = val;
+    m_posX.setValue(val);
     emit maskGeometryChanged(this);
 }
 
@@ -421,9 +426,10 @@ std::unique_ptr<IShape2D> HorizontalLineItem::createShape() const
 {
     return std::make_unique<HorizontalLine>(posY());
 }
+
 void HorizontalLineItem::setPosY(double pos_y)
 {
-    m_posY = pos_y;
+    m_posY.setValue(pos_y);
     emit maskGeometryChanged(this);
 }
 
@@ -482,29 +488,30 @@ std::unique_ptr<IShape2D> EllipseItem::createShape() const
 
     return std::make_unique<Ellipse>(xcenter, ycenter, xradius, yradius, _angle);
 }
+
 void EllipseItem::setXCenter(double val)
 {
-    m_xCenter = val;
+    m_xCenter.setValue(val);
     emit maskGeometryChanged();
 }
 void EllipseItem::setYCenter(double val)
 {
-    m_yCenter = val;
+    m_yCenter.setValue(val);
     emit maskGeometryChanged();
 }
 void EllipseItem::setXRadius(double val)
 {
-    m_xRadius = val;
+    m_xRadius.setValue(val);
     emit maskGeometryChanged();
 }
 void EllipseItem::setYRadius(const double val)
 {
-    m_yRadius = val;
+    m_yRadius.setValue(val);
     emit maskGeometryChanged();
 }
 void EllipseItem::setAngle(const double val)
 {
-    m_angle = val;
+    m_angle.setValue(val);
     emit maskGeometryChanged();
 }
 
diff --git a/GUI/Model/Mask/MaskItems.h b/GUI/Model/Mask/MaskItems.h
index 5e7838c6922..7f7dfe9c89e 100644
--- a/GUI/Model/Mask/MaskItems.h
+++ b/GUI/Model/Mask/MaskItems.h
@@ -16,6 +16,7 @@
 #define BORNAGAIN_GUI_MODEL_MASK_MASKITEMS_H
 
 #include "Base/Types/OwningVector.h"
+#include "GUI/Model/Descriptor/DoubleProperty.h"
 #include "GUI/Model/Descriptor/SelectionProperty.h"
 #include "GUI/Model/Mask/MaskObject.h"
 
@@ -57,13 +58,13 @@ public:
     explicit RectangleItem();
     std::unique_ptr<IShape2D> createShape() const override;
 
-    double xLow() const { return m_xLow; }
+    double xLow() const { return m_xLow.value(); }
     void setXLow(double val);
-    double yLow() const { return m_yLow; }
+    double yLow() const { return m_yLow.value(); }
     void setYLow(double val);
-    double xUp() const { return m_xUp; }
+    double xUp() const { return m_xUp.value(); }
     void setXUp(double val);
-    double yUp() const { return m_yUp; }
+    double yUp() const { return m_yUp.value(); }
     void setYUp(double val);
 
     void writeTo(QXmlStreamWriter* w) const override;
@@ -73,10 +74,10 @@ protected:
     explicit RectangleItem(const QString& modelType);
 
 private:
-    double m_xLow;
-    double m_yLow;
-    double m_xUp;
-    double m_yUp;
+    DoubleProperty m_xLow;
+    DoubleProperty m_yLow;
+    DoubleProperty m_xUp;
+    DoubleProperty m_yUp;
 };
 
 class RegionOfInterestItem : public RectangleItem {
@@ -89,17 +90,17 @@ class PolygonPointItem : public MaskObject {
 public:
     PolygonPointItem();
 
-    double posX() const { return m_posX; }
+    double posX() const { return m_posX.value(); }
     void setPosX(double val);
-    double posY() const { return m_posY; }
+    double posY() const { return m_posY.value(); }
     void setPosY(double val);
 
     void writeTo(QXmlStreamWriter* w) const;
     void readFrom(QXmlStreamReader* r);
 
 private:
-    double m_posX = 0;
-    double m_posY = 0;
+    DoubleProperty m_posX;
+    DoubleProperty m_posY;
 };
 
 class PolygonItem : public MaskItem {
@@ -126,14 +127,14 @@ public:
     VerticalLineItem();
     std::unique_ptr<IShape2D> createShape() const override;
 
-    double posX() const { return m_posX; }
+    double posX() const { return m_posX.value(); }
     void setPosX(double val);
 
     void writeTo(QXmlStreamWriter* w) const override;
     void readFrom(QXmlStreamReader* r) override;
 
 private:
-    double m_posX = 0;
+    DoubleProperty m_posX;
 };
 
 class HorizontalLineItem : public MaskItem {
@@ -141,14 +142,14 @@ public:
     HorizontalLineItem();
     std::unique_ptr<IShape2D> createShape() const override;
 
-    double posY() const { return m_posY; }
+    double posY() const { return m_posY.value(); }
     void setPosY(double pos_y);
 
     void writeTo(QXmlStreamWriter* w) const override;
     void readFrom(QXmlStreamReader* r) override;
 
 private:
-    double m_posY = 0;
+    DoubleProperty m_posY;
 };
 
 class EllipseItem : public MaskItem {
@@ -156,30 +157,30 @@ public:
     EllipseItem();
     std::unique_ptr<IShape2D> createShape() const override;
 
-    double xCenter() const { return m_xCenter; }
+    double xCenter() const { return m_xCenter.value(); }
     void setXCenter(double val);
 
-    double yCenter() const { return m_yCenter; }
+    double yCenter() const { return m_yCenter.value(); }
     void setYCenter(double val);
 
-    double xRadius() const { return m_xRadius; }
+    double xRadius() const { return m_xRadius.value(); }
     void setXRadius(double val);
 
-    double yRadius() const { return m_yRadius; }
+    double yRadius() const { return m_yRadius.value(); }
     void setYRadius(double val);
 
-    double angle() const { return m_angle; }
+    double angle() const { return m_angle.value(); }
     void setAngle(double val);
 
     void writeTo(QXmlStreamWriter* w) const override;
     void readFrom(QXmlStreamReader* r) override;
 
 private:
-    double m_xCenter = 0;
-    double m_yCenter = 0;
-    double m_xRadius = 0;
-    double m_yRadius = 0;
-    double m_angle = 0;
+    DoubleProperty m_xCenter;
+    DoubleProperty m_yCenter;
+    DoubleProperty m_xRadius;
+    DoubleProperty m_yRadius;
+    DoubleProperty m_angle;
 };
 
 class MaskAllItem : public MaskItem {
-- 
GitLab


From 190ff715bc553afad065ad2e58eeefdf6bcd97ef Mon Sep 17 00:00:00 2001
From: "Joachim Wuttke (o)" <j.wuttke@fz-juelich.de>
Date: Thu, 7 Dec 2023 16:04:29 +0100
Subject: [PATCH 02/18] follow up xml

---
 GUI/Model/Mask/MaskItems.cpp | 44 ++++++++++++++++++------------------
 1 file changed, 22 insertions(+), 22 deletions(-)

diff --git a/GUI/Model/Mask/MaskItems.cpp b/GUI/Model/Mask/MaskItems.cpp
index 3740badd52e..ed1482f5be2 100644
--- a/GUI/Model/Mask/MaskItems.cpp
+++ b/GUI/Model/Mask/MaskItems.cpp
@@ -161,22 +161,22 @@ void RectangleItem::writeTo(QXmlStreamWriter* w) const
 
     // x low
     w->writeStartElement(Tag::XLow);
-    XML::writeAttribute(w, XML::Attrib::value, m_xLow);
+    XML::writeAttribute(w, XML::Attrib::xvalue, m_xLow);
     w->writeEndElement();
 
     // y low
     w->writeStartElement(Tag::YLow);
-    XML::writeAttribute(w, XML::Attrib::value, m_yLow);
+    XML::writeAttribute(w, XML::Attrib::xvalue, m_yLow);
     w->writeEndElement();
 
     // x up
     w->writeStartElement(Tag::XUp);
-    XML::writeAttribute(w, XML::Attrib::value, m_xUp);
+    XML::writeAttribute(w, XML::Attrib::xvalue, m_xUp);
     w->writeEndElement();
 
     // y up
     w->writeStartElement(Tag::YUp);
-    XML::writeAttribute(w, XML::Attrib::value, m_yUp);
+    XML::writeAttribute(w, XML::Attrib::xvalue, m_yUp);
     w->writeEndElement();
 }
 
@@ -195,22 +195,22 @@ void RectangleItem::readFrom(QXmlStreamReader* r)
 
             // x low
         } else if (tag == Tag::XLow) {
-            XML::readAttribute(r, XML::Attrib::value, &m_xLow);
+            XML::readAttribute(r, XML::Attrib::xvalue, &m_xLow);
             XML::gotoEndElementOfTag(r, tag);
 
             // y low
         } else if (tag == Tag::YLow) {
-            XML::readAttribute(r, XML::Attrib::value, &m_yLow);
+            XML::readAttribute(r, XML::Attrib::xvalue, &m_yLow);
             XML::gotoEndElementOfTag(r, tag);
 
             // x up
         } else if (tag == Tag::XUp) {
-            XML::readAttribute(r, XML::Attrib::value, &m_xUp);
+            XML::readAttribute(r, XML::Attrib::xvalue, &m_xUp);
             XML::gotoEndElementOfTag(r, tag);
 
             // y up
         } else if (tag == Tag::YUp) {
-            XML::readAttribute(r, XML::Attrib::value, &m_yUp);
+            XML::readAttribute(r, XML::Attrib::xvalue, &m_yUp);
             XML::gotoEndElementOfTag(r, tag);
 
         } else
@@ -388,7 +388,7 @@ void VerticalLineItem::writeTo(QXmlStreamWriter* w) const
 
     // x position
     w->writeStartElement(Tag::XPosition);
-    XML::writeAttribute(w, XML::Attrib::value, m_posX);
+    XML::writeAttribute(w, XML::Attrib::xvalue, m_posX);
     w->writeEndElement();
 }
 
@@ -407,7 +407,7 @@ void VerticalLineItem::readFrom(QXmlStreamReader* r)
 
             // x position
         } else if (tag == Tag::XPosition) {
-            XML::readAttribute(r, XML::Attrib::value, &m_posX);
+            XML::readAttribute(r, XML::Attrib::xvalue, &m_posX);
             XML::gotoEndElementOfTag(r, tag);
 
         } else
@@ -444,7 +444,7 @@ void HorizontalLineItem::writeTo(QXmlStreamWriter* w) const
 
     // y position
     w->writeStartElement(Tag::YPosition);
-    XML::writeAttribute(w, XML::Attrib::value, m_posY);
+    XML::writeAttribute(w, XML::Attrib::xvalue, m_posY);
     w->writeEndElement();
 }
 
@@ -463,7 +463,7 @@ void HorizontalLineItem::readFrom(QXmlStreamReader* r)
 
             // y position
         } else if (tag == Tag::YPosition) {
-            XML::readAttribute(r, XML::Attrib::value, &m_posY);
+            XML::readAttribute(r, XML::Attrib::xvalue, &m_posY);
             XML::gotoEndElementOfTag(r, tag);
 
         } else
@@ -526,27 +526,27 @@ void EllipseItem::writeTo(QXmlStreamWriter* w) const
 
     // x center
     w->writeStartElement(Tag::XCenter);
-    XML::writeAttribute(w, XML::Attrib::value, m_xCenter);
+    XML::writeAttribute(w, XML::Attrib::xvalue, m_xCenter);
     w->writeEndElement();
 
     // y center
     w->writeStartElement(Tag::YCenter);
-    XML::writeAttribute(w, XML::Attrib::value, m_yCenter);
+    XML::writeAttribute(w, XML::Attrib::xvalue, m_yCenter);
     w->writeEndElement();
 
     // x radius
     w->writeStartElement(Tag::XRadius);
-    XML::writeAttribute(w, XML::Attrib::value, m_xRadius);
+    XML::writeAttribute(w, XML::Attrib::xvalue, m_xRadius);
     w->writeEndElement();
 
     // y radius
     w->writeStartElement(Tag::YRadius);
-    XML::writeAttribute(w, XML::Attrib::value, m_yRadius);
+    XML::writeAttribute(w, XML::Attrib::xvalue, m_yRadius);
     w->writeEndElement();
 
     // rotation angle
     w->writeStartElement(Tag::Angle);
-    XML::writeAttribute(w, XML::Attrib::value, m_angle);
+    XML::writeAttribute(w, XML::Attrib::xvalue, m_angle);
     w->writeEndElement();
 }
 
@@ -565,27 +565,27 @@ void EllipseItem::readFrom(QXmlStreamReader* r)
 
             // x center
         } else if (tag == Tag::XCenter) {
-            XML::readAttribute(r, XML::Attrib::value, &m_xCenter);
+            XML::readAttribute(r, XML::Attrib::xvalue, &m_xCenter);
             XML::gotoEndElementOfTag(r, tag);
 
             // y center
         } else if (tag == Tag::YCenter) {
-            XML::readAttribute(r, XML::Attrib::value, &m_yCenter);
+            XML::readAttribute(r, XML::Attrib::xvalue, &m_yCenter);
             XML::gotoEndElementOfTag(r, tag);
 
             // x radius
         } else if (tag == Tag::XRadius) {
-            XML::readAttribute(r, XML::Attrib::value, &m_xRadius);
+            XML::readAttribute(r, XML::Attrib::xvalue, &m_xRadius);
             XML::gotoEndElementOfTag(r, tag);
 
             // y radius
         } else if (tag == Tag::YRadius) {
-            XML::readAttribute(r, XML::Attrib::value, &m_yRadius);
+            XML::readAttribute(r, XML::Attrib::xvalue, &m_yRadius);
             XML::gotoEndElementOfTag(r, tag);
 
             // rotation angle
         } else if (tag == Tag::Angle) {
-            XML::readAttribute(r, XML::Attrib::value, &m_angle);
+            XML::readAttribute(r, XML::Attrib::xvalue, &m_angle);
             XML::gotoEndElementOfTag(r, tag);
 
         } else
-- 
GitLab


From 8ef09bc60dc083fff6dbec10d164c2e34c979a52 Mon Sep 17 00:00:00 2001
From: "Joachim Wuttke (o)" <j.wuttke@fz-juelich.de>
Date: Thu, 7 Dec 2023 18:08:51 +0100
Subject: [PATCH 03/18] adapt readAttrib

---
 GUI/Model/Mask/MaskItems.cpp | 22 +++++++++++-----------
 1 file changed, 11 insertions(+), 11 deletions(-)

diff --git a/GUI/Model/Mask/MaskItems.cpp b/GUI/Model/Mask/MaskItems.cpp
index ed1482f5be2..c24025d8c41 100644
--- a/GUI/Model/Mask/MaskItems.cpp
+++ b/GUI/Model/Mask/MaskItems.cpp
@@ -195,22 +195,22 @@ void RectangleItem::readFrom(QXmlStreamReader* r)
 
             // x low
         } else if (tag == Tag::XLow) {
-            XML::readAttribute(r, XML::Attrib::xvalue, &m_xLow);
+            m_xLow.readFrom(r);
             XML::gotoEndElementOfTag(r, tag);
 
             // y low
         } else if (tag == Tag::YLow) {
-            XML::readAttribute(r, XML::Attrib::xvalue, &m_yLow);
+            m_yLow.readFrom(r);
             XML::gotoEndElementOfTag(r, tag);
 
             // x up
         } else if (tag == Tag::XUp) {
-            XML::readAttribute(r, XML::Attrib::xvalue, &m_xUp);
+            m_xUp.readFrom(r);
             XML::gotoEndElementOfTag(r, tag);
 
             // y up
         } else if (tag == Tag::YUp) {
-            XML::readAttribute(r, XML::Attrib::xvalue, &m_yUp);
+            m_yUp.readFrom(r);
             XML::gotoEndElementOfTag(r, tag);
 
         } else
@@ -407,7 +407,7 @@ void VerticalLineItem::readFrom(QXmlStreamReader* r)
 
             // x position
         } else if (tag == Tag::XPosition) {
-            XML::readAttribute(r, XML::Attrib::xvalue, &m_posX);
+            m_posX.readFrom(r);
             XML::gotoEndElementOfTag(r, tag);
 
         } else
@@ -463,7 +463,7 @@ void HorizontalLineItem::readFrom(QXmlStreamReader* r)
 
             // y position
         } else if (tag == Tag::YPosition) {
-            XML::readAttribute(r, XML::Attrib::xvalue, &m_posY);
+            m_posY.readFrom(r);
             XML::gotoEndElementOfTag(r, tag);
 
         } else
@@ -565,27 +565,27 @@ void EllipseItem::readFrom(QXmlStreamReader* r)
 
             // x center
         } else if (tag == Tag::XCenter) {
-            XML::readAttribute(r, XML::Attrib::xvalue, &m_xCenter);
+            m_xCenter.readFrom(r);
             XML::gotoEndElementOfTag(r, tag);
 
             // y center
         } else if (tag == Tag::YCenter) {
-            XML::readAttribute(r, XML::Attrib::xvalue, &m_yCenter);
+            m_yCenter.readFrom(r);
             XML::gotoEndElementOfTag(r, tag);
 
             // x radius
         } else if (tag == Tag::XRadius) {
-            XML::readAttribute(r, XML::Attrib::xvalue, &m_xRadius);
+            m_xRadius.readFrom(r);
             XML::gotoEndElementOfTag(r, tag);
 
             // y radius
         } else if (tag == Tag::YRadius) {
-            XML::readAttribute(r, XML::Attrib::xvalue, &m_yRadius);
+            m_yRadius.readFrom(r);
             XML::gotoEndElementOfTag(r, tag);
 
             // rotation angle
         } else if (tag == Tag::Angle) {
-            XML::readAttribute(r, XML::Attrib::xvalue, &m_angle);
+            m_angle.readFrom(r);
             XML::gotoEndElementOfTag(r, tag);
 
         } else
-- 
GitLab


From 188058559d4dd373d629f0398902ac2daf5d6acc Mon Sep 17 00:00:00 2001
From: Joachim Wuttke <j.wuttke@fz-juelich.de>
Date: Thu, 7 Dec 2023 18:20:20 +0100
Subject: [PATCH 04/18] ditto for write

---
 GUI/Model/Mask/MaskItems.cpp | 22 +++++++++++-----------
 1 file changed, 11 insertions(+), 11 deletions(-)

diff --git a/GUI/Model/Mask/MaskItems.cpp b/GUI/Model/Mask/MaskItems.cpp
index c24025d8c41..e97fcbe2461 100644
--- a/GUI/Model/Mask/MaskItems.cpp
+++ b/GUI/Model/Mask/MaskItems.cpp
@@ -161,22 +161,22 @@ void RectangleItem::writeTo(QXmlStreamWriter* w) const
 
     // x low
     w->writeStartElement(Tag::XLow);
-    XML::writeAttribute(w, XML::Attrib::xvalue, m_xLow);
+    m_xLow.writeTo(w);
     w->writeEndElement();
 
     // y low
     w->writeStartElement(Tag::YLow);
-    XML::writeAttribute(w, XML::Attrib::xvalue, m_yLow);
+    m_yLow.writeTo(w);
     w->writeEndElement();
 
     // x up
     w->writeStartElement(Tag::XUp);
-    XML::writeAttribute(w, XML::Attrib::xvalue, m_xUp);
+    m_xUp.writeTo(w);
     w->writeEndElement();
 
     // y up
     w->writeStartElement(Tag::YUp);
-    XML::writeAttribute(w, XML::Attrib::xvalue, m_yUp);
+    m_yUp.writeTo(w);
     w->writeEndElement();
 }
 
@@ -388,7 +388,7 @@ void VerticalLineItem::writeTo(QXmlStreamWriter* w) const
 
     // x position
     w->writeStartElement(Tag::XPosition);
-    XML::writeAttribute(w, XML::Attrib::xvalue, m_posX);
+    m_posX.writeTo(w);
     w->writeEndElement();
 }
 
@@ -444,7 +444,7 @@ void HorizontalLineItem::writeTo(QXmlStreamWriter* w) const
 
     // y position
     w->writeStartElement(Tag::YPosition);
-    XML::writeAttribute(w, XML::Attrib::xvalue, m_posY);
+    m_posY.writeTo(w);
     w->writeEndElement();
 }
 
@@ -526,27 +526,27 @@ void EllipseItem::writeTo(QXmlStreamWriter* w) const
 
     // x center
     w->writeStartElement(Tag::XCenter);
-    XML::writeAttribute(w, XML::Attrib::xvalue, m_xCenter);
+    m_xCenter.writeTo(w);
     w->writeEndElement();
 
     // y center
     w->writeStartElement(Tag::YCenter);
-    XML::writeAttribute(w, XML::Attrib::xvalue, m_yCenter);
+    m_yCenter.writeTo(w);
     w->writeEndElement();
 
     // x radius
     w->writeStartElement(Tag::XRadius);
-    XML::writeAttribute(w, XML::Attrib::xvalue, m_xRadius);
+    m_xRadius.writeTo(w);
     w->writeEndElement();
 
     // y radius
     w->writeStartElement(Tag::YRadius);
-    XML::writeAttribute(w, XML::Attrib::xvalue, m_yRadius);
+    m_yRadius.writeTo(w);
     w->writeEndElement();
 
     // rotation angle
     w->writeStartElement(Tag::Angle);
-    XML::writeAttribute(w, XML::Attrib::xvalue, m_angle);
+    m_angle.writeTo(w);
     w->writeEndElement();
 }
 
-- 
GitLab


From 1569acf3816172f4977129c06c3dc69b546e1992 Mon Sep 17 00:00:00 2001
From: Joachim Wuttke <j.wuttke@fz-juelich.de>
Date: Thu, 7 Dec 2023 19:44:03 +0100
Subject: [PATCH 05/18] + ASSERT

---
 GUI/Model/Mask/MaskItems.cpp     | 4 ++++
 GUI/View/Shape/IShapeDisplay.cpp | 4 +++-
 2 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/GUI/Model/Mask/MaskItems.cpp b/GUI/Model/Mask/MaskItems.cpp
index e97fcbe2461..ccb986b05c5 100644
--- a/GUI/Model/Mask/MaskItems.cpp
+++ b/GUI/Model/Mask/MaskItems.cpp
@@ -118,6 +118,10 @@ void MaskItem::readFrom(QXmlStreamReader* r)
 RectangleItem::RectangleItem()
 {
     setMaskName("RectangleMask");
+    m_xLow.init("lower x", "lower x coordinate", 0, 4,
+                     RealLimits::limited(0., 4091.), "lowX");
+    m_xLow.init("lower x", "lower x coordinate", 0, 4,
+                     RealLimits::limited(0., 4091.), "lowX");
 }
 
 std::unique_ptr<IShape2D> RectangleItem::createShape() const
diff --git a/GUI/View/Shape/IShapeDisplay.cpp b/GUI/View/Shape/IShapeDisplay.cpp
index 9ee3245af43..54f36ae177e 100644
--- a/GUI/View/Shape/IShapeDisplay.cpp
+++ b/GUI/View/Shape/IShapeDisplay.cpp
@@ -69,7 +69,9 @@ void IShapeDisplay::setSceneAdaptor(const SceneAdaptor* adaptor)
 
 void IShapeDisplay::paint(QPainter* painter, const QStyleOptionGraphicsItem*, QWidget*)
 {
-    const bool is_masked = itemMaskValue(parameterizedItem());
+    const MaskObject* obj = parameterizedItem();
+    ASSERT(obj);
+    const bool is_masked = itemMaskValue(obj);
     painter->setBrush(MaskUtil::getMaskBrush(is_masked));
     painter->setPen(MaskUtil::getMaskPen(is_masked));
     painter->setRenderHints(QPainter::Antialiasing);
-- 
GitLab


From 4d424b32f9e6b000dbd1077b84b78db2fab8d256 Mon Sep 17 00:00:00 2001
From: Joachim Wuttke <j.wuttke@fz-juelich.de>
Date: Thu, 7 Dec 2023 22:21:08 +0100
Subject: [PATCH 06/18] initialize properties

---
 GUI/Model/Mask/MaskItems.cpp | 32 ++++++++++++++++++++++++++++----
 1 file changed, 28 insertions(+), 4 deletions(-)

diff --git a/GUI/Model/Mask/MaskItems.cpp b/GUI/Model/Mask/MaskItems.cpp
index ccb986b05c5..25e5464855e 100644
--- a/GUI/Model/Mask/MaskItems.cpp
+++ b/GUI/Model/Mask/MaskItems.cpp
@@ -119,9 +119,13 @@ RectangleItem::RectangleItem()
 {
     setMaskName("RectangleMask");
     m_xLow.init("lower x", "lower x coordinate", 0, 4,
-                     RealLimits::limited(0., 4091.), "lowX");
-    m_xLow.init("lower x", "lower x coordinate", 0, 4,
-                     RealLimits::limited(0., 4091.), "lowX");
+                     RealLimits::limited(0., 4091.), "xLow");
+    m_xUp.init("lower x", "upper x coordinate", 0, 4,
+               RealLimits::limited(0., 4091.), "xUp");
+    m_yLow.init("lower y", "lower y coordinate", 0, 4,
+                     RealLimits::limited(0., 4091.), "yLow");
+    m_yUp.init("lower y", "upper y coordinate", 0, 4,
+               RealLimits::limited(0., 4091.), "yUp");
 }
 
 std::unique_ptr<IShape2D> RectangleItem::createShape() const
@@ -239,7 +243,13 @@ std::unique_ptr<IShape2D> RegionOfInterestItem::createShape() const
 
 /* ------------------------------------------------------------------------- */
 
-PolygonPointItem::PolygonPointItem() = default;
+PolygonPointItem::PolygonPointItem()
+{
+    m_posX.init("lower x", "x coordinate", 0, 4,
+                RealLimits::limited(0., 4091.), "xPos");
+    m_posY.init("lower y", "y coordinate", 0, 4,
+                RealLimits::limited(0., 4091.), "yPos");
+}
 
 void PolygonPointItem::setPosX(double val)
 {
@@ -368,6 +378,8 @@ void PolygonItem::readFrom(QXmlStreamReader* r)
 VerticalLineItem::VerticalLineItem()
 {
     setMaskName("VerticalLineMask");
+    m_posX.init("lower x", "x coordinate", 0, 4,
+                RealLimits::limited(0., 4091.), "xPos");
 }
 
 std::unique_ptr<IShape2D> VerticalLineItem::createShape() const
@@ -424,6 +436,8 @@ void VerticalLineItem::readFrom(QXmlStreamReader* r)
 HorizontalLineItem::HorizontalLineItem()
 {
     setMaskName("HorizontalLineMask");
+    m_posY.init("lower y", "y coordinate", 0, 4,
+                RealLimits::limited(0., 4091.), "yPos");
 }
 
 std::unique_ptr<IShape2D> HorizontalLineItem::createShape() const
@@ -480,6 +494,16 @@ void HorizontalLineItem::readFrom(QXmlStreamReader* r)
 EllipseItem::EllipseItem()
 {
     setMaskName("EllipseMask");
+    m_xCenter.init("x center", "x center", 0, 4,
+                   RealLimits::limited(0., 4091.), "xCenter");
+    m_yCenter.init("y center", "y center", 0, 4,
+                   RealLimits::limited(0., 4091.), "yCenter");
+    m_xRadius.init("x radius", "x radius", 0, 4,
+                   RealLimits::limited(0., 4091.), "xRadius");
+    m_yRadius.init("y radius", "y radius", 0, 4,
+                   RealLimits::limited(0., 4091.), "yRadius");
+    m_angle.init("angle", "angle", 0, 4,
+                   RealLimits::limited(0., 360.), "angle");
 }
 
 std::unique_ptr<IShape2D> EllipseItem::createShape() const
-- 
GitLab


From 1bef5eaa137985388a533e86202ce2fd23f0b21d Mon Sep 17 00:00:00 2001
From: Joachim Wuttke <j.wuttke@fz-juelich.de>
Date: Fri, 8 Dec 2023 07:25:42 +0100
Subject: [PATCH 07/18] clang-format

---
 GUI/Model/Mask/MaskItems.cpp | 39 ++++++++++++------------------------
 1 file changed, 13 insertions(+), 26 deletions(-)

diff --git a/GUI/Model/Mask/MaskItems.cpp b/GUI/Model/Mask/MaskItems.cpp
index 25e5464855e..115ecefe037 100644
--- a/GUI/Model/Mask/MaskItems.cpp
+++ b/GUI/Model/Mask/MaskItems.cpp
@@ -118,14 +118,10 @@ void MaskItem::readFrom(QXmlStreamReader* r)
 RectangleItem::RectangleItem()
 {
     setMaskName("RectangleMask");
-    m_xLow.init("lower x", "lower x coordinate", 0, 4,
-                     RealLimits::limited(0., 4091.), "xLow");
-    m_xUp.init("lower x", "upper x coordinate", 0, 4,
-               RealLimits::limited(0., 4091.), "xUp");
-    m_yLow.init("lower y", "lower y coordinate", 0, 4,
-                     RealLimits::limited(0., 4091.), "yLow");
-    m_yUp.init("lower y", "upper y coordinate", 0, 4,
-               RealLimits::limited(0., 4091.), "yUp");
+    m_xLow.init("lower x", "lower x coordinate", 0, 4, RealLimits::limited(0., 4091.), "xLow");
+    m_xUp.init("lower x", "upper x coordinate", 0, 4, RealLimits::limited(0., 4091.), "xUp");
+    m_yLow.init("lower y", "lower y coordinate", 0, 4, RealLimits::limited(0., 4091.), "yLow");
+    m_yUp.init("lower y", "upper y coordinate", 0, 4, RealLimits::limited(0., 4091.), "yUp");
 }
 
 std::unique_ptr<IShape2D> RectangleItem::createShape() const
@@ -245,10 +241,8 @@ std::unique_ptr<IShape2D> RegionOfInterestItem::createShape() const
 
 PolygonPointItem::PolygonPointItem()
 {
-    m_posX.init("lower x", "x coordinate", 0, 4,
-                RealLimits::limited(0., 4091.), "xPos");
-    m_posY.init("lower y", "y coordinate", 0, 4,
-                RealLimits::limited(0., 4091.), "yPos");
+    m_posX.init("lower x", "x coordinate", 0, 4, RealLimits::limited(0., 4091.), "xPos");
+    m_posY.init("lower y", "y coordinate", 0, 4, RealLimits::limited(0., 4091.), "yPos");
 }
 
 void PolygonPointItem::setPosX(double val)
@@ -378,8 +372,7 @@ void PolygonItem::readFrom(QXmlStreamReader* r)
 VerticalLineItem::VerticalLineItem()
 {
     setMaskName("VerticalLineMask");
-    m_posX.init("lower x", "x coordinate", 0, 4,
-                RealLimits::limited(0., 4091.), "xPos");
+    m_posX.init("lower x", "x coordinate", 0, 4, RealLimits::limited(0., 4091.), "xPos");
 }
 
 std::unique_ptr<IShape2D> VerticalLineItem::createShape() const
@@ -436,8 +429,7 @@ void VerticalLineItem::readFrom(QXmlStreamReader* r)
 HorizontalLineItem::HorizontalLineItem()
 {
     setMaskName("HorizontalLineMask");
-    m_posY.init("lower y", "y coordinate", 0, 4,
-                RealLimits::limited(0., 4091.), "yPos");
+    m_posY.init("lower y", "y coordinate", 0, 4, RealLimits::limited(0., 4091.), "yPos");
 }
 
 std::unique_ptr<IShape2D> HorizontalLineItem::createShape() const
@@ -494,16 +486,11 @@ void HorizontalLineItem::readFrom(QXmlStreamReader* r)
 EllipseItem::EllipseItem()
 {
     setMaskName("EllipseMask");
-    m_xCenter.init("x center", "x center", 0, 4,
-                   RealLimits::limited(0., 4091.), "xCenter");
-    m_yCenter.init("y center", "y center", 0, 4,
-                   RealLimits::limited(0., 4091.), "yCenter");
-    m_xRadius.init("x radius", "x radius", 0, 4,
-                   RealLimits::limited(0., 4091.), "xRadius");
-    m_yRadius.init("y radius", "y radius", 0, 4,
-                   RealLimits::limited(0., 4091.), "yRadius");
-    m_angle.init("angle", "angle", 0, 4,
-                   RealLimits::limited(0., 360.), "angle");
+    m_xCenter.init("x center", "x center", 0, 4, RealLimits::limited(0., 4091.), "xCenter");
+    m_yCenter.init("y center", "y center", 0, 4, RealLimits::limited(0., 4091.), "yCenter");
+    m_xRadius.init("x radius", "x radius", 0, 4, RealLimits::limited(0., 4091.), "xRadius");
+    m_yRadius.init("y radius", "y radius", 0, 4, RealLimits::limited(0., 4091.), "yRadius");
+    m_angle.init("angle", "angle", 0, 4, RealLimits::limited(0., 360.), "angle");
 }
 
 std::unique_ptr<IShape2D> EllipseItem::createShape() const
-- 
GitLab


From e00721febf9597a85be4263278b0b06b590df096 Mon Sep 17 00:00:00 2001
From: "Joachim Wuttke (h)" <j.wuttke@fz-juelich.de>
Date: Fri, 8 Dec 2023 08:23:35 +0100
Subject: [PATCH 08/18] MaskItems API return property ref

---
 GUI/Model/Mask/MaskItems.h | 39 +++++++++++++++++++++++++-------------
 1 file changed, 26 insertions(+), 13 deletions(-)

diff --git a/GUI/Model/Mask/MaskItems.h b/GUI/Model/Mask/MaskItems.h
index 7f7dfe9c89e..4d0034c0c6e 100644
--- a/GUI/Model/Mask/MaskItems.h
+++ b/GUI/Model/Mask/MaskItems.h
@@ -58,13 +58,17 @@ public:
     explicit RectangleItem();
     std::unique_ptr<IShape2D> createShape() const override;
 
-    double xLow() const { return m_xLow.value(); }
+    DoubleProperty& xLow() { return m_xLow; }
+    const DoubleProperty& xLow() const { return m_xLow; }
     void setXLow(double val);
-    double yLow() const { return m_yLow.value(); }
+    DoubleProperty& yLow() { return m_yLow; }
+    const DoubleProperty& yLow() const { return m_yLow; }
     void setYLow(double val);
-    double xUp() const { return m_xUp.value(); }
+    DoubleProperty& xUp() { return m_xUp; }
+    const DoubleProperty& xUp() const { return m_xUp; }
     void setXUp(double val);
-    double yUp() const { return m_yUp.value(); }
+    DoubleProperty& yUp() { return m_yUp; }
+    const DoubleProperty& yUp() const { return m_yUp; }
     void setYUp(double val);
 
     void writeTo(QXmlStreamWriter* w) const override;
@@ -90,9 +94,11 @@ class PolygonPointItem : public MaskObject {
 public:
     PolygonPointItem();
 
-    double posX() const { return m_posX.value(); }
+    DoubleProperty& posX() { return m_posX; }
+    const DoubleProperty& posX() const { return m_posX; }
     void setPosX(double val);
-    double posY() const { return m_posY.value(); }
+    DoubleProperty& posY() { return m_posY; }
+    const DoubleProperty& posY() const { return m_posY; }
     void setPosY(double val);
 
     void writeTo(QXmlStreamWriter* w) const;
@@ -127,7 +133,8 @@ public:
     VerticalLineItem();
     std::unique_ptr<IShape2D> createShape() const override;
 
-    double posX() const { return m_posX.value(); }
+    DoubleProperty& posX() { return m_posX; }
+    const DoubleProperty& posX() const { return m_posX; }
     void setPosX(double val);
 
     void writeTo(QXmlStreamWriter* w) const override;
@@ -142,7 +149,8 @@ public:
     HorizontalLineItem();
     std::unique_ptr<IShape2D> createShape() const override;
 
-    double posY() const { return m_posY.value(); }
+    DoubleProperty& posY() { return m_posY; }
+    const DoubleProperty& posY() const { return m_posY; }
     void setPosY(double pos_y);
 
     void writeTo(QXmlStreamWriter* w) const override;
@@ -157,19 +165,24 @@ public:
     EllipseItem();
     std::unique_ptr<IShape2D> createShape() const override;
 
-    double xCenter() const { return m_xCenter.value(); }
+    DoubleProperty& xCenter() { return m_xCenter; }
+    const DoubleProperty& xCenter() const { return m_xCenter; }
     void setXCenter(double val);
 
-    double yCenter() const { return m_yCenter.value(); }
+    DoubleProperty& yCenter() { return m_yCenter; }
+    const DoubleProperty& yCenter() const { return m_yCenter; }
     void setYCenter(double val);
 
-    double xRadius() const { return m_xRadius.value(); }
+    DoubleProperty& xRadius() { return m_xRadius; }
+    const DoubleProperty& xRadius() const { return m_xRadius; }
     void setXRadius(double val);
 
-    double yRadius() const { return m_yRadius.value(); }
+    DoubleProperty& yRadius() { return m_yRadius; }
+    const DoubleProperty& yRadius() const { return m_yRadius; }
     void setYRadius(double val);
 
-    double angle() const { return m_angle.value(); }
+    DoubleProperty& angle() { return m_angle; }
+    const DoubleProperty& angle() const { return m_angle; }
     void setAngle(double val);
 
     void writeTo(QXmlStreamWriter* w) const override;
-- 
GitLab


From 732f285677c07d16abb2f022c337c9212d721220 Mon Sep 17 00:00:00 2001
From: "Joachim Wuttke (h)" <j.wuttke@fz-juelich.de>
Date: Fri, 8 Dec 2023 08:33:39 +0100
Subject: [PATCH 09/18] rename var

---
 GUI/View/Setup/MaskEditorToolpanel.cpp | 18 +++++++++---------
 GUI/View/Setup/MaskEditorToolpanel.h   |  2 +-
 2 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/GUI/View/Setup/MaskEditorToolpanel.cpp b/GUI/View/Setup/MaskEditorToolpanel.cpp
index 0802db83c3b..6952e211480 100644
--- a/GUI/View/Setup/MaskEditorToolpanel.cpp
+++ b/GUI/View/Setup/MaskEditorToolpanel.cpp
@@ -53,11 +53,11 @@ MaskEditorToolpanel::MaskEditorToolpanel()
     l2->addWidget(m_listView);
 
     // -- mask properties
-    auto* g3 = new StaticGroupBox("Mask properties", this);
+    auto* g3 = new StaticGroupBox("Selected mask", this);
     layout->addWidget(g3);
     g3->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Expanding);
-    m_maskPropertiesLayout = new QFormLayout(g3->body());
-    m_maskPropertiesLayout->setContentsMargins(0, 0, 0, 0);
+    m_editor_layout = new QFormLayout(g3->body());
+    m_editor_layout->setContentsMargins(0, 0, 0, 0);
 }
 
 QSize MaskEditorToolpanel::sizeHint() const
@@ -130,7 +130,7 @@ void MaskEditorToolpanel::setCurrentMaskItem(MaskItem* maskItem)
     if (m_currentMaskItem)
         disconnect(m_currentMaskItem, nullptr, this, nullptr);
 
-    GUI::Util::Layout::clearLayout(m_maskPropertiesLayout);
+    GUI::Util::Layout::clearLayout(m_editor_layout);
 
     m_currentMaskItem = maskItem;
 
@@ -161,11 +161,11 @@ void MaskEditorToolpanel::createMaskEditorUI()
 
     // -- name (only if not RoI)
     if (!dynamic_cast<RegionOfInterestItem*>(maskItem)) {
-        auto* edit = new QLineEdit(maskItem->maskName(), m_maskPropertiesLayout->parentWidget());
+        auto* edit = new QLineEdit(maskItem->maskName(), m_editor_layout->parentWidget());
         connect(edit, &QLineEdit::textEdited,
                 [maskItem](const QString& t) { maskItem->setMaskName(t); });
         connect(edit, &QLineEdit::editingFinished, [] { gProjectDocument.value()->setModified(); });
-        m_maskPropertiesLayout->addRow("Name:", edit);
+        m_editor_layout->addRow("Name:", edit);
     }
 
     if (auto* c = dynamic_cast<RectangleItem*>(maskItem)) {
@@ -223,13 +223,13 @@ void MaskEditorToolpanel::addMaskSpinBox(const QString& label, function<double()
         spinBox->setValue(getter());
     });
 
-    m_maskPropertiesLayout->addRow(label + ":", spinBox);
+    m_editor_layout->addRow(label + ":", spinBox);
 }
 
 void MaskEditorToolpanel::addMaskCheckBox(const QString& title, function<bool()> getter,
                                           function<void(bool)> setter)
 {
-    auto* checkBox = new QCheckBox(title, m_maskPropertiesLayout->parentWidget());
+    auto* checkBox = new QCheckBox(title, m_editor_layout->parentWidget());
     checkBox->setChecked(getter());
     connect(checkBox, &QCheckBox::stateChanged, this, [setter, checkBox]() {
         setter(checkBox->isChecked());
@@ -241,7 +241,7 @@ void MaskEditorToolpanel::addMaskCheckBox(const QString& title, function<bool()>
         checkBox->setChecked(getter());
     });
 
-    m_maskPropertiesLayout->addRow(checkBox);
+    m_editor_layout->addRow(checkBox);
 }
 
 MaskItem* MaskEditorToolpanel::maskItemForIndex(const QModelIndex& index)
diff --git a/GUI/View/Setup/MaskEditorToolpanel.h b/GUI/View/Setup/MaskEditorToolpanel.h
index 6288ca26433..c8cf625c684 100644
--- a/GUI/View/Setup/MaskEditorToolpanel.h
+++ b/GUI/View/Setup/MaskEditorToolpanel.h
@@ -71,7 +71,7 @@ private:
 
     QListView* m_listView;
     MaskContainerModel* m_maskContainerModel;
-    QFormLayout* m_maskPropertiesLayout;
+    QFormLayout* m_editor_layout;
     MaskItem* m_currentMaskItem; //!< the mask item whose properties shall be edited
     bool m_inhibitSelectionChange = false;
 };
-- 
GitLab


From b63680a58fc3b2b3c3483f8762c02cb6a8da5c1e Mon Sep 17 00:00:00 2001
From: "Joachim Wuttke (h)" <j.wuttke@fz-juelich.de>
Date: Fri, 8 Dec 2023 09:43:39 +0100
Subject: [PATCH 10/18] convert one spin box

---
 GUI/View/Numeric/DoubleSpinBox.cpp     |  3 ++-
 GUI/View/Setup/MaskEditorToolpanel.cpp | 35 ++++++++++++++++++--------
 2 files changed, 26 insertions(+), 12 deletions(-)

diff --git a/GUI/View/Numeric/DoubleSpinBox.cpp b/GUI/View/Numeric/DoubleSpinBox.cpp
index 41dc4d89dbc..b28a0fa20c5 100644
--- a/GUI/View/Numeric/DoubleSpinBox.cpp
+++ b/GUI/View/Numeric/DoubleSpinBox.cpp
@@ -98,10 +98,11 @@ double DoubleSpinBox::fromDisplay() const
 void DoubleSpinBox::setValue(double val)
 {
     ASSERT(m_property);
+    const double oldval = m_property->value();
     val = m_property->limits().clamp(val);
     lineEdit()->setText(toString(val));
     m_property->setValue(fromDisplay());
-    if (val != m_property->value())
+    if (m_property->value() != oldval)
         emit valueChanged(m_property->value());
 }
 
diff --git a/GUI/View/Setup/MaskEditorToolpanel.cpp b/GUI/View/Setup/MaskEditorToolpanel.cpp
index 6952e211480..591ae570556 100644
--- a/GUI/View/Setup/MaskEditorToolpanel.cpp
+++ b/GUI/View/Setup/MaskEditorToolpanel.cpp
@@ -26,6 +26,21 @@
 #include <QDoubleSpinBox>
 #include <QLineEdit>
 
+namespace {
+
+void addSpinBox(MaskItem* mask, QFormLayout* layout, const QString& name, DoubleProperty& property)
+{
+    auto* spinbox = new DoubleSpinBox(&property);
+    layout->addRow(name + ":", spinbox);
+    QObject::connect(spinbox, &DoubleSpinBox::valueChanged, [mask](double) {
+        gProjectDocument.value()->setModified();
+	emit mask->maskGeometryChanged();
+    });
+}
+
+} // namespace
+
+
 using std::function;
 
 MaskEditorToolpanel::MaskEditorToolpanel()
@@ -169,9 +184,7 @@ void MaskEditorToolpanel::createMaskEditorUI()
     }
 
     if (auto* c = dynamic_cast<RectangleItem*>(maskItem)) {
-        addMaskSpinBox(
-            "xlow", [c] { return c->xLow(); }, [c](double v) { c->setXLow(v); },
-            RealLimits::limitless());
+        addSpinBox(maskItem, m_editor_layout, "x low", c->xLow());
         addMaskSpinBox(
             "ylow", [c] { return c->yLow(); }, [c](double v) { c->setYLow(v); },
             RealLimits::limitless());
@@ -210,20 +223,20 @@ void MaskEditorToolpanel::createMaskEditorUI()
 void MaskEditorToolpanel::addMaskSpinBox(const QString& label, function<double()> getter,
                                          function<void(double)> setter, const RealLimits& limits)
 {
-    auto* spinBox = new QDoubleSpinBox;
-    GUI::View::NumberUtil::configSpinBox(spinBox, 3, limits);
-    spinBox->setValue(getter());
+    auto* spinbox = new QDoubleSpinBox;
+    GUI::View::NumberUtil::configSpinBox(spinbox, 3, limits);
+    spinbox->setValue(getter());
 
-    connect(spinBox, &QDoubleSpinBox::valueChanged, this, [setter](double newVal) {
+    connect(spinbox, &QDoubleSpinBox::valueChanged, this, [setter](double newVal) {
         setter(newVal);
         gProjectDocument.value()->setModified();
     });
-    connect(m_currentMaskItem, &MaskItem::maskGeometryChanged, spinBox, [=] {
-        QSignalBlocker b(spinBox);
-        spinBox->setValue(getter());
+    connect(m_currentMaskItem, &MaskItem::maskGeometryChanged, spinbox, [=] {
+        QSignalBlocker b(spinbox);
+        spinbox->setValue(getter());
     });
 
-    m_editor_layout->addRow(label + ":", spinBox);
+    m_editor_layout->addRow(label + ":", spinbox);
 }
 
 void MaskEditorToolpanel::addMaskCheckBox(const QString& title, function<bool()> getter,
-- 
GitLab


From 13d78f4651c2277adeae5fbe865d0a80cb341eec Mon Sep 17 00:00:00 2001
From: "Joachim Wuttke (h)" <j.wuttke@fz-juelich.de>
Date: Fri, 8 Dec 2023 09:59:42 +0100
Subject: [PATCH 11/18] convert all spin boxes in MaskEditorToolpanel

---
 GUI/Model/Mask/MaskItems.cpp           | 16 +++---
 GUI/View/Setup/MaskEditorToolpanel.cpp | 67 +++++---------------------
 GUI/View/Setup/MaskEditorToolpanel.h   |  5 --
 3 files changed, 21 insertions(+), 67 deletions(-)

diff --git a/GUI/Model/Mask/MaskItems.cpp b/GUI/Model/Mask/MaskItems.cpp
index 115ecefe037..9b99b1c1b2a 100644
--- a/GUI/Model/Mask/MaskItems.cpp
+++ b/GUI/Model/Mask/MaskItems.cpp
@@ -118,10 +118,10 @@ void MaskItem::readFrom(QXmlStreamReader* r)
 RectangleItem::RectangleItem()
 {
     setMaskName("RectangleMask");
-    m_xLow.init("lower x", "lower x coordinate", 0, 4, RealLimits::limited(0., 4091.), "xLow");
-    m_xUp.init("lower x", "upper x coordinate", 0, 4, RealLimits::limited(0., 4091.), "xUp");
-    m_yLow.init("lower y", "lower y coordinate", 0, 4, RealLimits::limited(0., 4091.), "yLow");
-    m_yUp.init("lower y", "upper y coordinate", 0, 4, RealLimits::limited(0., 4091.), "yUp");
+    m_xLow.init("x left", "left x coordinate", 0, 4, RealLimits::limited(0., 4091.), "xLow");
+    m_xUp.init("x right", "right x coordinate", 0, 4, RealLimits::limited(0., 4091.), "xUp");
+    m_yLow.init("y bottom", "bottom y coordinate", 0, 4, RealLimits::limited(0., 4091.), "yLow");
+    m_yUp.init("y top", "top y coordinate", 0, 4, RealLimits::limited(0., 4091.), "yUp");
 }
 
 std::unique_ptr<IShape2D> RectangleItem::createShape() const
@@ -241,8 +241,8 @@ std::unique_ptr<IShape2D> RegionOfInterestItem::createShape() const
 
 PolygonPointItem::PolygonPointItem()
 {
-    m_posX.init("lower x", "x coordinate", 0, 4, RealLimits::limited(0., 4091.), "xPos");
-    m_posY.init("lower y", "y coordinate", 0, 4, RealLimits::limited(0., 4091.), "yPos");
+    m_posX.init("x", "x coordinate", 0, 4, RealLimits::limited(0., 4091.), "xPos");
+    m_posY.init("y", "y coordinate", 0, 4, RealLimits::limited(0., 4091.), "yPos");
 }
 
 void PolygonPointItem::setPosX(double val)
@@ -372,7 +372,7 @@ void PolygonItem::readFrom(QXmlStreamReader* r)
 VerticalLineItem::VerticalLineItem()
 {
     setMaskName("VerticalLineMask");
-    m_posX.init("lower x", "x coordinate", 0, 4, RealLimits::limited(0., 4091.), "xPos");
+    m_posX.init("x", "x coordinate", 0, 4, RealLimits::limited(0., 4091.), "xPos");
 }
 
 std::unique_ptr<IShape2D> VerticalLineItem::createShape() const
@@ -429,7 +429,7 @@ void VerticalLineItem::readFrom(QXmlStreamReader* r)
 HorizontalLineItem::HorizontalLineItem()
 {
     setMaskName("HorizontalLineMask");
-    m_posY.init("lower y", "y coordinate", 0, 4, RealLimits::limited(0., 4091.), "yPos");
+    m_posY.init("y", "y coordinate", 0, 4, RealLimits::limited(0., 4091.), "yPos");
 }
 
 std::unique_ptr<IShape2D> HorizontalLineItem::createShape() const
diff --git a/GUI/View/Setup/MaskEditorToolpanel.cpp b/GUI/View/Setup/MaskEditorToolpanel.cpp
index 591ae570556..822448e7f91 100644
--- a/GUI/View/Setup/MaskEditorToolpanel.cpp
+++ b/GUI/View/Setup/MaskEditorToolpanel.cpp
@@ -19,19 +19,17 @@
 #include "GUI/Model/Mask/MaskItems.h"
 #include "GUI/Model/Project/ProjectDocument.h"
 #include "GUI/View/Numeric/DoubleSpinBox.h"
-#include "GUI/View/Numeric/NumberUtil.h"
 #include "GUI/View/Tool/LayoutUtil.h"
 #include "GUI/View/Widget/GroupBoxes.h"
 #include <QCheckBox>
-#include <QDoubleSpinBox>
 #include <QLineEdit>
 
 namespace {
 
-void addSpinBox(MaskItem* mask, QFormLayout* layout, const QString& name, DoubleProperty& property)
+void addSpinBox(MaskItem* mask, QFormLayout* layout, DoubleProperty& property)
 {
     auto* spinbox = new DoubleSpinBox(&property);
-    layout->addRow(name + ":", spinbox);
+    layout->addRow(property.label() + ":", spinbox);
     QObject::connect(spinbox, &DoubleSpinBox::valueChanged, [mask](double) {
         gProjectDocument.value()->setModified();
 	emit mask->maskGeometryChanged();
@@ -184,59 +182,20 @@ void MaskEditorToolpanel::createMaskEditorUI()
     }
 
     if (auto* c = dynamic_cast<RectangleItem*>(maskItem)) {
-        addSpinBox(maskItem, m_editor_layout, "x low", c->xLow());
-        addMaskSpinBox(
-            "ylow", [c] { return c->yLow(); }, [c](double v) { c->setYLow(v); },
-            RealLimits::limitless());
-        addMaskSpinBox(
-            "xup", [c] { return c->xUp(); }, [c](double v) { c->setXUp(v); },
-            RealLimits::limitless());
-        addMaskSpinBox(
-            "yup", [c] { return c->yUp(); }, [c](double v) { c->setYUp(v); },
-            RealLimits::limitless());
+        addSpinBox(maskItem, m_editor_layout, c->xLow());
+        addSpinBox(maskItem, m_editor_layout, c->xUp());
+        addSpinBox(maskItem, m_editor_layout, c->yLow());
+        addSpinBox(maskItem, m_editor_layout, c->yUp());
     } else if (auto* c = dynamic_cast<EllipseItem*>(maskItem)) {
-        addMaskSpinBox(
-            "X center", [c] { return c->xCenter(); }, [c](double v) { c->setXCenter(v); },
-            RealLimits::limitless());
-        addMaskSpinBox(
-            "Y center", [c] { return c->yCenter(); }, [c](double v) { c->setYCenter(v); },
-            RealLimits::limitless());
-        addMaskSpinBox(
-            "X radius", [c] { return c->xRadius(); }, [c](double v) { c->setXRadius(v); },
-            RealLimits::nonnegative());
-        addMaskSpinBox(
-            "Y radius", [c] { return c->yRadius(); }, [c](double v) { c->setYRadius(v); },
-            RealLimits::nonnegative());
-        addMaskSpinBox(
-            "Angle", [c] { return c->angle(); }, [c](double v) { c->setAngle(v); },
-            RealLimits::limitless());
+        addSpinBox(maskItem, m_editor_layout, c->xCenter());
+        addSpinBox(maskItem, m_editor_layout, c->yCenter());
+        addSpinBox(maskItem, m_editor_layout, c->xRadius());
+        addSpinBox(maskItem, m_editor_layout, c->yRadius());
+        // addSpinBox(maskItem, m_editor_layout, c->angle());
     } else if (auto* c = dynamic_cast<VerticalLineItem*>(maskItem))
-        addMaskSpinBox(
-            "X position", [c] { return c->posX(); }, [c](double v) { c->setPosX(v); },
-            RealLimits::limitless());
+        addSpinBox(maskItem, m_editor_layout, c->posX());
     else if (auto* c = dynamic_cast<HorizontalLineItem*>(maskItem))
-        addMaskSpinBox(
-            "Y position", [c] { return c->posY(); }, [c](double v) { c->setPosY(v); },
-            RealLimits::limitless());
-}
-
-void MaskEditorToolpanel::addMaskSpinBox(const QString& label, function<double()> getter,
-                                         function<void(double)> setter, const RealLimits& limits)
-{
-    auto* spinbox = new QDoubleSpinBox;
-    GUI::View::NumberUtil::configSpinBox(spinbox, 3, limits);
-    spinbox->setValue(getter());
-
-    connect(spinbox, &QDoubleSpinBox::valueChanged, this, [setter](double newVal) {
-        setter(newVal);
-        gProjectDocument.value()->setModified();
-    });
-    connect(m_currentMaskItem, &MaskItem::maskGeometryChanged, spinbox, [=] {
-        QSignalBlocker b(spinbox);
-        spinbox->setValue(getter());
-    });
-
-    m_editor_layout->addRow(label + ":", spinbox);
+        addSpinBox(maskItem, m_editor_layout, c->posY());
 }
 
 void MaskEditorToolpanel::addMaskCheckBox(const QString& title, function<bool()> getter,
diff --git a/GUI/View/Setup/MaskEditorToolpanel.h b/GUI/View/Setup/MaskEditorToolpanel.h
index c8cf625c684..0ac6ec0be46 100644
--- a/GUI/View/Setup/MaskEditorToolpanel.h
+++ b/GUI/View/Setup/MaskEditorToolpanel.h
@@ -26,7 +26,6 @@
 class Data2DItem;
 class MaskContainerModel;
 class MaskItem;
-class RealLimits;
 
 //! Tool widget for MaskEditor
 
@@ -55,10 +54,6 @@ private:
     //! Set the current mask and creates the UI to edit the mask's properties
     void setCurrentMaskItem(MaskItem* maskItem);
 
-    //! Add a spinbox to edit a mask's double value
-    void addMaskSpinBox(const QString& label, std::function<double()> getter,
-                        std::function<void(double)> setter, const RealLimits& limits);
-
     //! Add a checkbox to edit a mask's boolean value
     void addMaskCheckBox(const QString& title, std::function<bool()> getter,
                          std::function<void(bool)> setter);
-- 
GitLab


From 8799f12a5efca521102ccf50190ffdd518916e10 Mon Sep 17 00:00:00 2001
From: "Joachim Wuttke (h)" <j.wuttke@fz-juelich.de>
Date: Fri, 8 Dec 2023 10:00:39 +0100
Subject: [PATCH 12/18] simplify connect

---
 GUI/View/Setup/MaskEditorToolpanel.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/GUI/View/Setup/MaskEditorToolpanel.cpp b/GUI/View/Setup/MaskEditorToolpanel.cpp
index 822448e7f91..1bb4449a814 100644
--- a/GUI/View/Setup/MaskEditorToolpanel.cpp
+++ b/GUI/View/Setup/MaskEditorToolpanel.cpp
@@ -203,12 +203,12 @@ void MaskEditorToolpanel::addMaskCheckBox(const QString& title, function<bool()>
 {
     auto* checkBox = new QCheckBox(title, m_editor_layout->parentWidget());
     checkBox->setChecked(getter());
-    connect(checkBox, &QCheckBox::stateChanged, this, [setter, checkBox]() {
+    connect(checkBox, &QCheckBox::stateChanged, [setter, checkBox]() {
         setter(checkBox->isChecked());
         gProjectDocument.value()->setModified();
     });
 
-    connect(m_currentMaskItem, &MaskItem::maskVisibilityChanged, this, [checkBox, getter]() {
+    connect(m_currentMaskItem, &MaskItem::maskVisibilityChanged, [checkBox, getter]() {
         QSignalBlocker b(checkBox);
         checkBox->setChecked(getter());
     });
-- 
GitLab


From 17b5834a083b7c8ba96b9e46bcbae6289fd3dadf Mon Sep 17 00:00:00 2001
From: "Joachim Wuttke (h)" <j.wuttke@fz-juelich.de>
Date: Fri, 8 Dec 2023 10:02:14 +0100
Subject: [PATCH 13/18] rm using

---
 GUI/View/Setup/MaskEditorToolpanel.cpp | 8 +++-----
 1 file changed, 3 insertions(+), 5 deletions(-)

diff --git a/GUI/View/Setup/MaskEditorToolpanel.cpp b/GUI/View/Setup/MaskEditorToolpanel.cpp
index 1bb4449a814..100cd21475a 100644
--- a/GUI/View/Setup/MaskEditorToolpanel.cpp
+++ b/GUI/View/Setup/MaskEditorToolpanel.cpp
@@ -32,15 +32,13 @@ void addSpinBox(MaskItem* mask, QFormLayout* layout, DoubleProperty& property)
     layout->addRow(property.label() + ":", spinbox);
     QObject::connect(spinbox, &DoubleSpinBox::valueChanged, [mask](double) {
         gProjectDocument.value()->setModified();
-	emit mask->maskGeometryChanged();
+        emit mask->maskGeometryChanged();
     });
 }
 
 } // namespace
 
 
-using std::function;
-
 MaskEditorToolpanel::MaskEditorToolpanel()
     : m_listView(new QListView)
     , m_maskContainerModel(nullptr)
@@ -198,8 +196,8 @@ void MaskEditorToolpanel::createMaskEditorUI()
         addSpinBox(maskItem, m_editor_layout, c->posY());
 }
 
-void MaskEditorToolpanel::addMaskCheckBox(const QString& title, function<bool()> getter,
-                                          function<void(bool)> setter)
+void MaskEditorToolpanel::addMaskCheckBox(const QString& title, std::function<bool()> getter,
+                                          std::function<void(bool)> setter)
 {
     auto* checkBox = new QCheckBox(title, m_editor_layout->parentWidget());
     checkBox->setChecked(getter());
-- 
GitLab


From b57c57e42f059663a2b563af9a94653ffb0b2c3b Mon Sep 17 00:00:00 2001
From: "Joachim Wuttke (h)" <j.wuttke@fz-juelich.de>
Date: Fri, 8 Dec 2023 10:05:00 +0100
Subject: [PATCH 14/18] inline triv fct

---
 GUI/View/Setup/MaskEditorToolpanel.cpp | 9 ++-------
 GUI/View/Setup/MaskEditorToolpanel.h   | 3 ---
 2 files changed, 2 insertions(+), 10 deletions(-)

diff --git a/GUI/View/Setup/MaskEditorToolpanel.cpp b/GUI/View/Setup/MaskEditorToolpanel.cpp
index 100cd21475a..c30334894f6 100644
--- a/GUI/View/Setup/MaskEditorToolpanel.cpp
+++ b/GUI/View/Setup/MaskEditorToolpanel.cpp
@@ -116,7 +116,7 @@ void MaskEditorToolpanel::setPanelHidden(bool hidden)
     } else {
         QModelIndexList indexes = selectionModel()->selectedIndexes();
         if (!indexes.empty())
-            setCurrentMaskItem(maskItemForIndex(indexes.front()));
+            setCurrentMaskItem(m_maskContainerModel->itemForIndex(indexes.front()));
     }
 }
 
@@ -126,7 +126,7 @@ void MaskEditorToolpanel::onSelectionChanged(const QItemSelection& selected, con
         return;
 
     if (!selected.empty())
-        setCurrentMaskItem(maskItemForIndex(selected.indexes().front()));
+        setCurrentMaskItem(m_maskContainerModel->itemForIndex(selected.indexes().front()));
     else
         setCurrentMaskItem(nullptr);
 }
@@ -213,8 +213,3 @@ void MaskEditorToolpanel::addMaskCheckBox(const QString& title, std::function<bo
 
     m_editor_layout->addRow(checkBox);
 }
-
-MaskItem* MaskEditorToolpanel::maskItemForIndex(const QModelIndex& index)
-{
-    return m_maskContainerModel->itemForIndex(index);
-}
diff --git a/GUI/View/Setup/MaskEditorToolpanel.h b/GUI/View/Setup/MaskEditorToolpanel.h
index 0ac6ec0be46..9bee5a82780 100644
--- a/GUI/View/Setup/MaskEditorToolpanel.h
+++ b/GUI/View/Setup/MaskEditorToolpanel.h
@@ -58,9 +58,6 @@ private:
     void addMaskCheckBox(const QString& title, std::function<bool()> getter,
                          std::function<void(bool)> setter);
 
-    //! Returns the mask item for the given index, or nullptr if invalid.
-    MaskItem* maskItemForIndex(const QModelIndex& index);
-
     //! Creates the UI to edit the current mask's properties
     void createMaskEditorUI();
 
-- 
GitLab


From 29377398fa6441c2012b7f58b5fd331de9503f4a Mon Sep 17 00:00:00 2001
From: "Joachim Wuttke (h)" <j.wuttke@fz-juelich.de>
Date: Fri, 8 Dec 2023 10:06:47 +0100
Subject: [PATCH 15/18] merge fcts

---
 GUI/View/Setup/MaskEditorToolpanel.cpp | 7 -------
 GUI/View/Setup/MaskEditorToolpanel.h   | 3 ---
 2 files changed, 10 deletions(-)

diff --git a/GUI/View/Setup/MaskEditorToolpanel.cpp b/GUI/View/Setup/MaskEditorToolpanel.cpp
index c30334894f6..cd28a96b60f 100644
--- a/GUI/View/Setup/MaskEditorToolpanel.cpp
+++ b/GUI/View/Setup/MaskEditorToolpanel.cpp
@@ -144,16 +144,9 @@ void MaskEditorToolpanel::setCurrentMaskItem(MaskItem* maskItem)
     GUI::Util::Layout::clearLayout(m_editor_layout);
 
     m_currentMaskItem = maskItem;
-
-    createMaskEditorUI();
-}
-
-void MaskEditorToolpanel::createMaskEditorUI()
-{
     if (!m_currentMaskItem)
         return;
 
-    auto* maskItem = m_currentMaskItem; // shorthand
     // -- mask value (only if not RoI)
     if (!dynamic_cast<RegionOfInterestItem*>(maskItem)) {
         const auto maskValueGetter = [maskItem] { return maskItem->maskValue(); };
diff --git a/GUI/View/Setup/MaskEditorToolpanel.h b/GUI/View/Setup/MaskEditorToolpanel.h
index 9bee5a82780..245378c29f0 100644
--- a/GUI/View/Setup/MaskEditorToolpanel.h
+++ b/GUI/View/Setup/MaskEditorToolpanel.h
@@ -58,9 +58,6 @@ private:
     void addMaskCheckBox(const QString& title, std::function<bool()> getter,
                          std::function<void(bool)> setter);
 
-    //! Creates the UI to edit the current mask's properties
-    void createMaskEditorUI();
-
     QListView* m_listView;
     MaskContainerModel* m_maskContainerModel;
     QFormLayout* m_editor_layout;
-- 
GitLab


From f07acec3c1fec8bab7d2e6c97e12f483ad95bc6d Mon Sep 17 00:00:00 2001
From: "Joachim Wuttke (h)" <j.wuttke@fz-juelich.de>
Date: Fri, 8 Dec 2023 10:08:11 +0100
Subject: [PATCH 16/18] corr var spelling

---
 GUI/View/Setup/MaskEditorToolpanel.cpp | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/GUI/View/Setup/MaskEditorToolpanel.cpp b/GUI/View/Setup/MaskEditorToolpanel.cpp
index cd28a96b60f..165ac321188 100644
--- a/GUI/View/Setup/MaskEditorToolpanel.cpp
+++ b/GUI/View/Setup/MaskEditorToolpanel.cpp
@@ -192,17 +192,17 @@ void MaskEditorToolpanel::setCurrentMaskItem(MaskItem* maskItem)
 void MaskEditorToolpanel::addMaskCheckBox(const QString& title, std::function<bool()> getter,
                                           std::function<void(bool)> setter)
 {
-    auto* checkBox = new QCheckBox(title, m_editor_layout->parentWidget());
-    checkBox->setChecked(getter());
-    connect(checkBox, &QCheckBox::stateChanged, [setter, checkBox]() {
-        setter(checkBox->isChecked());
+    auto* check_box = new QCheckBox(title, m_editor_layout->parentWidget());
+    check_box->setChecked(getter());
+    connect(check_box, &QCheckBox::stateChanged, [setter, check_box]() {
+        setter(check_box->isChecked());
         gProjectDocument.value()->setModified();
     });
 
-    connect(m_currentMaskItem, &MaskItem::maskVisibilityChanged, [checkBox, getter]() {
-        QSignalBlocker b(checkBox);
-        checkBox->setChecked(getter());
+    connect(m_currentMaskItem, &MaskItem::maskVisibilityChanged, [check_box, getter]() {
+        QSignalBlocker b(check_box);
+        check_box->setChecked(getter());
     });
 
-    m_editor_layout->addRow(checkBox);
+    m_editor_layout->addRow(check_box);
 }
-- 
GitLab


From 9c52053c4d8c5df9c8fae53a41e229053adc9bf7 Mon Sep 17 00:00:00 2001
From: "Joachim Wuttke (h)" <j.wuttke@fz-juelich.de>
Date: Fri, 8 Dec 2023 10:15:22 +0100
Subject: [PATCH 17/18] MaskItems: don't emit signal maskGeometryChanged() =>
 broken

---
 GUI/Model/Mask/MaskItems.cpp | 13 -------------
 1 file changed, 13 deletions(-)

diff --git a/GUI/Model/Mask/MaskItems.cpp b/GUI/Model/Mask/MaskItems.cpp
index 9b99b1c1b2a..16f50e79124 100644
--- a/GUI/Model/Mask/MaskItems.cpp
+++ b/GUI/Model/Mask/MaskItems.cpp
@@ -136,22 +136,18 @@ std::unique_ptr<IShape2D> RectangleItem::createShape() const
 void RectangleItem::setXLow(double val)
 {
     m_xLow.setValue(val);
-    emit maskGeometryChanged();
 }
 void RectangleItem::setYLow(double val)
 {
     m_yLow.setValue(val);
-    emit maskGeometryChanged();
 }
 void RectangleItem::setXUp(double val)
 {
     m_xUp.setValue(val);
-    emit maskGeometryChanged();
 }
 void RectangleItem::setYUp(double val)
 {
     m_yUp.setValue(val);
-    emit maskGeometryChanged();
 }
 
 void RectangleItem::writeTo(QXmlStreamWriter* w) const
@@ -248,12 +244,10 @@ PolygonPointItem::PolygonPointItem()
 void PolygonPointItem::setPosX(double val)
 {
     m_posX.setValue(val);
-    emit maskGeometryChanged();
 }
 void PolygonPointItem::setPosY(double val)
 {
     m_posY.setValue(val);
-    emit maskGeometryChanged();
 }
 
 void PolygonPointItem::writeTo(QXmlStreamWriter* w) const
@@ -383,7 +377,6 @@ std::unique_ptr<IShape2D> VerticalLineItem::createShape() const
 void VerticalLineItem::setPosX(double val)
 {
     m_posX.setValue(val);
-    emit maskGeometryChanged(this);
 }
 
 void VerticalLineItem::writeTo(QXmlStreamWriter* w) const
@@ -440,7 +433,6 @@ std::unique_ptr<IShape2D> HorizontalLineItem::createShape() const
 void HorizontalLineItem::setPosY(double pos_y)
 {
     m_posY.setValue(pos_y);
-    emit maskGeometryChanged(this);
 }
 
 void HorizontalLineItem::writeTo(QXmlStreamWriter* w) const
@@ -507,27 +499,22 @@ std::unique_ptr<IShape2D> EllipseItem::createShape() const
 void EllipseItem::setXCenter(double val)
 {
     m_xCenter.setValue(val);
-    emit maskGeometryChanged();
 }
 void EllipseItem::setYCenter(double val)
 {
     m_yCenter.setValue(val);
-    emit maskGeometryChanged();
 }
 void EllipseItem::setXRadius(double val)
 {
     m_xRadius.setValue(val);
-    emit maskGeometryChanged();
 }
 void EllipseItem::setYRadius(const double val)
 {
     m_yRadius.setValue(val);
-    emit maskGeometryChanged();
 }
 void EllipseItem::setAngle(const double val)
 {
     m_angle.setValue(val);
-    emit maskGeometryChanged();
 }
 
 void EllipseItem::writeTo(QXmlStreamWriter* w) const
-- 
GitLab


From 5892a7d375ddbb0e29eb88b9cfad9911282ac84a Mon Sep 17 00:00:00 2001
From: "Joachim Wuttke (h)" <j.wuttke@fz-juelich.de>
Date: Fri, 8 Dec 2023 10:25:02 +0100
Subject: [PATCH 18/18] restore some signals, now in MaskGraphicsScene

---
 GUI/View/Scene/MaskGraphicsScene.cpp | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/GUI/View/Scene/MaskGraphicsScene.cpp b/GUI/View/Scene/MaskGraphicsScene.cpp
index 9b74063f540..4dc27df0f97 100644
--- a/GUI/View/Scene/MaskGraphicsScene.cpp
+++ b/GUI/View/Scene/MaskGraphicsScene.cpp
@@ -654,6 +654,7 @@ void MaskGraphicsScene::processRectangleOrEllipseItem(QGraphicsSceneMouseEvent*
         ellItem->setYRadius((ymin - ymax) / 2);
     }
 
+    emit m_currentItem->maskGeometryChanged();
     // produce views for the created shape
     updateViews();
 }
@@ -697,9 +698,9 @@ void MaskGraphicsScene::processLineItem(QGraphicsSceneMouseEvent* event)
 
     if (m_activity == MaskEditorFlags::VERTICAL_LINE_MODE)
         processVerticalLineItem(click_pos);
-
     if (m_activity == MaskEditorFlags::HORIZONTAL_LINE_MODE)
         processHorizontalLineItem(click_pos);
+    emit dynamic_cast<MaskItem*>(m_currentItem)->maskGeometryChanged();
 
     m_selectionModel->clearSelection();
     m_selectionModel->select(m_maskContainerModel->indexOfItem(m_currentItem),
-- 
GitLab