Browse Source

将模板配置数据加入界面;添加菜单栏重加载json文件功能;容器类型数据保存,删除事件功能

Menglan_Luo 2 years ago
parent
commit
99852c24b4
6 changed files with 595 additions and 444 deletions
  1. 5 5
      elemPropertyData.h
  2. 277 154
      mainwindow.cpp
  3. 22 3
      mainwindow.h
  4. 273 275
      mainwindow.ui
  5. 16 6
      readJsonSrc.cpp
  6. 2 1
      readJsonSrc.h

+ 5 - 5
elemPropertyData.h

@@ -33,7 +33,7 @@ public:
         QString anim;
         QString node;
         QString shadow;
-        CollAnim(QString collAnimName):name(collAnimName){}
+        CollAnim(QString collAnimName):name(collAnimName),type("尚未选择"),anim("尚未选择"){}
     };
     QVector<CollAnim> collAnim;
 
@@ -46,7 +46,7 @@ public:
         QString specialEffect;
         bool elimATLattices;
         QString triggerAction;
-        EventConfig():consisColor(false),changeMagnitude(0),elimATLattices(false) {}
+        EventConfig():name("尚未选择"),specialEffect("尚未选择"),triggerAction("尚未选择"),consisColor(false),changeMagnitude(0),elimATLattices(false){}
     };
     struct StatusConfig{
         QString statusValue;
@@ -58,7 +58,7 @@ public:
         QString collTargetType;
         QString collAnim;
         QVector<EventConfig> eventConfig;
-        StatusConfig(QString statusVal):statusValue(statusVal),multiHit(false),dropable(false),needCollect(false){}
+        StatusConfig(QString statusVal):statusValue(statusVal),multiHit(false),dropable(false),needCollect(false),initAnim("尚未选择"),clickAnim("尚未选择"),collAnim("尚未选择"){}
     };
     QVector<StatusConfig> statusConfig;
 
@@ -78,13 +78,13 @@ public:
         QString poolName;
         QString type;
         QVector<ContainTable> table;
-        ContainerConfig(QString pool):poolName(pool){}
+        ContainerConfig(QString pool):poolName(pool),type("尚未选择"){}
     };
     QVector<ContainerConfig> container;
     struct ChildElem{
         QString name;
         QString container;
-        ChildElem(QString childElemName):name(childElemName),container("尚未选择池子"){}
+        ChildElem(QString childElemName):name(childElemName),container("尚未选择"){}
     };
     QVector<ChildElem> childElem;
     bool isSingleContainerKey(QString poolKey,QString newKey);

+ 277 - 154
mainwindow.cpp

@@ -16,11 +16,14 @@
 #include <QDragEnterEvent>
 #include <QMimeData>
 #include <QUrl>
+#include <QFormLayout>
 
 MainWindow::MainWindow(QWidget *parent)
     : QMainWindow(parent)
     , ui(new Ui::MainWindow)
 {
+    //TODO:把用到的默认本地文件变成项目资源文件
+    jsonTemp = new ReadJsonSrc("/Users/menglanluo/redFiles/template.json");
     ui->setupUi(this);
     QPixmap pix("/Users/menglanluo/pic.png");
     ui->label_pic->setPixmap(pix.scaled(50,50,Qt::KeepAspectRatio));
@@ -28,14 +31,28 @@ MainWindow::MainWindow(QWidget *parent)
     ui->tableWidget_animation->setHorizontalHeaderLabels({"名称","资源","时间线","z-Order"});
     ui->tableWidget_containerPool->setHorizontalHeaderLabels({"键值","资源名","初始时间线","点击时间线","影响时间线","消失时间线","消失z-Order"});
     ui->tableWidget_childElem->setHorizontalHeaderLabels({"名称","使用的池子"});
-    ui->tableWidget_event->setHorizontalHeaderLabels({"事件名称","是否需要颜色一致","状态变化幅度","特效","根据格子数量消除","触发动作"});
+    ui->tableWidget_event->setHorizontalHeaderLabels({"事件名称","是否需要颜色一致","状态变化幅度","特效","根据格子数量消除","触发动作","触发动作设置"});
     ui->tabWidget->setCurrentIndex(0);
     ui->lineEdit_collectionType->setReadOnly(true);
+    updateTempRelatedUi();
 }
 
 MainWindow::~MainWindow()
 {
     delete ui;
+    delete jsonTemp;
+}
+
+///创建普通下拉选项
+QComboBox* MainWindow::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;
 }
 
 ///创建一个时间线下拉选项
@@ -44,11 +61,8 @@ QComboBox* MainWindow::createTimelineBox(QString chosenTimeline,QString fileName
     ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
     QComboBox* timeLine = new QComboBox;
     if(fileName == "双击添加资源文件") return timeLine;
-    timeLine->addItems(elem->getTimelineList(fileName));
-    int index;
-    if(chosenTimeline.isEmpty()) index = -1;
-    else index= timeLine->findText(chosenTimeline);
-    timeLine->setCurrentIndex(index);
+    QStringList list = elem->getTimelineList(fileName);
+    timeLine = createBox(chosenTimeline,list);
     if(type == TimelineType::Animation){
         connect(timeLine,SIGNAL(currentTextChanged(QString)),this,SLOT(onTimelineTextChanged(QString)));
     }
@@ -58,19 +72,23 @@ QComboBox* MainWindow::createTimelineBox(QString chosenTimeline,QString fileName
     return timeLine;
 }
 
+///创建事件下拉选项
+QComboBox* MainWindow::createEventBox(QString chosenEvent)
+{
+    QStringList list;
+    for(const auto &i:jsonTemp->templateMap["eventTemp"]) list.push_back(i.name);
+    QComboBox* event = createBox(chosenEvent,list);
+    connect(event,SIGNAL(currentTextChanged(QString)),this,SLOT(onEventBoxTextChanged(QString)));
+    return event;
+}
+
 ///创建一个使用池子下拉选项
 QComboBox* MainWindow::createPoolBox(QString chosenPool)
 {
     ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
-    QComboBox* pools = new QComboBox;
-    pools->addItem("尚未选择池子");
-    for(const auto &i:elem->container){
-        pools->addItem(i.poolName);
-    }
-    int index;
-    if(chosenPool == "尚未选择池子") index = 0;
-    else index= pools->findText(chosenPool);
-    pools->setCurrentIndex(index);
+    QStringList list;
+    for(const auto &i:elem->container) list.push_back(i.poolName);
+    QComboBox* pools = createBox(chosenPool,list);
     connect(pools,SIGNAL(currentTextChanged(QString)),this,SLOT(onPoolsTextChanged(QString)));
     return pools;
 }
@@ -89,31 +107,31 @@ QCheckBox* MainWindow::createCheckBox(bool chosen)
 QComboBox* MainWindow::createEffectBox(QString chosenEffect)
 {
     ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
-    QComboBox* effect = new QComboBox;
-    effect->addItem("尚未选择动画");
+    QStringList list;
     for(const auto &i:elem->statusEffect){
-        effect->addItem(i.name);
+        list.push_back(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)));
+    QComboBox* effect = createBox(chosenEffect,list);
+    connect(effect,SIGNAL(currentTextChanged(QString)),this,SLOT(onEventBoxTextChanged(QString)));
     return effect;
 }
 
 ///创建一个触发动作
