Quellcode durchsuchen

状态配置界面的刷新逻辑处理;动画、容器删除改名时关联下拉选项处理;添加配置文件数据处理类

Menglan_Luo vor 2 Jahren
Ursprung
Commit
6b2cef32b1
8 geänderte Dateien mit 456 neuen und 80 gelöschten Zeilen
  1. 2 0
      ConfigurableTool.pro
  2. 7 0
      elemPropertyData.h
  3. 15 1
      main.cpp
  4. 322 77
      mainwindow.cpp
  5. 24 1
      mainwindow.h
  6. 1 1
      mainwindow.ui
  7. 53 0
      readJsonSrc.cpp
  8. 32 0
      readJsonSrc.h

+ 2 - 0
ConfigurableTool.pro

@@ -20,6 +20,7 @@ SOURCES += \
     plistcpp/plistdate.cpp \
     plistcpp/pugixml.cpp \
     plistcpp/redream.cpp \
+    readJsonSrc.cpp \
     resfiledialog.cpp \
     statusconfiguration.cpp
 
@@ -301,6 +302,7 @@ HEADERS += \
     plisthpp/pugiconfig.hpp \
     plisthpp/pugixml.hpp \
     plisthpp/redream.h \
+    readJsonSrc.h \
     resfiledialog.h \
     statusconfiguration.h
 

+ 7 - 0
elemPropertyData.h

@@ -22,6 +22,7 @@ public:
         QString res;
         QString timeline;
         QString zOrder;
+        StatusEffect(QString animName):name(animName),res("双击添加资源文件"){}
     };
     QVector<StatusEffect> statusEffect;
 
@@ -32,6 +33,7 @@ public:
         QString anim;
         QString node;
         QString shadow;
+        CollAnim(QString collAnimName):name(collAnimName){}
     };
     QVector<CollAnim> collAnim;
 
@@ -44,6 +46,7 @@ public:
         QString specialEffect;
         bool elimATLattices;
         QString triggerAction;
+        EventConfig():consisColor(false),changeMagnitude(0),elimATLattices(false) {}
     };
     struct StatusConfig{
         QString statusValue;
@@ -55,6 +58,7 @@ public:
         QString collTargetType;
         QString collAnim;
         QVector<EventConfig> eventConfig;
+        StatusConfig(QString statusVal):statusValue(statusVal),multiHit(false),dropable(false),needCollect(false){}
     };
     QVector<StatusConfig> statusConfig;
 
@@ -67,17 +71,20 @@ public:
         QString effectTimeline;
         QString vanishTimeline;
         QString zOrder;
+        ContainTable(QString keyName):key(keyName),res("双击添加资源文件"){}
     };
 
     struct ContainerConfig{
         QString poolName;
         QString type;
         QVector<ContainTable> table;
+        ContainerConfig(QString pool):poolName(pool){}
     };
     QVector<ContainerConfig> container;
     struct ChildElem{
         QString name;
         QString container;
+        ChildElem(QString childElemName):name(childElemName),container("尚未选择池子"){}
     };
     QVector<ChildElem> childElem;
     bool isSingleContainerKey(QString poolKey,QString newKey);

+ 15 - 1
main.cpp

@@ -1,6 +1,7 @@
 #include "mainwindow.h"
-
+#include "readJsonSrc.h"
 #include <QApplication>
+#include <iostream>
 
 int main(int argc, char *argv[])
 {
@@ -8,4 +9,17 @@ int main(int argc, char *argv[])
     MainWindow w;
     w.show();
     return a.exec();
+    ReadJsonSrc src("/Users/menglanluo/redFiles/action.json");
+//    for(const auto &i:src.collAnimVec){
+//        std::cout<<"name:"<<qPrintable(i.name)<<std::endl;
+//        std::cout<<"id:"<<qPrintable(i.id)<<std::endl;
+//        std::cout<<"fields"<<std::endl;
+//        for(const auto &j:i.fields){
+//            std::cout<<"field name:"<<qPrintable(j.name)<<std::endl;
+//            std::cout<<"field id:"<<qPrintable(j.id)<<std::endl;
+//            std::cout<<"field type:"<<qPrintable(j.type)<<std::endl;
+//            std::cout<<"field src:"<<qPrintable(j.src)<<std::endl;
+//            std::cout<<"field default:"<<qPrintable(j.defaultVal)<<std::endl;
+//        }
+//    }
 }

+ 322 - 77
mainwindow.cpp

@@ -31,9 +31,6 @@ MainWindow::MainWindow(QWidget *parent)
     ui->tableWidget_event->setHorizontalHeaderLabels({"事件名称","是否需要颜色一致","状态变化幅度","特效","根据格子数量消除","触发动作"});
     ui->tabWidget->setCurrentIndex(0);
     ui->lineEdit_collectionType->setReadOnly(true);
-    ui->comboBox_initAnim->addItem("尚未选择动画");
-    ui->comboBox_clickAnim->addItem("尚未选择动画");
-    ui->comboBox_collectAnimation->addItem("尚未选择动画");
 }
 
 MainWindow::~MainWindow()
