From cdbc3a8c9bdeaa82fc2d1f25783fdf02f431440d Mon Sep 17 00:00:00 2001 From: Jim Evins Date: Fri, 14 Aug 2015 13:10:05 -0400 Subject: [PATCH] Make both highlight and select region layers work. --- glabels/Handles.cpp | 43 +++-- glabels/LabelModel.cpp | 1 + glabels/LabelModelObject.cpp | 1 + glabels/LabelModelShapeObject.cpp | 4 + glabels/Outline.cpp | 28 ++- glabels/Outline.h | 4 + glabels/View.cpp | 309 +++++++++++++++++------------- 7 files changed, 233 insertions(+), 157 deletions(-) diff --git a/glabels/Handles.cpp b/glabels/Handles.cpp index 6e590ca..294ab69 100644 --- a/glabels/Handles.cpp +++ b/glabels/Handles.cpp @@ -61,7 +61,12 @@ void glabels::Handle::drawAt( QPainter* painter, double x, double y ) const painter->save(); painter->translate( x, y ); - painter->resetTransform(); + + /* Render at a scale of 1:1 in pixels, while preserving translations and rotations. */ + QTransform t = painter->transform(); + painter->setTransform( QTransform( 1, t.m12(), t.m13(), + t.m21(), 1, t.m23(), + t.m31(), t.m32(), t.m33() ) ); painter->setPen( QPen( handleOutlineColor, handleOutlineWidthPixels ) ); painter->setBrush( handleFillColor ); @@ -147,7 +152,7 @@ glabels::HandleNorthEast::~HandleNorthEast() /// void glabels::HandleNorthEast::draw( QPainter* painter ) const { - drawAt( painter, mOwner->w()/2, 0 ); + drawAt( painter, mOwner->w(), 0 ); } @@ -156,7 +161,7 @@ void glabels::HandleNorthEast::draw( QPainter* painter ) const /// QPainterPath glabels::HandleNorthEast::path( QPainter* painter ) const { - return pathAt( painter, mOwner->w()/2, 0 ); + return pathAt( painter, mOwner->w(), 0 ); } @@ -182,7 +187,7 @@ glabels::HandleEast::~HandleEast() /// void glabels::HandleEast::draw( QPainter* painter ) const { - drawAt( painter, mOwner->w()/2, 0 ); + drawAt( painter, mOwner->w(), mOwner->h()/2 ); } @@ -191,7 +196,7 @@ void glabels::HandleEast::draw( QPainter* painter ) const /// QPainterPath glabels::HandleEast::path( QPainter* painter ) const { - return pathAt( painter, mOwner->w()/2, 0 ); + return pathAt( painter, mOwner->w(), mOwner->h()/2 ); } @@ -217,7 +222,7 @@ glabels::HandleSouthEast::~HandleSouthEast() /// void glabels::HandleSouthEast::draw( QPainter* painter ) const { - drawAt( painter, mOwner->w()/2, 0 ); + drawAt( painter, mOwner->w(), mOwner->h() ); } @@ -226,7 +231,7 @@ void glabels::HandleSouthEast::draw( QPainter* painter ) const /// QPainterPath glabels::HandleSouthEast::path( QPainter* painter ) const { - return pathAt( painter, mOwner->w()/2, 0 ); + return pathAt( painter, mOwner->w(), mOwner->h() ); } @@ -252,7 +257,7 @@ glabels::HandleSouth::~HandleSouth() /// void glabels::HandleSouth::draw( QPainter* painter ) const { - drawAt( painter, mOwner->w()/2, 0 ); + drawAt( painter, mOwner->w()/2, mOwner->h() ); } @@ -261,7 +266,7 @@ void glabels::HandleSouth::draw( QPainter* painter ) const /// QPainterPath glabels::HandleSouth::path( QPainter* painter ) const { - return pathAt( painter, mOwner->w()/2, 0 ); + return pathAt( painter, mOwner->w()/2, mOwner->h() ); } @@ -287,7 +292,7 @@ glabels::HandleSouthWest::~HandleSouthWest() /// void glabels::HandleSouthWest::draw( QPainter* painter ) const { - drawAt( painter, mOwner->w()/2, 0 ); + drawAt( painter, 0, mOwner->h() ); } @@ -296,7 +301,7 @@ void glabels::HandleSouthWest::draw( QPainter* painter ) const /// QPainterPath glabels::HandleSouthWest::path( QPainter* painter ) const { - return pathAt( painter, mOwner->w()/2, 0 ); + return pathAt( painter, 0, mOwner->w() ); } @@ -322,7 +327,7 @@ glabels::HandleWest::~HandleWest() /// void glabels::HandleWest::draw( QPainter* painter ) const { - drawAt( painter, mOwner->w()/2, 0 ); + drawAt( painter, 0, mOwner->h()/2 ); } @@ -331,7 +336,7 @@ void glabels::HandleWest::draw( QPainter* painter ) const /// QPainterPath glabels::HandleWest::path( QPainter* painter ) const { - return pathAt( painter, mOwner->w()/2, 0 ); + return pathAt( painter, 0, mOwner->h()/2 ); } @@ -357,7 +362,7 @@ glabels::HandleNorthWest::~HandleNorthWest() /// void glabels::HandleNorthWest::draw( QPainter* painter ) const { - drawAt( painter, mOwner->w()/2, 0 ); + drawAt( painter, 0, 0 ); } @@ -366,7 +371,7 @@ void glabels::HandleNorthWest::draw( QPainter* painter ) const /// QPainterPath glabels::HandleNorthWest::path( QPainter* painter ) const { - return pathAt( painter, mOwner->w()/2, 0 ); + return pathAt( painter, 0, 0 ); } @@ -392,7 +397,7 @@ glabels::HandleP1::~HandleP1() /// void glabels::HandleP1::draw( QPainter* painter ) const { - drawAt( painter, mOwner->w()/2, 0 ); + drawAt( painter, 0, 0 ); } @@ -401,7 +406,7 @@ void glabels::HandleP1::draw( QPainter* painter ) const /// QPainterPath glabels::HandleP1::path( QPainter* painter ) const { - return pathAt( painter, mOwner->w()/2, 0 ); + return pathAt( painter, 0, 0 ); } @@ -427,7 +432,7 @@ glabels::HandleP2::~HandleP2() /// void glabels::HandleP2::draw( QPainter* painter ) const { - drawAt( painter, mOwner->w()/2, 0 ); + drawAt( painter, mOwner->w(), mOwner->h() ); } @@ -436,5 +441,5 @@ void glabels::HandleP2::draw( QPainter* painter ) const /// QPainterPath glabels::HandleP2::path( QPainter* painter ) const { - return pathAt( painter, mOwner->w()/2, 0 ); + return pathAt( painter, mOwner->w(), mOwner->h() ); } diff --git a/glabels/LabelModel.cpp b/glabels/LabelModel.cpp index 07222e1..0d9d6a5 100644 --- a/glabels/LabelModel.cpp +++ b/glabels/LabelModel.cpp @@ -23,6 +23,7 @@ #include #include #include +#include #include "LabelModelObject.h" #include "LabelRegion.h" diff --git a/glabels/LabelModelObject.cpp b/glabels/LabelModelObject.cpp index ed14a51..e073a8f 100644 --- a/glabels/LabelModelObject.cpp +++ b/glabels/LabelModelObject.cpp @@ -23,6 +23,7 @@ #include #include #include +#include #include "ColorNode.h" #include "TextNode.h" diff --git a/glabels/LabelModelShapeObject.cpp b/glabels/LabelModelShapeObject.cpp index b8c21a6..62e3bed 100644 --- a/glabels/LabelModelShapeObject.cpp +++ b/glabels/LabelModelShapeObject.cpp @@ -32,6 +32,8 @@ namespace glabels /// LabelModelShapeObject::LabelModelShapeObject( QObject* parent ) : LabelModelObject(parent) { + mOutline = new Outline( this ); + mHandles << new HandleNorthWest( this ); mHandles << new HandleNorth( this ); mHandles << new HandleNorthEast( this ); @@ -50,6 +52,8 @@ namespace glabels /// LabelModelShapeObject::~LabelModelShapeObject() { + delete mOutline; + foreach( Handle* handle, mHandles ) { delete handle; diff --git a/glabels/Outline.cpp b/glabels/Outline.cpp index 1010b27..26c99c3 100644 --- a/glabels/Outline.cpp +++ b/glabels/Outline.cpp @@ -28,8 +28,11 @@ namespace { - const double outlineWidthPixels = 2; - const QColor outlineColor( 0, 0, 0, 192 ); + const qreal dashSize = 1; + + const double outlineWidthPixels = 1; + const QColor outlineColor1( 0, 0, 0 ); + const QColor outlineColor2( 255, 255, 255 ); } @@ -39,6 +42,20 @@ namespace glabels::Outline::Outline( LabelModelObject* owner ) : mOwner(owner) { + mDashes << dashSize << dashSize; + + mPen1.setColor( outlineColor1 ); + mPen1.setWidth( outlineWidthPixels ); + mPen1.setCosmetic( true ); + mPen1.setCapStyle( Qt::FlatCap ); + mPen1.setDashPattern( mDashes ); + + mPen2.setColor( outlineColor2 ); + mPen2.setWidth( outlineWidthPixels ); + mPen2.setCosmetic( true ); + mPen2.setCapStyle( Qt::FlatCap ); + mPen2.setDashPattern( mDashes ); + mPen2.setDashOffset( dashSize ); } @@ -57,11 +74,12 @@ void glabels::Outline::draw( QPainter* painter ) const { painter->save(); - QPen pen( outlineColor, outlineWidthPixels, Qt::DotLine ); - pen.setCosmetic( true ); - painter->setPen( pen ); painter->setBrush( Qt::NoBrush ); + painter->setPen( mPen1 ); + painter->drawRect( 0, 0, mOwner->w(), mOwner->h() ); + + painter->setPen( mPen2 ); painter->drawRect( 0, 0, mOwner->w(), mOwner->h() ); painter->restore(); diff --git a/glabels/Outline.h b/glabels/Outline.h index 830121b..bd3f0ce 100644 --- a/glabels/Outline.h +++ b/glabels/Outline.h @@ -59,6 +59,10 @@ namespace glabels private: LabelModelObject* mOwner; + QVector mDashes; + QPen mPen1; + QPen mPen2; + }; } diff --git a/glabels/View.cpp b/glabels/View.cpp index a9081df..c0339bd 100644 --- a/glabels/View.cpp +++ b/glabels/View.cpp @@ -290,6 +290,7 @@ glabels::View::paintEvent( QPaintEvent* event ) drawObjectsLayer( &painter ); drawFgLayer( &painter ); drawHighlightLayer( &painter ); + drawSelectRegionLayer( &painter ); } } @@ -317,94 +318,97 @@ glabels::View::resizeEvent( QResizeEvent *event ) void glabels::View::mouseMoveEvent( QMouseEvent* event ) { - /* - * Translate to label coordinates - */ - QTransform transform; - - transform.scale( mZoom, mZoom ); - - qreal xWorld, yWorld; - transform.inverted().map( event->x(), event->y(), &xWorld, &yWorld ); - - /* - * Emit signal regardless of mode - */ - emit pointerMoved( xWorld, yWorld ); - - - /* - * Handle event as appropriate for mode - */ - if ( mInObjectCreateMode ) + if ( mModel ) { - switch (mState) + /* + * Translate to label coordinates + */ + QTransform transform; + + transform.scale( mZoom, mZoom ); + + qreal xWorld, yWorld; + transform.inverted().map( event->x(), event->y(), &xWorld, &yWorld ); + + /* + * Emit signal regardless of mode + */ + emit pointerMoved( xWorld, yWorld ); + + + /* + * Handle event as appropriate for mode + */ + if ( !mInObjectCreateMode ) { - - case IdleState: - /* @TODO handle handles. */ - if ( mModel->objectAt( xWorld, yWorld ) ) + switch (mState) { - setCursor( Qt::SizeAllCursor ); - } - else - { - setCursor( Qt::ArrowCursor ); - } - break; - case ArrowSelectRegion: - mSelectRegion.setX2( xWorld ); - mSelectRegion.setY2( yWorld ); - update(); - break; + case IdleState: + /* @TODO handle handles. */ + if ( mModel->objectAt( xWorld, yWorld ) ) + { + setCursor( Qt::SizeAllCursor ); + } + else + { + setCursor( Qt::ArrowCursor ); + } + break; - case ArrowMove: - mModel->moveSelection( (xWorld - mMoveLastX), - (yWorld - mMoveLastY) ); - mMoveLastX = xWorld; - mMoveLastY = yWorld; - break; + case ArrowSelectRegion: + mSelectRegion.setX2( xWorld ); + mSelectRegion.setY2( yWorld ); + update(); + break; - case ArrowResize: - /* @TODO handle resize motion */ - break; + case ArrowMove: + mModel->moveSelection( (xWorld - mMoveLastX), + (yWorld - mMoveLastY) ); + mMoveLastX = xWorld; + mMoveLastY = yWorld; + break; - default: - // Should not happen! - qWarning() << "Invalid arrow state."; - break; + case ArrowResize: + /* @TODO handle resize motion */ + break; - } - } - else - { - if ( mState != IdleState ) - { - switch (mCreateObjectType) - { - case Box: - // @TODO - break; - case Ellipse: - // @TODO - break; - case Line: - // @TODO - break; - case Image: - // @TODO - break; - case Text: - // @TODO - break; - case Barcode: - // @TODO - break; default: // Should not happen! - qWarning() << "Invalid create type."; + qWarning() << "Invalid arrow state."; break; + + } + } + else + { + if ( mState != IdleState ) + { + switch (mCreateObjectType) + { + case Box: + // @TODO + break; + case Ellipse: + // @TODO + break; + case Line: + // @TODO + break; + case Image: + // @TODO + break; + case Text: + // @TODO + break; + case Barcode: + // @TODO + break; + default: + // Should not happen! + qWarning() << "Invalid create type."; + break; + } } } } @@ -417,35 +421,39 @@ glabels::View::mouseMoveEvent( QMouseEvent* event ) void glabels::View::mousePressEvent( QMouseEvent* event ) { - /* - * Translate to label coordinates - */ - QTransform transform; - - transform.scale( mZoom, mZoom ); - - qreal xWorld, yWorld; - transform.inverted().map( event->x(), event->y(), &xWorld, &yWorld ); - - - if ( event->button() & Qt::LeftButton ) + if ( mModel ) { - // Select Region - if ( !(event->modifiers() & Qt::ControlModifier) ) + /* + * Translate to label coordinates + */ + QTransform transform; + + transform.scale( mZoom, mZoom ); + + qreal xWorld, yWorld; + transform.inverted().map( event->x(), event->y(), &xWorld, &yWorld ); + + + if ( event->button() & Qt::LeftButton ) + { + // Select Region + if ( !(event->modifiers() & Qt::ControlModifier) ) + { + mModel->unselectAll(); + } + + mSelectRegionVisible = true; + mSelectRegion.setX1( xWorld ); + mSelectRegion.setY1( yWorld ); + mSelectRegion.setX2( xWorld ); + mSelectRegion.setY2( yWorld ); + + mState = ArrowSelectRegion; + update(); + } + else { - mModel->unselectAll(); } - - mSelectRegionVisible = true; - mSelectRegion.setX1( xWorld ); - mSelectRegion.setY1( yWorld ); - mSelectRegion.setX2( xWorld ); - mSelectRegion.setY2( yWorld ); - - mState = ArrowSelectRegion; - } - else - { } } @@ -456,42 +464,47 @@ glabels::View::mousePressEvent( QMouseEvent* event ) void glabels::View::mouseReleaseEvent( QMouseEvent* event ) { - /* - * Translate to label coordinates - */ - QTransform transform; - - transform.scale( mZoom, mZoom ); - - qreal xWorld, yWorld; - transform.inverted().map( event->x(), event->y(), &xWorld, &yWorld ); - - - if ( event->button() & Qt::LeftButton ) + if ( mModel ) { - switch (mState) + /* + * Translate to label coordinates + */ + QTransform transform; + + transform.scale( mZoom, mZoom ); + + qreal xWorld, yWorld; + transform.inverted().map( event->x(), event->y(), &xWorld, &yWorld ); + + + if ( event->button() & Qt::LeftButton ) { + switch (mState) + { - case IdleState: - break; + case IdleState: + break; - case ArrowSelectRegion: - mSelectRegion.setX2( xWorld ); - mSelectRegion.setY2( yWorld ); + case ArrowSelectRegion: + mSelectRegionVisible = false; + mSelectRegion.setX2( xWorld ); + mSelectRegion.setY2( yWorld ); - mModel->selectRegion( mSelectRegion ); + mModel->selectRegion( mSelectRegion ); - mState = IdleState; - break; + mState = IdleState; + update(); + break; - default: - // Should not happen! - break; + default: + // Should not happen! + break; + } + } + else + { } - } - else - { } } @@ -502,7 +515,10 @@ glabels::View::mouseReleaseEvent( QMouseEvent* event ) void glabels::View::leaveEvent( QEvent* event ) { - emit pointerExited(); + if ( mModel ) + { + emit pointerExited(); + } } @@ -584,7 +600,9 @@ glabels::View::drawGridLayer( QPainter* painter ) painter->setClipPath( mModel->frame()->path() ); - painter->setPen( QPen( gridLineColor, gridLineWidthPixels/mZoom ) ); + QPen pen( gridLineColor, gridLineWidthPixels ); + pen.setCosmetic( true ); + painter->setPen( pen ); for ( double x = x0; x < w; x += gridSpacing ) { @@ -651,8 +669,10 @@ glabels::View::drawFgLayer( QPainter* painter ) */ painter->save(); + QPen pen( labelOutlineColor, labelOutlineWidthPixels ); + pen.setCosmetic( true ); painter->setBrush( QBrush( Qt::NoBrush ) ); - painter->setPen( QPen( labelOutlineColor, labelOutlineWidthPixels/mZoom ) ); + painter->setPen( pen ); if ( mModel->rotate() ) { @@ -683,3 +703,26 @@ glabels::View::drawHighlightLayer( QPainter* painter ) painter->restore(); } + + +/// +/// Draw Select Region Layer +/// +void +glabels::View::drawSelectRegionLayer( QPainter* painter ) +{ + if ( mSelectRegionVisible ) + { + painter->save(); + + QPen pen( selectRegionOutlineColor, selectRegionOutlineWidthPixels ); + pen.setCosmetic( true ); + painter->setBrush( selectRegionFillColor ); + painter->setPen( pen ); + + painter->drawRect( mSelectRegion.rect() ); + + painter->restore(); + } + +}