-QWidget* MainWindow::createTriggerAction()
+QComboBox* MainWindow::createTriggerAction(QString chosenAction)
+{
+    QStringList actionlist;
+    for(const auto &i:jsonTemp->templateMap["actionTemp"]) actionlist.push_back(i.name);
+    QComboBox* actions = createBox(chosenAction,actionlist);
+    connect(actions,SIGNAL(currentTextChanged(QString)),this,SLOT(onEventBoxTextChanged(QString)));
+    return actions;
+}
+
+///创建一个触发动作设置按钮
+QPushButton* MainWindow::createSetButton()
 {
-    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;
+    connect(setAction,SIGNAL(clicked()),this,SLOT(onSetActionButtonClicked()));
+    return setAction;
 }
 
 ///动画删除或改名后其它下拉选项的更新
@@ -122,12 +140,12 @@ 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());
+        int index = ui->listWidget_collectAnim->currentRow();
         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());
+        int index = ui->listWidget_status->currentRow();
         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();
@@ -145,12 +163,12 @@ void MainWindow::updateCollAnimComboBox(QString changedAnim)
     ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
     //状态配置界面
     if(ui->listWidget_status->currentItem() != nullptr){
-        int index = elem->getStatusValIndex(ui->listWidget_status->currentItem()->text());
+        int index = ui->listWidget_status->currentRow();
         if(elem->statusConfig[index].collAnim == changedAnim) ui->comboBox_collectAnimation->setCurrentIndex(0);
     }
 }
 
-//TODO: 设置ui所有数据
+///切换元素时重置界面数据
 void MainWindow::setUi(ElemPropertyData *elem)
 {
     std::cout<<"切换元素,刷新界面"<<std::endl;
@@ -194,16 +212,21 @@ void MainWindow::setUi(ElemPropertyData *elem)
     for(const auto &i:elem->statusConfig){
         ui->listWidget_status->addItem(i.statusValue);
     }
+    //切换元素时状态尚未选中,先清除事件表格内容
+    rowCnt = ui->tableWidget_event->rowCount();
+    for(int i=0;i<rowCnt;i++){
+        ui->tableWidget_event->removeRow(0);
+    }
 
     //设置收集动画和状态配置的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("尚未选择动画");
+    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);
@@ -234,15 +257,7 @@ void MainWindow::setUi(ElemPropertyData *elem)
         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;
-        for(const auto &i:elem->container){
-            containers->addItem(i.poolName);
-        }
-        int index = containers->findText(i.container);
-        containers->setCurrentIndex(index);
-        containers->setCurrentIndex(0);
-        ui->tableWidget_childElem->setCellWidget(rowNum,1,containers);
+        ui->tableWidget_childElem->setCellWidget(rowNum,1,createPoolBox(i.container));
     }
 }
 
@@ -396,6 +411,7 @@ void MainWindow::onTimelineTextChanged(const QString &arg1)
     //修改数据
     ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
     elem->statusEffect[row].timeline = timeline->currentText();
+    std::cout<<"row:"<<row<<std::endl;
 }
 
 ///容器池区时间线数据发生改变
@@ -412,11 +428,12 @@ void MainWindow::onPoolTimelineTextChanged(const QString &arg1)
     int column = index.column();
     //修改数据
     ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
-    int poolIndex = elem->getPoolIndex(ui->listWidget_pool->currentItem()->text());
+    int poolIndex = ui->listWidget_pool->currentRow();
     if(column == 2) elem->container[poolIndex].table[row].initTimeline = timeline->currentText();
     else if(column == 3) elem->container[poolIndex].table[row].clickTimeline = timeline->currentText();
     else if(column == 4) elem->container[poolIndex].table[row].effectTimeline = timeline->currentText();
     else if(column == 5) elem->container[poolIndex].table[row].vanishTimeline = timeline->currentText();
+    std::cout<<"row:"<<row<<"\tcolumn:"<<column<<std::endl;
 }
 
 ///子元素使用池子数据发生改变
@@ -460,22 +477,74 @@ void MainWindow::onCheckBoxStateChanged(int state)
         else eventData.elimATLattices = true;
         std::cout<<"根据格子数量消除状态:"<<state<<std::endl;
     }
+    std::cout<<"row:"<<row<<"\tcolumn:"<<column<<std::endl;
 }
 
-///特效ComboBox选择发生改变
-void MainWindow::onEffectTextChanged(const QString &arg1)
+///事件配置ComboBox选择发生改变
+void MainWindow::onEventBoxTextChanged(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();
+    QComboBox *box = dynamic_cast<QComboBox*>(this->sender());
+    int x = box->frameGeometry().x();
+    int y = box->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());
-    elem->statusConfig[statusIndex].eventConfig[row].specialEffect = arg1;
+    QVector<ElemPropertyData::EventConfig> &eventTable = elem->statusConfig[statusIndex].eventConfig;
+    if(column == 0) eventTable[row].name = arg1;
+    else if(column == 3) eventTable[row].specialEffect = arg1;
+    else if(column == 5) eventTable[row].triggerAction = arg1;
+    std::cout<<"row:"<<row<<"\tcolumn:"<<column<<std::endl;
+}
+
+///动作配置中的设置点击后
+void MainWindow::onSetActionButtonClicked()
+{
+    if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_status->currentItem() == nullptr) return;
+    //获取设置按钮所在位置
+    QPushButton *button = dynamic_cast<QPushButton*>(this->sender());
+    int x = button->frameGeometry().x();
+    int y = button->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());
+    QVector<ElemPropertyData::EventConfig> &eventTable = elem->statusConfig[statusIndex].eventConfig;
+    QString action = eventTable[row].triggerAction;
+    std::cout<<"row:"<<row<<std::endl;
+    std::cout<<qPrintable(action)<<std::endl;
+}
+
+///点击动作配置的设置按钮后生成新窗口
+void MainWindow::createSetWindow(QString actionName)
+{
+    QWidget w;
+    w.setWindowTitle("设置触发动作属性");
+    QVector<ReadJsonSrc::Template> tempVec = jsonTemp->templateMap["actionTemp"];
+    int index = jsonTemp->getTemplateIndex("actionTemp",actionName);
+    QVector<ReadJsonSrc::Fields> fields = tempVec[index].fields;
+    QVBoxLayout *vlayout = new QVBoxLayout();
+    QFormLayout* formlayout = new QFormLayout();
+    for(const auto &i:fields){
+//        QHBoxLayout *hlayout = new QHBoxLayout();
+        QWidget *widget = new QWidget;
+        if(i.type == "list"){
+            if(i.src == "animations"){
+                ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
+                QStringList list;
+                for(const auto &i:elem->statusEffect) list.push_back(i.name);
+                widget = createBox(i.defaultVal,list);
+            }
+        }
+        else if(i.type == "input"){
+            widget = new QLineEdit(i.defaultVal);
+        }
+        formlayout->addRow(i.name,widget);
+    }
 }
 
 void MainWindow::on_pushButton_addAnimation_clicked()
@@ -498,7 +567,7 @@ void MainWindow::on_pushButton_addAnimation_clicked()
     // 此单元格不可编辑
     res->setFlags(res->flags() & ~Qt::ItemIsEditable);
     ui->tableWidget_animation->setItem(rowNum,1,res);
