Make both highlight and select region layers work.
This commit is contained in:
+24
-19
@@ -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() );
|
||||
}
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
#include <QFileInfo>
|
||||
#include <algorithm>
|
||||
#include <cmath>
|
||||
#include <QtDebug>
|
||||
|
||||
#include "LabelModelObject.h"
|
||||
#include "LabelRegion.h"
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
#include <QTransform>
|
||||
#include <QFont>
|
||||
#include <algorithm>
|
||||
#include <QtDebug>
|
||||
|
||||
#include "ColorNode.h"
|
||||
#include "TextNode.h"
|
||||
|
||||
@@ -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;
|
||||
|
||||
+23
-5
@@ -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();
|
||||
|
||||
@@ -59,6 +59,10 @@ namespace glabels
|
||||
private:
|
||||
LabelModelObject* mOwner;
|
||||
|
||||
QVector<qreal> mDashes;
|
||||
QPen mPen1;
|
||||
QPen mPen2;
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
+176
-133
@@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user