Bladeren bron

更新容器子界面的数据存储ui显示数据合法性判断等一系列逻辑;添加状态配置的数据存储并更新UI与数据的关联

Menglan_Luo 2 jaren geleden
bovenliggende
commit
90aa992ae7
5 gewijzigde bestanden met toevoegingen van 416 en 48 verwijderingen
  1. 30 0
      elemPropertyData.cpp
  2. 24 2
      elemPropertyData.h
  3. 323 33
      mainwindow.cpp
  4. 24 1
      mainwindow.h
  5. 15 12
      mainwindow.ui

+ 30 - 0
elemPropertyData.cpp

@@ -6,3 +6,33 @@ ElemPropertyData::ElemPropertyData()
     iconPath = "/Users/menglanluo/菜狗.png";
     dropConfig = 0;
 }
+
+bool ElemPropertyData::isSingleContainerKey(QString poolKey,QString newKey)
+{
+    for(const auto &i:container[poolKey].table){
+        if(newKey == i.key){
+            return false;
+        }
+    }
+    return true;
+}
+
+bool ElemPropertyData::isSingleChildElemName(QString newName)
+{
+    for(const auto &i:childElem){
+        if(newName == i.name){
+            return false;
+        }
+    }
+    return true;
+}
+
+bool ElemPropertyData::isSingleAnimName(QString newName)
+{
+    for(const auto &i:statusEffect){
+        if(newName == i.name){
+            return false;
+        }
+    }
+    return true;
+}

+ 24 - 2
elemPropertyData.h

@@ -21,7 +21,7 @@ public:
         QString name;
         QString res;
         QString timeline;
-        int zOrder;
+        QString zOrder;
     };
     QVector<StatusEffect> statusEffect;
 
@@ -35,6 +35,25 @@ public:
     QMap<QString,CollAnim> collAnim;
 
     // 状态配置
+    struct EventConfig{
+        QString name;
+        bool consisColor;
+        int changeMagnitude;
+        QString specialEffect;
+        bool elimATLattices;
+        QString triggerAction;
+    };
+    struct StatusConfig{
+        QString initAnim;
+        QString clickAnim;
+        bool multiHit;
+        bool dropable;
+        bool needCollect;
+        QString collTargetType;
+        QString collAnim;
+        QVector<EventConfig> eventConfig;
+    };
+    QMap<QString,StatusConfig> statusConfig;
 
     // 容器
     struct ContainTable{
@@ -49,7 +68,7 @@ public:
 
     struct ContainerConfig{
         QString type;
-        ContainTable table;
+        QVector<ContainTable> table;
     };
     QMap<QString,ContainerConfig> container;
     struct ChildElem{
@@ -57,6 +76,9 @@ public:
         QString container;
     };
     QVector<ChildElem> childElem;
+    bool isSingleContainerKey(QString poolKey,QString newKey);
+    bool isSingleChildElemName(QString newName);
+    bool isSingleAnimName(QString newName);
 };
 
 #endif // ELEMPROPERTYDATA_H

+ 323 - 33
mainwindow.cpp

@@ -26,6 +26,8 @@ MainWindow::MainWindow(QWidget *parent)
     ui->label_pic->setPixmap(pix.scaled(50,50,Qt::KeepAspectRatio));
     this->setAcceptDrops(true);
     ui->tableWidget_animation->setHorizontalHeaderLabels({"名称","资源","时间线","z-Order"});
+    ui->tableWidget_containerPool->setHorizontalHeaderLabels({"键值","资源名","初始时间线","点击时间线","影响时间线","消失时间线","消失z-Order"});
+    ui->tableWidget_childElem->setHorizontalHeaderLabels({"名称","使用的池子"});
     ui->tabWidget->setCurrentIndex(0);
 }
 
