442 lines
17 KiB
C++
442 lines
17 KiB
C++
#include <QPushButton>
|
|
#include <QMessageBox>
|
|
#include <QCoreApplication>
|
|
#include <QDir>
|
|
#include <QFileInfo>
|
|
#include <QSvgRenderer>
|
|
#include <QPainter>
|
|
#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;i<files.size();i++)
|
|
{
|
|
QString sPath = path+files.at(i);
|
|
QPixmap pixmap(sPath);
|
|
//pixmap.fill(Qt::transparent);
|
|
QListWidgetItem *newitem=new QListWidgetItem(QIcon(pixmap.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());
|
|
}*/
|
|
|
|
foreach(const QString &name, lst) {
|
|
QList<QListWidgetItem*> 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<BaseModelProperty*>(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<QListWidgetItem*> 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<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();
|
|
}
|
|
|
|
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<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();
|
|
}
|
|
|
|
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<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,true);
|
|
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);
|
|
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());
|
|
}
|
|
}
|