-    ui->tableWidget_animation->setCellWidget(rowNum,2,new QComboBox);
+    ui->tableWidget_animation->setCellWidget(rowNum,2,createBox("",{}));
     ui->tableWidget_animation->setItem(rowNum,3,new QTableWidgetItem("0"));
     elem->statusEffect.push_back(ElemPropertyData::StatusEffect(animName));
     //更新与动画相关的下拉选项
@@ -524,12 +593,7 @@ void MainWindow::on_pushButton_delAnimation_clicked()
         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){
-                animVec.remove(i);
-                break;
-            }
-        }
+        animVec.remove(curRow);
         ui->tableWidget_animation->removeRow(curRow);
         //更新动画相关的下拉选项
         updateAnimComboBox(animName);
@@ -605,16 +669,12 @@ void MainWindow::on_pushButton_addCollectAnim_clicked()
 void MainWindow::on_pushButton_delCollectAnim_clicked()
 {
     if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_collectAnim->currentItem() == nullptr) return;
-    QMessageBox::StandardButton reply = QMessageBox::question(this,"删除动画","确定要删除此收集动画吗?");
+    QMessageBox::StandardButton reply = QMessageBox::question(this,"删除收集动画","确定要删除此收集动画吗?");
     ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
     if(reply == QMessageBox::Yes){
         QString delName = ui->listWidget_collectAnim->currentItem()->text();
         QVector<ElemPropertyData::CollAnim> &collAnimVec = elem->collAnim;
-        for(int i=0;i<collAnimVec.size();i++){
-            if(collAnimVec[i].name == delName){
-                collAnimVec.remove(i);
-            }
-        }
+        collAnimVec.remove(ui->listWidget_collectAnim->currentRow());
         delete ui->listWidget_collectAnim->takeItem(ui->listWidget_collectAnim->currentRow());
         updateCollAnimComboBox(delName);
         ui->comboBox_collectAnimation->removeItem(ui->comboBox_collectAnimation->findText(delName));
@@ -642,20 +702,22 @@ void MainWindow::on_listWidget_collectAnim_itemDoubleClicked(QListWidgetItem *it
     }
 }
 
+//TODO: 动画类型的修改伴随界面的更新
 void MainWindow::on_comboBox_animationType_currentTextChanged(const QString &arg1)
 {
-    if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_collectAnim->currentItem() ==  nullptr) return;
+    if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_collectAnim->currentItem() ==  nullptr || isSetUi) return;
     ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
-    int index = elem->getCollAnimIndex(ui->listWidget_collectAnim->currentItem()->text());
+    int index = ui->listWidget_collectAnim->currentRow();
     elem->collAnim[index].type = arg1;
+    std::cout<<"收集动画第"<<index<<"行动画类型改变:"<<qPrintable(arg1)<<std::endl;
 }
 
 
 void MainWindow::on_comboBox_animation_currentTextChanged(const QString &arg1)
 {
-    if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_collectAnim->currentItem() ==  nullptr) return;
+    if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_collectAnim->currentItem() ==  nullptr || isSetUi) return;
     ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
-    int index = elem->getCollAnimIndex(ui->listWidget_collectAnim->currentItem()->text());
+    int index = ui->listWidget_collectAnim->currentRow();
     elem->collAnim[index].anim = arg1;
 }
 
@@ -663,7 +725,7 @@ void MainWindow::on_lineEdit_node_editingFinished()
 {
     if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_collectAnim->currentItem() == nullptr) return;
     ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
-    int index = elem->getCollAnimIndex(ui->listWidget_collectAnim->currentItem()->text());
+    int index = ui->listWidget_collectAnim->currentRow();
     elem->collAnim[index].node = ui->lineEdit_node->text();
 }
 
@@ -671,7 +733,7 @@ void MainWindow::on_lineEdit_shadow_editingFinished()
 {
     if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_collectAnim->currentItem() == nullptr) return;
     ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
-    int index = elem->getCollAnimIndex(ui->listWidget_collectAnim->currentItem()->text());
+    int index = ui->listWidget_collectAnim->currentRow();
     elem->collAnim[index].shadow = ui->lineEdit_shadow->text();
 }
 
@@ -679,15 +741,18 @@ void MainWindow::on_lineEdit_shadow_editingFinished()
 void MainWindow::setCollectAnimUi(QString collectAnimName)
 {
     if(ui->listWidget_collectAnim->currentItem() != nullptr){
+        isSetUi = true;
         ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
         ElemPropertyData::CollAnim collAnimData = elem->collAnim[elem->getCollAnimIndex(collectAnimName)];
         ui->lineEdit_node->setText(collAnimData.node);
         ui->lineEdit_shadow->setText(collAnimData.shadow);
-        std::cout<<qPrintable(collAnimData.anim)<<"\t"<<qPrintable(collAnimData.type)<<std::endl;
-        ui->comboBox_animationType->setCurrentIndex(1);
+        int typeIndex = ui->comboBox_animationType->findText(collAnimData.type);
+        if(typeIndex == -1) typeIndex = 0;
+        ui->comboBox_animationType->setCurrentIndex(typeIndex);
         int index = ui->comboBox_animation->findText(collAnimData.anim);
         if(index == -1) index = 0;
         ui->comboBox_animation->setCurrentIndex(index);
+        isSetUi = false;
     }
 }
 
@@ -803,10 +868,10 @@ void MainWindow::on_pushButton_delContainer_clicked()
 {
     if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_pool->currentItem() == nullptr) return;
     ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
-    QMessageBox::StandardButton reply = QMessageBox::question(this,"删除状态","确定要删除此容器吗?");
+    QMessageBox::StandardButton reply = QMessageBox::question(this,"删除容器","确定要删除此容器吗?");
     if(reply == QMessageBox::Yes){
         QString delPoolName = ui->listWidget_pool->currentItem()->text();
-        int index = elem->getPoolIndex(delPoolName);
+        int index = ui->listWidget_pool->currentRow();
         elem->container.remove(index);
         delete ui->listWidget_pool->takeItem(ui->listWidget_pool->currentRow());
         //子元素下拉列表删除可选项
@@ -877,10 +942,10 @@ void MainWindow::on_pushButton_addKey_clicked()
     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->setCellWidget(rowNum,i,createBox("",{}));
     }
     ui->tableWidget_containerPool->setItem(rowNum,3,new QTableWidgetItem("0"));
-    int index = elem->getPoolIndex(ui->listWidget_pool->currentItem()->text());
+    int index = ui->listWidget_pool->currentRow();
     ElemPropertyData::ContainTable containTable(keyName);
     elem->container[index].table.push_back(containTable);
 }
@@ -889,19 +954,14 @@ void MainWindow::on_pushButton_addKey_clicked()
 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,"删除容器","确定要删除此容器吗?");
+    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();
         ElemPropertyData* elem =elements[ui->listWidget_elem->currentItem()->text()];
-        int index = elem->getPoolIndex(ui->listWidget_pool->currentItem()->text());
+        int index = ui->listWidget_pool->currentRow();
         QVector<ElemPropertyData::ContainTable> &containerTable = elem->container[index].table;
-        for(int i=0;i<containerTable.size();i++){
-            if(containerName == containerTable[i].key){
-                containerTable.remove(i);
-                break;
-            }
-        }
+        containerTable.remove(curRow);
         ui->tableWidget_containerPool->removeRow(curRow);
     }
 }
