DiagramDesigner/diagramCavas/source/designerScene.cpp

258 lines
7.5 KiB
C++
Raw Permalink Normal View History

2024-12-03 20:07:25 +08:00
#include "designerScene.h"
#include "util/selectorManager.h"
#include "graphicsItem/graphicsItemGroup.h"
#include "drawingPanel.h"
2025-02-06 16:36:50 +08:00
#include "global.h"
2024-12-03 20:07:25 +08:00
#include <QPainter>
2025-02-06 16:36:50 +08:00
#include <QKeyEvent>
2024-12-03 20:07:25 +08:00
#include <QGraphicsSceneMouseEvent>
#include <QtCore/QBuffer>
#include <QtCore/QByteArray>
#include <QtCore/QDataStream>
#include <QtCore/QDebug>
#include <QtCore/QFile>
#include <QtCore/QJsonArray>
#include <QtCore/QJsonDocument>
#include <QtCore/QJsonObject>
#include <QtCore/QtGlobal>
#include <QtWidgets/QFileDialog>
#include <QtWidgets/QGraphicsSceneMoveEvent>
#include <QtWidgets/QHeaderView>
#include <QtWidgets/QLineEdit>
#include <QtWidgets/QTreeWidget>
#include <QtWidgets/QWidgetAction>
2025-02-06 16:36:50 +08:00
DesignerScene::DesignerScene(FixedPortsModel* graphModel, QObject *parent)
: BaseScene(graphModel,parent),
2024-12-03 20:07:25 +08:00
m_pDrawingPanel(NULL),
_graphModel(graphModel)
{
m_bGridVisible = true;
m_pView = nullptr;
2025-11-14 19:31:09 +08:00
m_pDrawingPanel = dynamic_cast<BaseDrawingPanel*>(parent);
2024-12-03 20:07:25 +08:00
}
DesignerScene::~DesignerScene()
{
}
void DesignerScene::drawBackground(QPainter* painter, const QRectF& rect)
{
QGraphicsScene::drawBackground(painter, rect);
painter->fillRect(sceneRect(), Qt::white);
if(!m_bGridVisible)
return;
QRectF sceneRect = this->sceneRect();
QPen pen;
pen.setBrush(Qt::darkCyan);//藏青色
pen.setStyle(Qt::DashLine);
pen.setWidthF(0.2);
painter->setPen(pen);
int nGridSpace = 20; //暂时写死
//竖线
for(int nX = sceneRect.left(); nX < sceneRect.right(); nX += nGridSpace)
painter->drawLine(nX,sceneRect.top(),nX,sceneRect.bottom());
//横线
for(int nY = sceneRect.top(); nY < sceneRect.bottom(); nY += nGridSpace)
painter->drawLine(sceneRect.left(),nY,sceneRect.right(),nY);
//补齐最后两条
painter->drawLine(sceneRect.right(), sceneRect.top(), sceneRect.right(), sceneRect.bottom());
painter->drawLine(sceneRect.left(), sceneRect.bottom(), sceneRect.right(), sceneRect.bottom());
//原点
// painter->setPen(Qt::red);
// painter->setBrush(Qt::red);
// painter->drawEllipse(0, 0, 50, 50);
}
void DesignerScene::mousePressEvent(QGraphicsSceneMouseEvent* mouseEvent)
{
if(m_pDrawingPanel)
{
2025-06-20 18:09:41 +08:00
DiagramMode mode = m_pDrawingPanel->getMode();
m_pDrawingPanel->selectorManager()->getWorkingSelector()->mousePressEvent(mouseEvent, this,mode);
2024-12-03 20:07:25 +08:00
update();
}
else
QGraphicsScene::mousePressEvent(mouseEvent);
}
void DesignerScene::mouseMoveEvent(QGraphicsSceneMouseEvent* mouseEvent)
{
if(m_pDrawingPanel)
{
2025-06-20 18:09:41 +08:00
DiagramMode mode = m_pDrawingPanel->getMode();
m_pDrawingPanel->selectorManager()->getWorkingSelector()->mouseMoveEvent(mouseEvent, this,mode);
2024-12-03 20:07:25 +08:00
update();
}
else
QGraphicsScene::mouseMoveEvent(mouseEvent);
}
void DesignerScene::mouseReleaseEvent(QGraphicsSceneMouseEvent* mouseEvent)
{
if(m_pDrawingPanel)
{
2025-06-20 18:09:41 +08:00
DiagramMode mode = m_pDrawingPanel->getMode();
m_pDrawingPanel->selectorManager()->getWorkingSelector()->mouseReleaseEvent(mouseEvent, this,mode);
2024-12-03 20:07:25 +08:00
update();
}
else
QGraphicsScene::mouseReleaseEvent(mouseEvent);
}
void DesignerScene::mouseDoubleClickEvent(QGraphicsSceneMouseEvent* mouseEvent)
{
if(m_pDrawingPanel)
{
2025-06-20 18:09:41 +08:00
DiagramMode mode = m_pDrawingPanel->getMode();
m_pDrawingPanel->selectorManager()->getWorkingSelector()->mouseDoubleClickEvent(mouseEvent, this,mode);
2024-12-03 20:07:25 +08:00
update();
}
else
QGraphicsScene::mouseDoubleClickEvent(mouseEvent);
2024-12-03 20:07:25 +08:00
}
void DesignerScene::keyPressEvent(QKeyEvent* event)
{
QGraphicsScene::keyPressEvent(event);
}
void DesignerScene::keyReleaseEvent(QKeyEvent* event)
{
QGraphicsScene::keyReleaseEvent(event);
}
2025-06-06 18:57:37 +08:00
void DesignerScene::contextMenuEvent(QGraphicsSceneContextMenuEvent *event)
2025-02-06 16:36:50 +08:00
{
2025-06-06 18:57:37 +08:00
if(m_pDrawingPanel)
2025-02-06 16:36:50 +08:00
{
2025-06-20 18:09:41 +08:00
DiagramMode mode = m_pDrawingPanel->getMode();
m_pDrawingPanel->selectorManager()->getWorkingSelector()->contextMenuEvent(event, this,mode);
2025-06-06 18:57:37 +08:00
update();
2025-02-06 16:36:50 +08:00
}
2025-06-06 18:57:37 +08:00
else
QGraphicsScene::contextMenuEvent(event);
2025-02-06 16:36:50 +08:00
}
2025-05-09 19:36:32 +08:00
void DesignerScene::dragEnterEvent(QGraphicsSceneDragDropEvent *event)
{
if(m_pDrawingPanel)
{
2025-06-20 18:09:41 +08:00
DiagramMode mode = m_pDrawingPanel->getMode();
if(mode == DM_run)
2025-05-09 19:36:32 +08:00
return;
2025-06-20 18:09:41 +08:00
m_pDrawingPanel->selectorManager()->getWorkingSelector()->dragEnterEvent(event, this,mode);
2025-05-09 19:36:32 +08:00
update();
}
else
QGraphicsScene::dragEnterEvent(event);
}
void DesignerScene::dragMoveEvent(QGraphicsSceneDragDropEvent *event)
{
if(m_pDrawingPanel)
{
2025-06-20 18:09:41 +08:00
DiagramMode mode = m_pDrawingPanel->getMode();
if(mode == DM_run)
2025-05-09 19:36:32 +08:00
return;
2025-06-20 18:09:41 +08:00
m_pDrawingPanel->selectorManager()->getWorkingSelector()->dragMoveEvent(event, this,mode);
2025-05-09 19:36:32 +08:00
update();
}
else
QGraphicsScene::dragMoveEvent(event);
}
void DesignerScene::dropEvent(QGraphicsSceneDragDropEvent *event)
{
if(m_pDrawingPanel)
{
2025-06-20 18:09:41 +08:00
DiagramMode mode = m_pDrawingPanel->getMode();
if(mode == DM_run)
2025-05-09 19:36:32 +08:00
return;
2025-06-20 18:09:41 +08:00
m_pDrawingPanel->selectorManager()->getWorkingSelector()->dropEvent(event, this,mode);
2025-05-09 19:36:32 +08:00
update();
}
else
QGraphicsScene::dropEvent(event);
}
2024-12-03 20:07:25 +08:00
void DesignerScene::setGridVisible(bool bVisible)
{
m_bGridVisible = bVisible;
update();
}
void DesignerScene::callParentEvent(QGraphicsSceneMouseEvent* mouseEvent)
{
//调用QGraphicsScene的函数会直接触发一些操作比如取消item的selected状态从而触发item的一些函数itemChange,然后在item的相应函数中书写执行一些操作
switch (mouseEvent->type())
{
case QEvent::GraphicsSceneMousePress:
QGraphicsScene::mousePressEvent(mouseEvent);
break;
case QEvent::GraphicsSceneMouseMove:
QGraphicsScene::mouseMoveEvent(mouseEvent);
break;
case QEvent::GraphicsSceneMouseRelease:
QGraphicsScene::mouseReleaseEvent(mouseEvent);
break;
default:
break;
}
}
GraphicsItemGroup* DesignerScene::createGroup()
{
QList<QGraphicsItem*> listItem = selectedItems();
if(listItem.isEmpty())
return nullptr;
else if(listItem.count() == 1) //判断只选中了一个时是不是已经打组,如果是不做操作,防止循环打组
{
AbstractShape* item = qgraphicsitem_cast<AbstractShape*>(listItem.first());
if(item && item->getType()==T_group)
return nullptr;
}
else //如果选择的有组群则拆散该组群并和其它单独的itme组合成新组群防止多层组群出现方便管理和计算
{
for(int n=0; n<listItem.count(); n++)
{
AbstractShape* shape = qgraphicsitem_cast<AbstractShape*>(listItem[n]);
if(shape && shape->getType()==T_group)
{
GraphicsItemGroup* group = qgraphicsitem_cast<GraphicsItemGroup*>(listItem[n]);
QList<QGraphicsItem*> childItems = group->childItems();
foreach (QGraphicsItem* child, childItems)
{
if(qgraphicsitem_cast<ItemControlHandle*>(child))
continue;
group->removeFromGroup(child);
listItem.push_back(child);
}
listItem.takeAt(n);
removeItem(group);
delete group;
n--;
}
}
}
GraphicsItemGroup* group = new GraphicsItemGroup();
group->addItems(listItem);
addItem(group);
return group;
}
void DesignerScene::destroyGroup()
{
}