@@ -46,7 +43,7 @@ QComboBox* MainWindow::createTimelineBox(QString chosenTimeline,QString fileName
 {
     ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
     QComboBox* timeLine = new QComboBox;
-//    timeLine->addItem("尚未选择资源");
+    if(fileName == "双击添加资源文件") return timeLine;
     timeLine->addItems(elem->getTimelineList(fileName));
     int index;
     if(chosenTimeline.isEmpty()) index = -1;
@@ -78,10 +75,85 @@ QComboBox* MainWindow::createPoolBox(QString chosenPool)
     return pools;
 }
 
+///创建一个checkBox
+QCheckBox* MainWindow::createCheckBox(bool chosen)
+{
+    QCheckBox* check = new QCheckBox;
+    if(chosen) check->setCheckState(Qt::Checked);
+    else check->setCheckState(Qt::Unchecked);
+    connect(check,SIGNAL(stateChanged(int)),this,SLOT(onCheckBoxStateChanged(int)));
+    return check;
+}
+
+///创建一个特效下拉选项
+QComboBox* MainWindow::createEffectBox(QString chosenEffect)
+{
+    ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
+    QComboBox* effect = new QComboBox;
+    effect->addItem("尚未选择动画");
+    for(const auto &i:elem->statusEffect){
+        effect->addItem(i.name);
+    }
+    int index;
+    if(chosenEffect == "尚未选择动画") index = 0;
+    else index= effect->findText(chosenEffect);
+    effect->setCurrentIndex(index);
+    connect(effect,SIGNAL(currentTextChanged(QString)),this,SLOT(onEffectTextChanged(QString)));
+    return effect;
+}
+
+///创建一个触发动作
+QWidget* MainWindow::createTriggerAction()
+{
+    QComboBox* actions = new QComboBox;
+    QPushButton* setAction = new QPushButton("设置");
+    QHBoxLayout *layout = new QHBoxLayout();
+    QWidget *triggerAction = new QWidget;
+    layout->addWidget(actions);
+    layout->addWidget(setAction);
+    triggerAction->setLayout(layout);
+    layout->setMargin(0);
+    return triggerAction;
+}
+
+///动画删除或改名后其它下拉选项的更新
+void MainWindow::updateAnimComboBox(QString changedAnim)
+{
+    ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
+    //收集动画界面
+    if(ui->listWidget_collectAnim->currentItem() != nullptr){
+        int index = elem->getCollAnimIndex(ui->listWidget_collectAnim->currentItem()->text());
+        if(elem->collAnim[index].anim == changedAnim) ui->comboBox_animation->setCurrentIndex(0);
+    }
+    //状态配置界面
+    if(ui->listWidget_status->currentItem() != nullptr){
+        int index = elem->getStatusValIndex(ui->listWidget_status->currentItem()->text());
+        if(elem->statusConfig[index].initAnim == changedAnim) ui->comboBox_initAnim->setCurrentIndex(0);
+        if(elem->statusConfig[index].clickAnim == changedAnim) ui->comboBox_clickAnim->setCurrentIndex(0);
+        int rowNum = ui->tableWidget_event->rowCount();
+        for(int i=0;i<rowNum;i++){
+            QComboBox *effect = qobject_cast<QComboBox*>(ui->tableWidget_event->cellWidget(i,3));
+            if(effect->currentText() == changedAnim) effect->setCurrentIndex(0);
+        }
+    }
+}
+
+///收集动画删除或改名后下拉选项更新
+void MainWindow::updateCollAnimComboBox(QString changedAnim)
+{
+    std::cout<<"收集动画改变,更新下拉选项"<<std::endl;
+    ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
+    //状态配置界面
+    if(ui->listWidget_status->currentItem() != nullptr){
+        int index = elem->getStatusValIndex(ui->listWidget_status->currentItem()->text());
+        if(elem->statusConfig[index].collAnim == changedAnim) ui->comboBox_collectAnimation->setCurrentIndex(0);
+    }
+}
 
 //TODO: 设置ui所有数据
 void MainWindow::setUi(ElemPropertyData *elem)
 {
+    std::cout<<"切换元素,刷新界面"<<std::endl;
     //基础元素区域的设置
     QPixmap pix(elem->iconPath);
     ui->label_pic->setPixmap(pix.scaled(50,50,Qt::KeepAspectRatio));
@@ -100,7 +172,6 @@ void MainWindow::setUi(ElemPropertyData *elem)
         int rowNum = ui->tableWidget_animation->rowCount();
         ui->tableWidget_animation->insertRow(rowNum);
         ui->tableWidget_animation->setItem(rowNum,0,new QTableWidgetItem(i.name));
-        //TODO: 时间线错误检查
         QTableWidgetItem* res = new QTableWidgetItem(getFileName(i.res));
         // 此单元格不可编辑
         res->setFlags(res->flags() & ~Qt::ItemIsEditable);
@@ -118,11 +189,21 @@ void MainWindow::setUi(ElemPropertyData *elem)
     }
 //    ui->listWidget_collectAnim->item(0)->setSelected(true); // 设置选中
 
+    //设置状态配置界面
+    ui->listWidget_status->clear();
+    for(const auto &i:elem->statusConfig){
+        ui->listWidget_status->addItem(i.statusValue);
+    }
+
     //设置收集动画和状态配置的comboBox
     ui->comboBox_initAnim->clear();
     ui->comboBox_clickAnim->clear();
     ui->comboBox_collectAnimation->clear();
     ui->comboBox_animation->clear();
+    ui->comboBox_initAnim->addItem("尚未选择动画");
+    ui->comboBox_clickAnim->addItem("尚未选择动画");
+    ui->comboBox_collectAnimation->addItem("尚未选择动画");
+    ui->comboBox_animation->addItem("尚未选择动画");
     for(const auto &i:elem->statusEffect){
         ui->comboBox_clickAnim->addItem(i.name);
         ui->comboBox_animation->addItem(i.name);
@@ -132,12 +213,6 @@ void MainWindow::setUi(ElemPropertyData *elem)
         ui->comboBox_collectAnimation->addItem(i.name);
     }
 
-    //设置状态配置界面
-    ui->listWidget_status->clear();
-    for(const auto &i:elem->statusConfig){
-        ui->listWidget_status->addItem(i.statusValue);
-    }
-
     //设置容器池界面
     ui->listWidget_pool->clear();
     for(const auto &i:elem->container){
@@ -295,7 +370,10 @@ void MainWindow::on_tableWidget_animation_cellDoubleClicked(int row, int column)
         res.exec();
         QString fileName = res.getResName();
         if(!fileName.isEmpty()){
-            ui->tableWidget_animation->setItem(row,column,new QTableWidgetItem(getFileName(fileName)));
+            QTableWidgetItem* res = new QTableWidgetItem(getFileName(fileName));
+            // 此单元格不可编辑
+            res->setFlags(res->flags() & ~Qt::ItemIsEditable);
+            ui->tableWidget_animation->setItem(row,1,res);
             QComboBox* timeLine = createTimelineBox("",fileName,TimelineType::Animation);
             ui->tableWidget_animation->setCellWidget(row,column+1,timeLine);
             //保存当前数据
@@ -307,6 +385,7 @@ void MainWindow::on_tableWidget_animation_cellDoubleClicked(int row, int column)
 ///动画区时间线数据发生改变
 void MainWindow::onTimelineTextChanged(const QString &arg1)
 {
+    if(ui->listWidget_elem->currentItem() == nullptr) return;
     //获取时间线列表所在位置
     std::cout<<"current timeline is:"<<qPrintable(arg1)<<std::endl;
     QComboBox *timeline = dynamic_cast<QComboBox*>(this->sender());
@@ -322,6 +401,7 @@ void MainWindow::onTimelineTextChanged(const QString &arg1)
 ///容器池区时间线数据发生改变
 void MainWindow::onPoolTimelineTextChanged(const QString &arg1)
 {
+    if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_pool->currentItem() == nullptr) return;
     //获取时间线列表所在位置
     std::cout<<"current timeline is:"<<qPrintable(arg1)<<std::endl;
     QComboBox *timeline = dynamic_cast<QComboBox*>(this->sender());
@@ -342,6 +422,7 @@ void MainWindow::onPoolTimelineTextChanged(const QString &arg1)
 ///子元素使用池子数据发生改变
 void MainWindow::onPoolsTextChanged(const QString &arg1)
 {
+    if(ui->listWidget_elem->currentItem() == nullptr) return;
     //获取池子列表所在位置
     QComboBox *pools = dynamic_cast<QComboBox*>(this->sender());
     int x = pools->frameGeometry().x();
@@ -353,6 +434,50 @@ void MainWindow::onPoolsTextChanged(const QString &arg1)
     elem->childElem[row].container = arg1;
 }
 
+///事件配置checkBox状态发生改变
+void MainWindow::onCheckBoxStateChanged(int state)
+{
+    if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_status->currentItem() == nullptr) return;
+    //获取checkBox所在位置
+    QCheckBox *check = dynamic_cast<QCheckBox*>(this->sender());
+    int x = check->frameGeometry().x();
+    int y = check->frameGeometry().y();
+    QModelIndex index = ui->tableWidget_event->indexAt(QPoint(x,y));
+    int row = index.row();
+    int column = index.column();
+    //修改数据
+    ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
+    int statusIndex = elem->getStatusValIndex(ui->listWidget_status->currentItem()->text());
+    ElemPropertyData::EventConfig &eventData = elem->statusConfig[statusIndex].eventConfig[row];
+    //是否需要颜色一致
+    if(column == 1){
+        if(state == 0) eventData.consisColor = false;
+        else eventData.consisColor = true;
+        std::cout<<"颜色是否需要一致状态:"<<state<<std::endl;
+    }
+    else if(column == 4){
+        if(state == 0) eventData.elimATLattices = false;
+        else eventData.elimATLattices = true;
+        std::cout<<"根据格子数量消除状态:"<<state<<std::endl;
+    }
+}
+
+///特效ComboBox选择发生改变
+void MainWindow::onEffectTextChanged(const QString &arg1)
+{
+    if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_status->currentItem() == nullptr) return;
+    //获取特效列表所在位置
+    QComboBox *effect = dynamic_cast<QComboBox*>(this->sender());
+    int x = effect->frameGeometry().x();
+    int y = effect->frameGeometry().y();
+    QModelIndex index = ui->tableWidget_event->indexAt(QPoint(x,y));
+    int row = index.row();
+    //修改数据
+    ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
+    int statusIndex = elem->getStatusValIndex(ui->listWidget_status->currentItem()->text());
+    elem->statusConfig[statusIndex].eventConfig[row].specialEffect = arg1;
+}
+
 void MainWindow::on_pushButton_addAnimation_clicked()
 {
     if(ui->listWidget_elem->currentItem()==nullptr) return;
@@ -375,11 +500,19 @@ 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(ElemPropertyData::StatusEffect(animName));
     //更新与动画相关的下拉选项
     ui->comboBox_initAnim->addItem(animName);
     ui->comboBox_clickAnim->addItem(animName);
     ui->comboBox_animation->addItem(animName);
+    //更新状态配置表格当前状态的特效下拉选项
+    if(ui->listWidget_status->currentItem() != nullptr){
+        int rowNum = ui->tableWidget_event->rowCount();
+        for(int i=0;i<rowNum;i++){
+            QComboBox *effect = qobject_cast<QComboBox*>(ui->tableWidget_event->cellWidget(i,3));
+            effect->addItem(animName);
+        }
+    }
 }
 
 
@@ -399,9 +532,10 @@ void MainWindow::on_pushButton_delAnimation_clicked()
         }
         ui->tableWidget_animation->removeRow(curRow);
         //更新动画相关的下拉选项
+        updateAnimComboBox(animName);
         ui->comboBox_initAnim->removeItem(ui->comboBox_initAnim->findText(animName));
         ui->comboBox_clickAnim->removeItem(ui->comboBox_clickAnim->findText(animName));
-        ui->comboBox_animation->removeItem(ui->comboBox_clickAnim->findText(animName));
+        ui->comboBox_animation->removeItem(ui->comboBox_animation->findText(animName));
     }  
 }
 
