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 ) 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
/// ///
+3 -1
View File
@@ -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;
///////////////////////////////// /////////////////////////////////
+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 /// Draw object + shadow
/// ///
+1
View File
@@ -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;
/////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////
+96 -29
View File
@@ -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 )
{ {
case IdleState: switch (mState)
break; {
case ArrowSelectRegion: case ArrowSelectRegion:
mSelectRegionVisible = false; mSelectRegionVisible = false;
mSelectRegion.setX2( xWorld ); mSelectRegion.setX2( xWorld );
mSelectRegion.setY2( yWorld ); mSelectRegion.setY2( yWorld );
mModel->selectRegion( mSelectRegion ); mModel->selectRegion( mSelectRegion );
mState = IdleState; mState = IdleState;
update(); update();
break; break;
default: default:
// Should not happen! mState = IdleState;
break; update();
break;
}
}
else
{
} }
}
else
{
} }
} }
} }