@@ -909,8 +969,12 @@ void MainWindow::on_pushButton_delKey_clicked()
 void MainWindow::setPoolUi(QString poolName)
 {
     if(ui->listWidget_elem->currentItem() == nullptr) return;
+    isSetUi = true;
     ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
     ElemPropertyData::ContainerConfig poolData = elem->container[elem->getPoolIndex(poolName)];
+    int contIndex = ui->comboBox_container->findText(poolData.type);
+    if(contIndex == -1) contIndex=0;
+    ui->comboBox_container->setCurrentIndex(contIndex);
     int rowNum = ui->tableWidget_containerPool->rowCount();
     for(int i=0;i<rowNum;i++){
         ui->tableWidget_containerPool->removeRow(0);
@@ -929,6 +993,7 @@ void MainWindow::setPoolUi(QString poolName)
         ui->tableWidget_containerPool->setCellWidget(rowNum,5,createTimelineBox(i.vanishTimeline,i.res,TimelineType::Pool));
         ui->tableWidget_containerPool->setItem(rowNum,6,new QTableWidgetItem(i.zOrder));
     }
+    isSetUi = false;
 }
 
 void MainWindow::on_tableWidget_containerPool_cellDoubleClicked(int row, int column)
@@ -942,10 +1007,9 @@ void MainWindow::on_tableWidget_containerPool_cellDoubleClicked(int row, int col
         res.exec();
         QString fileName = res.getResName();
         if(!fileName.isEmpty()){
-            //TODO: 加载comboBox,随后文件名去除路径
             ui->tableWidget_containerPool->setItem(row,column,new QTableWidgetItem(getFileName(fileName)));
             ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
-            int index = elem->getPoolIndex(ui->listWidget_pool->currentItem()->text());
+            int index = ui->listWidget_pool->currentRow();
             elem->container[index].table[row].res = fileName;
             //加载时间线下拉列表
             for(int i=2;i<=5;i++){
@@ -965,7 +1029,7 @@ void MainWindow::on_tableWidget_containerPool_itemChanged(QTableWidgetItem *item
     int column = item->column();
     int row = item->row();
     ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
-    int index = elem->getPoolIndex(ui->listWidget_pool->currentItem()->text());
+    int index = ui->listWidget_pool->currentRow();
     QVector<ElemPropertyData::ContainTable> &containerVec = elem->container[index].table;
     if(column == 0){
         bool isNum;double tmp = item->text().toDouble(&isNum);
@@ -994,34 +1058,6 @@ 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);
-//        }
-//    }
-//}
-
 void MainWindow::on_pushButton_addChildElem_clicked()
 {
     if(ui->listWidget_elem->currentItem() == nullptr) return;
@@ -1037,7 +1073,7 @@ void MainWindow::on_pushButton_addChildElem_clicked()
         childElemName = "item" + QString::number(id++);
     }
     ui->tableWidget_childElem->setItem(rowNum,0,new QTableWidgetItem(childElemName));
-    ui->tableWidget_childElem->setCellWidget(rowNum,1,createPoolBox("尚未选择池子"));
+    ui->tableWidget_childElem->setCellWidget(rowNum,1,createPoolBox("尚未选择"));
     elem->childElem.push_back(ElemPropertyData::ChildElem(childElemName));
 }
 
@@ -1049,12 +1085,7 @@ void MainWindow::on_pushButton_delChildElem_clicked()
         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;
-            }
-        }
+        childElemVec.remove(curRow);
         ui->tableWidget_childElem->removeRow(curRow);
     }
 }
@@ -1090,14 +1121,13 @@ void MainWindow::on_tableWidget_childElem_cellDoubleClicked(int row, int column)
 
 void MainWindow::on_checkBox_multiHit_stateChanged(int arg1)
 {
-    if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_status->currentItem() == nullptr) return;
+    if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_status->currentItem() == nullptr || isSetUi) return;
     ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
+    int index = ui->listWidget_status->currentRow();
     if(arg1){
-        int index = elem->getStatusValIndex(ui->listWidget_status->currentItem()->text());
         elem->statusConfig[index].multiHit = true;
     }
     else{
-        int index = elem->getStatusValIndex(ui->listWidget_status->currentItem()->text());
         elem->statusConfig[index].multiHit = false;
     }
 }
@@ -1105,14 +1135,13 @@ void MainWindow::on_checkBox_multiHit_stateChanged(int arg1)
 
 void MainWindow::on_checkBox_dropable_stateChanged(int arg1)
 {
-    if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_status->currentItem() == nullptr) return;
+    if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_status->currentItem() == nullptr || isSetUi) return;
     ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
+    int index = ui->listWidget_status->currentRow();
     if(arg1){
-        int index = elem->getStatusValIndex(ui->listWidget_status->currentItem()->text());
         elem->statusConfig[index].dropable = true;
     }
     else{
-        int index = elem->getStatusValIndex(ui->listWidget_status->currentItem()->text());
         elem->statusConfig[index].dropable = false;
     }
 }
@@ -1120,15 +1149,14 @@ void MainWindow::on_checkBox_dropable_stateChanged(int arg1)
 
 void MainWindow::on_checkBox_needCollect_stateChanged(int arg1)
 {
-    if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_status->currentItem() == nullptr) return;
+    if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_status->currentItem() == nullptr || isSetUi) return;
     ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
+    int index = ui->listWidget_status->currentRow();
     if(arg1){
-        int index = elem->getStatusValIndex(ui->listWidget_status->currentItem()->text());
         elem->statusConfig[index].needCollect = true;
         ui->lineEdit_collectionType->setReadOnly(false);
     }
     else{
-        int index = elem->getStatusValIndex(ui->listWidget_status->currentItem()->text());
         elem->statusConfig[index].needCollect = false;
         ui->lineEdit_collectionType->setReadOnly(true);
     }
@@ -1139,7 +1167,7 @@ void MainWindow::on_lineEdit_collectionType_editingFinished()
 {
     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());
+    int index = ui->listWidget_status->currentRow();
     ElemPropertyData::StatusConfig &data = elem->statusConfig[index];
     data.collTargetType = ui->lineEdit_collectionType->text();
     std::cout<<"收集的目标类型"<<qPrintable(data.collTargetType)<<std::endl;
@@ -1154,14 +1182,14 @@ void MainWindow::on_pushButton_addEvent_clicked()
     ui->tableWidget_event->insertRow(rowNum);
     ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
     ElemPropertyData::EventConfig event;
-    int index = elem->getStatusValIndex(ui->listWidget_status->currentItem()->text());
+    int index = ui->listWidget_status->currentRow();
     elem->statusConfig[index].eventConfig.push_back(event);
-    ui->tableWidget_event->setCellWidget(rowNum,0,new QComboBox);
+    ui->tableWidget_event->setCellWidget(rowNum,0,createEventBox("尚未选择"));
     ui->tableWidget_event->setCellWidget(rowNum,1,createCheckBox(false));
-    ui->tableWidget_event->setCellWidget(rowNum,3,createEffectBox("尚未选择动画"));
+    ui->tableWidget_event->setCellWidget(rowNum,3,createEffectBox("尚未选择"));
     ui->tableWidget_event->setCellWidget(rowNum,4,createCheckBox(false));
-    //设置触发动作
-    ui->tableWidget_event->setCellWidget(rowNum,5,createTriggerAction());
+    ui->tableWidget_event->setCellWidget(rowNum,5,createTriggerAction("尚未选择"));
+    ui->tableWidget_event->setCellWidget(rowNum,6,createSetButton());
 }
 
 QString MainWindow::getFileName(QString filePath)
