DiagramDesigner/diagramCavas/source/projectModelSetting.cpp

418 lines
16 KiB
C++
Raw Normal View History

2025-06-27 19:17:04 +08:00
#include <QPushButton>
#include <QMessageBox>
#include <QCoreApplication>
#include <QDir>
#include <QFileInfo>
#include <QSvgRenderer>
#include <QPainter>
2025-06-20 18:09:41 +08:00
#include "projectModelSetting.h"
#include "ui_projectModelSetting.h"
2025-06-27 19:17:04 +08:00
#include "baseProperty.h"
#include "graphicsItem/graphicsBaseItem.h"
2025-07-23 17:27:35 +08:00
#include "graphicsDataModel/fixedPortsModel.h"
2025-06-27 19:17:04 +08:00
#include "projectModelManager.h"
#include "tools.h"
#include "global.h"
#include "logger.h"
2025-07-23 17:27:35 +08:00
#include "dataBase.h"
2025-06-20 18:09:41 +08:00
ProjectModelSetting::ProjectModelSetting(QWidget *parent)
: QDialog(parent)
,ui(new Ui::projectModelSetting)
2025-06-27 19:17:04 +08:00
,_curItemData(nullptr)
2025-07-23 17:27:35 +08:00
,_controller(nullptr)
2025-06-20 18:09:41 +08:00
{
2025-06-27 19:17:04 +08:00
ui->setupUi(this);
2025-06-20 18:09:41 +08:00
this->setWindowFlags(Qt::FramelessWindowHint | windowFlags());
2025-06-27 19:17:04 +08:00
initial();
2025-06-20 18:09:41 +08:00
}
ProjectModelSetting::~ProjectModelSetting()
{
}
void ProjectModelSetting::initial()
{
connect(ui->btn_ok,&QPushButton::clicked,this,&ProjectModelSetting::onOkClicked);
connect(ui->btn_cancel,&QPushButton::clicked,this,&ProjectModelSetting::onCancelClicked);
2025-07-23 17:27:35 +08:00
//connect(ui->btn_saveAs,&QPushButton::clicked,this,&ProjectModelSetting::onSaveAsClicked);
2025-06-27 19:17:04 +08:00
connect(ui->btn_select,&QPushButton::clicked,this,&ProjectModelSetting::onSelectClicked);
2025-06-20 18:09:41 +08:00
connect(ui->btn_apply,&QPushButton::clicked,this,&ProjectModelSetting::onAddClicked);
connect(ui->btn_revoke,&QPushButton::clicked,this,&ProjectModelSetting::onDecreaseClicked);
2025-06-27 19:17:04 +08:00
2025-07-23 17:27:35 +08:00
//connect(ui->le_saveAs,&QLineEdit::editingFinished,this,&ProjectModelSetting::onSaveAsFinished);
//connect(ui->cb_modelType,&QComboBox::currentTextChanged,this,&ProjectModelSetting::onCurrentTextChanged);
2025-06-27 19:17:04 +08:00
_curPath = QCoreApplication::applicationDirPath()+"/proModelImage/";
2025-07-23 17:27:35 +08:00
//ui->cb_modelType->setPlaceholderText(" ");
/*QRegularExpression regExp("[a-zA-Z0-9]+");
2025-07-04 18:47:49 +08:00
QRegularExpressionValidator *validator = new QRegularExpressionValidator(regExp, this);
2025-07-23 17:27:35 +08:00
ui->le_saveAs->setValidator(validator);*/
2025-06-27 19:17:04 +08:00
}
void ProjectModelSetting::loadPicture()
{
ui->listWidget_icon->clear();
QString path = _curPath+_curItemData->metaModelName()+"/";
QDir dir(path);
QStringList namefiles;
namefiles<<"*.png"<<"*.svg";
QStringList files=dir.entryList(namefiles,QDir::Files|QDir::Readable,QDir::Name);
//动态添加item到QListWidget里
for(int i=0;i<files.size();i++)
{
QString sPath = path+files.at(i);
QListWidgetItem *newitem=new QListWidgetItem(QIcon(QPixmap(sPath).scaled(100, 100)),files.at(i));
QFile file(sPath);
if (!file.open(QIODevice::ReadOnly)) {
LOG_WARN("File", QString("%1 svgfile open failed").arg(sPath));
return;
}
// Read SVG content
QByteArray svgData = file.readAll().toHex();
file.close();
newitem->setData(Qt::UserRole + 1,svgData); //item附带二进制数据
QFileInfo fi(path+files.at(i)); //获取文件信息
newitem->setText(fi.baseName());//Returns the base name of the file without the path
newitem->setTextAlignment(Qt::AlignHCenter);//设置文字对齐方式:水平居中
ui->listWidget_icon->addItem(newitem);
}
}
void ProjectModelSetting::setSelectedItems(QStringList lst)
{
QList<QListWidgetItem*> lstItem = ui->listWidget_icon->findItems(lst.first(),Qt::MatchExactly);
if(!lstItem.empty())
{
ui->listWidget_icon->setCurrentItem(lstItem.first());
}
2025-06-20 18:09:41 +08:00
}
void ProjectModelSetting::showDlg(GraphicsBaseModelItem* srcNode)
{
show();
2025-06-27 19:17:04 +08:00
ui->treeView_base->setModel(nullptr);
ui->treeView_sub->setModel(nullptr);
ModelProperty* p = srcNode->getProperty();
BaseModelProperty* pro = dynamic_cast<BaseModelProperty*>(p);
if(pro)
{
QString sName = pro->name();
QString sMetaModel = pro->metaModelName();
QString sModel = pro->modelName();
2025-07-23 17:27:35 +08:00
if(sModel.isEmpty()) //模型为空直接判断名字()
{
sModel = sMetaModel+"_"+_controller->pageName();
pro->setModelName(sModel);
}
2025-06-27 19:17:04 +08:00
_curItemData = pro;
2025-07-23 17:27:35 +08:00
//loadProject(sMetaModel);
2025-06-27 19:17:04 +08:00
bool bExist = ProjectModelManager::instance().ifProjectExsit(sModel);
if(bExist){ //使用存在的属性
2025-07-23 17:27:35 +08:00
//ui->cb_modelType->setCurrentText(sModel);
loadModel(sModel);
2025-06-27 19:17:04 +08:00
}
else{ //新建当前对象的属性
if(pro->getModelProperty().pBase == nullptr && pro->getModelProperty().pSelect == nullptr){
pro->getModelProperty().pBase = new QStandardItemModel(this);
pro->getModelProperty().pSelect = new QStandardItemModel(this);
pro->getModelProperty().mapProperty = ProjectModelManager::instance().addNewProject(sMetaModel,sModel,pro->getModelProperty());
}
ui->treeView_base->setModel(pro->getModelProperty().pBase);
ui->treeView_sub->setModel(pro->getModelProperty().pSelect);
ui->treeView_sub->expandAll();
ui->treeView_base->expandAll();
}
2025-07-23 17:27:35 +08:00
//ui->le_saveAs->clear();
2025-06-27 19:17:04 +08:00
ui->le_name->setText(sName);
ui->le_base->setText(sMetaModel);
}
loadPicture();
}
2025-07-23 17:27:35 +08:00
/*void ProjectModelSetting::loadProject(const QString& sMeta)
2025-06-27 19:17:04 +08:00
{
ui->cb_modelType->blockSignals(true);
ui->cb_modelType->clear();
QStringList lst = ProjectModelManager::instance().getProjectModelLst(sMeta);
ui->cb_modelType->addItems(lst);
ui->cb_modelType->blockSignals(false);
2025-07-23 17:27:35 +08:00
}*/
2025-06-20 18:09:41 +08:00
void ProjectModelSetting::onOkClicked()
{
2025-07-23 17:27:35 +08:00
//_curItemData->setModelName(ui->cb_modelType->currentText());
onSaveClicked();
2025-07-04 18:47:49 +08:00
hide();
2025-06-20 18:09:41 +08:00
}
void ProjectModelSetting::onCancelClicked()
{
hide();
}
2025-07-23 17:27:35 +08:00
/*void ProjectModelSetting::onSaveAsClicked()
2025-06-20 18:09:41 +08:00
{
2025-06-27 19:17:04 +08:00
QString sModelName = ui->le_saveAs->text();
bool bExist = ProjectModelManager::instance().ifProjectExsit(sModelName);
if(bExist){
QMessageBox::information(NULL, QString("提示"), QString::fromWCharArray(L"该模型已存在"));
}
else{ //新建的模型拷贝当前内容到全局队列
_curItemData->getModelProperty().modelSetting.modelName = sModelName;
PropertyModel pro = _curItemData->getModelProperty().deepCopy();
ProjectModelManager::instance().getData()[_curItemData->metaModelName()].insert(sModelName,pro);
ProjectModelManager::instance().generate(_curItemData->metaModelName(),sModelName);
ProjectModelManager::instance().updateSetting(_curItemData->metaModelName(),sModelName);
ui->cb_modelType->blockSignals(true);
ui->cb_modelType->addItem(sModelName);
ui->cb_modelType->setCurrentText(sModelName);
ui->cb_modelType->blockSignals(false);
QMessageBox::information(NULL, QString("提示"), QString::fromWCharArray(L"另存成功"));
}
ui->label_info->clear();
2025-07-23 17:27:35 +08:00
}*/
2025-06-20 18:09:41 +08:00
2025-06-27 19:17:04 +08:00
void ProjectModelSetting::onSelectClicked()
{
QList<QListWidgetItem*> items = ui->listWidget_icon->selectedItems();
for(auto& item:items)
{
if(!_curItemData->getModelProperty().modelSetting.mapSvg.contains(item->text()))
{
QByteArray data = item->data(Qt::UserRole + 1).toByteArray();
_curItemData->getModelProperty().modelSetting.mapSvg.insert(item->text(),data);
ui->label_infoIcon->setText("当前选择:"+item->text());
}
}
2025-06-20 18:09:41 +08:00
}
void ProjectModelSetting::onAddClicked()
{
2025-06-27 19:17:04 +08:00
if(_curItemData == nullptr)
return;
QModelIndex selected = ui->treeView_base->currentIndex();
QStandardItem* pItem = _curItemData->getModelProperty().pBase->itemFromIndex(selected);
if(pItem)
{
int nLevel = getLevel(pItem);
if(nLevel != 1) //不是二级节点就返回
return;
else{
QString strGroup = pItem->parent()->text();
2025-06-20 18:09:41 +08:00
2025-06-27 19:17:04 +08:00
QStandardItem *parentItem = pItem->parent();
if (parentItem) {
parentItem->takeRow(pItem->row());
}
QList<QStandardItem*> groupItem = _curItemData->getModelProperty().pSelect->findItems(strGroup);
if(groupItem.isEmpty()) //已选对象中是否存在该组,没有则添加
{
QStandardItem* pGroup = new QStandardItem(strGroup);
_curItemData->getModelProperty().pSelect->appendRow(pGroup);
pGroup->appendRow(pItem);
}
else{
QStandardItem* pGroup = groupItem[0];
pGroup->appendRow(pItem);
}
_curItemData->getModelProperty().mapProperty[strGroup].mCheckState[pItem->text()].checkState = true; //选择状态设为1
}
}
ui->treeView_sub->expandAll();
ui->treeView_base->expandAll();
2025-06-20 18:09:41 +08:00
}
void ProjectModelSetting::onDecreaseClicked()
{
2025-06-27 19:17:04 +08:00
if(_curItemData == nullptr)
return;
QStringList lstPub = ProjectModelManager::instance().getPublicGroupList();
QModelIndex selected = ui->treeView_sub->currentIndex();
QStandardItem* pItem = _curItemData->getModelProperty().pSelect->itemFromIndex(selected);
if(pItem)
{
if(lstPub.contains(pItem->parent()->text())){
QMessageBox::information(NULL, QString("提示"), QString::fromWCharArray(L"公共属性无法编辑"));
return;
}
int nLevel = getLevel(pItem);
if(nLevel != 1) //不是二级节点就返回
return;
else{
QString strGroup = pItem->parent()->text();
QStandardItem *parentItem = pItem->parent();
if (parentItem) {
parentItem->takeRow(pItem->row());
if(!parentItem->hasChildren()){
_curItemData->getModelProperty().pSelect->takeRow(parentItem->row());
}
}
QList<QStandardItem*> groupItem = _curItemData->getModelProperty().pBase->findItems(strGroup);
if(groupItem.isEmpty()) //已选对象中是否存在该组,没有则添加
{
QStandardItem* pGroup = new QStandardItem(strGroup);
_curItemData->getModelProperty().pBase->appendRow(pGroup);
pGroup->appendRow(pItem);
}
else{
QStandardItem* pGroup = groupItem[0];
pGroup->appendRow(pItem);
}
_curItemData->getModelProperty().mapProperty[strGroup].mCheckState[pItem->text()].checkState = false; //选择状态设为1
}
}
ui->treeView_base->expandAll();
}
2025-07-23 17:27:35 +08:00
void ProjectModelSetting::onSaveClicked()
{
if(_curItemData){
QString sMeta = _curItemData->metaModelName();
QString sModelName = _curItemData->modelName();
bool bExist = ProjectModelManager::instance().ifProjectExsit(sModelName);
if(bExist){
QMessageBox msgBox;
msgBox.setText(QString::fromWCharArray(L"提示"));
msgBox.setInformativeText(QString::fromWCharArray(L"模型将被覆盖,是否保存?"));
msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Cancel);
msgBox.setDefaultButton(QMessageBox::Save);
int ret = msgBox.exec();
switch (ret) {
case QMessageBox::Save:
{
PropertyModel pro = _curItemData->getModelProperty().deepCopy();
ProjectModelManager::instance().getData()[_curItemData->metaModelName()][sModelName] = pro;
ProjectModelManager::instance().updateSetting(_curItemData->metaModelName(),sModelName);
QMap<QString,QJsonObject> mapCheckState = DataBase::GetInstance()->getCheckStateFromManager(sModelName);
QString sRes = ProjectModelManager::instance().modifyProjectModel(sMeta,sModelName,mapCheckState);
if(!sRes.isEmpty())
{
QMessageBox::information(NULL, QString::fromWCharArray(L"提示"), QString::fromWCharArray(L"修改成功"));
}
else
{
QMessageBox::information(NULL, QString::fromWCharArray(L"提示"), QString::fromWCharArray(L"修改失败"));
}
}
break;
case QMessageBox::Cancel:
break;
default:
break;
}
}
else{ //新建的模型拷贝当前内容到全局队列
_curItemData->getModelProperty().modelSetting.modelName = sModelName;
PropertyModel pro = _curItemData->getModelProperty().deepCopy();
ProjectModelManager::instance().getData()[_curItemData->metaModelName()].insert(sModelName,pro);
ProjectModelManager::instance().generate(_curItemData->metaModelName(),sModelName);
ProjectModelManager::instance().updateSetting(_curItemData->metaModelName(),sModelName);
QMessageBox::information(NULL, QString("提示"), QString::fromWCharArray(L"保存成功"));
}
if(_controller){
QMap<QUuid,GraphicsBaseModelItem*> mapItem = _controller->allBaseItems();
for(auto &item:mapItem)
{
ModelProperty* p = item->getProperty();
BaseModelProperty* pro = dynamic_cast<BaseModelProperty*>(p);
if(pro){
if(pro->metaModelName() == _curItemData->metaModelName()){ //将相同基模item的工程模名称都置为相同(改一个全变)
pro->setModelName(_curItemData->modelName());
}
}
}
}
}
}
/*void ProjectModelSetting::onSaveAsFinished()
2025-06-27 19:17:04 +08:00
{
QString sModelName = ui->le_saveAs->text();
bool bExist = ProjectModelManager::instance().ifProjectExsit(sModelName);
if(bExist){
ui->label_info->setText(QString::fromWCharArray(L"名称已存在"));
}
else{
ui->label_info->setText(QString::fromWCharArray(L"名称可用"));
}
2025-07-23 17:27:35 +08:00
}*/
2025-06-27 19:17:04 +08:00
void ProjectModelSetting::onCurrentTextChanged(const QString& text)
{
if(text.isEmpty())
return;
if(_curItemData)
{
_curItemData->getModelProperty().release();
PropertyModel model = ProjectModelManager::instance().getData()[_curItemData->metaModelName()][text].deepCopy();
2025-07-04 18:47:49 +08:00
//PropertyModel model = ProjectModelManager::instance().getData()[_curItemData->metaModelName()][text];
2025-06-27 19:17:04 +08:00
_curItemData->setModelProperty(model);
ui->treeView_base->setModel(_curItemData->getModelProperty().pBase);
ui->treeView_sub->setModel(_curItemData->getModelProperty().pSelect);
ui->treeView_sub->expandAll();
ui->treeView_base->expandAll();
loadPicture();
2025-07-04 18:47:49 +08:00
if(!_curItemData->getModelProperty().modelSetting.mapSvg.isEmpty())
setSelectedItems(_curItemData->getModelProperty().modelSetting.mapSvg.keys());
//showTestPic(_curItemData->getModelProperty().modelSetting.mapSvg.first());
2025-06-27 19:17:04 +08:00
}
}
2025-06-20 18:09:41 +08:00
2025-06-27 19:17:04 +08:00
void ProjectModelSetting::showTestPic(QByteArray arr)
{
QSvgRenderer renderer(arr);
bool a = renderer.isValid();
qreal dipScale = qApp->devicePixelRatio();
QSize scaledSize = ui->modelImagePreview->size() * dipScale;
//创建透明背景的高分辨率图像
QImage image(scaledSize, QImage::Format_A2BGR30_Premultiplied);
image.fill(Qt::transparent);
//高质量渲染设置
QPainter painter(&image);
painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform | QPainter::TextAntialiasing);
//渲染到目标对象
renderer.render(&painter, QRect(0, 0, scaledSize.width(), scaledSize.height()));
//转换为像素图
QPixmap pixmap = QPixmap::fromImage(image);
pixmap.setDevicePixelRatio(dipScale);
//显示图片
ui->modelImagePreview->clear();
ui->modelImagePreview->setPixmap(pixmap);
2025-06-20 18:09:41 +08:00
}
2025-07-23 17:27:35 +08:00
void ProjectModelSetting::loadModel(const QString& text)
{
if(text.isEmpty())
return;
if(_curItemData)
{
_curItemData->getModelProperty().release();
PropertyModel model = ProjectModelManager::instance().getData()[_curItemData->metaModelName()][text].deepCopy();
_curItemData->setModelProperty(model);
ui->treeView_base->setModel(_curItemData->getModelProperty().pBase);
ui->treeView_sub->setModel(_curItemData->getModelProperty().pSelect);
ui->treeView_sub->expandAll();
ui->treeView_base->expandAll();
loadPicture();
if(!_curItemData->getModelProperty().modelSetting.mapSvg.isEmpty())
setSelectedItems(_curItemData->getModelProperty().modelSetting.mapSvg.keys());
}
}