#include "util/creatingSelector.h" #include "graphicsItem/graphicsRectItem.h" #include "graphicsItem/graphicsPolygonItem.h" #include "graphicsItem/electricSvgItemBus.h" #include "graphicsItem/electricSvgItemRect.h" #include "graphicsItem/electricSvgItemTriangle.h" #include #include #include CreatingSelector::CreatingSelector(FixedPortsModel* model,QObject *parent) : BaseSelector(model,parent) { m_type = ST_cerating; m_creatingMethod = CM_drag; m_pCreatingItem = nullptr; m_scalBasePoint = QPointF(); } CreatingSelector::~CreatingSelector() { } void CreatingSelector::mousePressEvent(QGraphicsSceneMouseEvent* event, DesignerScene* scene) { if (event->button() != Qt::LeftButton) return; ms_ptMouseDown = event->scenePos(); ms_ptMouseLast = event->scenePos(); if(m_pCreatingItem == nullptr) { scene->clearSelection(); switch (m_creatingItemType) { case GIT_rect: { m_creatingMethod = CM_drag; m_pCreatingItem = new GraphicsRectItem(QRect(1, 1, 1, 1)); } break; case GIT_roundRect: { m_creatingMethod = CM_drag; m_pCreatingItem = new GraphicsRectItem(QRect(1, 1, 1, 1), true); } break; case GIT_polygon: { m_creatingMethod = CM_click; m_pCreatingItem = new GraphicPolygonItem(); } break; case GIT_bus: { m_creatingMethod = CM_click; m_pCreatingItem = new ElectricSvgItemBus(QRect(-100, -3, 200, 6)); m_pCreatingItem->setItemId(QUuid::createUuid()); m_pCreatingItem->setItemType(GIT_bus); m_pCreatingItem->editShape(ms_nDragHandle, ms_ptMouseLast); emit setWorkingSelector(ST_base); } break; case GIT_itemRect: { m_creatingMethod = CM_click; m_pCreatingItem = new ElectricSvgItemRect(QRect(-15, -15, 30, 30)); m_pCreatingItem->setItemId(QUuid::createUuid()); m_pCreatingItem->setItemType(GIT_itemRect); m_pCreatingItem->editShape(ms_nDragHandle, ms_ptMouseLast); emit setWorkingSelector(ST_base); } break; case GIT_itemTri: { m_creatingMethod = CM_click; m_pCreatingItem = new ElectricSvgItemTriangle(QRect(-15, -15, 30, 30)); m_pCreatingItem->setItemId(QUuid::createUuid()); m_pCreatingItem->setItemType(GIT_itemTri); m_pCreatingItem->editShape(ms_nDragHandle, ms_ptMouseLast); emit setWorkingSelector(ST_base); } break; default: break; } if(m_pCreatingItem) { m_pCreatingItem->setPos(event->scenePos()); m_pCreatingItem->setSelected(true); scene->addItem(m_pCreatingItem); m_pCreatingItem->setItemChanged(true); if(m_creatingMethod == CM_drag) { ms_ptMouseDown += QPoint(2, 2); ms_nDragHandle = H_rightBottom; } else if(m_creatingMethod == CM_click) m_pCreatingItem->addPoint(ms_ptMouseDown); } } if(m_pCreatingItem && m_creatingMethod == CM_click) { //创建时添加了第一个点,紧接着再次添加第二点,然后从第二个点开始进行移动绘制 m_pCreatingItem->addPoint(ms_ptMouseDown); ms_nDragHandle = m_pCreatingItem->handleCount(); //m_graphicsItem[sceneName()].insert(QString::number(m_pCreatingItem->itemId()),m_pCreatingItem); //插入数据到总表 _model->addNodeItem(m_pCreatingItem->itemId(),m_pCreatingItem); m_pCreatingItem = nullptr; //先舍弃多次点击创建对象241124 by } } void CreatingSelector::mouseMoveEvent(QGraphicsSceneMouseEvent* event, DesignerScene* scene) { setCursor(scene, Qt::CrossCursor); ms_ptMouseLast = event->scenePos(); if (m_pCreatingItem && m_creatingMethod == CM_drag) { if(m_scalBasePoint.isNull()) //基准点不能采用临时变量,因为handle的坐标也在不断变化,计算会出现问题 { m_scalBasePoint = m_pCreatingItem->getSymmetricPointPos(ms_nDragHandle); if(m_scalBasePoint.x() == 0) m_scalBasePoint.setX(1); if(m_scalBasePoint.y() == 0) m_scalBasePoint.setY(1); } QPointF scaleBasePoint = m_pCreatingItem->boundingRect().topLeft(); //计算缩放倍数 QPointF iniDelta = m_pCreatingItem->mapFromScene(ms_ptMouseDown) - scaleBasePoint; QPointF lastDelta = m_pCreatingItem->mapFromScene(ms_ptMouseLast) - scaleBasePoint; double sx = lastDelta.x() / iniDelta.x(); double sy = lastDelta.y() / iniDelta.y(); m_pCreatingItem->resize(ms_nDragHandle, sx, sy, scaleBasePoint); } else if (m_pCreatingItem && m_creatingMethod == CM_click) { if(ms_nDragHandle > H_left) { m_pCreatingItem->editShape(ms_nDragHandle, ms_ptMouseLast); } } } void CreatingSelector::mouseReleaseEvent(QGraphicsSceneMouseEvent* event, DesignerScene* scene) { if (m_pCreatingItem && m_creatingMethod == CM_drag) { if (event->scenePos() == (ms_ptMouseDown - QPoint(2, 2))) //最小拖动范围 { m_pCreatingItem->setSelected(false); scene->removeItem(m_pCreatingItem); delete m_pCreatingItem; } else if (ms_ptMouseLast != ms_ptMouseDown) { m_pCreatingItem->updateCoordinate(); emit scene->signalAddItem(m_pCreatingItem); } ms_nDragHandle = H_none; m_pCreatingItem = nullptr; m_scalBasePoint = QPointF(); setCursor(scene, Qt::ArrowCursor); emit setWorkingSelector(ST_base); } else if (m_pCreatingItem && m_creatingMethod == CM_click && event->button() == Qt::RightButton) //右键结束绘制 { if(m_pCreatingItem->endDrawing()) m_pCreatingItem->updateCoordinate(); else { m_pCreatingItem->setSelected(false); scene->removeItem(m_pCreatingItem); delete m_pCreatingItem; } ms_nDragHandle = H_none; m_pCreatingItem = nullptr; setCursor(scene, Qt::ArrowCursor); emit setWorkingSelector(ST_base); } }