Fix problem with order of transformations of objects.

This commit is contained in:
Jim Evins
2015-09-07 00:15:49 -04:00
parent 29d50be98a
commit 2959789a49
7 changed files with 69 additions and 57 deletions
+27 -23
View File
@@ -75,15 +75,19 @@ glabels::Handle::Location glabels::Handle::location() const
/// ///
/// Draw Handle at x,y /// 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->save();
painter->translate( x, y ); 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->setBrush( handleFillColor );
painter->drawRect( QRectF( -s*handlePixels/2.0, -s*handlePixels/2.0, s*handlePixels, s*handlePixels ) ); painter->drawRect( QRectF( -s*handlePixels/2.0, -s*handlePixels/2.0, s*handlePixels, s*handlePixels ) );
@@ -128,9 +132,9 @@ glabels::HandleNorthWest::~HandleNorthWest()
/// ///
/// Draw 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 /// 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 /// 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 /// 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 /// 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 /// 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 /// 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 /// 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 /// 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 /// 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() );
} }
+12 -12
View File
@@ -64,10 +64,10 @@ namespace glabels
// Drawing Methods // Drawing Methods
//////////////////////////// ////////////////////////////
public: public:
virtual void draw( QPainter* painter ) const = 0; virtual void draw( QPainter* painter, double scale ) const = 0;
virtual QPainterPath path( double scale ) const = 0; virtual QPainterPath path( double scale ) const = 0;
protected: 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; QPainterPath pathAt( double scale, double x, double y ) const;
@@ -98,7 +98,7 @@ namespace glabels
// Drawing Methods // Drawing Methods
//////////////////////////// ////////////////////////////
public: public:
virtual void draw( QPainter* painter ) const; virtual void draw( QPainter* painter, double scale ) const;
virtual QPainterPath path( double scale ) const; virtual QPainterPath path( double scale ) const;
}; };
@@ -120,7 +120,7 @@ namespace glabels
// Drawing Methods // Drawing Methods
//////////////////////////// ////////////////////////////
public: public:
virtual void draw( QPainter* painter ) const; virtual void draw( QPainter* painter, double scale ) const;
virtual QPainterPath path( double scale ) const; virtual QPainterPath path( double scale ) const;
}; };
@@ -142,7 +142,7 @@ namespace glabels
// Drawing Methods // Drawing Methods
//////////////////////////// ////////////////////////////
public: public:
virtual void draw( QPainter* painter ) const; virtual void draw( QPainter* painter, double scale ) const;
virtual QPainterPath path( double scale ) const; virtual QPainterPath path( double scale ) const;
}; };
@@ -164,7 +164,7 @@ namespace glabels
// Drawing Methods // Drawing Methods
//////////////////////////// ////////////////////////////
public: public:
virtual void draw( QPainter* painter ) const; virtual void draw( QPainter* painter, double scale ) const;
virtual QPainterPath path( double scale ) const; virtual QPainterPath path( double scale ) const;
}; };
@@ -186,7 +186,7 @@ namespace glabels
// Drawing Methods // Drawing Methods
//////////////////////////// ////////////////////////////
public: public:
virtual void draw( QPainter* painter ) const; virtual void draw( QPainter* painter, double scale ) const;
virtual QPainterPath path( double scale ) const; virtual QPainterPath path( double scale ) const;
}; };
@@ -208,7 +208,7 @@ namespace glabels
// Drawing Methods // Drawing Methods
//////////////////////////// ////////////////////////////
public: public:
virtual void draw( QPainter* painter ) const; virtual void draw( QPainter* painter, double scale ) const;
virtual QPainterPath path( double scale ) const; virtual QPainterPath path( double scale ) const;
}; };
@@ -230,7 +230,7 @@ namespace glabels
// Drawing Methods // Drawing Methods
//////////////////////////// ////////////////////////////
public: public:
virtual void draw( QPainter* painter ) const; virtual void draw( QPainter* painter, double scale ) const;
virtual QPainterPath path( double scale ) const; virtual QPainterPath path( double scale ) const;
}; };
@@ -252,7 +252,7 @@ namespace glabels
// Drawing Methods // Drawing Methods
//////////////////////////// ////////////////////////////
public: public:
virtual void draw( QPainter* painter ) const; virtual void draw( QPainter* painter, double scale ) const;
virtual QPainterPath path( double scale ) const; virtual QPainterPath path( double scale ) const;
}; };
@@ -274,7 +274,7 @@ namespace glabels
// Drawing Methods // Drawing Methods
//////////////////////////// ////////////////////////////
public: public:
virtual void draw( QPainter* painter ) const; virtual void draw( QPainter* painter, double scale ) const;
virtual QPainterPath path( double scale ) const; virtual QPainterPath path( double scale ) const;
}; };
@@ -296,7 +296,7 @@ namespace glabels
// Drawing Methods // Drawing Methods
//////////////////////////// ////////////////////////////
public: public:
virtual void draw( QPainter* painter ) const; virtual void draw( QPainter* painter, double scale ) const;
virtual QPainterPath path( double scale ) const; virtual QPainterPath path( double scale ) const;
}; };
+20 -12
View File
@@ -20,7 +20,6 @@
#include "LabelModelObject.h" #include "LabelModelObject.h"
#include <QTransform>
#include <QFont> #include <QFont>
#include <algorithm> #include <algorithm>
#include <cmath> #include <cmath>
@@ -53,7 +52,7 @@ namespace glabels
mY0 = 0; mY0 = 0;
mW = 0; mW = 0;
mH = 0; mH = 0;
mMatrix = QTransform(); mMatrix = QMatrix();
mShadowState = false; mShadowState = false;
mShadowX = 1.3; mShadowX = 1.3;
@@ -202,7 +201,7 @@ namespace glabels
/// ///
/// Matrix Property Getter /// Matrix Property Getter
/// ///
QTransform LabelModelObject::matrix() const QMatrix LabelModelObject::matrix() const
{ {
return mMatrix; return mMatrix;
} }
@@ -211,7 +210,7 @@ namespace glabels
/// ///
/// Matrix Property Setter /// Matrix Property Setter
/// ///
void LabelModelObject::setMatrix( const QTransform& value ) void LabelModelObject::setMatrix( const QMatrix& value )
{ {
if ( mMatrix != value ) if ( mMatrix != value )
{ {
@@ -861,7 +860,10 @@ namespace glabels
{ {
if ( thetaDegs != 0 ) if ( thetaDegs != 0 )
{ {
mMatrix = mMatrix.rotate( thetaDegs ); QMatrix m;
m.rotate( thetaDegs );
mMatrix *= m;
emit changed(); emit changed();
} }
} }
@@ -872,7 +874,10 @@ namespace glabels
/// ///
void LabelModelObject::flipHoriz() void LabelModelObject::flipHoriz()
{ {
mMatrix = mMatrix.scale( -1, 1 ); QMatrix m;
m.scale( -1, 1 );
mMatrix *= m;
emit changed(); emit changed();
} }
@@ -882,7 +887,10 @@ namespace glabels
/// ///
void LabelModelObject::flipVert() void LabelModelObject::flipVert()
{ {
mMatrix = mMatrix.scale( 1, -1 ); QMatrix m;
m.scale( 1, -1 );
mMatrix *= m;
emit changed(); emit changed();
} }
@@ -949,12 +957,12 @@ namespace glabels
{ {
painter->save(); painter->save();
painter->translate( mShadowX, mShadowY ); painter->translate( mShadowX, mShadowY );
painter->setTransform( mMatrix, true ); painter->setMatrix( mMatrix, true );
drawShadow( painter, inEditor, record ); drawShadow( painter, inEditor, record );
painter->restore(); painter->restore();
} }
painter->setTransform( mMatrix, true ); painter->setMatrix( mMatrix, true );
drawObject( painter, inEditor, record ); drawObject( painter, inEditor, record );
painter->restore(); painter->restore();
@@ -964,12 +972,12 @@ namespace glabels
/// ///
/// Draw selection highlights /// Draw selection highlights
/// ///
void LabelModelObject::drawSelectionHighlight( QPainter* painter ) const void LabelModelObject::drawSelectionHighlight( QPainter* painter, double scale ) const
{ {
painter->save(); painter->save();
painter->translate( mX0, mY0 ); painter->translate( mX0, mY0 );
painter->setTransform( mMatrix, true ); painter->setMatrix( mMatrix, true );
if ( mOutline ) if ( mOutline )
{ {
@@ -978,7 +986,7 @@ namespace glabels
foreach( Handle* handle, mHandles ) foreach( Handle* handle, mHandles )
{ {
handle->draw( painter ); handle->draw( painter, scale );
} }
painter->restore(); painter->restore();
+6 -6
View File
@@ -23,7 +23,7 @@
#include <QObject> #include <QObject>
#include <QFont> #include <QFont>
#include <QTransform> #include <QMatrix>
#include <QPainter> #include <QPainter>
#include "ColorNode.h" #include "ColorNode.h"
@@ -123,10 +123,10 @@ namespace glabels
// //
// Transformation Matrix Property // Transformation Matrix Property
// //
Q_PROPERTY( QTransform matrix READ matrix WRITE setMatrix ); Q_PROPERTY( QMatrix matrix READ matrix WRITE setMatrix );
QTransform matrix() const; QMatrix matrix() const;
void setMatrix( const QTransform& value ); void setMatrix( const QMatrix& value );
// //
@@ -394,7 +394,7 @@ namespace glabels
/////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////
public: public:
void draw( QPainter* painter, bool inEditor, MergeRecord* record ) const; void draw( QPainter* painter, bool inEditor, MergeRecord* record ) const;
void drawSelectionHighlight( QPainter* painter ) const; void drawSelectionHighlight( QPainter* painter, double scale ) const;
protected: protected:
virtual void drawShadow( QPainter* painter, bool inEditor, MergeRecord* record ) const = 0; virtual void drawShadow( QPainter* painter, bool inEditor, MergeRecord* record ) const = 0;
@@ -430,7 +430,7 @@ namespace glabels
static int msNextId; static int msNextId;
int mId; int mId;
QTransform mMatrix; QMatrix mMatrix;
}; };
+2 -2
View File
@@ -846,7 +846,7 @@ glabels::View::handleResizeMotion( double xWorld, double yWorld )
/* /*
* Put new origin back into world coordinates and set. * Put new origin back into world coordinates and set.
*/ */
QTransform inverseMatrix = mResizeObject->matrix().inverted(); QMatrix inverseMatrix = mResizeObject->matrix().inverted();
QPointF p0( x0, y0 ); QPointF p0( x0, y0 );
p0 = inverseMatrix.map( p0 ); p0 = inverseMatrix.map( p0 );
p0 += QPointF( mResizeObject->x0(), mResizeObject->y0() ); p0 += QPointF( mResizeObject->x0(), mResizeObject->y0() );
@@ -1064,7 +1064,7 @@ glabels::View::drawHighlightLayer( QPainter* painter )
{ {
if ( object->isSelected() ) if ( object->isSelected() )
{ {
object->drawSelectionHighlight( painter ); object->drawSelectionHighlight( painter, mScale );
} }
} }
+1 -1
View File
@@ -198,7 +198,7 @@ glabels::XmlLabelCreator::createObjectTopLevelSpanNode( QDomElement &parent, con
void void
glabels::XmlLabelCreator::createAffineAttrs( QDomElement &node, const LabelModelObject* object ) 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, "a0", a.m11() );
libglabels::XmlUtil::setDoubleAttr( node, "a1", a.m12() ); libglabels::XmlUtil::setDoubleAttr( node, "a1", a.m12() );
+1 -1
View File
@@ -352,7 +352,7 @@ glabels::XmlLabelParser::parseAffineAttrs( const QDomElement &node, LabelModelOb
a[4] = XmlUtil::getDoubleAttr( node, "a4", 0.0 ); a[4] = XmlUtil::getDoubleAttr( node, "a4", 0.0 );
a[5] = XmlUtil::getDoubleAttr( node, "a5", 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] ) );
} }