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