First pass at moving to QPainter based view.

This commit is contained in:
Jim Evins
2015-08-11 08:56:16 -04:00
parent 80f49aeb10
commit ca345cdede
6 changed files with 573 additions and 452 deletions
+36 -19
View File
@@ -93,6 +93,42 @@ namespace glabels
} }
///
/// Delete Object
///
void LabelModel::deleteObject( LabelModelObject* object )
{
object->unselect();
mObjectList.removeOne( object );
disconnect( object, 0, this, 0 );
mModified = true;
emit changed();
emit modifiedChanged();
delete object;
}
///
/// Delete Object
///
LabelModelObject* LabelModel::objectAt( double x, double y )
{
foreach( LabelModelObject* object, mObjectList )
{
if ( object->isLocatedAt( x, y ) )
{
return object;
}
}
return 0;
}
/// ///
/// Object Changed Slot /// Object Changed Slot
/// ///
@@ -117,25 +153,6 @@ namespace glabels
} }
///
/// Delete Object
///
void LabelModel::deleteObject( LabelModelObject* object )
{
object->unselect();
mObjectList.removeOne( object );
disconnect( object, 0, this, 0 );
mModified = true;
emit changed();
emit modifiedChanged();
delete object;
}
/// ///
/// Select Object /// Select Object
/// ///
+2
View File
@@ -98,6 +98,8 @@ namespace glabels
void addObject( LabelModelObject* object ); void addObject( LabelModelObject* object );
void deleteObject( LabelModelObject* object ); void deleteObject( LabelModelObject* object );
LabelModelObject* objectAt( double x, double y );
///////////////////////////////// /////////////////////////////////
// Manipulate selection // Manipulate selection
+9
View File
@@ -893,6 +893,15 @@ namespace glabels
} }
///
/// Default isLocatedAt method
///
bool LabelModelObject::isLocatedAt( double x, double y )
{
return false;
}
/// ///
/// Update Representative Graphics Item with Object's Transformation Matrix /// Update Representative Graphics Item with Object's Transformation Matrix
/// ///
+1
View File
@@ -384,6 +384,7 @@ namespace glabels
void rotate( double thetaDegs ); void rotate( double thetaDegs );
void flipHoriz(); void flipHoriz();
void flipVert(); void flipVert();
virtual bool isLocatedAt( double x, double y );
/////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////
+446 -397
View File
@@ -20,14 +20,10 @@
#include "View.h" #include "View.h"
#include <QGraphicsScene>
#include <QGraphicsItemGroup>
#include <QMouseEvent>
#include <QGraphicsLineItem>
#include <QGraphicsDropShadowEffect>
#include <algorithm> #include <algorithm>
#include <cmath> #include <cmath>
#include <iostream> #include <QMouseEvent>
#include <QtDebug>
#include "LabelModel.h" #include "LabelModel.h"
#include "LabelModelObject.h" #include "LabelModelObject.h"
@@ -49,7 +45,7 @@ namespace
const double ZOOM_TO_FIT_PAD = 16.0; const double ZOOM_TO_FIT_PAD = 16.0;
const QColor shadowColor( 64, 64, 64 ); const QColor shadowColor( 64, 64, 64, 128 );
const double shadowOffsetPixels = 3; const double shadowOffsetPixels = 3;
const double shadowRadiusPixels = 12; const double shadowRadiusPixels = 12;
@@ -70,227 +66,420 @@ namespace
} }
namespace glabels
///
/// Constructor
///
glabels::View::View( QWidget *parent ) : QWidget(parent)
{ {
mState = IdleState;
/// setZoomReal( 1, false );
/// Constructor
/// mModel = 0;
View::View( QWidget *parent ) : QGraphicsView(parent) mMarkupVisible = true;
mGridVisible = true;
mGridSpacing = 18;
mInObjectCreateMode = false;
setMouseTracking( true );
}
///
/// Zoom property
///
double
glabels::View::zoom() const
{
return mZoom;
}
///
/// Markup visible? property
///
bool
glabels::View::markupVisible() const
{
return mMarkupVisible;
}
///
/// Grid visible? property
///
bool
glabels::View::qridVisible() const
{
return mGridVisible;
}
///
/// Model Parameter Setter
///
void
glabels::View::setModel( LabelModel* model )
{
mModel = model;
if ( model )
{ {
mState = IdleState; connect( model, SIGNAL(changed()), this, SLOT(onModelChanged()) );
connect( model, SIGNAL(selectionChanged()), this, SLOT(onModelSelectionChanged()) );
setZoomReal( 1, false ); connect( model, SIGNAL(sizeChanged()), this, SLOT(onModelSizeChanged()) );
mModel = 0;
setMouseTracking( true );
setAttribute( Qt::WA_TranslucentBackground );
viewport()->setAutoFillBackground( false );
mScene = new QGraphicsScene();
setScene( mScene );
mScene->addItem( mLabelLayer = new QGraphicsItemGroup() );
mScene->addItem( mGridLayer = new QGraphicsItemGroup() );
mScene->addItem( mMarkupLayer = new QGraphicsItemGroup() );
mScene->addItem( mObjectLayer = new QGraphicsItemGroup() );
mScene->addItem( mForegroundLayer = new QGraphicsItemGroup() );
mScene->addItem( mSelectRegionLayer = new QGraphicsItemGroup() );
initSelectRegionLayer();
} }
}
/// ///
/// Model Parameter Setter /// Grid Visibility Parameter Setter
/// ///
void View::setModel( LabelModel* model ) void
glabels::View::setGridVisible( bool visibleFlag )
{
mGridVisible = visibleFlag;
update();
}
///
/// Markup Visibility Parameter Setter
///
void
glabels::View::setMarkupVisible( bool visibleFlag )
{
mMarkupVisible = visibleFlag;
update();
}
///
/// Zoom In "One Notch"
///
void
glabels::View::zoomIn()
{
// Find closest standard zoom level to our current zoom
// Start with 2nd largest scale
int i_min = 1;
double dist_min = fabs( zoomLevels[1] - mZoom );
for ( int i = 2; i < nZoomLevels; i++ )
{ {
mModel = model; double dist = fabs( zoomLevels[i] - mZoom );
if ( dist < dist_min )
mScene->setSceneRect( 0, 0, model->w(), model->h() );
initLabelLayer();
initGridLayer();
initMarkupLayer();
foreach (LabelModelObject* object, model->objectList() )
{ {
addObjectToObjectLayer( object ); i_min = i;
dist_min = dist;
} }
initForegroundLayer();
} }
// Zoom in one notch
setZoomReal( zoomLevels[i_min-1], false );
}
///
/// Grid Visibility Parameter Setter ///
/// /// Zoom Out "One Notch"
void View::setGridVisible( bool visibleFlag ) ///
void
glabels::View::zoomOut()
{
// Find closest standard zoom level to our current zoom
// Start with largest scale, end on 2nd smallest
int i_min = 0;
double dist_min = fabs( zoomLevels[0] - mZoom );
for ( int i = 1; i < (nZoomLevels-1); i++ )
{ {
mGridLayer->setVisible( visibleFlag ); double dist = fabs( zoomLevels[i] - mZoom );
} if ( dist < dist_min )
///
/// Markup Visibility Parameter Setter
///
void View::setMarkupVisible( bool visibleFlag )
{
mMarkupLayer->setVisible( visibleFlag );
}
///
/// Zoom In "One Notch"
///
void View::zoomIn()
{
// Find closest standard zoom level to our current zoom
// Start with 2nd largest scale
int i_min = 1;
double dist_min = fabs( zoomLevels[1] - mZoom );
for ( int i = 2; i < nZoomLevels; i++ )
{ {
double dist = fabs( zoomLevels[i] - mZoom ); i_min = i;
if ( dist < dist_min ) dist_min = dist;
}
}
// Zoom out one notch
setZoomReal( zoomLevels[i_min+1], false );
}
///
/// Zoom To 1:1 Scale
///
void
glabels::View::zoom1To1()
{
setZoomReal( 1.0, false );
}
///
/// Zoom To Fit
///
void
glabels::View::zoomToFit()
{
using std::min;
using std::max;
double x_scale = (72.0/physicalDpiX()) * ( width() - ZOOM_TO_FIT_PAD ) / mModel->w();
double y_scale = (72.0/physicalDpiY()) * ( height() - ZOOM_TO_FIT_PAD ) / mModel->h();
double newZoom = min( x_scale, y_scale );
// Limits
newZoom = min( newZoom, zoomLevels[0] );
newZoom = max( newZoom, zoomLevels[nZoomLevels-1] );
setZoomReal( newZoom, true );
}
///
/// Is Zoom at Maximum?
///
bool
glabels::View::isZoomMax() const
{
return ( mZoom >= zoomLevels[0] );
}
///
/// Is Zoom at Minimum?
///
bool
glabels::View::isZoomMin() const
{
return ( mZoom <= zoomLevels[nZoomLevels-1] );
}
///
/// Set Zoom to Value
///
void
glabels::View::setZoomReal( double zoom, bool zoomToFitFlag )
{
mZoom = zoom;
mZoomToFitFlag = zoomToFitFlag;
update();
emit zoomChanged();
}
///
/// Paint Event Handler
///
void
glabels::View::paintEvent( QPaintEvent* event )
{
if ( mModel )
{
QPainter painter( this );
painter.scale( mZoom, mZoom );
drawBgLayer( &painter );
drawGridLayer( &painter );
drawMarkupLayer( &painter );
}
}
///
/// Resize Event Handler
///
void
glabels::View::resizeEvent( QResizeEvent *event )
{
if ( mZoomToFitFlag )
{
zoomToFit();
}
else
{
update();
}
}
///
/// Mouse Movement Event Handler
///
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 )
{
switch (mState)
{
case IdleState:
/* @TODO handle handles. */
if ( mModel->objectAt( xWorld, yWorld ) )
{ {
i_min = i; setCursor( Qt::SizeAllCursor );
dist_min = dist; }
else
{
setCursor( Qt::ArrowCursor );
}
break;
case ArrowSelectRegion:
mSelectRegion.setX2( xWorld );
mSelectRegion.setY2( yWorld );
update();
break;
case ArrowMove:
mModel->moveSelection( (xWorld - mMoveLastX),
(yWorld - mMoveLastY) );
mMoveLastX = xWorld;
mMoveLastY = yWorld;
break;
case ArrowResize:
/* @TODO handle resize motion */
break;
default:
// Should not happen!
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;
} }
} }
// Zoom in one notch
setZoomReal( zoomLevels[i_min-1], false );
} }
}
/// ///
/// Zoom Out "One Notch" /// Mouse Button Press Event Handler
/// ///
void View::zoomOut() 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 )
{ {
// Find closest standard zoom level to our current zoom // Select Region
// Start with largest scale, end on 2nd smallest if ( !(event->modifiers() & Qt::ControlModifier) )
int i_min = 0;
double dist_min = fabs( zoomLevels[0] - mZoom );
for ( int i = 1; i < (nZoomLevels-1); i++ )
{ {
double dist = fabs( zoomLevels[i] - mZoom ); mModel->unselectAll();
if ( dist < dist_min )
{
i_min = i;
dist_min = dist;
}
} }
// Zoom out one notch mSelectRegionVisible = true;
setZoomReal( zoomLevels[i_min+1], false ); mSelectRegion.setX1( xWorld );
mSelectRegion.setY1( yWorld );
mSelectRegion.setX2( xWorld );
mSelectRegion.setY2( yWorld );
mState = ArrowSelectRegion;
} }
else
///
/// Zoom To 1:1 Scale
///
void View::zoom1To1()
{ {
setZoomReal( 1.0, false );
} }
}
/// ///
/// Zoom To Fit /// Mouse Button Release Event Handler
/// ///
void View::zoomToFit() 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 )
{ {
using std::min;
using std::max;
double x_scale = (72.0/physicalDpiX()) * ( width() - ZOOM_TO_FIT_PAD ) / mModel->w();
double y_scale = (72.0/physicalDpiY()) * ( height() - ZOOM_TO_FIT_PAD ) / mModel->h();
double newZoom = min( x_scale, y_scale );
// Limits
newZoom = min( newZoom, zoomLevels[0] );
newZoom = max( newZoom, zoomLevels[nZoomLevels-1] );
setZoomReal( newZoom, true );
}
///
/// Is Zoom at Maximum?
///
bool View::isZoomMax() const
{
return ( mZoom >= zoomLevels[0] );
}
///
/// Is Zoom at Minimum?
///
bool View::isZoomMin() const
{
return ( mZoom <= zoomLevels[nZoomLevels-1] );
}
///
/// Set Zoom to Value
///
void View::setZoomReal( double zoom, bool zoomToFitFlag )
{
mZoom = zoom;
mZoomToFitFlag = zoomToFitFlag;
resetTransform();
scale( mZoom*physicalDpiX()/72.0, mZoom*physicalDpiY()/72.0 );
emit zoomChanged();
}
///
/// Resize Event Handler
///
void View::resizeEvent( QResizeEvent *event )
{
if ( mZoomToFitFlag )
{
zoomToFit();
}
else
{
// Refresh to keep view location relative to window
resetTransform();
scale( mZoom*physicalDpiX()/72.0, mZoom*physicalDpiY()/72.0 );
}
}
///
/// Mouse Movement Event Handler
///
void View::mouseMoveEvent( QMouseEvent* event )
{
QPointF pointer = mapToScene( event->x(), event->y() );
emit pointerMoved( pointer.x(), pointer.y() );
switch (mState) switch (mState)
{ {
case IdleState: case IdleState:
break; break;
case ArrowSelectRegionState: case ArrowSelectRegion:
mSelectRegion.setX2( pointer.x() ); mSelectRegion.setX2( xWorld );
mSelectRegion.setY2( pointer.y() ); mSelectRegion.setY2( yWorld );
mSelectRegionItem->setRect( mSelectRegion.rect() ); mModel->selectRegion( mSelectRegion );
mState = IdleState;
break; break;
default: default:
@@ -299,139 +488,58 @@ namespace glabels
} }
} }
else
///
/// Leave Event Handler
///
void View::leaveEvent( QEvent* event )
{ {
emit pointerExited();
} }
}
/// ///
/// Mouse Button Press Event Handler /// Leave Event Handler
/// ///
void View::mousePressEvent( QMouseEvent* event ) void
glabels::View::leaveEvent( QEvent* event )
{
emit pointerExited();
}
///
/// Draw Background Layer
///
void
glabels::View::drawBgLayer( QPainter* painter )
{
painter->save();
QBrush brush( shadowColor );
painter->setBrush( QBrush( shadowColor ) );
painter->translate( shadowOffsetPixels/mZoom, shadowOffsetPixels/mZoom );
painter->drawPath( mModel->frame()->path() );
painter->restore();
painter->save();
painter->setBrush( QBrush( labelColor ) );
painter->drawPath( mModel->frame()->path() );
painter->restore();
}
///
/// Draw Grid Layer
///
void
glabels::View::drawGridLayer( QPainter* painter )
{
if ( mGridVisible )
{ {
QPointF pointer = mapToScene( event->x(), event->y() );
if ( event->button() & Qt::LeftButton )
{
// Select Region
if ( !(event->modifiers() & Qt::ControlModifier) )
{
mModel->unselectAll();
}
mSelectRegion.setX1( pointer.x() );
mSelectRegion.setY1( pointer.y() );
mSelectRegion.setX2( pointer.x() );
mSelectRegion.setY2( pointer.y() );
mSelectRegionItem->setRect( mSelectRegion.rect() );
mSelectRegionLayer->setVisible( true );
mState = ArrowSelectRegionState;
}
else
{
}
}
///
/// Mouse Button Release Event Handler
///
void View::mouseReleaseEvent( QMouseEvent* event )
{
QPointF pointer = mapToScene( event->x(), event->y() );
if ( event->button() & Qt::LeftButton )
{
switch (mState)
{
case IdleState:
break;
case ArrowSelectRegionState:
mSelectRegion.setX2( pointer.x() );
mSelectRegion.setY2( pointer.y() );
mSelectRegionItem->setRect( 0, 0, 0, 0 );
mSelectRegionLayer->setVisible( false );
mModel->selectRegion( mSelectRegion );
mState = IdleState;
break;
default:
// Should not happen!
break;
}
}
else
{
}
}
///
/// Clear Layer (Item Group) of All Child Items
///
void View::clearLayer( QGraphicsItemGroup* layer )
{
foreach( QGraphicsItem* item, layer->childItems() )
{
layer->removeFromGroup( item );
}
}
///
/// Initialize Label Layer
///
void View::initLabelLayer()
{
clearLayer( mLabelLayer );
QGraphicsPathItem *labelItem = new QGraphicsPathItem( mModel->frame()->path() );
QBrush brush( labelColor );
labelItem->setBrush( brush );
QGraphicsDropShadowEffect *shadowEffect = new QGraphicsDropShadowEffect();
shadowEffect->setColor( shadowColor );
shadowEffect->setOffset( shadowOffsetPixels );
shadowEffect->setBlurRadius( shadowRadiusPixels );
labelItem->setGraphicsEffect( shadowEffect );
mLabelLayer->addToGroup( labelItem );
}
///
/// Initialize Grid Layer
///
void View::initGridLayer()
{
clearLayer( mGridLayer );
QGraphicsPathItem *clipItem = new QGraphicsPathItem( mModel->frame()->path() );
clipItem->setFlag( QGraphicsItem::ItemClipsChildrenToShape );
QPen pen( gridLineColor );
pen.setCosmetic( true );
pen.setWidthF( gridLineWidthPixels );
double w = mModel->w(); double w = mModel->w();
double h = mModel->h(); double h = mModel->h();
double x0;
double y0; double x0, y0;
if ( dynamic_cast<const libglabels::FrameRect*>( mModel->frame() ) ) if ( dynamic_cast<const libglabels::FrameRect*>( mModel->frame() ) )
{ {
x0 = gridSpacing; x0 = gridSpacing;
@@ -439,97 +547,38 @@ namespace glabels
} }
else else
{ {
/* round labels, align grid with center of label. */ /* round labels, adjust grid to line up with center of label. */
x0 = fmod( w/2, gridSpacing ); x0 = fmod( w/2, gridSpacing );
y0 = fmod( h/2, gridSpacing ); y0 = fmod( h/2, gridSpacing );
} }
painter->save();
painter->setClipPath( mModel->frame()->path() );
painter->setPen( QPen( gridLineColor, gridLineWidthPixels/mZoom ) );
for ( double x = x0; x < w; x += gridSpacing ) for ( double x = x0; x < w; x += gridSpacing )
{ {
QGraphicsLineItem* lineItem = new QGraphicsLineItem( x, 0, x, h, clipItem ); painter->drawLine( x, 0, x, h );
lineItem->setPen( pen );
} }
for ( double y = y0; y < h; y += gridSpacing ) for ( double y = y0; y < h; y += gridSpacing )
{ {
QGraphicsLineItem* lineItem = new QGraphicsLineItem( 0, y, w, y, clipItem ); painter->drawLine( 0, y, w, y );
lineItem->setPen( pen );
} }
mGridLayer->addToGroup( clipItem ); painter->restore();
} }
///
/// Initialize Markup Layer
///
void View::initMarkupLayer()
{
clearLayer( mMarkupLayer );
QPen pen( markupLineColor );
pen.setCosmetic( true );
pen.setWidthF( markupLineWidthPixels );
const libglabels::Frame* frame = mModel->frame();
foreach (libglabels::Markup* markup, frame->markups() )
{
QGraphicsItem* markupItem = markup->createGraphicsItem( frame, pen );
mMarkupLayer->addToGroup( markupItem );
}
}
///
/// Add Object to Object Layer
///
void View::addObjectToObjectLayer( LabelModelObject* object )
{
QGraphicsItem* item = object->createGraphicsItem();
mObjectLayer->addToGroup( item );
}
///
/// Initialize Foreground Layer
///
void View::initForegroundLayer()
{
clearLayer( mForegroundLayer );
QGraphicsPathItem *outlineItem = new QGraphicsPathItem( mModel->frame()->path() );
QPen pen( labelOutlineColor );
pen.setJoinStyle( Qt::MiterJoin );
pen.setCosmetic( true );
pen.setWidthF( labelOutlineWidthPixels );
outlineItem->setPen( pen );
mForegroundLayer->addToGroup( outlineItem );
}
///
/// Initialize Select Region Layer
///
void View::initSelectRegionLayer()
{
clearLayer( mSelectRegionLayer );
mSelectRegionItem = new QGraphicsRectItem();
QBrush brush( selectRegionFillColor );
mSelectRegionItem->setBrush( brush );
QPen pen( selectRegionOutlineColor );
pen.setJoinStyle( Qt::MiterJoin );
pen.setCosmetic( true );
pen.setWidthF( selectRegionOutlineWidthPixels );
mSelectRegionItem->setPen( pen );
mSelectRegionLayer->addToGroup( mSelectRegionItem );
}
} }
///
/// Draw Markup Layer
///
void
glabels::View::drawMarkupLayer( QPainter* painter )
{
}
+79 -36
View File
@@ -21,13 +21,11 @@
#ifndef glabels_View_h #ifndef glabels_View_h
#define glabels_View_h #define glabels_View_h
#include <QGraphicsView> #include <QWidget>
#include <QPainter>
#include "LabelRegion.h" #include "LabelRegion.h"
class QGraphicsScene;
class QGraphicsItemGroup;
namespace glabels namespace glabels
{ {
@@ -39,7 +37,7 @@ namespace glabels
/// ///
/// View Widget /// View Widget
/// ///
class View : public QGraphicsView class View : public QWidget
{ {
Q_OBJECT Q_OBJECT
@@ -54,16 +52,20 @@ namespace glabels
// Signals // Signals
///////////////////////////////////// /////////////////////////////////////
signals: signals:
void contextMenuActivate();
void zoomChanged(); void zoomChanged();
void pointerMoved( double x, double y ); void pointerMoved( double x, double y );
void pointerExited(); void pointerExited();
void modeChanged();
///////////////////////////////////// /////////////////////////////////////
// Parameters // Parameters
///////////////////////////////////// /////////////////////////////////////
public: public:
inline double zoom() const; double zoom() const;
bool markupVisible() const;
bool qridVisible() const;
///////////////////////////////////// /////////////////////////////////////
@@ -95,10 +97,24 @@ namespace glabels
void setZoomReal( double zoom, bool zoomToFitFlag ); void setZoomReal( double zoom, bool zoomToFitFlag );
/////////////////////////////////////
// Mode operations
/////////////////////////////////////
public:
void arrowMode();
void createBoxMode();
void createEllipseMode();
void createLineMode();
void createImageMode();
void createTextMode();
void createBarcodeMode();
///////////////////////////////////// /////////////////////////////////////
// Event handlers // Event handlers
///////////////////////////////////// /////////////////////////////////////
protected: protected:
void paintEvent( QPaintEvent* event );
void resizeEvent( QResizeEvent* event ); void resizeEvent( QResizeEvent* event );
void mouseMoveEvent( QMouseEvent* event ); void mouseMoveEvent( QMouseEvent* event );
void mousePressEvent( QMouseEvent* event ); void mousePressEvent( QMouseEvent* event );
@@ -110,13 +126,25 @@ namespace glabels
// Private methods // Private methods
///////////////////////////////////// /////////////////////////////////////
private: private:
void clearLayer( QGraphicsItemGroup* layer ); void drawBgLayer( QPainter* painter );
void initLabelLayer(); void drawGridLayer( QPainter* painter );
void initGridLayer(); void drawMarkupLayer( QPainter* painter );
void initMarkupLayer(); void drawObjectsLayer( QPainter* painter );
void addObjectToObjectLayer( LabelModelObject* object ); void drawFgLayer( QPainter* painter );
void initForegroundLayer(); void drawHighlightLayer( QPainter* painter );
void initSelectRegionLayer(); void drawSelectRegionLayer( QPainter* painter );
void handleResizeMotion( QPainter* painter,
double xPixels,
double yPixels );
/////////////////////////////////////
// Private slots
/////////////////////////////////////
private:
void onLabelChanged();
void onLabelSizeChanged();
///////////////////////////////////// /////////////////////////////////////
@@ -125,40 +153,55 @@ namespace glabels
private: private:
enum State { enum State {
IdleState, IdleState,
ArrowSelectRegionState ArrowSelectRegion,
ArrowMove,
ArrowResize,
CreateDrag
}; };
State mState; enum CreateType {
Box,
QGraphicsScene* mScene; Ellipse,
Line,
QGraphicsItemGroup* mLabelLayer; Image,
QGraphicsItemGroup* mGridLayer; Text,
QGraphicsItemGroup* mMarkupLayer; Barcode
QGraphicsItemGroup* mObjectLayer; };
QGraphicsItemGroup* mForegroundLayer;
QGraphicsItemGroup* mSelectRegionLayer;
QGraphicsRectItem* mSelectRegionItem;
LabelRegion mSelectRegion;
double mZoom; double mZoom;
bool mZoomToFitFlag; bool mZoomToFitFlag;
bool mMarkupVisible;
bool mGridVisible;
double mGridSpacing;
LabelModel* mModel; LabelModel* mModel;
State mState;
/* ArrowSelectRegion state */
bool mSelectRegionVisible;
LabelRegion mSelectRegion;
/* ArrowMove state */
double mMoveLastX;
double mMoveLastY;
/* ArrowResize state */
/* @TODO */
/* CreateDrag state */
bool mInObjectCreateMode;
CreateType mCreateObjectType;
LabelModelObject* mCreateObject;
double mCreateX0;
double mCreateY0;
}; };
/////////////////////////////////
// INLINE METHODS
/////////////////////////////////
inline double View::zoom() const
{
return mZoom;
}
} }