Added object creation mode (box only) to view.

This commit is contained in:
Jim Evins
2015-08-15 19:40:52 -04:00
parent 95f5ee5e76
commit 6e69991a15
15 changed files with 390 additions and 123 deletions
+223 -117
View File
@@ -27,6 +27,8 @@
#include "LabelModel.h"
#include "LabelModelObject.h"
#include "LabelModelBoxObject.h"
#include "Cursors.h"
#include "libglabels/Markup.h"
#include "libglabels/FrameRect.h"
@@ -130,9 +132,9 @@ glabels::View::setModel( LabelModel* model )
{
setZoomReal( 1, false );
connect( model, SIGNAL(changed()), this, SLOT(onModelChanged()) );
connect( model, SIGNAL(selectionChanged()), this, SLOT(onModelSelectionChanged()) );
connect( model, SIGNAL(sizeChanged()), this, SLOT(onModelSizeChanged()) );
connect( model, SIGNAL(changed()), this, SLOT(update()) );
connect( model, SIGNAL(selectionChanged()), this, SLOT(update()) );
connect( model, SIGNAL(sizeChanged()), this, SLOT(update()) );
update();
}
@@ -286,6 +288,33 @@ glabels::View::setZoomReal( double zoom, bool zoomToFitFlag )
}
///
/// Arrow mode (normal mode)
///
void
glabels::View::arrowMode()
{
setCursor( Qt::ArrowCursor );
mInObjectCreateMode = false;
mState = IdleState;
}
///
/// Create box mode
///
void
glabels::View::createBoxMode()
{
setCursor( Cursors::Box() );
mInObjectCreateMode = true;
mCreateObjectType = Box;
mState = IdleState;
}
///
/// Resize Event Handler
///
@@ -310,118 +339,6 @@ glabels::View::resizeEvent( QResizeEvent *event )
}
///
/// Mouse Movement Event Handler
///
void
glabels::View::mouseMoveEvent( QMouseEvent* event )
{
if ( mModel )
{
/*
* Transform to label coordinates
*/
QTransform transform;
transform.scale( mScale, mScale );
transform.translate( mX0, mY0 );
QPointF pWorld = transform.inverted().map( event->posF() );
double xWorld = pWorld.x();
double yWorld = pWorld.y();
/*
* Emit signal regardless of mode
*/
emit pointerMoved( xWorld, yWorld );
/*
* Handle event as appropriate for mode
*/
if ( !mInObjectCreateMode )
{
switch (mState)
{
case IdleState:
if ( mModel->isSelectionAtomic() &&
mModel->handleAt( mScale, xWorld, yWorld ) )
{
setCursor( Qt::CrossCursor );
}
else if ( mModel->objectAt( mScale, xWorld, yWorld ) )
{
setCursor( Qt::SizeAllCursor );
}
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;
update();
break;
case ArrowResize:
handleResizeMotion( xWorld, yWorld );
update();
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;
}
}
}
}
}
///
/// Mouse Button Press Event Handler
///
@@ -451,6 +368,10 @@ glabels::View::mousePressEvent( QMouseEvent* event )
if ( !mInObjectCreateMode )
{
//
// NORMAL MODE
//
LabelModelObject* object = 0;
Handle* handle = 0;
if ( mModel->isSelectionAtomic() &&
@@ -497,7 +418,6 @@ glabels::View::mousePressEvent( QMouseEvent* event )
mMoveLastY = yWorld;
mState = ArrowMove;
update();
}
else
{
@@ -519,6 +439,53 @@ glabels::View::mousePressEvent( QMouseEvent* event )
update();
}
}
else
{
//
// OBJECT CREATION MODE
//
if ( mState == IdleState )
{
switch ( mCreateObjectType )
{
case Box:
mCreateObject = new LabelModelBoxObject();
break;
case Ellipse:
// mCreateObject = new LabelModelEllipseObject();
break;
case Line:
// mCreateObject = new LabelModelLineObject();
break;
case Image:
// mCreateObject = new LabelModelImageObject();
break;
case Text:
// mCreateObject = new LabelModelTextObject();
break;
case Barcode:
// mCreateObject = new LabelModelBarcodeObject();
break;
default:
Q_ASSERT_X( false, "View::::mousePressEvent", "Invalid creation type" );
break;
}
mCreateObject->setPosition( xWorld, yWorld );
mCreateObject->setSize( 0, 0 );
mModel->addObject( mCreateObject );
mModel->unselectAll();
mModel->selectObject( mCreateObject );
mCreateX0 = xWorld;
mCreateY0 = yWorld;
mState = CreateDrag;
}
}
}
else if ( event->button() & Qt::RightButton )
@@ -532,6 +499,123 @@ glabels::View::mousePressEvent( QMouseEvent* event )
}
///
/// Mouse Movement Event Handler
///
void
glabels::View::mouseMoveEvent( QMouseEvent* event )
{
using std::min;
using std::max;
if ( mModel )
{
/*
* Transform to label coordinates
*/
QTransform transform;
transform.scale( mScale, mScale );
transform.translate( mX0, mY0 );
QPointF pWorld = transform.inverted().map( event->posF() );
double xWorld = pWorld.x();
double yWorld = pWorld.y();
/*
* Emit signal regardless of mode
*/
emit pointerMoved( xWorld, yWorld );
/*
* Handle event as appropriate for mode
*/
if ( !mInObjectCreateMode )
{
///
/// NORMAL MODE
///
switch (mState)
{
case IdleState:
if ( mModel->isSelectionAtomic() &&
mModel->handleAt( mScale, xWorld, yWorld ) )
{
setCursor( Qt::CrossCursor );
}
else if ( mModel->objectAt( mScale, xWorld, yWorld ) )
{
setCursor( Qt::SizeAllCursor );
}
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:
handleResizeMotion( xWorld, yWorld );
break;
default:
// Should not happen!
Q_ASSERT_X( false, "View::::mouseMoveEvent", "Invalid state" );
break;
}
}
else
{
//
// OBJECT CREATION MODE
//
if ( mState != IdleState )
{
switch (mCreateObjectType)
{
case Box:
case Ellipse:
case Image:
case Text:
case Barcode:
mCreateObject->setPosition( min( xWorld, mCreateX0 ),
min( yWorld, mCreateY0 ) );
mCreateObject->setSize( max(xWorld,mCreateX0) - min(xWorld,mCreateX0),
max(yWorld,mCreateY0) - min(yWorld,mCreateY0) );
break;
case Line:
mCreateObject->setSize( xWorld - mCreateX0, yWorld - mCreateY0 );
break;
default:
// Should not happen!
Q_ASSERT_X( false, "View::::mouseMoveEvent", "Invalid creation mode" );
break;
}
}
}
}
}
///
/// Mouse Button Release Event Handler
///
@@ -561,6 +645,9 @@ glabels::View::mouseReleaseEvent( QMouseEvent* event )
if ( !mInObjectCreateMode )
{
///
/// NORMAL MODE
///
switch (mState)
{
@@ -582,7 +669,6 @@ glabels::View::mouseReleaseEvent( QMouseEvent* event )
default:
mState = IdleState;
update();
break;
}
@@ -590,7 +676,27 @@ glabels::View::mouseReleaseEvent( QMouseEvent* event )
}
else
{
//
// OBJECT CREATION MODE
//
if ( (fabs(mCreateObject->w()) < 4) && (fabs(mCreateObject->h()) < 4) )
{
switch (mCreateObjectType)
{
case Text:
mCreateObject->setSize( 0, 0 );
break;
case Line:
mCreateObject->setSize( 72, 0 );
break;
default:
mCreateObject->setSize( 72, 72 );
break;
}
}
arrowMode();
}
}
}