PowerDesignerX/source/util/baseSelector.cpp

183 lines
5.5 KiB
C++

#include "util/baseSelector.h"
#include <QGraphicsSceneMouseEvent>
#include <QGraphicsView>
#include <graphicsItem/graphicsBaseItem.h>
OperationMode BaseSelector::ms_opMode = OM_none;
QPointF BaseSelector::ms_ptMouseDown(0.0,0.0);
QPointF BaseSelector::ms_ptMouseLast(0.0,0.0);
int BaseSelector::ms_nDragHandle = 0;
BaseSelector::BaseSelector(QObject *parent)
: QObject(parent)
{
m_type = ST_base;
m_bHoverOnHandel = false;
m_pMovingItemCopy = nullptr;
}
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的选中状态
ms_opMode = OM_none;
GraphicsBaseItem* item = nullptr;
QList<QGraphicsItem *> items = scene->selectedItems();
if (items.count() == 1) //只有一个选中
{
item = qgraphicsitem_cast<GraphicsBaseItem*>(items.first());
if(item)
{
//需要增加当前是否点击在控制点的判断函数
if(ms_nDragHandle != H_none && ms_nDragHandle <= H_left) //在缩放控制点上
ms_opMode = OM_scale;
else if(ms_nDragHandle > H_left) //编辑控制点上
{
ms_opMode = OM_edit;
//setCursor(scene, Qt::ClosedHandCursor);
}
else
{
ms_opMode = OM_move;
setCursor(scene, Qt::ClosedHandCursor);
//创建移动时显示的item副本
m_pMovingItemCopy = new QGraphicsPathItem(item->shape());
m_pMovingItemCopy->setPen(Qt::DashLine);
m_pMovingItemCopy->setPos(item->pos());
m_pMovingItemCopy->setTransformOriginPoint(item->transformOriginPoint());
m_pMovingItemCopy->setTransform(item->transform());
m_pMovingItemCopy->setRotation(item->rotation());
m_pMovingItemCopy->setScale(item->scale());
m_pMovingItemCopy->setZValue(item->zValue());
scene->addItem(m_pMovingItemCopy);
m_movingItemIniPos = item->pos();
}
}
}
else if (items.count() > 1) //选中多个
{
ms_opMode = OM_move;
setCursor(scene, Qt::ClosedHandCursor);
}
if(ms_opMode == OM_none)
{
QGraphicsView *view = scene->getView();
if(view)
view->setDragMode(QGraphicsView::RubberBandDrag);
}
}
void BaseSelector::mouseMoveEvent(QGraphicsSceneMouseEvent* event, DesignerScene* scene)
{
ms_ptMouseLast = event->scenePos();
GraphicsBaseItem* item = nullptr;
QList<QGraphicsItem *> items = scene->selectedItems();
if (items.count() == 1)
{
item = qgraphicsitem_cast<GraphicsBaseItem*>(items.first());
if(item)
{
if(ms_nDragHandle != H_none && ms_opMode == OM_scale)
{
QPointF basePoint = item->getSymmetricPointPos(ms_nDragHandle);
if(basePoint.x() == 0)
basePoint.setX(1);
if(basePoint.y() == 0)
basePoint.setY(1);
//计算缩放倍数
QPointF iniDelta = item->mapFromScene(ms_ptMouseDown) - basePoint;
QPointF lastDelta = item->mapFromScene(ms_ptMouseLast) - basePoint;
double sx = lastDelta.x() / iniDelta.x();
double sy = lastDelta.y() / iniDelta.y();
item->resize(ms_nDragHandle, sx, sy, basePoint);
}
else if(ms_nDragHandle > H_left && ms_opMode == OM_edit) //编辑形状
{
}
else if(ms_opMode == OM_move)
{
if(m_pMovingItemCopy)
m_pMovingItemCopy->setPos(m_movingItemIniPos + (ms_ptMouseLast - ms_ptMouseDown));
}
}
}
if (ms_opMode != OM_scale && items.count() > 1) //例如多选移动等采用默认行为
{
scene->callParentEvent(event);
}
}
void BaseSelector::mouseReleaseEvent(QGraphicsSceneMouseEvent* event, DesignerScene* scene)
{
if (event->scenePos() == ms_ptMouseDown)
ms_opMode = OM_none;
setCursor(scene, Qt::ArrowCursor);
GraphicsBaseItem* item = nullptr;
QList<QGraphicsItem *> items = scene->selectedItems();
if (items.count() == 1)
{
item = qgraphicsitem_cast<GraphicsBaseItem*>(items.first());
if(item && (ms_opMode == OM_scale || ms_opMode == OM_edit) && ms_ptMouseLast != ms_ptMouseDown)
{
item->updateCoordinate();
}
else if(item && ms_opMode == OM_move && ms_ptMouseLast != ms_ptMouseDown)
{
item->setPos(m_movingItemIniPos + (ms_ptMouseLast - ms_ptMouseDown));
}
}
if(ms_opMode == OM_none)
{
QGraphicsView *view = scene->getView();
if(view)
view->setDragMode(QGraphicsView::NoDrag);
}
if(m_pMovingItemCopy)
{
scene->removeItem(m_pMovingItemCopy);
delete m_pMovingItemCopy;
m_pMovingItemCopy = nullptr;
}
ms_opMode = OM_none;
m_bHoverOnHandel = false;
ms_nDragHandle = H_none;
scene->callParentEvent(event);
}
void BaseSelector::setCursor(DesignerScene *scene, const QCursor &cursor)
{
QGraphicsView *view = scene->getView();
if (view)
view->setCursor(cursor);
}