From ffa08190108f7eb2cb672d830baef51f88235416 Mon Sep 17 00:00:00 2001 From: Jim Evins Date: Fri, 14 Aug 2015 16:34:40 -0400 Subject: [PATCH] Made move selection work in view. --- glabels/LabelModel.cpp | 22 +++++- glabels/LabelModel.h | 4 +- glabels/LabelModelObject.cpp | 21 ++++++ glabels/LabelModelObject.h | 1 + glabels/View.cpp | 127 ++++++++++++++++++++++++++--------- 5 files changed, 142 insertions(+), 33 deletions(-) diff --git a/glabels/LabelModel.cpp b/glabels/LabelModel.cpp index 5835359..a6db1db 100644 --- a/glabels/LabelModel.cpp +++ b/glabels/LabelModel.cpp @@ -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 /// diff --git a/glabels/LabelModel.h b/glabels/LabelModel.h index a54212d..628bf60 100644 --- a/glabels/LabelModel.h +++ b/glabels/LabelModel.h @@ -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; ///////////////////////////////// diff --git a/glabels/LabelModelObject.cpp b/glabels/LabelModelObject.cpp index fe82343..39e9ef2 100644 --- a/glabels/LabelModelObject.cpp +++ b/glabels/LabelModelObject.cpp @@ -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 /// diff --git a/glabels/LabelModelObject.h b/glabels/LabelModelObject.h index 3378bff..9956045 100644 --- a/glabels/LabelModelObject.h +++ b/glabels/LabelModelObject.h @@ -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; /////////////////////////////////////////////////////////////// diff --git a/glabels/View.cpp b/glabels/View.cpp index 6e8549d..688895e 100644 --- a/glabels/View.cpp +++ b/glabels/View.cpp @@ -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 - { } } }