#include "util/baseSelector.h" #include #include #include 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 items = scene->selectedItems(); if (items.count() == 1) //只有一个选中 { item = qgraphicsitem_cast(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 items = scene->selectedItems(); if (items.count() == 1) { item = qgraphicsitem_cast(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 items = scene->selectedItems(); if (items.count() == 1) { item = qgraphicsitem_cast(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); }