Made move selection work in view.

This commit is contained in:
Jim Evins
2015-08-14 16:34:40 -04:00
parent e5f5ddaf17
commit ffa0819010
5 changed files with 142 additions and 33 deletions
+20 -2
View File
@@ -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 )
{
@@ -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
///
+3 -1
View File
@@ -33,6 +33,7 @@ namespace glabels
{
// Forward References
class LabelModelObject;
class Handle;
class LabelRegion;
class ColorNode;
@@ -100,7 +101,8 @@ namespace glabels
void addObject( 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;
/////////////////////////////////
+21
View File
@@ -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
///
+1
View File
@@ -386,6 +386,7 @@ namespace glabels
void flipHoriz();
void flipVert();
bool isLocatedAt( double scale, double x, double y ) const;
Handle* handleAt( double scale, double x, double y ) const;
///////////////////////////////////////////////////////////////
+97 -30
View File
@@ -367,6 +367,7 @@ glabels::View::mouseMoveEvent( QMouseEvent* event )
(yWorld - mMoveLastY) );
mMoveLastX = xWorld;
mMoveLastY = yWorld;
update();
break;
case ArrowResize:
@@ -436,23 +437,81 @@ glabels::View::mousePressEvent( QMouseEvent* event )
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 )
{
switch (mState)
//
// LEFT BUTTON Release
//
if ( !mInObjectCreateMode )
{
switch (mState)
{
case IdleState:
break;
case ArrowSelectRegion:
mSelectRegionVisible = false;
mSelectRegion.setX2( xWorld );
mSelectRegion.setY2( yWorld );
case ArrowSelectRegion:
mSelectRegionVisible = false;
mSelectRegion.setX2( xWorld );
mSelectRegion.setY2( yWorld );
mModel->selectRegion( mSelectRegion );
mModel->selectRegion( mSelectRegion );
mState = IdleState;
update();
break;
mState = IdleState;
update();
break;
default:
// Should not happen!
break;
default:
mState = IdleState;
update();
break;
}
}
else
{
}
}
else
{
}
}
}