@@ -37,6 +39,7 @@ MainWindow::~MainWindow()
 //TODO: 设置ui所有数据
 void MainWindow::setUi(ElemPropertyData *elem)
 {
+    //基础元素区域的设置
     QPixmap pix(elem->iconPath);
     ui->label_pic->setPixmap(pix.scaled(50,50,Qt::KeepAspectRatio));
     ui->lineEdit_name->setText(elem->labelName);
@@ -44,12 +47,13 @@ void MainWindow::setUi(ElemPropertyData *elem)
     ui->lineEdit_maxlayer->setText(elem->maxLayer);
     ui->lineEdit_score->setText(elem->score);
     ui->spinBox_drop->setValue(elem->dropConfig);
+
     //设置状态与效果动画表格显示
     int rowCnt = ui->tableWidget_animation->rowCount();
     for(int i=0;i<rowCnt;i++){
         ui->tableWidget_animation->removeRow(0);
     }
-    for(const auto &i:elements[ui->listWidget_elem->currentItem()->text()]->statusEffect){
+    for(const auto &i:elem->statusEffect){
         int rowNum = ui->tableWidget_animation->rowCount();
         ui->tableWidget_animation->insertRow(rowNum);
         ui->tableWidget_animation->setItem(rowNum,0,new QTableWidgetItem(i.name));
@@ -59,8 +63,9 @@ void MainWindow::setUi(ElemPropertyData *elem)
         res->setFlags(res->flags() & ~Qt::ItemIsEditable);
         ui->tableWidget_animation->setItem(rowNum,1,res);
         ui->tableWidget_animation->setCellWidget(rowNum,2,new QComboBox);
-        ui->tableWidget_animation->setItem(rowNum,3,new QTableWidgetItem(QString::number(i.zOrder)));
+        ui->tableWidget_animation->setItem(rowNum,3,new QTableWidgetItem(i.zOrder));
     }
+
     //设置收集动画的显示并聚焦到收集动画列表的最后一个元素
     ui->listWidget_collectAnim->clear();
     ui->listWidget_collectAnim->addItems(elem->collAnim.keys());
@@ -77,6 +82,31 @@ void MainWindow::setUi(ElemPropertyData *elem)
         ui->comboBox_initAnim->addItem(i.name);
     }
     ui->comboBox_collectAnimation->addItems(elem->collAnim.keys());
+
+    //设置容器池界面
+    ui->listWidget_pool->clear();
+    ui->listWidget_pool->addItems(elem->container.keys());
+    //切换元素时容器尚未选中,先清除表格内容
+    int rowNum = ui->tableWidget_containerPool->rowCount();
+    for(int i=0;i<rowNum;i++){
+        ui->tableWidget_containerPool->removeRow(0);
+    }
+
+    //设置子元素界面
+    rowCnt = ui->tableWidget_childElem->rowCount();
+    for(int i=0;i<rowCnt;i++){
+        ui->tableWidget_childElem->removeRow(0);
+    }
+    for(const auto &i:elem->childElem){
+        int rowNum = ui->tableWidget_childElem->rowCount();
+        ui->tableWidget_childElem->insertRow(rowNum);
+        ui->tableWidget_childElem->setItem(rowNum,0,new QTableWidgetItem(i.name));
+        //TODO: 根据记载的comboBox数据设置当前选中项
+        QComboBox* containers = new QComboBox;
+        containers->addItems(elem->container.keys());
+        containers->setCurrentIndex(0);
+        ui->tableWidget_childElem->setCellWidget(rowNum,1,containers);
+    }
 }
 
 void MainWindow::on_pushButton_chooseFile_clicked()
@@ -189,14 +219,6 @@ void MainWindow::on_listWidget_elem_currentItemChanged(QListWidgetItem *current,
    setUi(elements[current->text()]);
 }
 
