From 2959789a4943c8c08af8bb3a30e38c7cab2c6584 Mon Sep 17 00:00:00 2001 From: Jim Evins Date: Mon, 7 Sep 2015 00:15:49 -0400 Subject: [PATCH] Fix problem with order of transformations of objects. --- glabels/Handles.cpp | 50 +++++++++++++++++++----------------- glabels/Handles.h | 24 ++++++++--------- glabels/LabelModelObject.cpp | 32 ++++++++++++++--------- glabels/LabelModelObject.h | 12 ++++----- glabels/View.cpp | 4 +-- glabels/XmlLabelCreator.cpp | 2 +- glabels/XmlLabelParser.cpp | 2 +- 7 files changed, 69 insertions(+), 57 deletions(-) diff --git a/glabels/Handles.cpp b/glabels/Handles.cpp index 781f3aa..6f6a21b 100644 --- a/glabels/Handles.cpp +++ b/glabels/Handles.cpp @@ -75,15 +75,19 @@ glabels::Handle::Location glabels::Handle::location() const /// /// Draw Handle at x,y /// -void glabels::Handle::drawAt( QPainter* painter, double x, double y ) const +void glabels::Handle::drawAt( QPainter* painter, double scale, double x, double y ) const { painter->save(); painter->translate( x, y ); - double s = 1.0 / painter->transform().m11(); + double s = 1.0 / scale; - painter->setPen( QPen( handleOutlineColor, s*handleOutlineWidthPixels ) ); + QPen pen( handleOutlineColor ); + pen.setCosmetic( true ); + pen.setWidth( handleOutlineWidthPixels ); + + painter->setPen( pen ); painter->setBrush( handleFillColor ); painter->drawRect( QRectF( -s*handlePixels/2.0, -s*handlePixels/2.0, s*handlePixels, s*handlePixels ) ); @@ -128,9 +132,9 @@ glabels::HandleNorthWest::~HandleNorthWest() /// /// Draw HandleNorthWest /// -void glabels::HandleNorthWest::draw( QPainter* painter ) const +void glabels::HandleNorthWest::draw( QPainter* painter, double scale ) const { - drawAt( painter, 0, 0 ); + drawAt( painter, scale, 0, 0 ); } @@ -163,9 +167,9 @@ glabels::HandleNorth::~HandleNorth() /// /// Draw HandleNorth /// -void glabels::HandleNorth::draw( QPainter* painter ) const +void glabels::HandleNorth::draw( QPainter* painter, double scale ) const { - drawAt( painter, mOwner->w()/2, 0 ); + drawAt( painter, scale, mOwner->w()/2, 0 ); } @@ -198,9 +202,9 @@ glabels::HandleNorthEast::~HandleNorthEast() /// /// Draw HandleNorthEast /// -void glabels::HandleNorthEast::draw( QPainter* painter ) const +void glabels::HandleNorthEast::draw( QPainter* painter, double scale ) const { - drawAt( painter, mOwner->w(), 0 ); + drawAt( painter, scale, mOwner->w(), 0 ); } @@ -233,9 +237,9 @@ glabels::HandleEast::~HandleEast() /// /// Draw HandleEast /// -void glabels::HandleEast::draw( QPainter* painter ) const +void glabels::HandleEast::draw( QPainter* painter, double scale ) const { - drawAt( painter, mOwner->w(), mOwner->h()/2 ); + drawAt( painter, scale, mOwner->w(), mOwner->h()/2 ); } @@ -268,9 +272,9 @@ glabels::HandleSouthEast::~HandleSouthEast() /// /// Draw HandleSouthEast /// -void glabels::HandleSouthEast::draw( QPainter* painter ) const +void glabels::HandleSouthEast::draw( QPainter* painter, double scale ) const { - drawAt( painter, mOwner->w(), mOwner->h() ); + drawAt( painter, scale, mOwner->w(), mOwner->h() ); } @@ -303,9 +307,9 @@ glabels::HandleSouth::~HandleSouth() /// /// Draw HandleSouth /// -void glabels::HandleSouth::draw( QPainter* painter ) const +void glabels::HandleSouth::draw( QPainter* painter, double scale ) const { - drawAt( painter, mOwner->w()/2, mOwner->h() ); + drawAt( painter, scale, mOwner->w()/2, mOwner->h() ); } @@ -338,9 +342,9 @@ glabels::HandleSouthWest::~HandleSouthWest() /// /// Draw HandleSouthWest /// -void glabels::HandleSouthWest::draw( QPainter* painter ) const +void glabels::HandleSouthWest::draw( QPainter* painter, double scale ) const { - drawAt( painter, 0, mOwner->h() ); + drawAt( painter, scale, 0, mOwner->h() ); } @@ -373,9 +377,9 @@ glabels::HandleWest::~HandleWest() /// /// Draw HandleWest /// -void glabels::HandleWest::draw( QPainter* painter ) const +void glabels::HandleWest::draw( QPainter* painter, double scale ) const { - drawAt( painter, 0, mOwner->h()/2 ); + drawAt( painter, scale, 0, mOwner->h()/2 ); } @@ -408,9 +412,9 @@ glabels::HandleP1::~HandleP1() /// /// Draw HandleP1 /// -void glabels::HandleP1::draw( QPainter* painter ) const +void glabels::HandleP1::draw( QPainter* painter, double scale ) const { - drawAt( painter, 0, 0 ); + drawAt( painter, scale, 0, 0 ); } @@ -443,9 +447,9 @@ glabels::HandleP2::~HandleP2() /// /// Draw HandleP2 /// -void glabels::HandleP2::draw( QPainter* painter ) const +void glabels::HandleP2::draw( QPainter* painter, double scale ) const { - drawAt( painter, mOwner->w(), mOwner->h() ); + drawAt( painter, scale, mOwner->w(), mOwner->h() ); } diff --git a/glabels/Handles.h b/glabels/Handles.h index 9d41db1..3e54f12 100644 --- a/glabels/Handles.h +++ b/glabels/Handles.h @@ -64,10 +64,10 @@ namespace glabels // Drawing Methods //////////////////////////// public: - virtual void draw( QPainter* painter ) const = 0; + virtual void draw( QPainter* painter, double scale ) const = 0; virtual QPainterPath path( double scale ) const = 0; protected: - void drawAt( QPainter* painter, double x, double y ) const; + void drawAt( QPainter* painter, double scale, double x, double y ) const; QPainterPath pathAt( double scale, double x, double y ) const; @@ -98,7 +98,7 @@ namespace glabels // Drawing Methods //////////////////////////// public: - virtual void draw( QPainter* painter ) const; + virtual void draw( QPainter* painter, double scale ) const; virtual QPainterPath path( double scale ) const; }; @@ -120,7 +120,7 @@ namespace glabels // Drawing Methods //////////////////////////// public: - virtual void draw( QPainter* painter ) const; + virtual void draw( QPainter* painter, double scale ) const; virtual QPainterPath path( double scale ) const; }; @@ -142,7 +142,7 @@ namespace glabels // Drawing Methods //////////////////////////// public: - virtual void draw( QPainter* painter ) const; + virtual void draw( QPainter* painter, double scale ) const; virtual QPainterPath path( double scale ) const; }; @@ -164,7 +164,7 @@ namespace glabels // Drawing Methods //////////////////////////// public: - virtual void draw( QPainter* painter ) const; + virtual void draw( QPainter* painter, double scale ) const; virtual QPainterPath path( double scale ) const; }; @@ -186,7 +186,7 @@ namespace glabels // Drawing Methods //////////////////////////// public: - virtual void draw( QPainter* painter ) const; + virtual void draw( QPainter* painter, double scale ) const; virtual QPainterPath path( double scale ) const; }; @@ -208,7 +208,7 @@ namespace glabels // Drawing Methods //////////////////////////// public: - virtual void draw( QPainter* painter ) const; + virtual void draw( QPainter* painter, double scale ) const; virtual QPainterPath path( double scale ) const; }; @@ -230,7 +230,7 @@ namespace glabels // Drawing Methods //////////////////////////// public: - virtual void draw( QPainter* painter ) const; + virtual void draw( QPainter* painter, double scale ) const; virtual QPainterPath path( double scale ) const; }; @@ -252,7 +252,7 @@ namespace glabels // Drawing Methods //////////////////////////// public: - virtual void draw( QPainter* painter ) const; + virtual void draw( QPainter* painter, double scale ) const; virtual QPainterPath path( double scale ) const; }; @@ -274,7 +274,7 @@ namespace glabels // Drawing Methods //////////////////////////// public: - virtual void draw( QPainter* painter ) const; + virtual void draw( QPainter* painter, double scale ) const; virtual QPainterPath path( double scale ) const; }; @@ -296,7 +296,7 @@ namespace glabels // Drawing Methods //////////////////////////// public: - virtual void draw( QPainter* painter ) const; + virtual void draw( QPainter* painter, double scale ) const; virtual QPainterPath path( double scale ) const; }; diff --git a/glabels/LabelModelObject.cpp b/glabels/LabelModelObject.cpp index 931d394..e71d02f 100644 --- a/glabels/LabelModelObject.cpp +++ b/glabels/LabelModelObject.cpp @@ -20,7 +20,6 @@ #include "LabelModelObject.h" -#include #include #include #include @@ -53,7 +52,7 @@ namespace glabels mY0 = 0; mW = 0; mH = 0; - mMatrix = QTransform(); + mMatrix = QMatrix(); mShadowState = false; mShadowX = 1.3; @@ -202,7 +201,7 @@ namespace glabels /// /// Matrix Property Getter /// - QTransform LabelModelObject::matrix() const + QMatrix LabelModelObject::matrix() const { return mMatrix; } @@ -211,7 +210,7 @@ namespace glabels /// /// Matrix Property Setter /// - void LabelModelObject::setMatrix( const QTransform& value ) + void LabelModelObject::setMatrix( const QMatrix& value ) { if ( mMatrix != value ) { @@ -861,7 +860,10 @@ namespace glabels { if ( thetaDegs != 0 ) { - mMatrix = mMatrix.rotate( thetaDegs ); + QMatrix m; + m.rotate( thetaDegs ); + mMatrix *= m; + emit changed(); } } @@ -872,7 +874,10 @@ namespace glabels /// void LabelModelObject::flipHoriz() { - mMatrix = mMatrix.scale( -1, 1 ); + QMatrix m; + m.scale( -1, 1 ); + mMatrix *= m; + emit changed(); } @@ -882,7 +887,10 @@ namespace glabels /// void LabelModelObject::flipVert() { - mMatrix = mMatrix.scale( 1, -1 ); + QMatrix m; + m.scale( 1, -1 ); + mMatrix *= m; + emit changed(); } @@ -949,12 +957,12 @@ namespace glabels { painter->save(); painter->translate( mShadowX, mShadowY ); - painter->setTransform( mMatrix, true ); + painter->setMatrix( mMatrix, true ); drawShadow( painter, inEditor, record ); painter->restore(); } - painter->setTransform( mMatrix, true ); + painter->setMatrix( mMatrix, true ); drawObject( painter, inEditor, record ); painter->restore(); @@ -964,12 +972,12 @@ namespace glabels /// /// Draw selection highlights /// - void LabelModelObject::drawSelectionHighlight( QPainter* painter ) const + void LabelModelObject::drawSelectionHighlight( QPainter* painter, double scale ) const { painter->save(); painter->translate( mX0, mY0 ); - painter->setTransform( mMatrix, true ); + painter->setMatrix( mMatrix, true ); if ( mOutline ) { @@ -978,7 +986,7 @@ namespace glabels foreach( Handle* handle, mHandles ) { - handle->draw( painter ); + handle->draw( painter, scale ); } painter->restore(); diff --git a/glabels/LabelModelObject.h b/glabels/LabelModelObject.h index 9956045..9a0ca63 100644 --- a/glabels/LabelModelObject.h +++ b/glabels/LabelModelObject.h @@ -23,7 +23,7 @@ #include #include -#include +#include #include #include "ColorNode.h" @@ -123,10 +123,10 @@ namespace glabels // // Transformation Matrix Property // - Q_PROPERTY( QTransform matrix READ matrix WRITE setMatrix ); + Q_PROPERTY( QMatrix matrix READ matrix WRITE setMatrix ); - QTransform matrix() const; - void setMatrix( const QTransform& value ); + QMatrix matrix() const; + void setMatrix( const QMatrix& value ); // @@ -394,7 +394,7 @@ namespace glabels /////////////////////////////////////////////////////////////// public: void draw( QPainter* painter, bool inEditor, MergeRecord* record ) const; - void drawSelectionHighlight( QPainter* painter ) const; + void drawSelectionHighlight( QPainter* painter, double scale ) const; protected: virtual void drawShadow( QPainter* painter, bool inEditor, MergeRecord* record ) const = 0; @@ -430,7 +430,7 @@ namespace glabels static int msNextId; int mId; - QTransform mMatrix; + QMatrix mMatrix; }; diff --git a/glabels/View.cpp b/glabels/View.cpp index c568480..25b8a56 100644 --- a/glabels/View.cpp +++ b/glabels/View.cpp @@ -846,7 +846,7 @@ glabels::View::handleResizeMotion( double xWorld, double yWorld ) /* * Put new origin back into world coordinates and set. */ - QTransform inverseMatrix = mResizeObject->matrix().inverted(); + QMatrix inverseMatrix = mResizeObject->matrix().inverted(); QPointF p0( x0, y0 ); p0 = inverseMatrix.map( p0 ); p0 += QPointF( mResizeObject->x0(), mResizeObject->y0() ); @@ -1064,7 +1064,7 @@ glabels::View::drawHighlightLayer( QPainter* painter ) { if ( object->isSelected() ) { - object->drawSelectionHighlight( painter ); + object->drawSelectionHighlight( painter, mScale ); } } diff --git a/glabels/XmlLabelCreator.cpp b/glabels/XmlLabelCreator.cpp index 6d49b1a..ac87065 100644 --- a/glabels/XmlLabelCreator.cpp +++ b/glabels/XmlLabelCreator.cpp @@ -198,7 +198,7 @@ glabels::XmlLabelCreator::createObjectTopLevelSpanNode( QDomElement &parent, con void glabels::XmlLabelCreator::createAffineAttrs( QDomElement &node, const LabelModelObject* object ) { - QTransform a = object->matrix(); + QMatrix a = object->matrix(); libglabels::XmlUtil::setDoubleAttr( node, "a0", a.m11() ); libglabels::XmlUtil::setDoubleAttr( node, "a1", a.m12() ); diff --git a/glabels/XmlLabelParser.cpp b/glabels/XmlLabelParser.cpp index f8d2e2b..1631cd8 100644 --- a/glabels/XmlLabelParser.cpp +++ b/glabels/XmlLabelParser.cpp @@ -352,7 +352,7 @@ glabels::XmlLabelParser::parseAffineAttrs( const QDomElement &node, LabelModelOb a[4] = XmlUtil::getDoubleAttr( node, "a4", 0.0 ); a[5] = XmlUtil::getDoubleAttr( node, "a5", 0.0 ); - object->setMatrix( QTransform( a[0], a[1], a[2], a[3], a[4], a[5] ) ); + object->setMatrix( QMatrix( a[0], a[1], a[2], a[3], a[4], a[5] ) ); }