@@ -422,9 +556,10 @@ void MainWindow::on_tableWidget_animation_itemChanged(QTableWidgetItem *item)
         }
         std::cout<<"名字发生改变,新名字:"<<qPrintable(newName)<<std::endl;
         //更新动画相关的下拉选项
+        updateAnimComboBox(animVec[row].name);
         ui->comboBox_initAnim->removeItem(ui->comboBox_initAnim->findText(animVec[row].name));
         ui->comboBox_clickAnim->removeItem(ui->comboBox_clickAnim->findText(animVec[row].name));
-        ui->comboBox_animation->removeItem(ui->comboBox_clickAnim->findText(animVec[row].name));
+        ui->comboBox_animation->removeItem(ui->comboBox_animation->findText(animVec[row].name));
         ui->comboBox_initAnim->addItem(newName);
         ui->comboBox_clickAnim->addItem(newName);
         ui->comboBox_animation->addItem(newName);
@@ -435,8 +570,9 @@ void MainWindow::on_tableWidget_animation_itemChanged(QTableWidgetItem *item)
         std::cout<<"动画资源发生改变,新资源名:"<<qPrintable(ui->tableWidget_animation->item(row,1)->text())<<std::endl;
     }
     else{
+        bool ok;double a = ui->tableWidget_animation->item(row,3)->text().toDouble(&ok);
         int zOrder = ui->tableWidget_animation->item(row,3)->text().toInt();
-        if(zOrder<0 || zOrder>100000){
+        if(!ok || zOrder<0 || zOrder>100000){
             QMessageBox::critical(this,"警告","z-Order值超出范围!");
             ui->tableWidget_animation->item(row,3)->setText(animVec[row].zOrder);
             return;
@@ -459,7 +595,7 @@ void MainWindow::on_pushButton_addCollectAnim_clicked()
         collAnimName = "collAnim" + QString::number(id++);
     }
     ui->listWidget_collectAnim->addItem(new QListWidgetItem(collAnimName));
-    ElemPropertyData::CollAnim collAnim;collAnim.name = collAnimName;
+    ElemPropertyData::CollAnim collAnim(collAnimName);
     elem->collAnim.push_back(collAnim);
     ui->comboBox_collectAnimation->addItem(collAnimName);
 //    ui->listWidget_collectAnim->item(ui->listWidget_collectAnim->count() - 1)->setSelected(true); // 设置选中
@@ -476,10 +612,11 @@ void MainWindow::on_pushButton_delCollectAnim_clicked()
         QVector<ElemPropertyData::CollAnim> &collAnimVec = elem->collAnim;
         for(int i=0;i<collAnimVec.size();i++){
             if(collAnimVec[i].name == delName){
-                elem->collAnim.remove(i);
+                collAnimVec.remove(i);
             }
         }
         delete ui->listWidget_collectAnim->takeItem(ui->listWidget_collectAnim->currentRow());
+        updateCollAnimComboBox(delName);
         ui->comboBox_collectAnimation->removeItem(ui->comboBox_collectAnimation->findText(delName));
     }
 }
