317 lines
15 KiB
C++
317 lines
15 KiB
C++
#include "util/baseSelector.h"
|
||
#include <QGraphicsSceneMouseEvent>
|
||
#include <QGraphicsView>
|
||
#include <graphicsItem/graphicsBaseItem.h>
|
||
#include <QDebug>
|
||
|
||
QPointF BaseSelector::ms_ptMouseDown(0.0,0.0);
|
||
QPointF BaseSelector::ms_ptMouseLast(0.0,0.0);
|
||
double BaseSelector::ms_dAngleMouseDownToItem = 0.0;
|
||
int BaseSelector::ms_nDragHandle = 0;
|
||
uint BaseSelector::_Id = 0;
|
||
ItemMap BaseSelector::m_graphicsItem;
|
||
|
||
BaseSelector::BaseSelector(QObject *parent)
|
||
: QObject(parent)
|
||
{
|
||
m_type = ST_base;
|
||
m_opMode = OM_none;
|
||
m_bHoverOnHandel = false;
|
||
}
|
||
BaseSelector::~BaseSelector()
|
||
{
|
||
|
||
}
|
||
|
||
void BaseSelector::mousePressEvent(QGraphicsSceneMouseEvent* event, DesignerScene* scene)
|
||
{
|
||
if (event->button() != Qt::LeftButton)
|
||
return;
|
||
|
||
ms_ptMouseDown = event->scenePos();
|
||
ms_ptMouseLast = event->scenePos();
|
||
|
||
if(!m_bHoverOnHandel)
|
||
scene->callParentEvent(event); //此处是通过触发QGraphicsScene的事件函数来取消所有被选中item的选中状态
|
||
|
||
m_opMode = OM_none;
|
||
|
||
QList<QGraphicsItem *> items = scene->selectedItems();
|
||
if (items.count() == 1) //只有一个选中
|
||
{
|
||
AbstractShape* item = qgraphicsitem_cast<AbstractShape*>(items.first());
|
||
if(item)
|
||
{
|
||
//需要增加当前是否点击在控制点的判断函数
|
||
ms_nDragHandle = item->collidesWithHandle(event->scenePos());
|
||
if(ms_nDragHandle != H_none && ms_nDragHandle <= H_left) //在缩放控制点上
|
||
{
|
||
m_opMode = OM_scale;
|
||
emit setWorkingSelector(ST_scaling);
|
||
}
|
||
else if(ms_nDragHandle >= H_rotate_leftTop && ms_nDragHandle <= H_rotate_leftBottom) //在旋转控制点上
|
||
{
|
||
m_opMode = OM_rotate;
|
||
//计算夹角
|
||
QPointF originPoint = item->mapToScene(item->boundingRect().center());
|
||
double dLengthY = ms_ptMouseLast.y() - originPoint.y();
|
||
double dLengthX = ms_ptMouseLast.x() - originPoint.x();
|
||
ms_dAngleMouseDownToItem = atan2(dLengthY, dLengthX) * 180 / M_PI;
|
||
// if(atan2(dLengthY, dLengthX) < 0)
|
||
// ms_dAngleMouseDownToItem += 360.0;
|
||
//创建副本
|
||
item->createOperationCopy();
|
||
emit setWorkingSelector(ST_rotation);
|
||
}
|
||
else if(ms_nDragHandle > H_rotate_leftBottom && ms_nDragHandle < H_connect) //编辑控制点上
|
||
{
|
||
m_opMode = OM_edit;
|
||
setCursor(scene, Qt::ClosedHandCursor);
|
||
emit setWorkingSelector(ST_editing);
|
||
}
|
||
else if(ms_nDragHandle >= H_connect ) //连接控制点
|
||
{
|
||
m_opMode = OM_connect;
|
||
//setCursor(scene, Qt::ClosedHandCursor);
|
||
setCursor(scene, Qt::ArrowCursor);
|
||
emit setWorkingSelector(ST_connecting);
|
||
}
|
||
else
|
||
{
|
||
m_opMode = OM_move;
|
||
setCursor(scene, Qt::ClosedHandCursor);
|
||
emit setWorkingSelector(ST_moving);
|
||
}
|
||
}
|
||
}
|
||
else if (items.count() > 1) //选中多个
|
||
{
|
||
m_opMode = OM_move;
|
||
emit setWorkingSelector(ST_moving);
|
||
setCursor(scene, Qt::ClosedHandCursor);
|
||
}
|
||
|
||
if(m_opMode == OM_move) //可以多个选中同时移动
|
||
{
|
||
for(int n = 0; n < items.size(); n++)
|
||
{
|
||
//创建副本
|
||
AbstractShape* item = qgraphicsitem_cast<AbstractShape*>(items.at(n));
|
||
item->createOperationCopy();
|
||
}
|
||
}
|
||
else if(m_opMode == OM_none)
|
||
{
|
||
QGraphicsView *view = scene->getView();
|
||
if(view)
|
||
view->setDragMode(QGraphicsView::RubberBandDrag);
|
||
}
|
||
|
||
}
|
||
|
||
void BaseSelector::mouseMoveEvent(QGraphicsSceneMouseEvent* event, DesignerScene* scene)
|
||
{
|
||
ms_ptMouseLast = event->scenePos();
|
||
|
||
QList<QGraphicsItem *> items = scene->selectedItems();
|
||
|
||
if (items.count() == 1)
|
||
{
|
||
AbstractShape* item = qgraphicsitem_cast<AbstractShape*>(items.first());
|
||
if(item)
|
||
{
|
||
if(ms_nDragHandle == H_none)
|
||
{
|
||
//设置光标样式
|
||
int nHandle = item->collidesWithHandle(event->scenePos());
|
||
if(nHandle == H_none)
|
||
{
|
||
setCursor(scene, Qt::ArrowCursor);
|
||
m_bHoverOnHandel = false;
|
||
}
|
||
else if(nHandle >= H_edit)
|
||
{
|
||
setCursor(scene, Qt::OpenHandCursor);
|
||
m_bHoverOnHandel = true;
|
||
}
|
||
else
|
||
{
|
||
//划分为四组区间范围,分别水平组、垂直组、一三象限倾斜组、二四象限倾斜组,每组由两个对称区间构成
|
||
double dRotation = item->rotation();
|
||
dRotation += item->getSyncRotationDataFromParent();
|
||
//让角度保持在正负180的区间,也就是上下两个半圈,这样易于象限判断
|
||
if (dRotation > 180)
|
||
dRotation -= 360;
|
||
if (dRotation < -180)
|
||
dRotation += 360;
|
||
//qDebug() << "selfRotation:" << item->rotation() << " syncRotation:" << item->getSyncRotationDataFromParent() << " fininalRotatio:" << dRotation;
|
||
double dTileAngle = 15.0;
|
||
|
||
switch (nHandle)
|
||
{
|
||
case H_leftTop:
|
||
{
|
||
if((dRotation > -145+dTileAngle && dRotation < -45-dTileAngle) || (dRotation > 45+dTileAngle && dRotation < 145-dTileAngle)) //垂直区间
|
||
setCursor(scene, Qt::SizeBDiagCursor);
|
||
else if((dRotation >= -45-dTileAngle && dRotation <= -45+dTileAngle) || (dRotation >= 145-dTileAngle && dRotation <= 145+dTileAngle)) //一三象限倾斜
|
||
setCursor(scene, Qt::SizeHorCursor);
|
||
else if((dRotation >= -145-dTileAngle && dRotation <= -145+dTileAngle) || (dRotation >= 45-dTileAngle && dRotation <= 45+dTileAngle)) //二四象限倾斜
|
||
setCursor(scene, Qt::SizeVerCursor);
|
||
else //水平区间
|
||
setCursor(scene, Qt::SizeFDiagCursor);
|
||
break;
|
||
}
|
||
case H_top:
|
||
{
|
||
if((dRotation > -145+dTileAngle && dRotation < -45-dTileAngle) || (dRotation > 45+dTileAngle && dRotation < 145-dTileAngle)) //垂直区间
|
||
setCursor(scene, Qt::SizeHorCursor);
|
||
else if((dRotation >= -45-dTileAngle && dRotation <= -45+dTileAngle) || (dRotation >= 145-dTileAngle && dRotation <= 145+dTileAngle)) //一三象限倾斜
|
||
setCursor(scene, Qt::SizeFDiagCursor);
|
||
else if((dRotation >= -145-dTileAngle && dRotation <= -145+dTileAngle) || (dRotation >= 45-dTileAngle && dRotation <= 45+dTileAngle)) //二四象限倾斜
|
||
setCursor(scene, Qt::SizeBDiagCursor);
|
||
else
|
||
setCursor(scene, Qt::SizeVerCursor);
|
||
break;
|
||
}
|
||
case H_rightTop:
|
||
{
|
||
if((dRotation > -145+dTileAngle && dRotation < -45-dTileAngle) || (dRotation > 45+dTileAngle && dRotation < 145-dTileAngle)) //垂直区间
|
||
setCursor(scene, Qt::SizeFDiagCursor);
|
||
else if((dRotation >= -45-dTileAngle && dRotation <= -45+dTileAngle) || (dRotation >= 145-dTileAngle && dRotation <= 145+dTileAngle)) //一三象限倾斜
|
||
setCursor(scene, Qt::SizeVerCursor);
|
||
else if((dRotation >= -145-dTileAngle && dRotation <= -145+dTileAngle) || (dRotation >= 45-dTileAngle && dRotation <= 45+dTileAngle)) //二四象限倾斜
|
||
setCursor(scene, Qt::SizeHorCursor);
|
||
else
|
||
setCursor(scene, Qt::SizeBDiagCursor);
|
||
break;
|
||
}
|
||
case H_right:
|
||
{
|
||
if((dRotation > -145+dTileAngle && dRotation < -45-dTileAngle) || (dRotation > 45+dTileAngle && dRotation < 145-dTileAngle)) //垂直区间
|
||
setCursor(scene, Qt::SizeVerCursor);
|
||
else if((dRotation >= -45-dTileAngle && dRotation <= -45+dTileAngle) || (dRotation >= 145-dTileAngle && dRotation <= 145+dTileAngle)) //一三象限倾斜
|
||
setCursor(scene, Qt::SizeBDiagCursor);
|
||
else if((dRotation >= -145-dTileAngle && dRotation <= -145+dTileAngle) || (dRotation >= 45-dTileAngle && dRotation <= 45+dTileAngle)) //二四象限倾斜
|
||
setCursor(scene, Qt::SizeFDiagCursor);
|
||
else
|
||
setCursor(scene, Qt::SizeHorCursor);
|
||
break;
|
||
}
|
||
case H_rightBottom:
|
||
{
|
||
if((dRotation > -145+dTileAngle && dRotation < -45-dTileAngle) || (dRotation > 45+dTileAngle && dRotation < 145-dTileAngle)) //垂直区间
|
||
setCursor(scene, Qt::SizeBDiagCursor);
|
||
else if((dRotation >= -45-dTileAngle && dRotation <= -45+dTileAngle) || (dRotation >= 145-dTileAngle && dRotation <= 145+dTileAngle)) //一三象限倾斜
|
||
setCursor(scene, Qt::SizeHorCursor);
|
||
else if((dRotation >= -145-dTileAngle && dRotation <= -145+dTileAngle) || (dRotation >= 45-dTileAngle && dRotation <= 45+dTileAngle)) //二四象限倾斜
|
||
setCursor(scene, Qt::SizeVerCursor);
|
||
else //水平区间
|
||
setCursor(scene, Qt::SizeFDiagCursor);
|
||
break;
|
||
}
|
||
case H_bottom:
|
||
{
|
||
if((dRotation > -145+dTileAngle && dRotation < -45-dTileAngle) || (dRotation > 45+dTileAngle && dRotation < 145-dTileAngle)) //垂直区间
|
||
setCursor(scene, Qt::SizeHorCursor);
|
||
else if((dRotation >= -45-dTileAngle && dRotation <= -45+dTileAngle) || (dRotation >= 145-dTileAngle && dRotation <= 145+dTileAngle)) //一三象限倾斜
|
||
setCursor(scene, Qt::SizeFDiagCursor);
|
||
else if((dRotation >= -145-dTileAngle && dRotation <= -145+dTileAngle) || (dRotation >= 45-dTileAngle && dRotation <= 45+dTileAngle)) //二四象限倾斜
|
||
setCursor(scene, Qt::SizeBDiagCursor);
|
||
else
|
||
setCursor(scene, Qt::SizeVerCursor);
|
||
break;
|
||
}
|
||
case H_leftBottom:
|
||
{
|
||
if((dRotation > -145+dTileAngle && dRotation < -45-dTileAngle) || (dRotation > 45+dTileAngle && dRotation < 145-dTileAngle)) //垂直区间
|
||
setCursor(scene, Qt::SizeFDiagCursor);
|
||
else if((dRotation >= -45-dTileAngle && dRotation <= -45+dTileAngle) || (dRotation >= 145-dTileAngle && dRotation <= 145+dTileAngle)) //一三象限倾斜
|
||
setCursor(scene, Qt::SizeVerCursor);
|
||
else if((dRotation >= -145-dTileAngle && dRotation <= -145+dTileAngle) || (dRotation >= 45-dTileAngle && dRotation <= 45+dTileAngle)) //二四象限倾斜
|
||
setCursor(scene, Qt::SizeHorCursor);
|
||
else //水平区间
|
||
setCursor(scene, Qt::SizeBDiagCursor);
|
||
break;
|
||
}
|
||
case H_left:
|
||
{
|
||
if((dRotation > -145+dTileAngle && dRotation < -45-dTileAngle) || (dRotation > 45+dTileAngle && dRotation < 145-dTileAngle)) //垂直区间
|
||
setCursor(scene, Qt::SizeVerCursor);
|
||
else if((dRotation >= -45-dTileAngle && dRotation <= -45+dTileAngle) || (dRotation >= 145-dTileAngle && dRotation <= 145+dTileAngle)) //一三象限倾斜
|
||
setCursor(scene, Qt::SizeBDiagCursor);
|
||
else if((dRotation >= -145-dTileAngle && dRotation <= -145+dTileAngle) || (dRotation >= 45-dTileAngle && dRotation <= 45+dTileAngle)) //二四象限倾斜
|
||
setCursor(scene, Qt::SizeFDiagCursor);
|
||
else
|
||
setCursor(scene, Qt::SizeHorCursor);
|
||
break;
|
||
}
|
||
case H_rotate_leftTop:
|
||
{
|
||
int nSize = 24;
|
||
QCursor rotateCursor = QCursor(QPixmap(":/images/icon_rotate.png")/*.scaled(nSize, nSize, Qt::KeepAspectRatio, Qt::SmoothTransformation)*/);
|
||
setCursor(scene, rotateCursor);
|
||
break;
|
||
}
|
||
case H_rotate_rightTop:
|
||
{
|
||
int nSize = 24;
|
||
QCursor rotateCursor = QCursor(QPixmap(":/images/icon_rotate.png")/*.scaled(nSize, nSize, Qt::KeepAspectRatio, Qt::SmoothTransformation)*/);
|
||
setCursor(scene, rotateCursor);
|
||
break;
|
||
}
|
||
case H_rotate_rightBottom:
|
||
{
|
||
int nSize = 24;
|
||
QCursor rotateCursor = QCursor(QPixmap(":/images/icon_rotate.png")/*.scaled(nSize, nSize, Qt::KeepAspectRatio, Qt::SmoothTransformation)*/);
|
||
setCursor(scene, rotateCursor);
|
||
break;
|
||
}
|
||
case H_rotate_leftBottom:
|
||
{
|
||
int nSize = 24;
|
||
QCursor rotateCursor = QCursor(QPixmap(":/images/icon_rotate.png")/*.scaled(nSize, nSize, Qt::KeepAspectRatio, Qt::SmoothTransformation)*/);
|
||
setCursor(scene, rotateCursor);
|
||
break;
|
||
}
|
||
default:
|
||
break;
|
||
}
|
||
|
||
m_bHoverOnHandel = true;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
void BaseSelector::mouseReleaseEvent(QGraphicsSceneMouseEvent* event, DesignerScene* scene)
|
||
{
|
||
setCursor(scene, Qt::ArrowCursor);
|
||
|
||
if(m_opMode == OM_none)
|
||
{
|
||
QGraphicsView *view = scene->getView();
|
||
if(view)
|
||
view->setDragMode(QGraphicsView::NoDrag);
|
||
}
|
||
|
||
m_opMode = OM_none;
|
||
m_bHoverOnHandel = false;
|
||
ms_nDragHandle = H_none;
|
||
scene->callParentEvent(event);
|
||
}
|
||
|
||
void BaseSelector::mouseDoubleClickEvent(QGraphicsSceneMouseEvent* event, DesignerScene* scene)
|
||
{
|
||
Q_UNUSED(event)
|
||
Q_UNUSED(scene)
|
||
}
|
||
|
||
void BaseSelector::setCursor(DesignerScene *scene, const QCursor &cursor)
|
||
{
|
||
QGraphicsView *view = scene->getView();
|
||
if (view)
|
||
view->setCursor(cursor);
|
||
}
|
||
|