#include #include #include #include #include #include #include #include "projectModelSetting.h" #include "ui_projectModelSetting.h" #include "baseProperty.h" #include "graphicsItem/graphicsBaseItem.h" #include "graphicsDataModel/fixedPortsModel.h" #include "projectModelManager.h" #include "tools.h" #include "global.h" #include "logger.h" #include "dataBase.h" #include "designerScene.h" ProjectModelSetting::ProjectModelSetting(QWidget *parent) : QDialog(parent) ,ui(new Ui::projectModelSetting) ,_curItemData(nullptr) ,_controller(nullptr) { ui->setupUi(this); this->setWindowFlags(Qt::FramelessWindowHint | windowFlags()); initial(); } ProjectModelSetting::~ProjectModelSetting() { } void ProjectModelSetting::initial() { connect(ui->btn_ok,&QPushButton::clicked,this,&ProjectModelSetting::onOkClicked); connect(ui->btn_cancel,&QPushButton::clicked,this,&ProjectModelSetting::onCancelClicked); //connect(ui->btn_saveAs,&QPushButton::clicked,this,&ProjectModelSetting::onSaveAsClicked); connect(ui->btn_select,&QPushButton::clicked,this,&ProjectModelSetting::onSelectClicked); connect(ui->btn_apply,&QPushButton::clicked,this,&ProjectModelSetting::onAddClicked); connect(ui->btn_revoke,&QPushButton::clicked,this,&ProjectModelSetting::onDecreaseClicked); //connect(ui->le_saveAs,&QLineEdit::editingFinished,this,&ProjectModelSetting::onSaveAsFinished); //connect(ui->cb_modelType,&QComboBox::currentTextChanged,this,&ProjectModelSetting::onCurrentTextChanged); _curPath = QCoreApplication::applicationDirPath()+"/proModelImage/"; //ui->cb_modelType->setPlaceholderText(" "); /*QRegularExpression regExp("[a-zA-Z0-9]+"); QRegularExpressionValidator *validator = new QRegularExpressionValidator(regExp, this); ui->le_saveAs->setValidator(validator);*/ ui->listWidget_icon->setStyleSheet( "QListWidget::item:selected {" " background: #4e72b8;" " color: palette(HighlightedText);" "}" ); } 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;isetData(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 lstItem = ui->listWidget_icon->findItems(lst.first(),Qt::MatchExactly); if(!lstItem.empty()) { ui->listWidget_icon->setCurrentItem(lstItem.first()); }*/ foreach(const QString &name, lst) { QList items = ui->listWidget_icon->findItems(name, Qt::MatchExactly); foreach(QListWidgetItem* item, items) { item->setSelected(true); } } } void ProjectModelSetting::showDlg(GraphicsBaseModelItem* srcNode) { show(); ui->label_infoIcon->clear(); ui->treeView_base->setModel(nullptr); ui->treeView_sub->setModel(nullptr); ModelProperty* p = srcNode->getProperty(); BaseModelProperty* pro = dynamic_cast(p); if(pro) { QString sName = pro->name(); QString sMetaModel = pro->metaModelName(); QString sModel = pro->modelName(); if(sModel.isEmpty()) //模型为空直接判断名字() { sModel = sMetaModel+"_"+_controller->pageName(); pro->setModelName(sModel); } _curItemData = pro; //loadProject(sMetaModel); bool bExist = ProjectModelManager::instance().ifProjectExsit(sModel); if(bExist){ //使用存在的属性 //ui->cb_modelType->setCurrentText(sModel); loadModel(sModel); } 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(); } //ui->le_saveAs->clear(); ui->le_name->setText(sName); ui->le_base->setText(sMetaModel); } loadPicture(); } /*void ProjectModelSetting::loadProject(const QString& sMeta) { 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); }*/ void ProjectModelSetting::onOkClicked() { //_curItemData->setModelName(ui->cb_modelType->currentText()); onSaveClicked(); hide(); } void ProjectModelSetting::onCancelClicked() { hide(); } /*void ProjectModelSetting::onSaveAsClicked() { 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(); }*/ void ProjectModelSetting::onSelectClicked() { QList items = ui->listWidget_icon->selectedItems(); QStringList lst; for(auto& item:items) { if(!_curItemData->getModelProperty().modelSetting.mapSvg.contains(item->text())) { QByteArray data = QByteArray::fromHex(item->data(Qt::UserRole + 1).toByteArray()); _curItemData->getModelProperty().modelSetting.mapSvg.insert(item->text(),data); } lst.append(item->text()); } if(!lst.isEmpty()){ ui->label_infoIcon->setText("当前选择:"+lst.join(",")); } } void ProjectModelSetting::onAddClicked() { 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(); QStandardItem *parentItem = pItem->parent(); if (parentItem) { parentItem->takeRow(pItem->row()); } QList 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(); } void ProjectModelSetting::onDecreaseClicked() { 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 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(); } 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,true); QMap 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,true); QMessageBox::information(NULL, QString("提示"), QString::fromWCharArray(L"保存成功")); } if(_controller){ QMap mapItem = _controller->allBaseItems(); for(auto &item:mapItem) { ModelProperty* p = item->getProperty(); BaseModelProperty* pro = dynamic_cast(p); QString sModel = _curItemData->modelName(); if(pro){ if(pro->metaModelName() == _curItemData->metaModelName()){ //将相同基模item的工程模名称都置为相同(改一个全变) pro->setModelName(sModel); pro->getModelProperty().modelSetting.modelName = sModel; } } } } } } /*void ProjectModelSetting::onSaveAsFinished() { 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"名称可用")); } }*/ void ProjectModelSetting::onCurrentTextChanged(const QString& text) { if(text.isEmpty()) return; if(_curItemData) { _curItemData->getModelProperty().release(); PropertyModel model = ProjectModelManager::instance().getData()[_curItemData->metaModelName()][text].deepCopy(); //PropertyModel model = ProjectModelManager::instance().getData()[_curItemData->metaModelName()][text]; _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()); //showTestPic(_curItemData->getModelProperty().modelSetting.mapSvg.first()); } } 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); } 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()); } }