@@ -497,6 +634,7 @@ void MainWindow::on_listWidget_collectAnim_itemDoubleClicked(QListWidgetItem *it
             QMessageBox::critical(this,"警告","该收集动画名已存在!");
             return;
         }
+        updateCollAnimComboBox(item->text());
         ui->comboBox_collectAnimation->removeItem(ui->comboBox_collectAnimation->findText(item->text()));
         ui->comboBox_collectAnimation->addItem(name);
         elem->collAnim[elem->getCollAnimIndex(item->text())].name = name;
@@ -546,7 +684,6 @@ void MainWindow::setCollectAnimUi(QString collectAnimName)
         ui->lineEdit_node->setText(collAnimData.node);
         ui->lineEdit_shadow->setText(collAnimData.shadow);
         std::cout<<qPrintable(collAnimData.anim)<<"\t"<<qPrintable(collAnimData.type)<<std::endl;
-        //TODO: 使用comboBox的index来修改当前要显示的值
         ui->comboBox_animationType->setCurrentIndex(1);
         int index = ui->comboBox_animation->findText(collAnimData.anim);
         if(index == -1) index = 0;
@@ -569,7 +706,7 @@ void MainWindow::on_pushButton_genTemp_clicked()
     ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
     for(int i=0;i<elem->maxLayer.toInt();i++){
         ui->listWidget_status->addItem(QString::number(i));
-        ElemPropertyData::StatusConfig status;status.statusValue = QString::number(i);
+        ElemPropertyData::StatusConfig status(QString::number(i));
         elem->statusConfig.push_back(status);
     }
 }
