#include "pool.h" #include "ui_pool.h" #include "datahpp/dataManager.h" #include "changenamedialog.h" #include "resfiledialog.h" #include #include Pool::Pool(QWidget *parent) : QWidget(parent), ui(new Ui::Pool) { ui->setupUi(this); ui->tableWidget_containerPool->setHorizontalHeaderLabels({"键值","资源名","初始时间线","点击时间线","影响时间线","消失时间线","消失z-Order","消失音效"}); ui->tableWidget_childElem->setHorizontalHeaderLabels({"名称","使用的池子"}); updateTempRelated(); } Pool::~Pool() { delete ui; } ///创建普通下拉选项 QComboBox* Pool::createBox(QString choice,QStringList list) { QComboBox* box = new QComboBox; box->addItem("尚未选择"); box->addItems(list); int index = box->findText(choice); if(index == -1) index = 0; box->setCurrentIndex(index); return box; } ///创建一个时间线下拉选项 QComboBox* Pool::createTimelineBox(QString chosenTimeline,QString fileName) { //这里会导致如果没有选择任何时间线,切换之后时间线列表为空 QComboBox* timeLine = new QComboBox; if(fileName == "双击添加资源文件") return timeLine; QStringList list = DataManager::getInstance()->getTimelineList(currentElem,fileName); timeLine = createBox(chosenTimeline,list); connect(timeLine,SIGNAL(currentTextChanged(QString)),this,SLOT(onPoolTimelineTextChanged(QString))); return timeLine; } ///创建一个使用池子下拉选项 QComboBox* Pool::createPoolBox(QString chosenPool) { QComboBox* pools = createBox(chosenPool,DataManager::getInstance()->getList(currentElem,DataManager::ListType::Pool)); connect(pools,SIGNAL(currentTextChanged(QString)),this,SLOT(onPoolsTextChanged(QString))); return pools; } void Pool::setUi(QString elem) { isSetUi = true; currentElem = elem; //设置容器池 ui->listWidget_pool->clear(); ui->listWidget_pool->addItems(DataManager::getInstance()->getList(elem,DataManager::ListType::Pool)); //切换元素时容器尚未选中,先清除表格内容和类型选项内容 ui->comboBox_container->setCurrentIndex(0); int rowNum = ui->tableWidget_containerPool->rowCount(); for(int i=0;itableWidget_containerPool->removeRow(0); } //设置子元素界面 int rowCnt = ui->tableWidget_childElem->rowCount(); for(int i=0;itableWidget_childElem->removeRow(0); } for(const auto &i:DataManager::getInstance()->getChildElemTable(elem)){ int rowNum = ui->tableWidget_childElem->rowCount(); ui->tableWidget_childElem->insertRow(rowNum); ui->tableWidget_childElem->setItem(rowNum,0,new QTableWidgetItem(i.name)); ui->tableWidget_childElem->setCellWidget(rowNum,1,createPoolBox(i.container)); } setPoolUi(); isSetUi = false; } void Pool::setPoolUi() { int index = ui->listWidget_pool->currentRow(); if(index == -1) return; isSetUi = true; ElemPropertyData::ContainerConfig poolData = DataManager::getInstance()->getContainData(currentElem,index); int contIndex = ui->comboBox_container->findText(poolData.type); if(contIndex == -1){ contIndex=0; DataManager::getInstance()->changeContainType(currentElem,index,"尚未选择"); } ui->comboBox_container->setCurrentIndex(contIndex); int rowNum = ui->tableWidget_containerPool->rowCount(); for(int i=0;itableWidget_containerPool->removeRow(0); } for(const auto &i:poolData.table){ int rowNum = ui->tableWidget_containerPool->rowCount(); ui->tableWidget_containerPool->insertRow(rowNum); ui->tableWidget_containerPool->setItem(rowNum,0,new QTableWidgetItem(i.key)); QTableWidgetItem* res = new QTableWidgetItem(DataManager::getFileName(i.res)); // 此单元格不可编辑 res->setFlags(res->flags() & ~Qt::ItemIsEditable); ui->tableWidget_containerPool->setItem(rowNum,1,res); ui->tableWidget_containerPool->setCellWidget(rowNum,2,createTimelineBox(i.initTimeline,i.res)); ui->tableWidget_containerPool->setCellWidget(rowNum,3,createTimelineBox(i.clickTimeline,i.res)); ui->tableWidget_containerPool->setCellWidget(rowNum,4,createTimelineBox(i.effectTimeline,i.res)); ui->tableWidget_containerPool->setCellWidget(rowNum,5,createTimelineBox(i.vanishTimeline,i.res)); ui->tableWidget_containerPool->setItem(rowNum,6,new QTableWidgetItem(i.zOrder)); ui->tableWidget_containerPool->setItem(rowNum,7,new QTableWidgetItem(i.audio)); } isSetUi = false; } ///容器池区时间线数据发生改变 void Pool::onPoolTimelineTextChanged(const QString &arg1) { int poolIndex = ui->listWidget_pool->currentRow(); if(poolIndex == -1) return; //获取时间线列表所在位置 std::cout<<"current timeline is:"<(this->sender()); int x = timeline->frameGeometry().x(); int y = timeline->frameGeometry().y(); QModelIndex index = ui->tableWidget_containerPool->indexAt(QPoint(x,y)); int row = index.row(); int column = index.column(); //修改数据 DataManager::getInstance()->changeContainTable(currentElem,poolIndex,row,column,timeline->currentText()); } ///子元素使用池子数据发生改变 void Pool::onPoolsTextChanged(const QString &arg1) { //获取池子列表所在位置 QComboBox *pools = dynamic_cast(this->sender()); int x = pools->frameGeometry().x(); int y = pools->frameGeometry().y(); QModelIndex index = ui->tableWidget_childElem->indexAt(QPoint(x,y)); int row = index.row(); int column = index.column(); //修改数据 DataManager::getInstance()->changeChildElemTable(currentElem,row,column,arg1); } ///添加容器池 void Pool::on_pushButton_addContainer_clicked() { QString poolName = "pool"; int id = 1; while(1){ if(!DataManager::getInstance()->existPool(currentElem,poolName)){ break; } poolName = "pool" + QString::number(id++); } ui->listWidget_pool->addItem(new QListWidgetItem(poolName)); DataManager::getInstance()->addPool(currentElem,poolName); //子元素下拉列表添加可选项 int rowNum = ui->tableWidget_childElem->rowCount(); for(int i=0;i(ui->tableWidget_childElem->cellWidget(i,1)); containers->addItem(poolName); } } ///删除容器池 void Pool::on_pushButton_delContainer_clicked() { int index = ui->listWidget_pool->currentRow(); if(index == -1) return; QMessageBox::StandardButton reply = QMessageBox::question(this,"删除容器","确定要删除此容器吗?"); if(reply == QMessageBox::Yes){ QString delPoolName = ui->listWidget_pool->currentItem()->text(); delete ui->listWidget_pool->takeItem(index); DataManager::getInstance()->delPool(currentElem,index); //子元素下拉列表删除可选项 QVector childTable = DataManager::getInstance()->getChildElemTable(currentElem); int rowNum = ui->tableWidget_childElem->rowCount(); for(int i=0;i(ui->tableWidget_childElem->cellWidget(i,1)); //之前选中的池子被删除了 if(childTable[i].container == delPoolName){ containers->setCurrentIndex(0); DataManager::getInstance()->changeChildElemTable(currentElem,i,1,"尚未选择"); } containers->removeItem(containers->findText(delPoolName)); } } } ///修改容器池名字 void Pool::on_listWidget_pool_itemDoubleClicked(QListWidgetItem *item) { int index = ui->listWidget_pool->currentRow(); if(index == -1) return; ChangeNameDialog newName; newName.setModal(true); newName.exec(); QString name = newName.getNewName(); if(!name.isEmpty()){ //TODO: 检查新名字唯一性 if(DataManager::getInstance()->existPool(currentElem,name)){ QMessageBox::critical(this,"警告","该容器名已存在!"); return; } //子元素下拉列表可选项改名 QVector childTable = DataManager::getInstance()->getChildElemTable(currentElem); int rowNum = ui->tableWidget_childElem->rowCount(); for(int i=0;i(ui->tableWidget_childElem->cellWidget(i,1)); //子元素选中的池子即将被改名 if(childTable[i].container == item->text()){ containers->setCurrentIndex(0); DataManager::getInstance()->changeChildElemTable(currentElem,i,1,"尚未选择"); } containers->removeItem(containers->findText(item->text())); containers->addItem(name); } DataManager::getInstance()->changePoolName(currentElem,index,name); item->setText(name); } } ///选中的容器池发生改变 void Pool::on_listWidget_pool_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous) { if(current != nullptr){ setPoolUi(); } } ///容器池表格添加一个键 void Pool::on_pushButton_addKey_clicked() { int poolIndex = ui->listWidget_pool->currentRow(); if(poolIndex == -1) return; int rowNum = ui->tableWidget_containerPool->rowCount(); ui->tableWidget_containerPool->insertRow(rowNum); QString keyName = "0"; int id = 1; while(1){ if(!(DataManager::getInstance()->existKey(currentElem,poolIndex,keyName))){ break; } keyName = QString::number(id++); } ui->tableWidget_containerPool->setItem(rowNum,0,new QTableWidgetItem(keyName)); QTableWidgetItem* res = new QTableWidgetItem("双击添加资源文件"); // 此单元格不可编辑 res->setFlags(res->flags() & ~Qt::ItemIsEditable); ui->tableWidget_containerPool->setItem(rowNum,1,res); for(int i=2;i<=5;i++){ ui->tableWidget_containerPool->setCellWidget(rowNum,i,createBox("尚未选择",{})); } ui->tableWidget_containerPool->setItem(rowNum,6,new QTableWidgetItem("0")); DataManager::getInstance()->addKey(currentElem,poolIndex,keyName); } ///容器池表格删除一个键 void Pool::on_pushButton_delKey_clicked() { int poolIndex = ui->listWidget_pool->currentRow(); int row = ui->tableWidget_containerPool->currentRow(); if(poolIndex == -1 || row == -1) return; QMessageBox::StandardButton reply = QMessageBox::question(this,"删除键值","确定要删除此键值吗?"); if(reply == QMessageBox::Yes){ ui->tableWidget_containerPool->removeRow(row); DataManager::getInstance()->delKey(currentElem,poolIndex,row); } } ///容器池表格添加资源文件 void Pool::on_tableWidget_containerPool_cellDoubleClicked(int row, int column) { int poolIndex = ui->listWidget_pool->currentRow(); if(poolIndex == -1) return; //容器表格内容修改flag poolTableItemChanged = true; if(column == 1){ ResFileDialog res; res.setModal(true); res.exec(); QString fileName = res.getResName(); if(!fileName.isEmpty()){ ui->tableWidget_containerPool->setItem(row,column,new QTableWidgetItem(DataManager::getFileName(fileName))); DataManager::getInstance()->changeContainTable(currentElem,poolIndex,row,1,fileName); //加载时间线下拉列表 for(int i=2;i<=5;i++){ QComboBox* timeline = createTimelineBox("尚未选择",fileName); ui->tableWidget_containerPool->setCellWidget(row,i,timeline); } } } } ///容器池表格数据修改(键值、zOrder) void Pool::on_tableWidget_containerPool_itemChanged(QTableWidgetItem *item) { int poolIndex = ui->listWidget_pool->currentRow(); if(poolIndex == -1) return; if(!poolTableItemChanged) return; poolTableItemChanged = false; int column = item->column(); int row = item->row(); QVector containerVec = DataManager::getInstance()->getContainData(currentElem,poolIndex).table; if(column == 0){ bool isNum;double tmp = item->text().toDouble(&isNum); if(item->text().toInt() < 0 || !isNum){ QMessageBox::critical(this,"错误","键值必须是大于等于0的数字"); item->setText(containerVec[row].key); return; } if(DataManager::getInstance()->existKey(currentElem,poolIndex,item->text())){ QMessageBox::critical(this,"警告","该键值已存在!"); item->setText(containerVec[row].key); return; } } //检查zOrder合法性 else if(column == 6){ QString zOrder = item->text(); bool isNum;double tmp = zOrder.toDouble(&isNum); if(item->text().toInt() < 0 || !isNum){ QMessageBox::critical(this,"错误","消失zOrder值必须是大于等于0的数字"); item->setText(containerVec[row].zOrder); return; } } DataManager::getInstance()->changeContainTable(currentElem,poolIndex,row,column,item->text()); } ///添加子元素 void Pool::on_pushButton_addChildElem_clicked() { int rowNum = ui->tableWidget_childElem->rowCount(); ui->tableWidget_childElem->insertRow(rowNum); QString childElemName = "item"; int id = 1; while(1){ if(!(DataManager::getInstance()->existChildElem(currentElem,childElemName))){ break; } childElemName = "item" + QString::number(id++); } ui->tableWidget_childElem->setItem(rowNum,0,new QTableWidgetItem(childElemName)); ui->tableWidget_childElem->setCellWidget(rowNum,1,createPoolBox("尚未选择")); DataManager::getInstance()->addChildElem(currentElem,childElemName); } ///删除子元素 void Pool::on_pushButton_delChildElem_clicked() { int row = ui->tableWidget_childElem->currentRow(); if(row == -1) return; QMessageBox::StandardButton reply = QMessageBox::question(this,"删除子元素","确定要删除此子元素吗?"); if(reply == QMessageBox::Yes){ ui->tableWidget_childElem->removeRow(row); DataManager::getInstance()->delChildElem(currentElem,row); } } ///子元素名字修改 void Pool::on_tableWidget_childElem_itemChanged(QTableWidgetItem *item) { if(!childElemTableItemChanged) return; childElemTableItemChanged = false; int column = item->column(); int row = item->row(); QVector childElemVec = DataManager::getInstance()->getChildElemTable(currentElem); if(column == 0){ if(DataManager::getInstance()->existChildElem(currentElem,item->text())){ QMessageBox::critical(this,"警告","该子元素名已存在!"); item->setText(childElemVec[row].name); return; } DataManager::getInstance()->changeChildElemTable(currentElem,row,0,item->text()); } } ///表格双击 void Pool::on_tableWidget_childElem_cellDoubleClicked(int row, int column) { //子元素表格双击改名置flag为true childElemTableItemChanged = true; } ///容器池表格选择的容器类型改变 void Pool::on_comboBox_container_currentTextChanged(const QString &arg1) { int poolIndex = ui->listWidget_pool->currentRow(); if(poolIndex == -1 || isSetUi) return; DataManager::getInstance()->changeContainType(currentElem,poolIndex,arg1); } ///更新模板文件相关数据 void Pool::updateTempRelated() { ui->comboBox_container->clear(); ui->comboBox_container->addItem("尚未选择"); ui->comboBox_container->addItems(DataManager::getInstance()->getList(currentElem,DataManager::ListType::PoolType)); int index = ui->listWidget_pool->currentRow(); if(index != -1){ ElemPropertyData::ContainerConfig poolData = DataManager::getInstance()->getContainData(currentElem,index); int contIndex = ui->comboBox_container->findText(poolData.type); if(contIndex == -1){ contIndex=0; DataManager::getInstance()->changeContainType(currentElem,index,"尚未选择"); } ui->comboBox_container->setCurrentIndex(contIndex); } } void Pool::on_pushButton_copy_clicked() { int poolIndex = ui->listWidget_pool->currentRow(); int keyIndex = ui->tableWidget_containerPool->currentRow(); if(poolIndex == -1 || keyIndex == -1) return; int rowNum = ui->tableWidget_containerPool->rowCount(); ui->tableWidget_containerPool->insertRow(rowNum); QString keyName = "0"; int id = 1; while(1){ if(!(DataManager::getInstance()->existKey(currentElem,poolIndex,keyName))){ break; } keyName = QString::number(id++); } ElemPropertyData::ContainTable copyData = DataManager::getInstance()->getContainData(currentElem,poolIndex).table[keyIndex]; ui->tableWidget_containerPool->setItem(rowNum,0,new QTableWidgetItem(keyName)); QTableWidgetItem* res = new QTableWidgetItem(DataManager::getFileName(copyData.res)); // 此单元格不可编辑 res->setFlags(res->flags() & ~Qt::ItemIsEditable); ui->tableWidget_containerPool->setItem(rowNum,1,res); ui->tableWidget_containerPool->setCellWidget(rowNum,2,createTimelineBox(copyData.initTimeline,copyData.res)); ui->tableWidget_containerPool->setCellWidget(rowNum,3,createTimelineBox(copyData.clickTimeline,copyData.res)); ui->tableWidget_containerPool->setCellWidget(rowNum,4,createTimelineBox(copyData.effectTimeline,copyData.res)); ui->tableWidget_containerPool->setCellWidget(rowNum,5,createTimelineBox(copyData.vanishTimeline,copyData.res)); ui->tableWidget_containerPool->setItem(rowNum,6,new QTableWidgetItem(copyData.zOrder)); ui->tableWidget_containerPool->setItem(rowNum,7,new QTableWidgetItem(copyData.audio)); DataManager::getInstance()->copyKey(currentElem,poolIndex,keyName,keyIndex); }