@@ -1185,6 +1213,7 @@ QString MainWindow::getFileName(QString filePath)
 void MainWindow::on_listWidget_status_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
 {
     if(ui->listWidget_elem->currentItem() == nullptr || current == nullptr) return;
+    isSetUi = true;
     ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
     int index = elem->getStatusValIndex(current->text());
     ElemPropertyData::StatusConfig statusData = elem->statusConfig[index];
@@ -1208,7 +1237,6 @@ void MainWindow::on_listWidget_status_currentItemChanged(QListWidgetItem *curren
     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);
@@ -1221,16 +1249,16 @@ void MainWindow::on_listWidget_status_currentItemChanged(QListWidgetItem *curren
         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();
+        rowNum = ui->tableWidget_event->rowCount();
         ui->tableWidget_event->insertRow(rowNum);
         //事件名称
-        ui->tableWidget_event->setCellWidget(rowNum,0,new QComboBox);
+        ui->tableWidget_event->setCellWidget(rowNum,0,createEventBox(i.name));
+        std::cout<<"重置状态配置ui:事件名称:"<<qPrintable(i.name)<<std::endl;
         //是否需要颜色一致
         ui->tableWidget_event->setCellWidget(rowNum,1,createCheckBox(i.consisColor));
         //tableWidget_event
@@ -1240,8 +1268,11 @@ void MainWindow::on_listWidget_status_currentItemChanged(QListWidgetItem *curren
         //根据格子数量消除
         ui->tableWidget_event->setCellWidget(rowNum,4,createCheckBox(i.elimATLattices));
         //触发动作
-        ui->tableWidget_event->setCellWidget(rowNum,5,createTriggerAction());
+        ui->tableWidget_event->setCellWidget(rowNum,5,createTriggerAction(i.triggerAction));
+        //触发动作设置
+        ui->tableWidget_event->setCellWidget(rowNum,6,createSetButton());
     }
+    isSetUi = false;
 }
 
 void MainWindow::on_tableWidget_event_cellDoubleClicked(int row, int column)
@@ -1259,7 +1290,7 @@ void MainWindow::on_tableWidget_event_itemChanged(QTableWidgetItem *item)
     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());
+    int index = ui->listWidget_status->currentRow();
     QVector<ElemPropertyData::EventConfig> &eventVec = elem->statusConfig[index].eventConfig;
     if(column == 2){
         bool ok;double a = item->text().toDouble(&ok);
@@ -1277,28 +1308,120 @@ void MainWindow::on_tableWidget_event_itemChanged(QTableWidgetItem *item)
 
 void MainWindow::on_comboBox_initAnim_currentTextChanged(const QString &arg1)
 {
-    if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_status->currentItem() == nullptr) return;
+    if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_status->currentItem() == nullptr || isSetUi) return;
     std::cout<<"初始化动画:"<<qPrintable(arg1)<<std::endl;
     ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
-    int index = elem->getStatusValIndex(ui->listWidget_status->currentItem()->text());
+    int index = ui->listWidget_status->currentRow();
     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;
+    if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_status->currentItem() == nullptr || isSetUi) return;
     ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
-    int index = elem->getStatusValIndex(ui->listWidget_status->currentItem()->text());
+    int index = ui->listWidget_status->currentRow();
     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;
+    if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_status->currentItem() == nullptr || isSetUi) return;
     ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
-    int index = elem->getStatusValIndex(ui->listWidget_status->currentItem()->text());
+    int index = ui->listWidget_status->currentRow();
     elem->statusConfig[index].collAnim = arg1;
 }
 
+///模板更新后更新与模板配置相关的界面显示
+void MainWindow::updateTempRelatedUi()
+{
+    isSetUi = true;
+    //收集动画
+    ui->comboBox_animationType->clear();
+    ui->comboBox_animationType->addItem("尚未选择");
+    for(const auto &i:jsonTemp->templateMap["collAnimTemp"]) ui->comboBox_animationType->addItem(i.name);
+    //状态配置
+    int rowNum = ui->tableWidget_event->rowCount();
+    for(int i=0;i<rowNum;i++){
+        //事件名称配置
+        ui->tableWidget_event->setCellWidget(i,0,createEventBox("尚未选择"));
+        ui->tableWidget_event->setCellWidget(i,5,createTriggerAction("尚未选择"));
+    }
+    //容器池
+    ui->comboBox_container->clear();
+    ui->comboBox_container->addItem("尚未选择");
+    for(const auto &i:jsonTemp->templateMap["poolTemp"]) ui->comboBox_container->addItem(i.name);
+    int animIndex = 0,poolIndex = 0;
+
+    //若当前界面选择的选项没有被改变,仍然保持当前选项
+    if(ui->listWidget_elem->currentItem() != nullptr){
+        ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
+        //收集动画
+        if(ui->listWidget_collectAnim->currentItem() != nullptr) {
+            int index = ui->listWidget_collectAnim->currentRow();
+            std::cout<<"当前选择的收集动画类型:"<<qPrintable(elem->collAnim[index].type)<<std::endl;
+            animIndex = ui->comboBox_animationType->findText(elem->collAnim[index].type);
+            if(animIndex == -1) animIndex = 0;
+        }
+        //容器池
+        if(ui->listWidget_pool->currentItem() != nullptr){
+            int index = ui->listWidget_pool->currentRow();
+            std::cout<<"当前选择的容器类型:"<<qPrintable(elem->container[index].type)<<std::endl;
+            poolIndex = ui->comboBox_container->findText(elem->container[index].type);
+            if(poolIndex == -1) poolIndex = 0;
+        }
+        //事件配置
+        if(ui->listWidget_status->currentItem() != nullptr){
+            int index = ui->listWidget_status->currentRow();
+            int rowNum = ui->tableWidget_event->rowCount();
+            for(int i=0;i<rowNum;i++){
+                //事件配置
+                QComboBox* nameBox = dynamic_cast<QComboBox*>(ui->tableWidget_event->cellWidget(i,0));
+                QComboBox* actionBox = dynamic_cast<QComboBox*>(ui->tableWidget_event->cellWidget(i,5));
+                int eindex = nameBox->findText(elem->statusConfig[index].eventConfig[i].name);
+                if(eindex != -1) nameBox->setCurrentIndex(eindex);
+                std::cout<<"当前触发动作:"<<qPrintable(elem->statusConfig[index].eventConfig[i].triggerAction)<<std::endl;
+                int aindex = actionBox->findText(elem->statusConfig[index].eventConfig[i].triggerAction);
+                if(aindex != -1) actionBox->setCurrentIndex(aindex);
+            }
+        }
+    }
+    ui->comboBox_animationType->setCurrentIndex(animIndex);
+    ui->comboBox_container->setCurrentIndex(poolIndex);
+    isSetUi = false;
+}
+
+void MainWindow::on_reloadTempFile_triggered()
+{
+    ReadJsonSrc* tmp = jsonTemp;
+    jsonTemp = new ReadJsonSrc("/Users/menglanluo/redFiles/template.json");
+    delete tmp;
+    updateTempRelatedUi();
+}
+
+
+void MainWindow::on_comboBox_container_currentTextChanged(const QString &arg1)
+{
+    if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_pool->currentItem() ==  nullptr || isSetUi) return;
+    ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
+    int poolIndex = ui->listWidget_pool->currentRow();
+    elem->container[poolIndex].type = arg1;
+    std::cout<<"容器池第"<<poolIndex<<"行容器类型改变:"<<qPrintable(arg1)<<std::endl;
+}
+
+///删除事件
+void MainWindow::on_pushButton_delEvent_clicked()
+{
+    if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_status->currentItem() == nullptr) return;
+    if(ui->tableWidget_event->currentRow() == -1) return;
+    ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
+    QMessageBox::StandardButton reply = QMessageBox::question(this,"删除事件","确定要删除此事件吗?");
+    if(reply == QMessageBox::Yes){
+        int curRow = ui->tableWidget_event->currentRow();
+        QVector<ElemPropertyData::EventConfig> &eventTable = elem->statusConfig[ui->listWidget_status->currentRow()].eventConfig;
+        eventTable.remove(curRow);
+        ui->tableWidget_event->removeRow(curRow);
+    }
+}
+