@@ -588,7 +725,7 @@ void MainWindow::on_pushButton_addStatus_clicked()
     }
     if(!statusName.isEmpty()){
         ui->listWidget_status->addItem(statusName);
-        ElemPropertyData::StatusConfig status;status.statusValue = statusName;
+        ElemPropertyData::StatusConfig status(statusName);
         elem->statusConfig.push_back(status);
     }
 }
@@ -651,7 +788,7 @@ void MainWindow::on_pushButton_addContainer_clicked()
         poolName = "pool" + QString::number(id++);
     }
     ui->listWidget_pool->addItem(new QListWidgetItem(poolName));
-    ElemPropertyData::ContainerConfig container;container.poolName = poolName;
+    ElemPropertyData::ContainerConfig container(poolName);
     elem->container.push_back(container);
     //子元素下拉列表添加可选项
     int rowNum = ui->tableWidget_childElem->rowCount();
@@ -668,15 +805,16 @@ void MainWindow::on_pushButton_delContainer_clicked()
     ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
     QMessageBox::StandardButton reply = QMessageBox::question(this,"删除状态","确定要删除此容器吗?");
     if(reply == QMessageBox::Yes){
-        QString delPollName = ui->listWidget_pool->currentItem()->text();
-        int index = elem->getPoolIndex(delPollName);
+        QString delPoolName = ui->listWidget_pool->currentItem()->text();
+        int index = elem->getPoolIndex(delPoolName);
         elem->container.remove(index);
         delete ui->listWidget_pool->takeItem(ui->listWidget_pool->currentRow());
-        //子元素下拉列表添加可选项
+        //子元素下拉列表删除可选项
         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->removeItem(containers->findText(delPollName));
+            if(elem->childElem[i].container == delPoolName) containers->setCurrentIndex(0);
+            containers->removeItem(containers->findText(delPoolName));
         }
     }
 }
@@ -697,11 +835,13 @@ void MainWindow::on_listWidget_pool_itemDoubleClicked(QListWidgetItem *item)
             return;
         }
         int index = elem->getPoolIndex(item->text());
-        //子元素下拉列表添加可选项
+        //子元素下拉列表可选项改名
         int rowNum = ui->tableWidget_childElem->rowCount();
         for(int i=0;i<rowNum;i++){
             QComboBox *containers = qobject_cast<QComboBox*>(ui->tableWidget_childElem->cellWidget(i,1));
+            if(elem->childElem[i].container == elem->container[index].poolName) containers->setCurrentIndex(0);
             containers->removeItem(containers->findText(elem->container[index].poolName));
+            containers->addItem(name);
         }
         elem->container[index].poolName = name;
         item->setText(name);
@@ -741,7 +881,7 @@ void MainWindow::on_pushButton_addKey_clicked()
     }
     ui->tableWidget_containerPool->setItem(rowNum,3,new QTableWidgetItem("0"));
     int index = elem->getPoolIndex(ui->listWidget_pool->currentItem()->text());
-    ElemPropertyData::ContainTable containTable;containTable.key = keyName;
+    ElemPropertyData::ContainTable containTable(keyName);
     elem->container[index].table.push_back(containTable);
 }
 
@@ -775,17 +915,10 @@ void MainWindow::setPoolUi(QString poolName)
     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(getFileName(i.res));
         // 此单元格不可编辑
         res->setFlags(res->flags() & ~Qt::ItemIsEditable);
@@ -861,33 +994,33 @@ void MainWindow::on_tableWidget_containerPool_itemChanged(QTableWidgetItem *item
     }
 }
 
