247 lines
7.4 KiB
C++
247 lines
7.4 KiB
C++
#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;
|
||
}
|
||
}
|