-bool MainWindow::isSingleAnimName(const QVector<ElemPropertyData::StatusEffect> &statusEffect,QString name){
-    for(const auto &i:statusEffect){
-        if(name == i.name)
-            return false;
-    }
-    return true;
-}
-
 //替换资源文件
 void MainWindow::on_tableWidget_animation_cellDoubleClicked(int row, int column)
 {
@@ -229,7 +251,7 @@ void MainWindow::on_pushButton_addAnimation_clicked()
     QString animName = "anim";
     int id = 1;
     while(1){
-        if(isSingleAnimName(elem->statusEffect,animName)){
+        if(elem->isSingleAnimName(animName)){
             break;
         }
         animName = "anim" + QString::number(id++);
@@ -241,21 +263,23 @@ void MainWindow::on_pushButton_addAnimation_clicked()
     ui->tableWidget_animation->setItem(rowNum,1,res);
     ui->tableWidget_animation->setCellWidget(rowNum,2,new QComboBox);
     ui->tableWidget_animation->setItem(rowNum,3,new QTableWidgetItem("0"));
-    elem->statusEffect.push_back({animName,"","",0});
+    elem->statusEffect.push_back({animName,"","","0"});
 }
 
 
 void MainWindow::on_pushButton_delAnimation_clicked()
 {
-    if(ui->tableWidget_animation->currentRow() == -1) return;
+    if(ui->listWidget_elem->currentItem() == nullptr || ui->tableWidget_animation->currentRow() == -1) return;
     QMessageBox::StandardButton reply = QMessageBox::question(this,"删除动画","确定要删除此动画吗?");
     if(reply == QMessageBox::Yes){
         int curRow = ui->tableWidget_animation->currentRow();
         QString animName = ui->tableWidget_animation->item(curRow,0)->text();
         QVector<ElemPropertyData::StatusEffect> &animVec = elements[ui->listWidget_elem->currentItem()->text()]->statusEffect;
         for(int i=0;i<animVec.size();i++){
-            if(animName == animVec[i].name)
+            if(animName == animVec[i].name){
                 animVec.remove(i);
+                break;
+            }
         }
         ui->tableWidget_animation->removeRow(curRow);
     }
@@ -267,10 +291,11 @@ void MainWindow::on_tableWidget_animation_itemChanged(QTableWidgetItem *item)
     animTableItemChanged = false;
     int column = item->column();
     int row = item->row();
-    QVector<ElemPropertyData::StatusEffect> &animVec = elements[ui->listWidget_elem->currentItem()->text()]->statusEffect;
+    ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
+    QVector<ElemPropertyData::StatusEffect> &animVec = elem->statusEffect;
     if(column == 0){
         QString newName = ui->tableWidget_animation->item(row,0)->text();
-        if(!isSingleAnimName(animVec,newName)){
+        if(!elem->isSingleAnimName(newName)){
             QMessageBox::critical(this,"警告","该动画名已存在!");
             ui->tableWidget_animation->item(row,0)->setText(animVec[row].name);
             return;
@@ -291,11 +316,11 @@ void MainWindow::on_tableWidget_animation_itemChanged(QTableWidgetItem *item)
         int zOrder = ui->tableWidget_animation->item(row,3)->text().toInt();
         if(zOrder<0 || zOrder>100000){
             QMessageBox::critical(this,"警告","z-Order值超出范围!");
-            ui->tableWidget_animation->item(row,3)->setText(QString::number(animVec[row].zOrder));
+            ui->tableWidget_animation->item(row,3)->setText(animVec[row].zOrder);
             return;
         }
         std::cout<<"z-Order值发生改变,新值为:"<<zOrder<<std::endl;
-        animVec[row].zOrder = zOrder;
+        animVec[row].zOrder = item->text();
     }
 }
 
@@ -398,24 +423,33 @@ void MainWindow::on_listWidget_collectAnim_currentItemChanged(QListWidgetItem *c
     }
 }
 
-//TODO: 生成模板时更新状态配置的数据,怎么米有反应。。。
+//生成模板并更新状态配置的数据
 void MainWindow::on_pushButton_genTemp_clicked()
 {
     if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_status->count() > 0) return;
-    for(int i=0;i<elements[ui->listWidget_elem->currentItem()->text()]->maxLayer.toInt();i++){
+    ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
+    for(int i=0;i<elem->maxLayer.toInt();i++){
         ui->listWidget_status->addItem(QString::number(i));
+        elem->statusConfig[QString::number(i)];
     }
 }
 
 //TODO: 生成一个合法的状态值并修改数据
 void MainWindow::on_pushButton_addStatus_clicked()
 {
-    //TODO: 检查状态值合法性
     if(ui->listWidget_elem->currentItem() == nullptr) return;
-//    for(int i=0;i<elements[ui->listWidget_elem->currentItem()->text()]->maxLayer.toInt();i++){
-//        ui->listWidget_status->addItem(QString::number(i));
-//    }
-    ui->listWidget_status->addItem("3");
+    ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
+    QString statusName;
+    for(int i=0;i<elem->maxLayer.toInt();i++){
+        if(elem->statusConfig.find(QString::number(i)) == elem->statusConfig.end()){
+            statusName = QString::number(i);
+            break;
+        }
+    }
+    if(!statusName.isEmpty()){
+        ui->listWidget_status->addItem(statusName);
+        elem->statusConfig[statusName];
+    }
 }
 
 //TODO: 删除状态值对应的数据
@@ -423,40 +457,72 @@ void MainWindow::on_pushButton_delStatus_clicked()
 {
     if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_status->currentItem() == nullptr) return;
     QMessageBox::StandardButton reply = QMessageBox::question(this,"删除状态","确定要删除此状态吗?");
+    ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
     if(reply == QMessageBox::Yes){
+        elem->statusConfig.remove(ui->listWidget_status->currentItem()->text());
         delete ui->listWidget_status->takeItem(ui->listWidget_status->currentRow());
     }
 }
 
+//修改状态值,检查修改后的状态值是否合法,并转移数据
 void MainWindow::on_listWidget_status_itemDoubleClicked(QListWidgetItem *item)
 {
     ChangeNameDialog newName;
     newName.setModal(true);
     newName.exec();
     QString name = newName.getNewName();
+    ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
     if(!name.isEmpty()){
         //TODO: 检查状态值合法性并转移数据
-//        if(1){}
-//        QString elemName = ui->listWidget_elem->currentItem()->text();
-//        ElemPropertyData* newElem = elements[elemName];
-//        elements.erase(elements.find(elemName));
-//        elements[newName.getNewName()] = newElem;
-        item->setText(newName.getNewName());
+        bool isNum;double tmp = name.toDouble(&isNum);
+        int maxlayer = ui->lineEdit_maxlayer->text().toInt();
+        int statusNum = name.toInt();
+        if(!isNum ||statusNum < 0 || statusNum >= maxlayer){
+            QMessageBox::critical(this,"错误","状态值必须是大于等于0且小于最大层数的数字");
+            return;
+        }
+        if(elem->statusConfig.find(name) != elem->statusConfig.end()){
+            QMessageBox::critical(this,"警告","该状态值已存在");
+            return;
+        }
+        ElemPropertyData::StatusConfig data = elem->statusConfig[item->text()];
+        elem->statusConfig.remove(item->text());
+        elem->statusConfig[name] = data;
+        item->setText(name);
     }
 }
 
 
 void MainWindow::on_pushButton_addContainer_clicked()
 {
-    //TODO: 检查名称唯一性
-    ui->listWidget_pool->addItem("pool1");
+    if(ui->listWidget_elem->currentItem() == nullptr) return;
+    QString poolName = "pool";
+    ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
+    int id = 1;
+    while(1){
+        if(elem->container.find(poolName)==elem->container.end()){
+            break;
+        }
+        poolName = "pool" + QString::number(id++);
+    }
+    ui->listWidget_pool->addItem(new QListWidgetItem(poolName));
+    elem->container[poolName];
+    //子元素下拉列表添加可选项
+    int rowNum = ui->tableWidget_childElem->rowCount();
+    for(int i=0;i<rowNum;i++){
+        QComboBox *containers = qobject_cast<QComboBox*>(ui->tableWidget_childElem->cellWidget(i,1));
+        containers->addItem(poolName);
+    }
 }
 
 
 void MainWindow::on_pushButton_delContainer_clicked()
 {
+    if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_pool->currentItem() == nullptr) return;
     QMessageBox::StandardButton reply = QMessageBox::question(this,"删除状态","确定要删除此容器吗?");
     if(reply == QMessageBox::Yes){
+        QString key = ui->listWidget_pool->currentItem()->text();
+        elements[ui->listWidget_elem->currentItem()->text()]->container.remove(key);
         delete ui->listWidget_pool->takeItem(ui->listWidget_pool->currentRow());
     }
 }
@@ -464,16 +530,170 @@ void MainWindow::on_pushButton_delContainer_clicked()
 
 void MainWindow::on_listWidget_pool_itemDoubleClicked(QListWidgetItem *item)
 {
+    if(ui->listWidget_elem->currentItem() == nullptr) return;
     ChangeNameDialog newName;
     newName.setModal(true);
     newName.exec();
     QString name = newName.getNewName();
+    ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
     if(!name.isEmpty()){
         //TODO: 检查新名字唯一性
+        if(elem->container.find(name) != elem->container.end()){
+            QMessageBox::critical(this,"警告","该容器名已存在!");
+            return;
+        }
+        ElemPropertyData::ContainerConfig containerData = elem->container[item->text()];
+        elem->container.remove(item->text());
+        elem->container[name] = containerData;
         item->setText(name);
     }
 }
 
+
+void MainWindow::on_listWidget_pool_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
+{
+    //TODO:保存切换前界面数据
+    if(current != nullptr){
+        setPoolUi(current->text());
+    }
+}
+
+void MainWindow::on_pushButton_addKey_clicked()
+{
+    if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_pool->currentItem() == nullptr) return;
+    int rowNum = ui->tableWidget_containerPool->rowCount();
+    ui->tableWidget_containerPool->insertRow(rowNum);
+    QString keyName = "0";
+    ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
+    int id = 1;
+    while(1){
+        if(elem->isSingleContainerKey(ui->listWidget_pool->currentItem()->text(),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,new QComboBox);
+    }
+    ui->tableWidget_containerPool->setItem(rowNum,3,new QTableWidgetItem("0"));
+    elem->container[ui->listWidget_pool->currentItem()->text()].table.push_back({keyName,"","","","","","0"});
+}
+
+
+void MainWindow::on_pushButton_delKey_clicked()
+{
+    if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_pool->currentItem() == nullptr || ui->tableWidget_containerPool->currentRow() == -1) return;
+    QMessageBox::StandardButton reply = QMessageBox::question(this,"删除容器","确定要删除此容器吗?");
+    if(reply == QMessageBox::Yes){
+        int curRow = ui->tableWidget_containerPool->currentRow();
+        QString containerName = ui->tableWidget_containerPool->item(curRow,0)->text();
+        QVector<ElemPropertyData::ContainTable> &containerTable = elements[ui->listWidget_elem->currentItem()->text()]->container[ui->listWidget_pool->currentItem()->text()].table;
+        for(int i=0;i<containerTable.size();i++){
+            if(containerName == containerTable[i].key){
+                containerTable.remove(i);
+                break;
+            }
+        }
+        ui->tableWidget_containerPool->removeRow(curRow);
+    }
+}
+
+void MainWindow::setPoolUi(QString poolName)
+{
+    if(ui->listWidget_elem->currentItem() == nullptr) return;
+    ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
+    ElemPropertyData::ContainerConfig poolData = elem->container[poolName];
+    int rowNum = ui->tableWidget_containerPool->rowCount();
+    for(int i=0;i<rowNum;i++){
+        ui->tableWidget_containerPool->removeRow(0);
+    }
+    //TODO: 设置comboBox选项
+
+    int rowCnt = ui->tableWidget_containerPool->rowCount();
+    for(int i=0;i<rowCnt;i++){
+        ui->tableWidget_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));
+        //TODO: 资源和时间线所在单元格替换数据
+        QTableWidgetItem* res = new QTableWidgetItem("双击添加资源文件");
+        // 此单元格不可编辑
+        res->setFlags(res->flags() & ~Qt::ItemIsEditable);
+        ui->tableWidget_containerPool->setItem(rowNum,1,res);
+        for(int col=2;col<=5;col++){
+            ui->tableWidget_containerPool->setCellWidget(rowNum,col,new QComboBox);
+        }
+        ui->tableWidget_containerPool->setItem(rowNum,6,new QTableWidgetItem(i.zOrder));
+    }
+}
+
+void MainWindow::on_tableWidget_containerPool_cellDoubleClicked(int row, int column)
+{
+    if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_pool->currentItem() == nullptr) return;
+    //容器表格内容修改flag
+    poolTableItemChanged = true;
+    if(column == 1){
+        ResFileDialog res;
+        res.setModal(true);
+        res.exec();
+        QString fileName = res.getResName();
+        if(!fileName.isEmpty()){
+            //TODO: 加载comboBox,随后文件名去除路径
+            ui->tableWidget_containerPool->setItem(row,column,new QTableWidgetItem(fileName));
+            elements[ui->listWidget_elem->currentItem()->text()]->container[ui->listWidget_pool->currentItem()->text()].table[row].res = fileName;
+//            QComboBox* timeLine = new QComboBox;
+//            timeLine->addItem("lml");
+//            timeLine->addItem("xdf");
+//            timeLine->addItem("cqf");
+//            ui->tableWidget_animation->setCellWidget(row,column+1,timeLine);
+        }
+    }
+}
+
+
+void MainWindow::on_tableWidget_containerPool_itemChanged(QTableWidgetItem *item)
+{
+    if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_pool->currentItem() == nullptr) return;
+    if(!poolTableItemChanged) return;
+    poolTableItemChanged = false;
+    int column = item->column();
+    int row = item->row();
+    QVector<ElemPropertyData::ContainTable> &containerVec = elements[ui->listWidget_elem->currentItem()->text()]->container[ui->listWidget_pool->currentItem()->text()].table;
+    ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
+    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(!elem->isSingleContainerKey(ui->listWidget_pool->currentItem()->text(),item->text())){
+            QMessageBox::critical(this,"警告","该键值已存在!");
+            item->setText(containerVec[row].key);
+            return;
+        }
+        containerVec[row].key = item->text();
+    }
+    //检查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;
+        }
+        containerVec[row].zOrder = zOrder;
+    }
+}
+
 //切换tab时更新comboBox(或者每一次添加删除动画就更新一下该元素的comboBox?这样也更方便进行逻辑检查)
 void MainWindow::on_tabWidget_currentChanged(int index)
 {
@@ -500,4 +720,74 @@ void MainWindow::on_tabWidget_currentChanged(int index)
     }
 }
 