-//切换tab时更新comboBox(或者每一次添加删除动画就更新一下该元素的comboBox?这样也更方便进行逻辑检查)
-void MainWindow::on_tabWidget_currentChanged(int index)
-{
-    if(ui->listWidget_elem->currentItem() == nullptr) return;
-    QVector<ElemPropertyData::StatusEffect> &animVec = elements[ui->listWidget_elem->currentItem()->text()]->statusEffect;
-    //如果目前展示的是收集动画,加载状态与效果配置中的动画到收集动画的动画下拉列表中
-    //目前这种方法较为暴力,后期可以视动画数量进行优化
-    if(index == 1){
-        ui->comboBox_animation->clear();
-        for(const auto &i:animVec){
-            ui->comboBox_animation->addItem(i.name);
-        }
-    }
-    //如果目前展示的是状态配置,加载相应状态效果配置动画和收集动画
-    else if(index == 2){
-        ui->comboBox_initAnim->clear();
-        ui->comboBox_clickAnim->clear();
-        ui->comboBox_collectAnimation->clear();
-        for(const auto &i:animVec){
-            ui->comboBox_initAnim->addItem(i.name);
-            ui->comboBox_clickAnim->addItem(i.name);
-        }
-        for(auto i:elements[ui->listWidget_elem->currentItem()->text()]->collAnim){
-            ui->comboBox_collectAnimation->addItem(i.name);
-        }
-    }
-}
+////切换tab时更新comboBox(或者每一次添加删除动画就更新一下该元素的comboBox?这样也更方便进行逻辑检查)
+//void MainWindow::on_tabWidget_currentChanged(int index)
+//{
+//    if(ui->listWidget_elem->currentItem() == nullptr) return;
+//    QVector<ElemPropertyData::StatusEffect> &animVec = elements[ui->listWidget_elem->currentItem()->text()]->statusEffect;
+//    //如果目前展示的是收集动画,加载状态与效果配置中的动画到收集动画的动画下拉列表中
+//    //目前这种方法较为暴力,后期可以视动画数量进行优化
+//    if(index == 1){
+//        ui->comboBox_animation->clear();
+//        for(const auto &i:animVec){
+//            ui->comboBox_animation->addItem(i.name);
+//        }
+//    }
+//    //如果目前展示的是状态配置,加载相应状态效果配置动画和收集动画
+//    else if(index == 2){
+//        ui->comboBox_initAnim->clear();
+//        ui->comboBox_clickAnim->clear();
+//        ui->comboBox_collectAnimation->clear();
+//        for(const auto &i:animVec){
+//            ui->comboBox_initAnim->addItem(i.name);
+//            ui->comboBox_clickAnim->addItem(i.name);
+//        }
+//        for(auto i:elements[ui->listWidget_elem->currentItem()->text()]->collAnim){
+//            ui->comboBox_collectAnimation->addItem(i.name);
+//        }
+//    }
+//}
 
 void MainWindow::on_pushButton_addChildElem_clicked()
 {
@@ -905,7 +1038,7 @@ void MainWindow::on_pushButton_addChildElem_clicked()
     }
     ui->tableWidget_childElem->setItem(rowNum,0,new QTableWidgetItem(childElemName));
     ui->tableWidget_childElem->setCellWidget(rowNum,1,createPoolBox("尚未选择池子"));
-    elem->childElem.push_back({childElemName,"尚未选择池子"});
+    elem->childElem.push_back(ElemPropertyData::ChildElem(childElemName));
 }
 
 void MainWindow::on_pushButton_delChildElem_clicked()
@@ -1004,12 +1137,12 @@ void MainWindow::on_checkBox_needCollect_stateChanged(int arg1)
 
 void MainWindow::on_lineEdit_collectionType_editingFinished()
 {
-//    if(ui->lineEdit_collectionType->hasFocus()) return;
     if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_status->currentItem() == nullptr) return;
     ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
     int index = elem->getStatusValIndex(ui->listWidget_status->currentItem()->text());
-    ElemPropertyData::StatusConfig data = elem->statusConfig[index];
+    ElemPropertyData::StatusConfig &data = elem->statusConfig[index];
     data.collTargetType = ui->lineEdit_collectionType->text();
+    std::cout<<"收集的目标类型"<<qPrintable(data.collTargetType)<<std::endl;
 }
 
 
@@ -1024,23 +1157,16 @@ void MainWindow::on_pushButton_addEvent_clicked()
     int index = elem->getStatusValIndex(ui->listWidget_status->currentItem()->text());
     elem->statusConfig[index].eventConfig.push_back(event);
     ui->tableWidget_event->setCellWidget(rowNum,0,new QComboBox);
-    ui->tableWidget_event->setCellWidget(rowNum,1,new QCheckBox);
-    ui->tableWidget_event->setCellWidget(rowNum,3,new QComboBox);
-    ui->tableWidget_event->setCellWidget(rowNum,4,new QCheckBox);
+    ui->tableWidget_event->setCellWidget(rowNum,1,createCheckBox(false));
+    ui->tableWidget_event->setCellWidget(rowNum,3,createEffectBox("尚未选择动画"));
+    ui->tableWidget_event->setCellWidget(rowNum,4,createCheckBox(false));
     //设置触发动作