+ 22 - 3
mainwindow.h

@@ -4,10 +4,12 @@
 #include <QMainWindow>
 #include <QListWidgetItem>
 #include <QTableWidgetItem>
-#include <elemPropertyData.h>
+#include "elemPropertyData.h"
+#include "readJsonSrc.h"
 #include <QMap>
 #include <QComboBox>
 #include <QCheckBox>
+#include <QPushButton>
 
 QT_BEGIN_NAMESPACE
 namespace Ui { class MainWindow; }
@@ -130,7 +132,16 @@ private slots:
 
     void on_comboBox_collectAnimation_currentTextChanged(const QString &arg1);
 
-    void onEffectTextChanged(const QString &arg1);
+    void onEventBoxTextChanged(const QString &arg1);
+
+    void onSetActionButtonClicked();
+
+    void on_reloadTempFile_triggered();
+
+    void on_comboBox_container_currentTextChanged(const QString &arg1);
+
+    void on_pushButton_delEvent_clicked();
+
 private:
     Ui::MainWindow *ui;
     QMap<QString,ElemPropertyData*> elements;
@@ -148,12 +159,20 @@ private:
     void setPoolUi(QString poolName);
     QString getFileName(QString filePath);
     enum class TimelineType{Animation,Pool};
+    QComboBox* createBox(QString choice,QStringList list);
     QComboBox* createTimelineBox(QString chosenTimeline,QString filename,TimelineType type);
     QComboBox* createPoolBox(QString chosenPool);
     QCheckBox* createCheckBox(bool chosen);
-    QWidget* createTriggerAction();
+    QComboBox* createTriggerAction(QString chosenAction);
     QComboBox* createEffectBox(QString chosenEffect);
+    QComboBox* createEventBox(QString chosenEvent);
+    QPushButton* createSetButton();
     void updateAnimComboBox(QString changedAnim);
     void updateCollAnimComboBox(QString changedAnim);
+    void updateTempRelatedUi();
+    ReadJsonSrc* jsonTemp;
+    //表示当前正在设置ui界面,改变时不要触发任何数据保存
+    bool isSetUi = false;
+    void createSetWindow(QString actionName);
 };
 #endif // MAINWINDOW_H

+ 273 - 275
mainwindow.ui

@@ -187,7 +187,7 @@
            <enum>QTabWidget::Triangular</enum>
           </property>
           <property name="currentIndex">
-           <number>1</number>
+           <number>2</number>
           </property>
           <property name="elideMode">
            <enum>Qt::ElideRight</enum>
@@ -347,278 +347,264 @@
            <attribute name="title">
             <string>状态配置</string>
            </attribute>