+void MainWindow::on_pushButton_addChildElem_clicked()
+{
+    if(ui->listWidget_elem->currentItem() == nullptr) return;
+    int rowNum = ui->tableWidget_childElem->rowCount();
+    ui->tableWidget_childElem->insertRow(rowNum);
+    QString childElemName = "item";
+    ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
+    int id = 1;
+    while(1){
+        if(elem->isSingleChildElemName(childElemName)){
+            break;
+        }
+        childElemName = "item" + QString::number(id++);
+    }
+    ui->tableWidget_childElem->setItem(rowNum,0,new QTableWidgetItem(childElemName));
+    QComboBox* containers = new QComboBox;
+    containers->addItems(elem->container.keys());
+    ui->tableWidget_childElem->setCellWidget(rowNum,1,containers);
+    elem->childElem.push_back({childElemName,""});
+}
+
+void MainWindow::on_pushButton_delChildElem_clicked()
+{
+    if(ui->listWidget_elem->currentItem() == nullptr || ui->tableWidget_childElem->currentRow() == -1) return;
+    QMessageBox::StandardButton reply = QMessageBox::question(this,"删除子元素","确定要删除此子元素吗?");
+    if(reply == QMessageBox::Yes){
+        int curRow = ui->tableWidget_childElem->currentRow();
+        QString childElemName = ui->tableWidget_childElem->item(curRow,0)->text();
+        QVector<ElemPropertyData::ChildElem> &childElemVec = elements[ui->listWidget_elem->currentItem()->text()]->childElem;
+        for(int i=0;i<childElemVec.size();i++){
+            if(childElemName == childElemVec[i].name){
+                childElemVec.remove(i);
+                break;
+            }
+        }
+        ui->tableWidget_childElem->removeRow(curRow);
+    }
+}
+
+
+void MainWindow::on_tableWidget_childElem_itemChanged(QTableWidgetItem *item)
+{
+    if(ui->listWidget_elem->currentItem() == nullptr) return;
+    if(!childElemTableItemChanged) return;
+    childElemTableItemChanged = false;
+    int column = item->column();
+    int row = item->row();
+    ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
+    QVector<ElemPropertyData::ChildElem> &childElemVec = elem->childElem;
+    if(column == 0){
+        if(!elem->isSingleChildElemName(item->text())){
+            QMessageBox::critical(this,"警告","该子元素名已存在!");
+            item->setText(childElemVec[row].name);
+            return;
+        }
+        childElemVec[row].name = item->text();
+    }
+    //TODO: comboBox值修改后的保存
+}
+
+
+void MainWindow::on_tableWidget_childElem_cellDoubleClicked(int row, int column)
+{
+    if(ui->listWidget_elem->currentItem() == nullptr) return;
+    //子元素表格双击改名置flag为true
+    childElemTableItemChanged = true;
+}
+
+
+
 