-    QComboBox* actions = new QComboBox;
-    QPushButton* setAction = new QPushButton("设置");
-    QHBoxLayout *layout = new QHBoxLayout();
-    QWidget *triggerAction = new QWidget;
-    layout->addWidget(actions);
-    layout->addWidget(setAction);
-    triggerAction->setLayout(layout);
-    layout->setMargin(0);
-    ui->tableWidget_event->setCellWidget(rowNum,5,triggerAction);
+    ui->tableWidget_event->setCellWidget(rowNum,5,createTriggerAction());
 }
 
 QString MainWindow::getFileName(QString filePath)
 {
+    if(filePath == "双击添加资源文件") return filePath;
     int size = filePath.count();
     int pos = 0;
     for(int i=size-1;i>=0;i--){
@@ -1056,4 +1182,123 @@ QString MainWindow::getFileName(QString filePath)
     return fileName;
 }
 
+void MainWindow::on_listWidget_status_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
+{
+    if(ui->listWidget_elem->currentItem() == nullptr || current == nullptr) return;
+    ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
+    int index = elem->getStatusValIndex(current->text());
+    ElemPropertyData::StatusConfig statusData = elem->statusConfig[index];
+    int comboIndex;
+    //初始化动画
+    comboIndex = ui->comboBox_initAnim->findText(statusData.initAnim);
+    if(comboIndex == -1) comboIndex = 0;
+    ui->comboBox_initAnim->setCurrentIndex(comboIndex);
+    //点击动画
+    comboIndex = ui->comboBox_clickAnim->findText(statusData.clickAnim);
+    if(comboIndex == -1) comboIndex = 0;
+    ui->comboBox_clickAnim->setCurrentIndex(comboIndex);
+    //收集动画
+    comboIndex = ui->comboBox_collectAnimation->findText(statusData.collAnim);
+    if(comboIndex == -1) comboIndex = 0;
+    ui->comboBox_collectAnimation->setCurrentIndex(comboIndex);
+    //多重打击
+    if(statusData.multiHit) ui->checkBox_multiHit->setCheckState(Qt::Checked);
+    else ui->checkBox_multiHit->setCheckState(Qt::Unchecked);
+    //可掉落
+    if(statusData.dropable) ui->checkBox_multiHit->setCheckState(Qt::Checked);
+    else ui->checkBox_dropable->setCheckState(Qt::Unchecked);
+    //是否需要收集
+    //TODO: 加载收集动画数据
+    ui->lineEdit_collectionType->clear();
+    if(statusData.needCollect){
+        ui->checkBox_needCollect->setCheckState(Qt::Checked);
+        ui->lineEdit_collectionType->setReadOnly(false);
+        std::cout<<"收集的目标类型"<<qPrintable(statusData.collTargetType)<<std::endl;
+        ui->lineEdit_collectionType->setText(statusData.collTargetType);
+    }
+    else{
+        ui->checkBox_needCollect->setCheckState(Qt::Unchecked);
+        ui->lineEdit_collectionType->setReadOnly(true);
+    }
+    //事件配置
+    //TODO:设置事件表格下拉项
+    int rowNum = ui->tableWidget_event->rowCount();
+    for(int i=0;i<rowNum;i++){
+        ui->tableWidget_event->removeRow(0);
+    }
+    for(const auto &i:statusData.eventConfig){
+        int rowNum = ui->tableWidget_event->rowCount();
+        ui->tableWidget_event->insertRow(rowNum);
+        //事件名称
+        ui->tableWidget_event->setCellWidget(rowNum,0,new QComboBox);
+        //是否需要颜色一致
+        ui->tableWidget_event->setCellWidget(rowNum,1,createCheckBox(i.consisColor));
+        //tableWidget_event
+        ui->tableWidget_event->setItem(rowNum,2,new QTableWidgetItem(i.changeMagnitude));
+        //特效
+        ui->tableWidget_event->setCellWidget(rowNum,3,createEffectBox(i.specialEffect));
+        //根据格子数量消除
+        ui->tableWidget_event->setCellWidget(rowNum,4,createCheckBox(i.elimATLattices));
+        //触发动作
+        ui->tableWidget_event->setCellWidget(rowNum,5,createTriggerAction());
+    }
+}
+
+void MainWindow::on_tableWidget_event_cellDoubleClicked(int row, int column)
+{
+    if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_status->currentItem() == nullptr) return;
+    if(column == 2) eventTableItemChanged = true;
+}
+
+//状态变化幅度合法性检查及数据保存
+void MainWindow::on_tableWidget_event_itemChanged(QTableWidgetItem *item)
+{
+    if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_status->currentItem() == nullptr) return;
+    if(!eventTableItemChanged) return;
+    eventTableItemChanged = false;
+    int column = item->column();
+    int row = item->row();
+    ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
+    int index = elem->getStatusValIndex(ui->listWidget_status->currentItem()->text());
+    QVector<ElemPropertyData::EventConfig> &eventVec = elem->statusConfig[index].eventConfig;
+    if(column == 2){
+        bool ok;double a = item->text().toDouble(&ok);
+        int val = item->text().toInt();
+        if(!ok || val<0){
+            QMessageBox::critical(this,"警告","状态变化幅度是大于0的数字");
+            ui->tableWidget_event->item(row,2)->setText(QString::number(eventVec[row].changeMagnitude));
+            return;
+        }
+        std::cout<<"状态变化幅度发生改变,新值为:"<<val<<std::endl;
+        eventVec[row].changeMagnitude = val;
+    }
+}
+
+
+void MainWindow::on_comboBox_initAnim_currentTextChanged(const QString &arg1)
+{
+    if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_status->currentItem() == nullptr) return;
+    std::cout<<"初始化动画:"<<qPrintable(arg1)<<std::endl;
+    ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
+    int index = elem->getStatusValIndex(ui->listWidget_status->currentItem()->text());
+    elem->statusConfig[index].initAnim = arg1;
+}
+
+
+void MainWindow::on_comboBox_clickAnim_currentTextChanged(const QString &arg1)
+{
+    if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_status->currentItem() == nullptr) return;
+    ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
+    int index = elem->getStatusValIndex(ui->listWidget_status->currentItem()->text());
+    elem->statusConfig[index].clickAnim = arg1;
+}
+
+
+void MainWindow::on_comboBox_collectAnimation_currentTextChanged(const QString &arg1)
+{
+    if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_status->currentItem() == nullptr) return;
+    ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
+    int index = elem->getStatusValIndex(ui->listWidget_status->currentItem()->text());
+    elem->statusConfig[index].collAnim = arg1;
+}
 

+ 24 - 1
mainwindow.h

@@ -7,6 +7,7 @@
 #include <elemPropertyData.h>
 #include <QMap>
 #include <QComboBox>
+#include <QCheckBox>
 
 QT_BEGIN_NAMESPACE
 namespace Ui { class MainWindow; }
@@ -77,7 +78,7 @@ private slots:
 
     void on_listWidget_collectAnim_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous);
 
