#include "WindowAppPouView.h"
#include "WindowAppPouScene.h"
#include "DragMimeData.h"
#include "WindowAppTreeTool.h"
#include "WindowAppPouFrame.h"
#include "VPCommand.h"
#include "Pou.h"
WindowAppPouView::WindowAppPouView(QWidget* parent /*= nullptr*/)
: QGraphicsView()
, m_pPouScene(nullptr)
{
this->setParent(parent);
this->m_fZoom = 0;
this->m_pBkImage = nullptr;
}
///
/// 初始化
///
void WindowAppPouView::initView(const QString& strGroup, QWidget* pParent)
{
// 设置为可接收拖拽
this->setAcceptDrops(true);
//// 设置视图的重绘方式(默认也是这种方式)
//this->setViewportUpdateMode(QGraphicsView::MinimalViewportUpdate);
// 取消滚动条
//this->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
//this->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
// 绘图窗口的场景类
// 2022-1-8 修改,此处将父控件WindowAppPouView*传递给Scene,用于实现点击调用函数
m_pPouScene = new WindowAppPouScene(strGroup, this, pParent);
// 设置为固定大小
// 将自身设置得比scene略大,防止出现滚动条
this->resize(POU_VIEW_WIDTH + 1, POU_VIEW_HEIGHT + 1);
m_pPouScene->setSceneRect(QRectF(0, 0, POU_VIEW_WIDTH, POU_VIEW_HEIGHT));
this->setScene(m_pPouScene);
// 由于默认是居中显示,此处需要设置为默认左上角显示
this->centerOn(0, 0);
// 防止窗口中的对象拖尾
this->setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
// 初始化方格背景
this->initBkImage();
//设置橡皮筋选择选项
this->setDragMode(QGraphicsView::RubberBandDrag);
// 设置抗锯齿(解决link 拖拽的时候,预览线有锯齿)
this->setRenderHint(QPainter::Antialiasing, true);
// 初始化与Zoom相关操作
this->initZoom();
}
///
/// 初始化与缩放相关的操作
///
void WindowAppPouView::initZoom()
{
//用于缩放视图的滑动条
QSlider* slider = new QSlider;
slider->setOrientation(Qt::Horizontal);
slider->setRange(1, 100);
slider->setTickInterval(10);
slider->setValue(50);
slider->setMaximumSize(80, 20);
connect(slider, SIGNAL(valueChanged(int)), this, SLOT(slotZoom(int)));
QGridLayout* gridLayout = new QGridLayout(this);
QSpacerItem* horizontalSpacer = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
gridLayout->addItem(horizontalSpacer, 1, 0, 1, 1);
QSpacerItem* verticalSpacer = new QSpacerItem(20, 40, QSizePolicy::Minimum, QSizePolicy::Expanding);
gridLayout->addItem(verticalSpacer, 0, 0, 1, 1);
m_pZooomLabel = new QLabel();
m_pZooomLabel->setText("Zoom 0 ");
gridLayout->addWidget(slider, 1, 1, 1, 1);
gridLayout->addWidget(m_pZooomLabel, 1, 2, 1, 1);
setLayout(gridLayout);
m_fZoom = 50;
connect(horizontalScrollBar(), &QScrollBar::valueChanged, this, &WindowAppPouView::viewportRectChanged);
connect(verticalScrollBar(), &QScrollBar::valueChanged, this, &WindowAppPouView::viewportRectChanged);
}
//
//#include "LoadingManager.h"
//void myFunction()
//{
// Utility::qSleep(10000);
//
// qDebug() << "myFunction finished";
//
// emit g_pLoadingManager->sigLoadingFinished();
//}
///
/// 在拖拽事件中获取拖动进来的工具信息
///
///
void WindowAppPouView::dropEvent(QDropEvent* event)
{
// 确定是从树形控件拖拽来的
WindowAppTreeTool* source = qobject_cast(event->source());
if (source)
{
const DragMimeData* pMimeData = (const DragMimeData*)(event->mimeData());
// 确认MimeData中有对应的数据字段
if (pMimeData->hasFormat(FORMAT_DRAG_TOOL))
{
// 取出拖动的工具信息
const STATIC_TOOL* pDragTool = pMimeData->DragItemData();
// 2021/4/17 处理了一个拖动tool为空的bug
if (pDragTool == nullptr)
{
return;
}
//// 取出节点信息
//qDebug() << pDragTool->strName;
qDebug() << "[TOOL] Drag " << pDragTool->strName << " to WindowAppDiagramView.";
// 按照拖动的工具信息在Pou中进行创建对应的运行时工具
// ((WindowAppPouScene*)this->scene())->addNewItem(pDragTool, mapToScene( event->pos()));
// 2022-10-1,将Pou工具的添加整合进Undo体系
PouToolAddCommand* toolAddCommand = new PouToolAddCommand((WindowAppPouScene*)this->scene(), pDragTool, mapToScene(event->pos()));
((WindowAppPouScene*)scene())->m_CommandManager.executeCommand(toolAddCommand);
//emit g_pLoadingManager->sigLoading();
//QFuture future = QtConcurrent::run(myFunction);
//while (true)
//{
// QCoreApplication::processEvents();
// if (future.isFinished())
// {
// break;
// }
// Utility::qSleep(100);
//}
//emit g_pLoadingManager->sigLoadingFinished();
}
event->accept();
}
}
///
/// 拖拽动作处理
///
///
void WindowAppPouView::dragMoveEvent(QDragMoveEvent* event)
{
// 只接收从toolTree的拖动操作
WindowAppTreeTool* source = qobject_cast (event->source());
if (source)
{
event->acceptProposedAction();
event->accept();
}
}
/////
///// 直接添加Tool功能块(from序列化文件)
/////
/////
//void WindowAppPouView::addToolDirectly(TOOL* newTool, QPointF pos)
//{
// ((WindowAppPouScene*)this->scene())->addNewItem(newTool, pos, true);
//}
/////
///// 在界面中添加新的Link(from序列化文件)
/////
/////
/////
//void WindowAppPouView::addLinkDirectly(const QString& strStartInf, const QString& strEndInf, LINK_MODE linkMode)
//{
// ((WindowAppPouScene*)this->scene())->addLink(strStartInf, strEndInf, linkMode);
//}
///
/// 在界面中添加棋盘格背景
///
///
///
void WindowAppPouView::drawBackground(QPainter* painter, const QRectF& rect)
{
if (m_pBkImage)
{
painter->drawTiledPixmap(rect, *m_pBkImage);
}
}
///
/// 自动缩放
///
///
void WindowAppPouView::resizeEvent(QResizeEvent* resizeEvent)
{
Q_UNUSED(resizeEvent);
//QRect rect = this->geometry();
//m_pDiagramScene->setSceneRect(0, 0, rect.width(), rect.height());
emit navigatorViewRequired(true, transform());
}
void WindowAppPouView::slotZoom(int value)
{
qreal scaleFactor;
if (value > m_fZoom)//放大
{
scaleFactor = pow(1.05, (value - m_fZoom));
}
else {
scaleFactor = pow(1 / 1.05, (m_fZoom - value));
}
scale(scaleFactor, scaleFactor);
m_fZoom = value;
QString strZoom = "Zoom " + QString::number(value - 50) + " ";
m_pZooomLabel->setText(strZoom);
emit navigatorViewRequired(true , transform());
}
///
/// 初始化方格背景
///
void WindowAppPouView::initBkImage()
{
m_pBkImage = new QPixmap(16, 16);
QColor color1(60, 60, 60);
QColor color2(45, 45, 45);
m_pBkImage->fill(color1);
QPainter painter1(m_pBkImage);
painter1.fillRect(0, 0, 8, 8, color2);
painter1.fillRect(8, 8, 8, 8, color2);
painter1.end();
}