+ 24 - 1
mainwindow.h

@@ -80,13 +80,36 @@ private slots:
 
     void on_listWidget_status_itemDoubleClicked(QListWidgetItem *item);
 
+    void on_tableWidget_containerPool_cellDoubleClicked(int row, int column);
+
+    void on_tableWidget_containerPool_itemChanged(QTableWidgetItem *item);
+
+    void on_pushButton_addKey_clicked();
+
+    void on_pushButton_delKey_clicked();
+
+    void on_listWidget_pool_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous);
+
+    void on_pushButton_addChildElem_clicked();
+
+    void on_pushButton_delChildElem_clicked();
+
+    void on_tableWidget_childElem_itemChanged(QTableWidgetItem *item);
+
+    void on_tableWidget_childElem_cellDoubleClicked(int row, int column);
+
 private:
     Ui::MainWindow *ui;
     QMap<QString,ElemPropertyData*> elements;
     void setUi(ElemPropertyData* elem);
-    bool isSingleAnimName(const QVector<ElemPropertyData::StatusEffect> &statusEffect,QString name);
     //防止双击修改以外的表格修改操作反复触发itemChanged信号
+    //动画表格
     bool animTableItemChanged = false;
+    //容器表格
+    bool poolTableItemChanged = false;
+    //子元素表格
+    bool childElemTableItemChanged = false;
     void setCollectAnimUi(QString collectAnimName);
