diff --git a/sources/editor/customelementpart.h b/sources/editor/customelementpart.h index c1c24d713..9de3bd4ea 100644 --- a/sources/editor/customelementpart.h +++ b/sources/editor/customelementpart.h @@ -73,6 +73,7 @@ class CustomElementPart { Typically, useless primitives are discarded when saving the element. */ virtual bool isUseless() const = 0; + virtual QRectF sceneGeometricRect() const = 0; /** Inform this part a user-induced transformation is about to begin. This method can be used to save data required by handleUserTransformation(). */ diff --git a/sources/editor/partarc.cpp b/sources/editor/partarc.cpp index aa07cb3e5..93c53dffc 100644 --- a/sources/editor/partarc.cpp +++ b/sources/editor/partarc.cpp @@ -256,6 +256,16 @@ bool PartArc::isUseless() const { return(rect().isNull() || !angle()); } +/** + @return the minimum, margin-less rectangle this part can fit into, in scene + coordinates. It is different from boundingRect() because it is not supposed + to imply any margin, and it is different from shape because it is a regular + rectangle, not a complex shape. +*/ +QRectF PartArc::sceneGeometricRect() const { + return(mapToScene(rect()).boundingRect()); +} + /** Start the user-induced transformation, provided this primitive is contained within the \a initial_selection_rect bounding rectangle. diff --git a/sources/editor/partarc.h b/sources/editor/partarc.h index a3ade5eef..3637afaff 100644 --- a/sources/editor/partarc.h +++ b/sources/editor/partarc.h @@ -60,6 +60,7 @@ class PartArc : public QGraphicsEllipseItem, public CustomElementGraphicPart { virtual void setProperty(const QString &, const QVariant &); virtual QVariant property(const QString &); virtual bool isUseless() const; + virtual QRectF sceneGeometricRect() const; virtual void startUserTransformation(const QRectF &); virtual void handleUserTransformation(const QRectF &, const QRectF &); diff --git a/sources/editor/partcircle.cpp b/sources/editor/partcircle.cpp index acd1ce80d..fdc5f36be 100644 --- a/sources/editor/partcircle.cpp +++ b/sources/editor/partcircle.cpp @@ -199,6 +199,16 @@ bool PartCircle::isUseless() const { return(rect().isNull()); } +/** + @return the minimum, margin-less rectangle this part can fit into, in scene + coordinates. It is different from boundingRect() because it is not supposed + to imply any margin, and it is different from shape because it is a regular + rectangle, not a complex shape. +*/ +QRectF PartCircle::sceneGeometricRect() const { + return(mapToScene(rect()).boundingRect()); +} + /** Start the user-induced transformation, provided this primitive is contained within the \a initial_selection_rect bounding rectangle. diff --git a/sources/editor/partcircle.h b/sources/editor/partcircle.h index 62b9e1e77..c2b76abab 100644 --- a/sources/editor/partcircle.h +++ b/sources/editor/partcircle.h @@ -52,6 +52,7 @@ class PartCircle : public QGraphicsEllipseItem, public CustomElementGraphicPart virtual void setProperty(const QString &, const QVariant &); virtual QVariant property(const QString &); virtual bool isUseless() const; + virtual QRectF sceneGeometricRect() const; virtual void startUserTransformation(const QRectF &); virtual void handleUserTransformation(const QRectF &, const QRectF &); diff --git a/sources/editor/partellipse.cpp b/sources/editor/partellipse.cpp index e913ab0f5..e3fc6e688 100644 --- a/sources/editor/partellipse.cpp +++ b/sources/editor/partellipse.cpp @@ -189,6 +189,16 @@ bool PartEllipse::isUseless() const { return(rect().isNull()); } +/** + @return the minimum, margin-less rectangle this part can fit into, in scene + coordinates. It is different from boundingRect() because it is not supposed + to imply any margin, and it is different from shape because it is a regular + rectangle, not a complex shape. +*/ +QRectF PartEllipse::sceneGeometricRect() const { + return(mapToScene(rect()).boundingRect()); +} + /** Start the user-induced transformation, provided this primitive is contained within the \a initial_selection_rect bounding rectangle. diff --git a/sources/editor/partellipse.h b/sources/editor/partellipse.h index c9673759c..54d890230 100644 --- a/sources/editor/partellipse.h +++ b/sources/editor/partellipse.h @@ -51,6 +51,7 @@ class PartEllipse : public QGraphicsEllipseItem, public CustomElementGraphicPart virtual void setProperty(const QString &, const QVariant &); virtual QVariant property(const QString &); virtual bool isUseless() const; + virtual QRectF sceneGeometricRect() const; virtual void startUserTransformation(const QRectF &); virtual void handleUserTransformation(const QRectF &, const QRectF &); diff --git a/sources/editor/partline.cpp b/sources/editor/partline.cpp index ab4576f4e..8706770cc 100644 --- a/sources/editor/partline.cpp +++ b/sources/editor/partline.cpp @@ -476,6 +476,16 @@ bool PartLine::isUseless() const { return(sceneP1() == sceneP2()); } +/** + @return the minimum, margin-less rectangle this part can fit into, in scene + coordinates. It is different from boundingRect() because it is not supposed + to imply any margin, and it is different from shape because it is a regular + rectangle, not a complex shape. +*/ +QRectF PartLine::sceneGeometricRect() const { + return(QRectF(sceneP1(), sceneP2())); +} + /** Start the user-induced transformation, provided this primitive is contained within the \a initial_selection_rect bounding rectangle. diff --git a/sources/editor/partline.h b/sources/editor/partline.h index 0f5292648..b9fb1f241 100644 --- a/sources/editor/partline.h +++ b/sources/editor/partline.h @@ -68,6 +68,7 @@ class PartLine : public QGraphicsLineItem, public CustomElementGraphicPart { virtual void setProperty(const QString &, const QVariant &); virtual QVariant property(const QString &); virtual bool isUseless() const; + virtual QRectF sceneGeometricRect() const; virtual void startUserTransformation(const QRectF &); virtual void handleUserTransformation(const QRectF &, const QRectF &); virtual void setFirstEndType(const QET::EndType &); diff --git a/sources/editor/partpolygon.cpp b/sources/editor/partpolygon.cpp index 1ac84839f..ae6e163bd 100644 --- a/sources/editor/partpolygon.cpp +++ b/sources/editor/partpolygon.cpp @@ -163,6 +163,16 @@ bool PartPolygon::isUseless() const { return(true); } +/** + @return the minimum, margin-less rectangle this part can fit into, in scene + coordinates. It is different from boundingRect() because it is not supposed + to imply any margin, and it is different from shape because it is a regular + rectangle, not a complex shape. +*/ +QRectF PartPolygon::sceneGeometricRect() const { + return(mapToScene(polygon().boundingRect()).boundingRect()); +} + /** Start the user-induced transformation, provided this primitive is contained within the \a initial_selection_rect bounding rectangle. diff --git a/sources/editor/partpolygon.h b/sources/editor/partpolygon.h index 62025dca8..9993fa0c9 100644 --- a/sources/editor/partpolygon.h +++ b/sources/editor/partpolygon.h @@ -56,6 +56,7 @@ class PartPolygon : public QGraphicsPolygonItem, public CustomElementGraphicPart void setProperty(const QString &, const QVariant &); virtual QVariant property(const QString &); virtual bool isUseless() const; + virtual QRectF sceneGeometricRect() const; virtual void startUserTransformation(const QRectF &); virtual void handleUserTransformation(const QRectF &, const QRectF &); diff --git a/sources/editor/partrectangle.cpp b/sources/editor/partrectangle.cpp index e5b2126d6..3db5892d9 100644 --- a/sources/editor/partrectangle.cpp +++ b/sources/editor/partrectangle.cpp @@ -196,6 +196,16 @@ bool PartRectangle::isUseless() const { return(rect().isNull()); } +/** + @return the minimum, margin-less rectangle this part can fit into, in scene + coordinates. It is different from boundingRect() because it is not supposed + to imply any margin, and it is different from shape because it is a regular + rectangle, not a complex shape. +*/ +QRectF PartRectangle::sceneGeometricRect() const { + return(mapToScene(rect()).boundingRect()); +} + /** Start the user-induced transformation, provided this primitive is contained within the \a initial_selection_rect bounding rectangle. diff --git a/sources/editor/partrectangle.h b/sources/editor/partrectangle.h index 818702e64..832b8af1e 100644 --- a/sources/editor/partrectangle.h +++ b/sources/editor/partrectangle.h @@ -51,6 +51,7 @@ class PartRectangle : public QGraphicsRectItem, public CustomElementGraphicPart virtual void setProperty(const QString &, const QVariant &); virtual QVariant property(const QString &); virtual bool isUseless() const; + virtual QRectF sceneGeometricRect() const; virtual void startUserTransformation(const QRectF &); virtual void handleUserTransformation(const QRectF &, const QRectF &); diff --git a/sources/editor/partterminal.cpp b/sources/editor/partterminal.cpp index f39cd79c5..2832e77e9 100644 --- a/sources/editor/partterminal.cpp +++ b/sources/editor/partterminal.cpp @@ -220,6 +220,16 @@ bool PartTerminal::isUseless() const { return(false); } +/** + @return the minimum, margin-less rectangle this part can fit into, in scene + coordinates. It is different from boundingRect() because it is not supposed + to imply any margin, and it is different from shape because it is a regular + rectangle, not a complex shape. +*/ +QRectF PartTerminal::sceneGeometricRect() const { + return(sceneBoundingRect()); +} + /** Start the user-induced transformation, provided this primitive is contained within the \a initial_selection_rect bounding rectangle. diff --git a/sources/editor/partterminal.h b/sources/editor/partterminal.h index b655a105b..561296cdd 100644 --- a/sources/editor/partterminal.h +++ b/sources/editor/partterminal.h @@ -57,6 +57,7 @@ class PartTerminal : public CustomElementPart, public QGraphicsItem { virtual void setProperty(const QString &, const QVariant &); virtual QVariant property(const QString &); virtual bool isUseless() const; + virtual QRectF sceneGeometricRect() const; virtual void startUserTransformation(const QRectF &); virtual void handleUserTransformation(const QRectF &, const QRectF &); diff --git a/sources/editor/parttext.cpp b/sources/editor/parttext.cpp index bcd89267e..95ed14d71 100644 --- a/sources/editor/parttext.cpp +++ b/sources/editor/parttext.cpp @@ -303,6 +303,16 @@ bool PartText::isUseless() const { return(toPlainText().isEmpty()); } +/** + @return the minimum, margin-less rectangle this part can fit into, in scene + coordinates. It is different from boundingRect() because it is not supposed + to imply any margin, and it is different from shape because it is a regular + rectangle, not a complex shape. +*/ +QRectF PartText::sceneGeometricRect() const { + return(sceneBoundingRect()); +} + /** Start the user-induced transformation, provided this primitive is contained within the \a rect bounding rectangle. diff --git a/sources/editor/parttext.h b/sources/editor/parttext.h index 5f0ef85fb..0e46e0bb0 100644 --- a/sources/editor/parttext.h +++ b/sources/editor/parttext.h @@ -56,6 +56,7 @@ class PartText : public QGraphicsTextItem, public CustomElementPart { virtual void setProperty(const QString &, const QVariant &); virtual QVariant property(const QString &); virtual bool isUseless() const; + virtual QRectF sceneGeometricRect() const; virtual void startUserTransformation(const QRectF &); virtual void handleUserTransformation(const QRectF &, const QRectF &); virtual void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget * = 0 ); diff --git a/sources/editor/parttextfield.cpp b/sources/editor/parttextfield.cpp index 19a899ae0..542702ef2 100644 --- a/sources/editor/parttextfield.cpp +++ b/sources/editor/parttextfield.cpp @@ -346,6 +346,16 @@ bool PartTextField::isUseless() const { return(false); } +/** + @return the minimum, margin-less rectangle this part can fit into, in scene + coordinates. It is different from boundingRect() because it is not supposed + to imply any margin, and it is different from shape because it is a regular + rectangle, not a complex shape. +*/ +QRectF PartTextField::sceneGeometricRect() const { + return(sceneBoundingRect()); +} + /** Start the user-induced transformation, provided this primitive is contained within the \a initial_selection_rect bounding rectangle. diff --git a/sources/editor/parttextfield.h b/sources/editor/parttextfield.h index 108a40ea5..382e57dc3 100644 --- a/sources/editor/parttextfield.h +++ b/sources/editor/parttextfield.h @@ -62,6 +62,7 @@ class PartTextField : public QGraphicsTextItem, public CustomElementPart { virtual void setProperty(const QString &, const QVariant &); virtual QVariant property(const QString &); virtual bool isUseless() const; + virtual QRectF sceneGeometricRect() const; virtual void startUserTransformation(const QRectF &); virtual void handleUserTransformation(const QRectF &, const QRectF &); virtual void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget * = 0 );