Make both highlight and select region layers work.

This commit is contained in:
Jim Evins
2015-08-14 13:10:05 -04:00
parent aeb6098159
commit cdbc3a8c9b
7 changed files with 233 additions and 157 deletions
+24 -19
View File
@@ -61,7 +61,12 @@ void glabels::Handle::drawAt( QPainter* painter, double x, double y ) const
painter->save(); painter->save();
painter->translate( x, y ); 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->setPen( QPen( handleOutlineColor, handleOutlineWidthPixels ) );
painter->setBrush( handleFillColor ); painter->setBrush( handleFillColor );
@@ -147,7 +152,7 @@ glabels::HandleNorthEast::~HandleNorthEast()
/// ///
void glabels::HandleNorthEast::draw( QPainter* painter ) const 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 QPainterPath glabels::HandleP2::path( QPainter* painter ) const
{ {
return pathAt( painter, mOwner->w()/2, 0 ); return pathAt( painter, mOwner->w(), mOwner->h() );
} }
+1
View File
@@ -23,6 +23,7 @@
#include <QFileInfo> #include <QFileInfo>
#include <algorithm> #include <algorithm>
#include <cmath> #include <cmath>
#include <QtDebug>
#include "LabelModelObject.h" #include "LabelModelObject.h"
#include "LabelRegion.h" #include "LabelRegion.h"
+1
View File
@@ -23,6 +23,7 @@
#include <QTransform> #include <QTransform>
#include <QFont> #include <QFont>
#include <algorithm> #include <algorithm>
#include <QtDebug>
#include "ColorNode.h" #include "ColorNode.h"
#include "TextNode.h" #include "TextNode.h"
+4
View File
@@ -32,6 +32,8 @@ namespace glabels
/// ///
LabelModelShapeObject::LabelModelShapeObject( QObject* parent ) : LabelModelObject(parent) LabelModelShapeObject::LabelModelShapeObject( QObject* parent ) : LabelModelObject(parent)
{ {
mOutline = new Outline( this );
mHandles << new HandleNorthWest( this ); mHandles << new HandleNorthWest( this );
mHandles << new HandleNorth( this ); mHandles << new HandleNorth( this );
mHandles << new HandleNorthEast( this ); mHandles << new HandleNorthEast( this );
@@ -50,6 +52,8 @@ namespace glabels
/// ///
LabelModelShapeObject::~LabelModelShapeObject() LabelModelShapeObject::~LabelModelShapeObject()
{ {
delete mOutline;
foreach( Handle* handle, mHandles ) foreach( Handle* handle, mHandles )
{ {
delete handle; delete handle;
+23 -5
View File
@@ -28,8 +28,11 @@
namespace namespace
{ {
const double outlineWidthPixels = 2; const qreal dashSize = 1;
const QColor outlineColor( 0, 0, 0, 192 );
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 ) glabels::Outline::Outline( LabelModelObject* owner )
: mOwner(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(); painter->save();
QPen pen( outlineColor, outlineWidthPixels, Qt::DotLine );
pen.setCosmetic( true );
painter->setPen( pen );
painter->setBrush( Qt::NoBrush ); 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->drawRect( 0, 0, mOwner->w(), mOwner->h() );
painter->restore(); painter->restore();
+4
View File
@@ -59,6 +59,10 @@ namespace glabels
private: private:
LabelModelObject* mOwner; LabelModelObject* mOwner;
QVector<qreal> mDashes;
QPen mPen1;
QPen mPen2;
}; };
} }
+176 -133
View File
@@ -290,6 +290,7 @@ glabels::View::paintEvent( QPaintEvent* event )
drawObjectsLayer( &painter ); drawObjectsLayer( &painter );
drawFgLayer( &painter ); drawFgLayer( &painter );
drawHighlightLayer( &painter ); drawHighlightLayer( &painter );
drawSelectRegionLayer( &painter );
} }
} }
@@ -317,94 +318,97 @@ glabels::View::resizeEvent( QResizeEvent *event )
void void
glabels::View::mouseMoveEvent( QMouseEvent* event ) glabels::View::mouseMoveEvent( QMouseEvent* event )
{ {
/* if ( mModel )
* 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 )
{ {
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 )
{ {
switch (mState)
case IdleState:
/* @TODO handle handles. */
if ( mModel->objectAt( xWorld, yWorld ) )
{ {
setCursor( Qt::SizeAllCursor );
}
else
{
setCursor( Qt::ArrowCursor );
}
break;
case ArrowSelectRegion: case IdleState:
mSelectRegion.setX2( xWorld ); /* @TODO handle handles. */
mSelectRegion.setY2( yWorld ); if ( mModel->objectAt( xWorld, yWorld ) )
update(); {
break; setCursor( Qt::SizeAllCursor );
}
else
{
setCursor( Qt::ArrowCursor );
}
break;
case ArrowMove: case ArrowSelectRegion:
mModel->moveSelection( (xWorld - mMoveLastX), mSelectRegion.setX2( xWorld );
(yWorld - mMoveLastY) ); mSelectRegion.setY2( yWorld );
mMoveLastX = xWorld; update();
mMoveLastY = yWorld; break;
break;
case ArrowResize: case ArrowMove:
/* @TODO handle resize motion */ mModel->moveSelection( (xWorld - mMoveLastX),
break; (yWorld - mMoveLastY) );
mMoveLastX = xWorld;
mMoveLastY = yWorld;
break;
default: case ArrowResize:
// Should not happen! /* @TODO handle resize motion */
qWarning() << "Invalid arrow state."; break;
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: default:
// Should not happen! // Should not happen!
qWarning() << "Invalid create type."; qWarning() << "Invalid arrow state.";
break; 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 void
glabels::View::mousePressEvent( QMouseEvent* event ) glabels::View::mousePressEvent( QMouseEvent* event )
{ {
/* if ( mModel )
* 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) ) * 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 void
glabels::View::mouseReleaseEvent( QMouseEvent* event ) glabels::View::mouseReleaseEvent( QMouseEvent* event )
{ {
/* if ( mModel )
* 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) /*
* 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: case IdleState:
break; break;
case ArrowSelectRegion: case ArrowSelectRegion:
mSelectRegion.setX2( xWorld ); mSelectRegionVisible = false;
mSelectRegion.setY2( yWorld ); mSelectRegion.setX2( xWorld );
mSelectRegion.setY2( yWorld );
mModel->selectRegion( mSelectRegion ); mModel->selectRegion( mSelectRegion );
mState = IdleState; mState = IdleState;
break; update();
break;
default: default:
// Should not happen! // Should not happen!
break; break;
}
}
else
{
} }
}
else
{
} }
} }
@@ -502,7 +515,10 @@ glabels::View::mouseReleaseEvent( QMouseEvent* event )
void void
glabels::View::leaveEvent( QEvent* event ) 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->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 ) for ( double x = x0; x < w; x += gridSpacing )
{ {
@@ -651,8 +669,10 @@ glabels::View::drawFgLayer( QPainter* painter )
*/ */
painter->save(); painter->save();
QPen pen( labelOutlineColor, labelOutlineWidthPixels );
pen.setCosmetic( true );
painter->setBrush( QBrush( Qt::NoBrush ) ); painter->setBrush( QBrush( Qt::NoBrush ) );
painter->setPen( QPen( labelOutlineColor, labelOutlineWidthPixels/mZoom ) ); painter->setPen( pen );
if ( mModel->rotate() ) if ( mModel->rotate() )
{ {
@@ -683,3 +703,26 @@ glabels::View::drawHighlightLayer( QPainter* painter )
painter->restore(); 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();
}
}