+    void setPoolUi(QString poolName);
 };
 #endif // MAINWINDOW_H

+ 15 - 12
mainwindow.ui

@@ -187,7 +187,7 @@
            <enum>QTabWidget::Triangular</enum>
           </property>
           <property name="currentIndex">
-           <number>2</number>
+           <number>3</number>
           </property>
           <property name="elideMode">
            <enum>Qt::ElideRight</enum>
@@ -626,7 +626,7 @@
            <attribute name="title">
             <string>容器</string>
            </attribute>
-           <widget class="QTableWidget" name="tableWidget_container">
+           <widget class="QTableWidget" name="tableWidget_childElem">
             <property name="geometry">
              <rect>
               <x>10</x>
@@ -635,6 +635,11 @@
               <height>192</height>
              </rect>
             </property>
+            <property name="columnCount">
+             <number>2</number>
+            </property>
+            <column/>
+            <column/>
            </widget>
            <widget class="QListWidget" name="listWidget_pool">
             <property name="geometry">
@@ -677,18 +682,16 @@
              <rect>
               <x>222</x>
               <y>64</y>
-              <width>256</width>
-              <height>192</height>
+              <width>451</width>
+              <height>181</height>
              </rect>
             </property>
             <property name="rowCount">
-             <number>2</number>
+             <number>0</number>
             </property>
             <property name="columnCount">
              <number>7</number>
             </property>
-            <row/>
-            <row/>
             <column/>
             <column/>
             <column/>
@@ -735,8 +738,8 @@
            <widget class="QPushButton" name="pushButton_delKey">
             <property name="geometry">
              <rect>
-              <x>550</x>
-              <y>130</y>
+              <x>680</x>
+              <y>110</y>
               <width>91</width>
               <height>31</height>
              </rect>
@@ -748,8 +751,8 @@
            <widget class="QPushButton" name="pushButton_addKey">
             <property name="geometry">
              <rect>
-              <x>550</x>
-              <y>80</y>
+              <x>680</x>
+              <y>60</y>
               <width>91</width>
               <height>31</height>
              </rect>
@@ -771,7 +774,7 @@
              <string>添加</string>
             </property>
            </widget>
-           <widget class="QPushButton" name="pushButton_del">
+           <widget class="QPushButton" name="pushButton_delChildElem">
             <property name="geometry">
              <rect>
               <x>290</x>