DiagramDesigner/source/diagramView.cpp

247 lines
7.4 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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;
}
}