-    void on_tabWidget_currentChanged(int index);
+//    void on_tabWidget_currentChanged(int index);
 
     void on_pushButton_genTemp_clicked();
 
@@ -115,6 +116,21 @@ private slots:
 
     void onPoolsTextChanged(const QString &arg1);
 
+    void on_listWidget_status_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous);
+
+    void on_tableWidget_event_cellDoubleClicked(int row, int column);
+
+    void on_tableWidget_event_itemChanged(QTableWidgetItem *item);
+
+    void onCheckBoxStateChanged(int state);
+
+    void on_comboBox_initAnim_currentTextChanged(const QString &arg1);
+
+    void on_comboBox_clickAnim_currentTextChanged(const QString &arg1);
+
+    void on_comboBox_collectAnimation_currentTextChanged(const QString &arg1);
+
+    void onEffectTextChanged(const QString &arg1);
 private:
     Ui::MainWindow *ui;
     QMap<QString,ElemPropertyData*> elements;
@@ -126,11 +142,18 @@ private:
     bool poolTableItemChanged = false;
     //子元素表格
     bool childElemTableItemChanged = false;
+    //事件配置表格
+    bool eventTableItemChanged = false;
     void setCollectAnimUi(QString collectAnimName);
     void setPoolUi(QString poolName);
     QString getFileName(QString filePath);
     enum class TimelineType{Animation,Pool};
     QComboBox* createTimelineBox(QString chosenTimeline,QString filename,TimelineType type);
     QComboBox* createPoolBox(QString chosenPool);
+    QCheckBox* createCheckBox(bool chosen);
+    QWidget* createTriggerAction();
+    QComboBox* createEffectBox(QString chosenEffect);
+    void updateAnimComboBox(QString changedAnim);
+    void updateCollAnimComboBox(QString changedAnim);
 };
 #endif // MAINWINDOW_H

+ 1 - 1
mainwindow.ui

@@ -187,7 +187,7 @@
            <enum>QTabWidget::Triangular</enum>
           </property>
           <property name="currentIndex">
-           <number>3</number>
+           <number>1</number>
           </property>
           <property name="elideMode">
            <enum>Qt::ElideRight</enum>

+ 53 - 0
readJsonSrc.cpp

@@ -0,0 +1,53 @@
+#include "readJsonSrc.h"
+#include <QJsonDocument>
+#include <QJsonObject>
+#include <QFile>
+#include <iostream>
+#include <QVector>
+
+ReadJsonSrc::ReadJsonSrc(QString filePath)
+{
+    QFile srcFile(filePath);
+    if(!srcFile.open(QFile::ReadOnly)){
+        std::cout<<"can't open file "<<qPrintable(filePath)<<std::endl;
+    }
+    QJsonObject jsonObj = QJsonDocument::fromJson(QString(srcFile.readAll()).toUtf8()).object();
+    srcFile.close();
+    readJsonObj(jsonObj);
+}
+
+void ReadJsonSrc::readJsonObj(QJsonObject obj)
+{
+    //收集动画
+    QJsonObject collAnim = obj["coll_template"].toObject();
+    templateMap["collAnimTemp"] = readTemplate(collAnim);
+    //事件
+    QJsonObject event = obj["event_template"].toObject();
+    templateMap["eventTemp"] = readTemplate(event);
+    //动作
+    QJsonObject action = obj["action_template"].toObject();
+    templateMap["actionTemp"] = readTemplate(action);
+    //容器池
+    QJsonObject pool = obj["pool_template"].toObject();
+    templateMap["poolTemp"] = readTemplate(pool);
+}
+
+QVector<ReadJsonSrc::Template> ReadJsonSrc::readTemplate(QJsonObject obj)
+{
+    QVector<Template> tempVec;
+    for(const auto &i:obj){
+        QJsonObject tempObj = i.toObject();
+        Template temp(tempObj["name"].toString(),tempObj["id"].toString());
+        QVector<Fields> fields;
+        QJsonObject fieldObj = tempObj["fields"].toObject();
+        QStringList fiedsName = fieldObj.keys();
+        for(const auto &j:fiedsName){
+            QJsonObject content = fieldObj[j].toObject();
+            Fields field(j,content["id"].toString(),content["type"].toString(),content["src"].toString(),content["default"].toString());
+            fields.push_back(field);
+        }
+        temp.fields = fields;
+        tempVec.push_back(temp);
+    }
+    return tempVec;
+}

+ 32 - 0
readJsonSrc.h

@@ -0,0 +1,32 @@
+#ifndef READJSONSRC_H
+#define READJSONSRC_H
+#include <QString>
+#include <QJsonObject>
+
+class ReadJsonSrc
+{
+public:
+    ReadJsonSrc(QString filePath);
+    struct Fields{
+        QString name;
+        QString id;
+        QString type;
+        QString src;
+        QString defaultVal;
+        Fields(QString fname,QString fid,QString ftype,QString fsrc,QString fval):
+            name(fname),id(fid),type(ftype),src(fsrc),defaultVal(fval){}
+    };
+    struct Template{
+        QString name;
+        QString id;
+        QVector<Fields> fields;
+        Template(QString tempName,QString tempId):name(tempName),id(tempId){}
+    };
+    QMap<QString,QVector<Template>> templateMap;
+    //读取json配置文件内容并存数据
+    void readJsonObj(QJsonObject obj);
+    //读取模板内容
+    QVector<Template> readTemplate(QJsonObject obj);
+};
+
+#endif // READJSONSRC_H