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
///
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() );
}
+12 -12
View File
@@ -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;
};
+20 -12
View File
@@ -20,7 +20,6 @@
#include "LabelModelObject.h"
#include <QTransform>
#include <QFont>
#include <algorithm>
#include <cmath>
@@ -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();
+6 -6
View File
@@ -23,7 +23,7 @@
#include <QObject>
#include <QFont>
#include <QTransform>
#include <QMatrix>
#include <QPainter>
#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;
};
+2 -2
View File
@@ -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 );
}
}
+1 -1
View File
@@ -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() );
+1 -1
View File
@@ -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] ) );
}