135 lines
3.7 KiB
C++
135 lines
3.7 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;
|
|
}
|
|
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)
|
|
{
|
|
|
|
}
|
|
}
|
|
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);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
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(ms_ptMouseDown + (ms_ptMouseLast - ms_ptMouseDown));
|
|
}
|
|
}
|
|
|
|
if(ms_opMode == OM_none)
|
|
{
|
|
QGraphicsView *view = scene->getView();
|
|
if(view)
|
|
view->setDragMode(QGraphicsView::NoDrag);
|
|
}
|
|
|
|
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);
|
|
}
|