Implement region select capability in View.
This commit is contained in:
@@ -19,3 +19,27 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "LabelRegion.h"
|
#include "LabelRegion.h"
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
|
|
||||||
|
namespace glabels
|
||||||
|
{
|
||||||
|
|
||||||
|
QRectF LabelRegion::rect() const
|
||||||
|
{
|
||||||
|
using std::min;
|
||||||
|
using std::fabs;
|
||||||
|
|
||||||
|
QRectF r;
|
||||||
|
|
||||||
|
r.setX( min( mX1, mX2 ) );
|
||||||
|
r.setY( min( mY1, mY2 ) );
|
||||||
|
r.setWidth( fabs( mX2 - mX1 ) );
|
||||||
|
r.setHeight( fabs( mY2 - mY1 ) );
|
||||||
|
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|||||||
@@ -21,6 +21,8 @@
|
|||||||
#ifndef glabels_LabelRegion_h
|
#ifndef glabels_LabelRegion_h
|
||||||
#define glabels_LabelRegion_h
|
#define glabels_LabelRegion_h
|
||||||
|
|
||||||
|
#include <QRectF>
|
||||||
|
|
||||||
|
|
||||||
namespace glabels
|
namespace glabels
|
||||||
{
|
{
|
||||||
@@ -64,6 +66,13 @@ namespace glabels
|
|||||||
inline void setY2( double value );
|
inline void setY2( double value );
|
||||||
|
|
||||||
|
|
||||||
|
/////////////////////////////////
|
||||||
|
// Methods
|
||||||
|
/////////////////////////////////
|
||||||
|
public:
|
||||||
|
QRectF rect() const;
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////
|
/////////////////////////////////
|
||||||
// Private Data
|
// Private Data
|
||||||
/////////////////////////////////
|
/////////////////////////////////
|
||||||
|
|||||||
+139
-17
@@ -63,6 +63,10 @@ namespace
|
|||||||
|
|
||||||
const QColor markupLineColor( 240, 99, 99 );
|
const QColor markupLineColor( 240, 99, 99 );
|
||||||
const double markupLineWidthPixels = 1;
|
const double markupLineWidthPixels = 1;
|
||||||
|
|
||||||
|
const QColor selectRegionFillColor( 192, 192, 255, 128 );
|
||||||
|
const QColor selectRegionOutlineColor( 0, 0, 255, 128 );
|
||||||
|
const double selectRegionOutlineWidthPixels = 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -74,6 +78,8 @@ namespace glabels
|
|||||||
///
|
///
|
||||||
View::View( QWidget *parent ) : QGraphicsView(parent)
|
View::View( QWidget *parent ) : QGraphicsView(parent)
|
||||||
{
|
{
|
||||||
|
mState = IdleState;
|
||||||
|
|
||||||
setZoomReal( 1, false );
|
setZoomReal( 1, false );
|
||||||
mModel = 0;
|
mModel = 0;
|
||||||
|
|
||||||
@@ -85,11 +91,14 @@ namespace glabels
|
|||||||
mScene = new QGraphicsScene();
|
mScene = new QGraphicsScene();
|
||||||
setScene( mScene );
|
setScene( mScene );
|
||||||
|
|
||||||
mScene->addItem( mLabelLayer = new QGraphicsItemGroup() );
|
mScene->addItem( mLabelLayer = new QGraphicsItemGroup() );
|
||||||
mScene->addItem( mGridLayer = new QGraphicsItemGroup() );
|
mScene->addItem( mGridLayer = new QGraphicsItemGroup() );
|
||||||
mScene->addItem( mMarkupLayer = new QGraphicsItemGroup() );
|
mScene->addItem( mMarkupLayer = new QGraphicsItemGroup() );
|
||||||
mScene->addItem( mObjectLayer = new QGraphicsItemGroup() );
|
mScene->addItem( mObjectLayer = new QGraphicsItemGroup() );
|
||||||
mScene->addItem( mForegroundLayer = new QGraphicsItemGroup() );
|
mScene->addItem( mForegroundLayer = new QGraphicsItemGroup() );
|
||||||
|
mScene->addItem( mSelectRegionLayer = new QGraphicsItemGroup() );
|
||||||
|
|
||||||
|
initSelectRegionLayer();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -100,16 +109,18 @@ namespace glabels
|
|||||||
{
|
{
|
||||||
mModel = model;
|
mModel = model;
|
||||||
|
|
||||||
createLabelLayer();
|
mScene->setSceneRect( 0, 0, model->w(), model->h() );
|
||||||
createGridLayer();
|
|
||||||
createMarkupLayer();
|
initLabelLayer();
|
||||||
|
initGridLayer();
|
||||||
|
initMarkupLayer();
|
||||||
|
|
||||||
foreach (LabelModelObject* object, model->objectList() )
|
foreach (LabelModelObject* object, model->objectList() )
|
||||||
{
|
{
|
||||||
addObjectToObjectLayer( object );
|
addObjectToObjectLayer( object );
|
||||||
}
|
}
|
||||||
|
|
||||||
createForegroundLayer();
|
initForegroundLayer();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -268,6 +279,25 @@ namespace glabels
|
|||||||
{
|
{
|
||||||
QPointF pointer = mapToScene( event->x(), event->y() );
|
QPointF pointer = mapToScene( event->x(), event->y() );
|
||||||
emit pointerMoved( pointer.x(), pointer.y() );
|
emit pointerMoved( pointer.x(), pointer.y() );
|
||||||
|
|
||||||
|
switch (mState)
|
||||||
|
{
|
||||||
|
|
||||||
|
case IdleState:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ArrowSelectRegionState:
|
||||||
|
mSelectRegion.setX2( pointer.x() );
|
||||||
|
mSelectRegion.setY2( pointer.y() );
|
||||||
|
|
||||||
|
mSelectRegionItem->setRect( mSelectRegion.rect() );
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
// Should not happen!
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -280,6 +310,76 @@ namespace glabels
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
///
|
||||||
|
/// Mouse Button Press Event Handler
|
||||||
|
///
|
||||||
|
void View::mousePressEvent( QMouseEvent* event )
|
||||||
|
{
|
||||||
|
QPointF pointer = mapToScene( event->x(), event->y() );
|
||||||
|
|
||||||
|
if ( event->button() & Qt::LeftButton )
|
||||||
|
{
|
||||||
|
// Select Region
|
||||||
|
if ( !(event->modifiers() & Qt::ControlModifier) )
|
||||||
|
{
|
||||||
|
mModel->unselectAll();
|
||||||
|
}
|
||||||
|
|
||||||
|
mSelectRegion.setX1( pointer.x() );
|
||||||
|
mSelectRegion.setY1( pointer.y() );
|
||||||
|
mSelectRegion.setX2( pointer.x() );
|
||||||
|
mSelectRegion.setY2( pointer.y() );
|
||||||
|
|
||||||
|
mSelectRegionItem->setRect( mSelectRegion.rect() );
|
||||||
|
mSelectRegionLayer->setVisible( true );
|
||||||
|
|
||||||
|
mState = ArrowSelectRegionState;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
///
|
||||||
|
/// Mouse Button Release Event Handler
|
||||||
|
///
|
||||||
|
void View::mouseReleaseEvent( QMouseEvent* event )
|
||||||
|
{
|
||||||
|
QPointF pointer = mapToScene( event->x(), event->y() );
|
||||||
|
|
||||||
|
if ( event->button() & Qt::LeftButton )
|
||||||
|
{
|
||||||
|
switch (mState)
|
||||||
|
{
|
||||||
|
|
||||||
|
case IdleState:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ArrowSelectRegionState:
|
||||||
|
mSelectRegion.setX2( pointer.x() );
|
||||||
|
mSelectRegion.setY2( pointer.y() );
|
||||||
|
|
||||||
|
mSelectRegionItem->setRect( 0, 0, 0, 0 );
|
||||||
|
mSelectRegionLayer->setVisible( false );
|
||||||
|
|
||||||
|
mModel->selectRegion( mSelectRegion );
|
||||||
|
|
||||||
|
mState = IdleState;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
// Should not happen!
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
///
|
///
|
||||||
/// Clear Layer (Item Group) of All Child Items
|
/// Clear Layer (Item Group) of All Child Items
|
||||||
///
|
///
|
||||||
@@ -293,9 +393,9 @@ namespace glabels
|
|||||||
|
|
||||||
|
|
||||||
///
|
///
|
||||||
/// Create Label Layer
|
/// Initialize Label Layer
|
||||||
///
|
///
|
||||||
void View::createLabelLayer()
|
void View::initLabelLayer()
|
||||||
{
|
{
|
||||||
clearLayer( mLabelLayer );
|
clearLayer( mLabelLayer );
|
||||||
|
|
||||||
@@ -315,9 +415,9 @@ namespace glabels
|
|||||||
|
|
||||||
|
|
||||||
///
|
///
|
||||||
/// Create Grid Layer
|
/// Initialize Grid Layer
|
||||||
///
|
///
|
||||||
void View::createGridLayer()
|
void View::initGridLayer()
|
||||||
{
|
{
|
||||||
clearLayer( mGridLayer );
|
clearLayer( mGridLayer );
|
||||||
|
|
||||||
@@ -361,9 +461,9 @@ namespace glabels
|
|||||||
|
|
||||||
|
|
||||||
///
|
///
|
||||||
/// Create Markup Layer
|
/// Initialize Markup Layer
|
||||||
///
|
///
|
||||||
void View::createMarkupLayer()
|
void View::initMarkupLayer()
|
||||||
{
|
{
|
||||||
clearLayer( mMarkupLayer );
|
clearLayer( mMarkupLayer );
|
||||||
|
|
||||||
@@ -393,9 +493,9 @@ namespace glabels
|
|||||||
|
|
||||||
|
|
||||||
///
|
///
|
||||||
/// Create Foreground Layer
|
/// Initialize Foreground Layer
|
||||||
///
|
///
|
||||||
void View::createForegroundLayer()
|
void View::initForegroundLayer()
|
||||||
{
|
{
|
||||||
clearLayer( mForegroundLayer );
|
clearLayer( mForegroundLayer );
|
||||||
|
|
||||||
@@ -410,4 +510,26 @@ namespace glabels
|
|||||||
mForegroundLayer->addToGroup( outlineItem );
|
mForegroundLayer->addToGroup( outlineItem );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
///
|
||||||
|
/// Initialize Select Region Layer
|
||||||
|
///
|
||||||
|
void View::initSelectRegionLayer()
|
||||||
|
{
|
||||||
|
clearLayer( mSelectRegionLayer );
|
||||||
|
|
||||||
|
mSelectRegionItem = new QGraphicsRectItem();
|
||||||
|
|
||||||
|
QBrush brush( selectRegionFillColor );
|
||||||
|
mSelectRegionItem->setBrush( brush );
|
||||||
|
|
||||||
|
QPen pen( selectRegionOutlineColor );
|
||||||
|
pen.setJoinStyle( Qt::MiterJoin );
|
||||||
|
pen.setCosmetic( true );
|
||||||
|
pen.setWidthF( selectRegionOutlineWidthPixels );
|
||||||
|
mSelectRegionItem->setPen( pen );
|
||||||
|
|
||||||
|
mSelectRegionLayer->addToGroup( mSelectRegionItem );
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+20
-4
@@ -23,6 +23,8 @@
|
|||||||
|
|
||||||
#include <QGraphicsView>
|
#include <QGraphicsView>
|
||||||
|
|
||||||
|
#include "LabelRegion.h"
|
||||||
|
|
||||||
class QGraphicsScene;
|
class QGraphicsScene;
|
||||||
class QGraphicsItemGroup;
|
class QGraphicsItemGroup;
|
||||||
|
|
||||||
@@ -99,6 +101,8 @@ namespace glabels
|
|||||||
protected:
|
protected:
|
||||||
void resizeEvent( QResizeEvent* event );
|
void resizeEvent( QResizeEvent* event );
|
||||||
void mouseMoveEvent( QMouseEvent* event );
|
void mouseMoveEvent( QMouseEvent* event );
|
||||||
|
void mousePressEvent( QMouseEvent* event );
|
||||||
|
void mouseReleaseEvent( QMouseEvent* event );
|
||||||
void leaveEvent( QEvent* event );
|
void leaveEvent( QEvent* event );
|
||||||
|
|
||||||
|
|
||||||
@@ -107,17 +111,25 @@ namespace glabels
|
|||||||
/////////////////////////////////////
|
/////////////////////////////////////
|
||||||
private:
|
private:
|
||||||
void clearLayer( QGraphicsItemGroup* layer );
|
void clearLayer( QGraphicsItemGroup* layer );
|
||||||
void createLabelLayer();
|
void initLabelLayer();
|
||||||
void createGridLayer();
|
void initGridLayer();
|
||||||
void createMarkupLayer();
|
void initMarkupLayer();
|
||||||
void addObjectToObjectLayer( LabelModelObject* object );
|
void addObjectToObjectLayer( LabelModelObject* object );
|
||||||
void createForegroundLayer();
|
void initForegroundLayer();
|
||||||
|
void initSelectRegionLayer();
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////////
|
/////////////////////////////////////
|
||||||
// Private data
|
// Private data
|
||||||
/////////////////////////////////////
|
/////////////////////////////////////
|
||||||
private:
|
private:
|
||||||
|
enum State {
|
||||||
|
IdleState,
|
||||||
|
ArrowSelectRegionState
|
||||||
|
};
|
||||||
|
|
||||||
|
State mState;
|
||||||
|
|
||||||
QGraphicsScene* mScene;
|
QGraphicsScene* mScene;
|
||||||
|
|
||||||
QGraphicsItemGroup* mLabelLayer;
|
QGraphicsItemGroup* mLabelLayer;
|
||||||
@@ -125,6 +137,10 @@ namespace glabels
|
|||||||
QGraphicsItemGroup* mMarkupLayer;
|
QGraphicsItemGroup* mMarkupLayer;
|
||||||
QGraphicsItemGroup* mObjectLayer;
|
QGraphicsItemGroup* mObjectLayer;
|
||||||
QGraphicsItemGroup* mForegroundLayer;
|
QGraphicsItemGroup* mForegroundLayer;
|
||||||
|
QGraphicsItemGroup* mSelectRegionLayer;
|
||||||
|
|
||||||
|
QGraphicsRectItem* mSelectRegionItem;
|
||||||
|
LabelRegion mSelectRegion;
|
||||||
|
|
||||||
double mZoom;
|
double mZoom;
|
||||||
bool mZoomToFitFlag;
|
bool mZoomToFitFlag;
|
||||||
|
|||||||
Reference in New Issue
Block a user