DiagramDesigner/source/diagramView.cpp

247 lines
7.4 KiB
C++
Raw Normal View History

2026-03-23 11:06:17 +08:00
#include <QStandardItemModel>
#include <QMenu>
#include <QUuid>
#include "diagramView.h"
#include "ui_diagramView.h"
#include "tools.h"
#include "projectManager.h"
#include "dataBase.h"
#include <QMessageBox>
#include <QStyle>
DiagramView::DiagramView(QWidget *parent)
: QDialog(parent)
, ui(new Ui::diagramView)
,_pModel(nullptr)
{
ui->setupUi(this);
_pModel = new QStandardItemModel(this);
ui->treeView->setContextMenuPolicy(Qt::CustomContextMenu);
_count = 0;
}
DiagramView::~DiagramView()
{
delete ui;
}
void DiagramView::initial()
{
QStyle *style = QApplication::style();
m_iconUnsaved = style->standardIcon(QStyle::SP_DialogNoButton);
m_iconSaved = style->standardIcon(QStyle::SP_DialogYesButton);
connect(ui->treeView, &QTreeView::customContextMenuRequested, this, &DiagramView::onIndexRbtnClicked);
connect(ui->treeView, &QTreeView::clicked, this, &DiagramView::onItemClicked);
connect(_pModel, &QStandardItemModel::itemChanged, this, &DiagramView::onItemChanged);
connect(ui->btn_new, &QPushButton::clicked, this, &DiagramView::onNewHMIClicked);
connect(ui->btn_save, &QPushButton::clicked, this, &DiagramView::onSaveHMIClicked);
ui->treeView->setHeaderHidden(true);
// 设置模型的列数
_pModel->setColumnCount(3);
_pModel->setHorizontalHeaderLabels({"名称", "状态", "修改时间"});
QList<HMIPageInfo> lst = DataBase::GetInstance()->getAllHMI();
for(auto& info:lst)
{
QString sLastSave = info.context["lastSave"].toString();
QList<QStandardItem*> rowItems;
QStandardItem* pItem = new QStandardItem(info.name); //名称
pItem->setData(info.uid,Qt::UserRole);
rowItems.append(pItem);
QStandardItem *stateItem = new QStandardItem(); //状态
updateState(stateItem,1);
rowItems.append(stateItem);
stateItem->setEditable(false);
QStandardItem *timeItem = new QStandardItem(sLastSave); //修改时间
rowItems.append(timeItem);
timeItem->setEditable(false);
_pModel->appendRow(rowItems);
}
// 创建树视图
ui->treeView->setModel(_pModel);
// 展开所有节点
ui->treeView->expandAll();
// 显示树视图
ui->treeView->setWindowTitle(QObject::tr("组态列表"));
ui->treeView->header()->setStretchLastSection(false);
ui->treeView->header()->setSectionResizeMode(0, QHeaderView::Stretch);
ui->treeView->header()->setSectionResizeMode(1, QHeaderView::ResizeToContents);
ui->treeView->header()->setSectionResizeMode(2, QHeaderView::ResizeToContents);
}
void DiagramView::onIndexRbtnClicked(const QPoint &pos)
{
// 获取当前点击的位置对应的索引
QMenu menu;
QModelIndex index = ui->treeView->indexAt(pos);
if (index.isValid()) {
QStandardItem* item = _pModel->itemFromIndex(index);
QVariant parentId = item->data(Qt::UserRole+1);
if(item)
{
QAction *saveAction = new QAction("保存", this);
QAction *delAction = new QAction("删除", this);
connect(delAction,&QAction::triggered,this,[&](){
QModelIndex currentIndex = ui->treeView->currentIndex();
if(currentIndex.isValid())
{
QStandardItem* pItem = _pModel->itemFromIndex(currentIndex);
QVariant id = pItem->data(Qt::UserRole+1);
QString sName = pItem->text();
if(pItem)
{
QString str = item->text();
DiagramInfo info;
//todo:具体信息
info.id = id; //新建的随机赋予临时id
info.sName = sName;
info.sTag = sName;
info.parentId = parentId;
emit diagramDelete(info);
QStandardItem* pParent = item->parent();
if(pParent)
{
pParent->removeRow(currentIndex.row());
}
}
}
});
menu.addAction(saveAction);
menu.addAction(delAction);
}
}
// 在点击位置显示菜单
menu.exec(ui->treeView->mapToGlobal(pos));
}
void DiagramView::onItemChanged(QStandardItem *item)
{
int nLevel = getLevel(item);
QString str = item->text(); //名称可能修改
DiagramInfo info;
info.id = item->data(Qt::UserRole).toUuid();
info.sName = str;
emit diagramChange(info);
}
void DiagramView::onItemClicked(const QModelIndex &index)
{
QModelIndex firstIndex = index.sibling(0,index.column()); //取行首item
if(firstIndex.isValid()){
QStandardItem* item = _pModel->itemFromIndex(firstIndex);
QStandardItem* parent = item->parent();
if(item)
{
DiagramInfo info;
info.id = item->data(Qt::UserRole).toUuid();
info.sName = item->text();
if(parent)
info.parentId = parent->data(Qt::UserRole).toInt();
emit diagramSelected(info);
}
}
}
void DiagramView::onNewHMICreated(const QString& str,QUuid id)
{
QList<QStandardItem*> rowItems;
QStandardItem* pItem = new QStandardItem(str); //名称
pItem->setData(id,Qt::UserRole);
rowItems.append(pItem);
QStandardItem *stateItem = new QStandardItem(); //状态
updateState(stateItem,0);
rowItems.append(stateItem);
stateItem->setEditable(false);
QStandardItem *timeItem = new QStandardItem(); //修改时间
rowItems.append(timeItem);
timeItem->setEditable(false);
_pModel->appendRow(rowItems);
}
void DiagramView::onHMIUpdated(const QString& str,QUuid id,int nState,QString sTime)
{
int rowCount = _pModel->rowCount();
for (int row = 0; row < rowCount; ++row) {
// 获取第一列名称列的item
QStandardItem *nameItem = _pModel->item(row, 0);
if (nameItem) {
QString name = nameItem->text();
if(name == str){
QStandardItem *stateItem = _pModel->item(row, 1);
stateItem->setText(nState?"已保存":"未保存");
QStandardItem *timeItem = _pModel->item(row, 2);
timeItem->setText(sTime);
break;
}
}
}
}
void DiagramView::onHMISaved(const QString& strPro,const QString& autor,QUuid uid,QString sTime)
{
}
void DiagramView::onNewHMIClicked()
{
emit prepareCreateHMI();
}
void DiagramView::onSaveHMIClicked()
{
}
void DiagramView::updateState(QStandardItem* p,int n)
{
if(p){
if(n == 0){ //未保存
p->setText("未保存");
p->setIcon(m_iconUnsaved);
}
else if(n == 1){ //已保存
p->setText("已保存");
p->setIcon(m_iconSaved);
}
}
}
void DiagramView::updateSaveTime(QStandardItem* p,QString s)
{
if(p){
p->setText(s);
}
}
QString DiagramView::generateName()
{
QString sName = QString::fromWCharArray(L"组态图_")+QString::number(_count);
QModelIndex Idx = findIndex(_pModel,sName);
if(Idx.isValid()) //已存在
{
_count += 1;
return generateName();
}
else {
return sName;
}
}