-           <widget class="QTableWidget" name="tableWidget_event">
-            <property name="geometry">
-             <rect>
-              <x>190</x>
-              <y>220</y>
-              <width>551</width>
-              <height>101</height>
-             </rect>
-            </property>
-            <property name="rowCount">
-             <number>0</number>
-            </property>
-            <property name="columnCount">
-             <number>6</number>
-            </property>
-            <column/>
-            <column/>
-            <column/>
-            <column/>
-            <column/>
-            <column/>
-           </widget>
-           <widget class="QLabel" name="label_eventConfiguration">
-            <property name="geometry">
-             <rect>
-              <x>190</x>
-              <y>190</y>
-              <width>67</width>
-              <height>16</height>
-             </rect>
-            </property>
-            <property name="text">
-             <string>事件配置:</string>
-            </property>
-           </widget>
-           <widget class="QListWidget" name="listWidget_status">
-            <property name="geometry">
-             <rect>
-              <x>10</x>
-              <y>20</y>
-              <width>101</width>
-              <height>301</height>
-             </rect>
-            </property>
-           </widget>
-           <widget class="QPushButton" name="pushButton_addStatus">
-            <property name="geometry">
-             <rect>
-              <x>0</x>
-              <y>330</y>
-              <width>81</width>
-              <height>31</height>
-             </rect>
-            </property>
-            <property name="text">
-             <string>添加</string>
-            </property>
-           </widget>
-           <widget class="QPushButton" name="pushButton_delStatus">
-            <property name="geometry">
-             <rect>
-              <x>80</x>
-              <y>330</y>
-              <width>81</width>
-              <height>31</height>
-             </rect>
-            </property>
-            <property name="text">
-             <string>删除</string>
-            </property>
-           </widget>
-           <widget class="QPushButton" name="pushButton_genTemp">
-            <property name="geometry">
-             <rect>
-              <x>30</x>
-              <y>360</y>
-              <width>113</width>
-              <height>32</height>
-             </rect>
-            </property>
-            <property name="text">
-             <string>生成模板</string>
-            </property>
-           </widget>
-           <widget class="QPushButton" name="pushButton_addEvent">
-            <property name="geometry">
-             <rect>
-              <x>180</x>
-              <y>330</y>
-              <width>113</width>
-              <height>32</height>
-             </rect>
-            </property>
-            <property name="text">
-             <string>添加事件</string>
-            </property>
-           </widget>
-           <widget class="QPushButton" name="pushButton_delEvent">
-            <property name="geometry">
-             <rect>
-              <x>290</x>
-              <y>330</y>
-              <width>113</width>
-              <height>32</height>
-             </rect>
-            </property>
-            <property name="text">
-             <string>删除事件</string>
-            </property>
-           </widget>
-           <widget class="QWidget" name="layoutWidget">
-            <property name="geometry">
-             <rect>
-              <x>190</x>
-              <y>20</y>
-              <width>571</width>
-              <height>171</height>
-             </rect>
-            </property>
-            <layout class="QVBoxLayout" name="verticalLayout_5">
-             <item>
-              <layout class="QHBoxLayout" name="horizontalLayout_25">
-               <item>
-                <widget class="QLabel" name="label_initialAnimation">
-                 <property name="text">
-                  <string>初始化动画:</string>
-                 </property>
-                </widget>
-               </item>
-               <item>
-                <widget class="QComboBox" name="comboBox_initAnim"/>
-               </item>
-               <item>
-                <spacer name="horizontalSpacer_7">
-                 <property name="orientation">
-                  <enum>Qt::Horizontal</enum>
-                 </property>
-                 <property name="sizeHint" stdset="0">
-                  <size>
-                   <width>298</width>
-                   <height>18</height>
-                  </size>
-                 </property>
-                </spacer>
-               </item>
-              </layout>
-             </item>
-             <item>
-              <layout class="QHBoxLayout" name="horizontalLayout_23">
-               <item>
-                <widget class="QLabel" name="label_clickAnimation">
-                 <property name="text">
-                  <string>点击动画:</string>
-                 </property>
-                </widget>
-               </item>
-               <item>
-                <widget class="QComboBox" name="comboBox_clickAnim"/>
-               </item>
-               <item>
-                <spacer name="horizontalSpacer_4">
-                 <property name="orientation">
-                  <enum>Qt::Horizontal</enum>
-                 </property>
-                 <property name="sizeHint" stdset="0">
-                  <size>
-                   <width>298</width>
-                   <height>18</height>
-                  </size>
-                 </property>
-                </spacer>
-               </item>
-              </layout>
-             </item>
-             <item>
-              <layout class="QHBoxLayout" name="horizontalLayout_24">
-               <item>
-                <widget class="QCheckBox" name="checkBox_multiHit">
-                 <property name="text">
-                  <string>支持多重打击</string>
-                 </property>
-                </widget>
-               </item>
-               <item>
-                <spacer name="horizontalSpacer_5">
-                 <property name="orientation">
-                  <enum>Qt::Horizontal</enum>
-                 </property>
-                 <property name="sizeHint" stdset="0">
-                  <size>
-                   <width>88</width>
-                   <height>20</height>
-                  </size>
-                 </property>
-                </spacer>
-               </item>
-               <item>
-                <widget class="QCheckBox" name="checkBox_dropable">
-                 <property name="text">
-                  <string>可掉落</string>
-                 </property>
-                </widget>
-               </item>
-               <item>
-                <spacer name="horizontalSpacer_6">
-                 <property name="orientation">
-                  <enum>Qt::Horizontal</enum>
-                 </property>
-                 <property name="sizeHint" stdset="0">
-                  <size>
-                   <width>138</width>
-                   <height>28</height>
-                  </size>
-                 </property>
-                </spacer>
-               </item>
-              </layout>
-             </item>
-             <item>
-              <layout class="QHBoxLayout" name="horizontalLayout_26">
-               <item>
-                <widget class="QCheckBox" name="checkBox_needCollect">
-                 <property name="text">
-                  <string>是否需要收集</string>
-                 </property>
-                </widget>
-               </item>
-               <item>
-                <spacer name="horizontalSpacer_8">
-                 <property name="orientation">
-                  <enum>Qt::Horizontal</enum>
-                 </property>
-                 <property name="sizeHint" stdset="0">
-                  <size>
-                   <width>40</width>
-                   <height>20</height>
-                  </size>
-                 </property>
-                </spacer>
-               </item>
-               <item>
-                <layout class="QHBoxLayout" name="horizontalLayout_27">
-                 <item>
-                  <widget class="QLabel" name="label_cellectionType">
-                   <property name="text">
-                    <string>收集的目标类型:</string>
-                   </property>
-                  </widget>
-                 </item>
-                 <item>
-                  <widget class="QLineEdit" name="lineEdit_collectionType"/>
-                 </item>
-                </layout>
-               </item>
-               <item>
-                <layout class="QHBoxLayout" name="horizontalLayout_28">
-                 <item>
-                  <widget class="QLabel" name="label_collectAnimation">
-                   <property name="text">
-                    <string>收集动画:</string>
-                   </property>
-                  </widget>
-                 </item>
-                 <item>
-                  <widget class="QComboBox" name="comboBox_collectAnimation"/>
-                 </item>
-                </layout>
-               </item>
-              </layout>
-             </item>
-            </layout>
-           </widget>
+           <layout class="QHBoxLayout" name="horizontalLayout_32">
+            <item>
+             <widget class="QSplitter" name="splitter_4">
+              <property name="orientation">
+               <enum>Qt::Horizontal</enum>
+              </property>
+              <widget class="QWidget" name="">
+               <layout class="QVBoxLayout" name="verticalLayout_13">
+                <item>
+                 <widget class="QListWidget" name="listWidget_status"/>
+                </item>
+                <item>
+                 <layout class="QHBoxLayout" name="horizontalLayout_30">
+                  <item>
+                   <widget class="QPushButton" name="pushButton_addStatus">
+                    <property name="text">
+                     <string>添加</string>
+                    </property>
+                   </widget>
+                  </item>
+                  <item>
+                   <widget class="QPushButton" name="pushButton_delStatus">
+                    <property name="text">
+                     <string>删除</string>
+                    </property>
+                   </widget>
+                  </item>
+                 </layout>
+                </item>
+                <item>
+                 <widget class="QPushButton" name="pushButton_genTemp">
+                  <property name="text">
+                   <string>生成模板</string>
+                  </property>
+                 </widget>
+                </item>
+               </layout>
+              </widget>
+              <widget class="QWidget" name="">
+               <layout class="QVBoxLayout" name="verticalLayout_15">
+                <item>
+                 <layout class="QVBoxLayout" name="verticalLayout_5">
+                  <item>
+                   <layout class="QHBoxLayout" name="horizontalLayout_25">
+                    <item>
+                     <widget class="QLabel" name="label_initialAnimation">
+                      <property name="text">
+                       <string>初始化动画:</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QComboBox" name="comboBox_initAnim"/>
+                    </item>
+                    <item>
+                     <spacer name="horizontalSpacer_7">
+                      <property name="orientation">
+                       <enum>Qt::Horizontal</enum>
+                      </property>
+                      <property name="sizeHint" stdset="0">
+                       <size>
+                        <width>298</width>
+                        <height>18</height>
+                       </size>
+                      </property>
+                     </spacer>
+                    </item>
+                   </layout>
+                  </item>
+                  <item>
+                   <layout class="QHBoxLayout" name="horizontalLayout_23">
+                    <item>
+                     <widget class="QLabel" name="label_clickAnimation">
+                      <property name="text">
+                       <string>点击动画:</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QComboBox" name="comboBox_clickAnim"/>
+                    </item>
+                    <item>
+                     <spacer name="horizontalSpacer_4">
+                      <property name="orientation">
+                       <enum>Qt::Horizontal</enum>
+                      </property>
+                      <property name="sizeHint" stdset="0">
+                       <size>
+                        <width>298</width>
+                        <height>18</height>
+                       </size>
+                      </property>
+                     </spacer>
+                    </item>
+                   </layout>
+                  </item>
+                  <item>
+                   <layout class="QHBoxLayout" name="horizontalLayout_24">
+                    <item>
+                     <widget class="QCheckBox" name="checkBox_multiHit">
+                      <property name="text">
+                       <string>支持多重打击</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <spacer name="horizontalSpacer_5">
+                      <property name="orientation">
+                       <enum>Qt::Horizontal</enum>
+                      </property>
+                      <property name="sizeHint" stdset="0">
+                       <size>
+                        <width>88</width>
+                        <height>20</height>
+                       </size>
+                      </property>
+                     </spacer>
+                    </item>
+                    <item>
+                     <widget class="QCheckBox" name="checkBox_dropable">
+                      <property name="text">
+                       <string>可掉落</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <spacer name="horizontalSpacer_6">
+                      <property name="orientation">
+                       <enum>Qt::Horizontal</enum>
+                      </property>
+                      <property name="sizeHint" stdset="0">
+                       <size>
+                        <width>138</width>
+                        <height>28</height>
+                       </size>
+                      </property>
+                     </spacer>
+                    </item>
+                   </layout>
+                  </item>
+                  <item>
+                   <layout class="QHBoxLayout" name="horizontalLayout_26">
+                    <item>
+                     <widget class="QCheckBox" name="checkBox_needCollect">
+                      <property name="text">
+                       <string>是否需要收集</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <spacer name="horizontalSpacer_8">
+                      <property name="orientation">
+                       <enum>Qt::Horizontal</enum>
+                      </property>
+                      <property name="sizeHint" stdset="0">
+                       <size>
+                        <width>40</width>
+                        <height>20</height>
+                       </size>
+                      </property>
+                     </spacer>
+                    </item>
+                    <item>
+                     <layout class="QHBoxLayout" name="horizontalLayout_27">
+                      <item>
+                       <widget class="QLabel" name="label_cellectionType">
+                        <property name="text">
+                         <string>收集的目标类型:</string>
+                        </property>
+                       </widget>
+                      </item>
+                      <item>
+                       <widget class="QLineEdit" name="lineEdit_collectionType"/>
+                      </item>
+                     </layout>
+                    </item>
+                    <item>
+                     <layout class="QHBoxLayout" name="horizontalLayout_28">
+                      <item>
+                       <widget class="QLabel" name="label_collectAnimation">
+                        <property name="text">
+                         <string>收集动画:</string>
+                        </property>
+                       </widget>
+                      </item>
+                      <item>
+                       <widget class="QComboBox" name="comboBox_collectAnimation"/>
+                      </item>
+                     </layout>
+                    </item>
+                   </layout>
+                  </item>
+                 </layout>
+                </item>
+                <item>
+                 <layout class="QVBoxLayout" name="verticalLayout_14">
+                  <item>
+                   <widget class="QLabel" name="label_eventConfiguration">
+                    <property name="text">
+                     <string>事件配置:</string>
+                    </property>
+                   </widget>
+                  </item>
+                  <item>
+                   <widget class="QTableWidget" name="tableWidget_event">
+                    <property name="rowCount">
+                     <number>0</number>
+                    </property>
+                    <property name="columnCount">
+                     <number>7</number>
+                    </property>
+                    <column/>
+                    <column/>
+                    <column/>
+                    <column/>
+                    <column/>
+                    <column/>
+                    <column/>
+                   </widget>
+                  </item>
+                  <item>
+                   <layout class="QHBoxLayout" name="horizontalLayout_31">
+                    <item>
+                     <widget class="QPushButton" name="pushButton_addEvent">
+                      <property name="text">
+                       <string>添加事件</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <widget class="QPushButton" name="pushButton_delEvent">
+                      <property name="text">
+                       <string>删除事件</string>
+                      </property>
+                     </widget>
+                    </item>
+                    <item>
+                     <spacer name="horizontalSpacer_11">
+                      <property name="orientation">
+                       <enum>Qt::Horizontal</enum>
+                      </property>
+                      <property name="sizeHint" stdset="0">
+                       <size>
+                        <width>40</width>
+                        <height>20</height>
+                       </size>
+                      </property>
+                     </spacer>
+                    </item>
+                   </layout>
+                  </item>
+                 </layout>
+                </item>
+               </layout>
+              </widget>
+             </widget>
+            </item>
+           </layout>
           </widget>
           <widget class="QWidget" name="tab_container_2">
            <attribute name="title">
