Made move selection work in view.
This commit is contained in:
+20
-2
@@ -114,9 +114,9 @@ namespace glabels
|
|||||||
|
|
||||||
|
|
||||||
///
|
///
|
||||||
/// Delete Object
|
/// Object at x,y
|
||||||
///
|
///
|
||||||
LabelModelObject* LabelModel::objectAt( double scale, double x, double y )
|
LabelModelObject* LabelModel::objectAt( double scale, double x, double y ) const
|
||||||
{
|
{
|
||||||
foreach( LabelModelObject* object, mObjectList )
|
foreach( LabelModelObject* object, mObjectList )
|
||||||
{
|
{
|
||||||
@@ -130,6 +130,24 @@ namespace glabels
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
///
|
||||||
|
/// Handle at x,y
|
||||||
|
///
|
||||||
|
Handle* LabelModel::handleAt( double scale, double x, double y ) const
|
||||||
|
{
|
||||||
|
foreach( LabelModelObject* object, mObjectList )
|
||||||
|
{
|
||||||
|
Handle* handle = object->handleAt( scale, x, y );
|
||||||
|
if ( handle )
|
||||||
|
{
|
||||||
|
return handle;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
///
|
///
|
||||||
/// Object Changed Slot
|
/// Object Changed Slot
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ namespace glabels
|
|||||||
{
|
{
|
||||||
// Forward References
|
// Forward References
|
||||||
class LabelModelObject;
|
class LabelModelObject;
|
||||||
|
class Handle;
|
||||||
class LabelRegion;
|
class LabelRegion;
|
||||||
class ColorNode;
|
class ColorNode;
|
||||||
|
|
||||||
@@ -100,7 +101,8 @@ namespace glabels
|
|||||||
void addObject( LabelModelObject* object );
|
void addObject( LabelModelObject* object );
|
||||||
void deleteObject( LabelModelObject* object );
|
void deleteObject( LabelModelObject* object );
|
||||||
|
|
||||||
LabelModelObject* objectAt( double scale, double x, double y );
|
LabelModelObject* objectAt( double scale, double x, double y ) const;
|
||||||
|
Handle* handleAt( double scale, double x, double y ) const;
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////
|
/////////////////////////////////
|
||||||
|
|||||||
@@ -920,6 +920,27 @@ namespace glabels
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
///
|
||||||
|
/// Is one of this object's handles locate at x,y? If so, return it.
|
||||||
|
///
|
||||||
|
Handle* LabelModelObject::handleAt( double scale, double x, double y ) const
|
||||||
|
{
|
||||||
|
QPointF p( x, y );
|
||||||
|
p -= QPointF( mX0, mY0 ); // Translate point to x0,y0
|
||||||
|
|
||||||
|
foreach ( Handle* handle, mHandles )
|
||||||
|
{
|
||||||
|
QPainterPath handlePath = mMatrix.map( handle->path( scale ) );
|
||||||
|
if ( handlePath.contains( p ) )
|
||||||
|
{
|
||||||
|
return handle;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
///
|
///
|
||||||
/// Draw object + shadow
|
/// Draw object + shadow
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -386,6 +386,7 @@ namespace glabels
|
|||||||
void flipHoriz();
|
void flipHoriz();
|
||||||
void flipVert();
|
void flipVert();
|
||||||
bool isLocatedAt( double scale, double x, double y ) const;
|
bool isLocatedAt( double scale, double x, double y ) const;
|
||||||
|
Handle* handleAt( double scale, double x, double y ) const;
|
||||||
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////
|
||||||
|
|||||||
+97
-30
@@ -367,6 +367,7 @@ glabels::View::mouseMoveEvent( QMouseEvent* event )
|
|||||||
(yWorld - mMoveLastY) );
|
(yWorld - mMoveLastY) );
|
||||||
mMoveLastX = xWorld;
|
mMoveLastX = xWorld;
|
||||||
mMoveLastY = yWorld;
|
mMoveLastY = yWorld;
|
||||||
|
update();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ArrowResize:
|
case ArrowResize:
|
||||||
@@ -436,23 +437,81 @@ glabels::View::mousePressEvent( QMouseEvent* event )
|
|||||||
|
|
||||||
if ( event->button() & Qt::LeftButton )
|
if ( event->button() & Qt::LeftButton )
|
||||||
{
|
{
|
||||||
// Select Region
|
//
|
||||||
if ( !(event->modifiers() & Qt::ControlModifier) )
|
// LEFT BUTTON
|
||||||
|
//
|
||||||
|
|
||||||
|
if ( !mInObjectCreateMode )
|
||||||
{
|
{
|
||||||
mModel->unselectAll();
|
LabelModelObject* object = 0;
|
||||||
|
Handle* handle = 0;
|
||||||
|
if ( mModel->isSelectionAtomic() &&
|
||||||
|
(handle = mModel->handleAt( mZoom, xWorld, yWorld )) != 0 )
|
||||||
|
{
|
||||||
|
// TODO PREP RESIZE
|
||||||
|
}
|
||||||
|
else if ( (object = mModel->objectAt( mZoom, xWorld, yWorld )) != 0 )
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Start a Move Selection (adjusting selection if necessary)
|
||||||
|
//
|
||||||
|
if ( event->modifiers() & Qt::ControlModifier )
|
||||||
|
{
|
||||||
|
if ( object->isSelected() )
|
||||||
|
{
|
||||||
|
// Un-selecting a selected item
|
||||||
|
mModel->unselectObject( object );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Add to current selection
|
||||||
|
mModel->selectObject( object );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( !object->isSelected() )
|
||||||
|
{
|
||||||
|
// Replace current selection with this object
|
||||||
|
mModel->unselectAll();
|
||||||
|
mModel->selectObject( object );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mMoveLastX = xWorld;
|
||||||
|
mMoveLastY = yWorld;
|
||||||
|
|
||||||
|
mState = ArrowMove;
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Start a 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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mSelectRegionVisible = true;
|
|
||||||
mSelectRegion.setX1( xWorld );
|
|
||||||
mSelectRegion.setY1( yWorld );
|
|
||||||
mSelectRegion.setX2( xWorld );
|
|
||||||
mSelectRegion.setY2( yWorld );
|
|
||||||
|
|
||||||
mState = ArrowSelectRegion;
|
|
||||||
update();
|
|
||||||
}
|
}
|
||||||
else
|
else if ( event->button() & Qt::RightButton )
|
||||||
{
|
{
|
||||||
|
//
|
||||||
|
// RIGHT BUTTON
|
||||||
|
//
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -479,31 +538,39 @@ glabels::View::mouseReleaseEvent( QMouseEvent* event )
|
|||||||
|
|
||||||
if ( event->button() & Qt::LeftButton )
|
if ( event->button() & Qt::LeftButton )
|
||||||
{
|
{
|
||||||
switch (mState)
|
//
|
||||||
|
// LEFT BUTTON Release
|
||||||
|
//
|
||||||
|
|
||||||
|
if ( !mInObjectCreateMode )
|
||||||
{
|
{
|
||||||
|
|
||||||
|
switch (mState)
|
||||||
|
{
|
||||||
|
|
||||||
case IdleState:
|
case ArrowSelectRegion:
|
||||||
break;
|
mSelectRegionVisible = false;
|
||||||
|
mSelectRegion.setX2( xWorld );
|
||||||
|
mSelectRegion.setY2( yWorld );
|
||||||
|
|
||||||
case ArrowSelectRegion:
|
mModel->selectRegion( mSelectRegion );
|
||||||
mSelectRegionVisible = false;
|
|
||||||
mSelectRegion.setX2( xWorld );
|
|
||||||
mSelectRegion.setY2( yWorld );
|
|
||||||
|
|
||||||
mModel->selectRegion( mSelectRegion );
|
mState = IdleState;
|
||||||
|
update();
|
||||||
|
break;
|
||||||
|
|
||||||
mState = IdleState;
|
default:
|
||||||
update();
|
mState = IdleState;
|
||||||
break;
|
update();
|
||||||
|
break;
|
||||||
default:
|
|
||||||
// Should not happen!
|
|
||||||
break;
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user