@@ -630,7 +616,7 @@
               <property name="orientation">
                <enum>Qt::Horizontal</enum>
               </property>
-              <widget class="QWidget" name="">
+              <widget class="QWidget" name="layoutWidget">
                <layout class="QVBoxLayout" name="verticalLayout_10">
                 <item>
                  <layout class="QHBoxLayout" name="horizontalLayout_9">
@@ -679,7 +665,7 @@
                 </item>
                </layout>
               </widget>
-              <widget class="QWidget" name="">
+              <widget class="QWidget" name="layoutWidget">
                <layout class="QVBoxLayout" name="verticalLayout_9">
                 <item>
                  <layout class="QHBoxLayout" name="horizontalLayout_29">
@@ -864,8 +850,20 @@
      <height>24</height>
     </rect>
    </property>
+   <widget class="QMenu" name="menu">
+    <property name="title">
+     <string>文件</string>
+    </property>
+    <addaction name="reloadTempFile"/>
+   </widget>
+   <addaction name="menu"/>
   </widget>
   <widget class="QStatusBar" name="statusbar"/>
+  <action name="reloadTempFile">
+   <property name="text">
+    <string>Reload TempFile</string>
+   </property>
+  </action>
  </widget>
  <resources/>
  <connections/>

+ 16 - 6
readJsonSrc.cpp

@@ -4,6 +4,7 @@
 #include <QFile>
 #include <iostream>
 #include <QVector>
+#include <QJsonArray>
 
 ReadJsonSrc::ReadJsonSrc(QString filePath)
 {
@@ -19,23 +20,23 @@ ReadJsonSrc::ReadJsonSrc(QString filePath)
 void ReadJsonSrc::readJsonObj(QJsonObject obj)
 {
     //收集动画
-    QJsonObject collAnim = obj["coll_template"].toObject();
+    QJsonArray collAnim = obj["coll_template"].toArray();
     templateMap["collAnimTemp"] = readTemplate(collAnim);
     //事件
-    QJsonObject event = obj["event_template"].toObject();
+    QJsonArray event = obj["event_template"].toArray();
     templateMap["eventTemp"] = readTemplate(event);
     //动作
-    QJsonObject action = obj["action_template"].toObject();
+    QJsonArray action = obj["action_template"].toArray();
     templateMap["actionTemp"] = readTemplate(action);
     //容器池
-    QJsonObject pool = obj["pool_template"].toObject();
+    QJsonArray pool = obj["pool_template"].toArray();
     templateMap["poolTemp"] = readTemplate(pool);
 }
 
-QVector<ReadJsonSrc::Template> ReadJsonSrc::readTemplate(QJsonObject obj)
+QVector<ReadJsonSrc::Template> ReadJsonSrc::readTemplate(QJsonArray arr)
 {
     QVector<Template> tempVec;
-    for(const auto &i:obj){
+    for(const auto &i:arr){
         QJsonObject tempObj = i.toObject();
         Template temp(tempObj["name"].toString(),tempObj["id"].toString());
         QVector<Fields> fields;
@@ -51,3 +52,12 @@ QVector<ReadJsonSrc::Template> ReadJsonSrc::readTemplate(QJsonObject obj)
     }
     return tempVec;
 }
+
+int ReadJsonSrc::getTemplateIndex(QString key,QString name)
+{
+    QVector<Template> tempVec = templateMap[key];
+    for(int i=0;i<tempVec.size();i++){
+        if(tempVec[i].name == name) return i;
+    }
+    return -1;;
+}

+ 2 - 1
readJsonSrc.h

@@ -26,7 +26,8 @@ public:
     //读取json配置文件内容并存数据
     void readJsonObj(QJsonObject obj);
     //读取模板内容
-    QVector<Template> readTemplate(QJsonObject obj);
+    QVector<Template> readTemplate(QJsonArray arr);
+    int getTemplateIndex(QString key,QString name);
 };
 
 #endif // READJSONSRC_H