Quellcode durchsuchen

完善容器池界面分离并添加元素部分数据保存

Menglan_Luo vor 2 Jahren
Ursprung
Commit
02d0a9dcf7
11 geänderte Dateien mit 650 neuen und 726 gelöschten Zeilen
  1. 135 0
      dataManager.cpp
  2. 24 1
      dataManager.h
  3. 41 12
      elemPropertyData.cpp
  4. 8 4
      elemPropertyData.h
  5. 0 9
      main.cpp
  6. 24 414
      mainwindow.cpp
  7. 0 48
      mainwindow.h
  8. 1 228
      mainwindow.ui
  9. 369 8
      pool.cpp
  10. 46 0
      pool.h
  11. 2 2
      statusEffectAnim.cpp

+ 135 - 0
dataManager.cpp

@@ -1,5 +1,7 @@
 #include "dataManager.h"
 #include <iostream>
+#include <QFile>
+#include <QJsonDocument>
 
 DataManager* DataManager::getInstance()
 {
@@ -10,11 +12,13 @@ DataManager* DataManager::getInstance()
 DataManager::DataManager()
 {
     jsonTemp = new ReadJsonSrc(":/file/file/template.json");
+    loadData();
 }
 
 DataManager::~DataManager()
 {
     delete jsonTemp;
+    saveData();
 }
 
 //模板配置
@@ -57,6 +61,10 @@ QStringList DataManager::getList(QString elem,ListType listType)
     else if(listType == ListType::Actions){
         for(const auto &i:jsonTemp->templateMap["actionTemp"]) list.push_back(i.name);
     }
+    else if(listType == ListType::PoolType){
+        for(const auto &i:jsonTemp->templateMap["poolTemp"]) list.push_back(i.name);
+    }
+    else if(listType == ListType::Elem) return elements.keys();
     return list;
 }
 
@@ -277,3 +285,130 @@ ElemPropertyData::ContainerConfig DataManager::getContainData(QString elem,int i
 {
     return elements[elem]->container[index];
 }
+void DataManager::changeContainTable(QString elem, int index, int row, int column, QString data)
+{
+    QVector<ElemPropertyData::ContainTable> &table = elements[elem]->container[index].table;
+    if(column == 0) table[row].key = data;
+    else if(column == 1) table[row].res = data;
+    else if(column == 2) table[row].initTimeline = data;
+    else if(column == 3) table[row].clickTimeline = data;
+    else if(column == 4) table[row].effectTimeline = data;
+    else if(column == 5) table[row].vanishTimeline = data;
+    else if(column == 6) table[row].zOrder = data;
+}
+bool DataManager::existPool(QString elem, QString poolName)
+{
+    if(elements[elem]->getPoolIndex(poolName) == -1) return false;
+    return true;
+}
+void DataManager::addPool(QString elem, QString poolName)
+{
+    ElemPropertyData::ContainerConfig pool(poolName);
+    elements[elem]->container.push_back(pool);
+}
+void DataManager::delPool(QString elem, int index)
+{
+    elements[elem]->container.remove(index);
+}
+void DataManager::changePoolName(QString elem, int index, QString newName)
+{
+    elements[elem]->container[index].poolName = newName;
+}
+bool DataManager::existKey(QString elem,int poolIndex,QString key)
+{
+    if(elements[elem]->getKeyIndex(poolIndex,key) == -1) return false;
+    return true;
+}
+void DataManager::addKey(QString elem, int poolIndex,QString keyName)
+{
+    ElemPropertyData::ContainTable key(keyName);
+    elements[elem]->container[poolIndex].table.push_back(key);
+}
+void DataManager::delKey(QString elem, int poolIndex, int row)
+{
+    elements[elem]->container[poolIndex].table.remove(row);
+}
+void DataManager::changeContainType(QString elem, int poolIndex, QString poolType)
+{
+    elements[elem]->container[poolIndex].type = poolType;
+}
+
+//子元素
+QVector<ElemPropertyData::ChildElem> DataManager::getChildElemTable(QString elem)
+{
+    return elements[elem]->childElem;
+}
+void DataManager::changeChildElemTable(QString elem, int row, int column, QString data)
+{
+    QVector<ElemPropertyData::ChildElem> &table = elements[elem]->childElem;
+    if(column == 0) table[row].name = data;
+    else if(column == 1) table[row].container = data;
+}
+bool DataManager::existChildElem(QString elem, QString childElemName)
+{
+    if(elements[elem]->getChildElemIndex(childElemName) == -1) return false;
+    return true;
+}
+void DataManager::addChildElem(QString elem, QString childElemName)
+{
+    ElemPropertyData::ChildElem childElem(childElemName);
+    elements[elem]->childElem.push_back(childElem);
+}
+void DataManager::delChildElem(QString elem, int index)
+{
+    elements[elem]->childElem.remove(index);
+}
+
+//数据保存
+///加载数据
+bool DataManager::loadData()
+{
+    QFile loadFile("data.json");
+    if(!loadFile.open(QIODevice::ReadOnly)){
+        qWarning("can't open data file!");
+        return false;
+    }
+    QJsonDocument loadDoc(QJsonDocument::fromJson(loadFile.readAll()));
+    read(loadDoc.object());
+    return true;
+}
+
+///读数据
+void DataManager::read(const QJsonObject &json)
+{
+    elements.clear();
+    QStringList keys = json.keys();
+    for(int i=0;i<keys.size();i++)
+    {
+        QString elem = keys[i];
+        elements[elem] = new ElemPropertyData();
+        elements[elem]->readFundData(json[elem].toObject());
+    }
+}
+
+///写数据
+void DataManager::write(QJsonObject &json) const
+{
+    QStringList keys = elements.keys();
+    for(int i=0;i<keys.size();i++)
+    {
+        QString elem = keys[i];
+        QJsonObject obj;
+        elements[elem]->writeFundData(obj);
+        json.insert(elem,obj);
+    }
+}
+
+///保存数据
+bool DataManager::saveData()
+{
+    QFile saveFile("data.json");
+    if(!saveFile.open(QIODevice::WriteOnly)){
+        qWarning("can't open data file!");
+        return false;
+    }
+    QJsonObject dataObj;
+    write(dataObj);
+    saveFile.write(QJsonDocument(dataObj).toJson());
+    return true;
+}

+ 24 - 1
dataManager.h

@@ -12,7 +12,7 @@ public:
     QVector<ReadJsonSrc::Fields> getTempFields(QString key,QString name);
     ///更新模板
     void updateTempData();
-    enum class ListType{Anim,CollAnim,Pool,AnimType,StatusVal,Events,Actions};
+    enum class ListType{Anim,CollAnim,Pool,AnimType,StatusVal,Events,Actions,PoolType,Elem};
     ///获取某一元素对应的动画、收集动画、容器列表
     QStringList getList(QString elem,ListType listType);
     ///检查是否存在此元素
@@ -76,6 +76,29 @@ public:
 
     //容器池
     ElemPropertyData::ContainerConfig getContainData(QString elem,int index);
+    void changeContainTable(QString elem,int index,int row,int column,QString data);
+    bool existPool(QString elem,QString poolName);
+    void addPool(QString elem,QString poolName);
+    void delPool(QString elem,int index);
+    void changePoolName(QString elem,int index,QString newName);
+    bool existKey(QString elem,int poolIndex,QString key);
+    void addKey(QString elem,int poolIndex,QString keyName);
+    void delKey(QString elem,int poolIndex,int row);
+    void changeContainType(QString elem,int poolIndex,QString poolType);
+
+    //子元素
+    QVector<ElemPropertyData::ChildElem> getChildElemTable(QString elem);
+    void changeChildElemTable(QString elem,int row,int column,QString data);
+    bool existChildElem(QString elem,QString childElemName);
+    void addChildElem(QString elem,QString childElemName);
+    void delChildElem(QString elem,int index);
+
+    //数据保存
+    bool loadData();
+    bool saveData();
+    void read(const QJsonObject &json);
+    void write(QJsonObject &json) const;
+
 private:
     DataManager();
     ~DataManager();

+ 41 - 12
elemPropertyData.cpp

@@ -3,30 +3,28 @@
 
 ElemPropertyData::ElemPropertyData()
 {
-    //TODO: 把默认图标变成程序内部资源
     iconPath = ":/icon/icon/菜狗.png";
     dropConfig = 0;
 }
 
-bool ElemPropertyData::isSingleContainerKey(QString poolKey,QString newKey)
+int ElemPropertyData::getKeyIndex(int poolIndex, QString key)
 {
-    int index = getPoolIndex(poolKey);
-    for(const auto &i:container[index].table){
-        if(newKey == i.key){
-            return false;
+    for(int i = 0;i<container[poolIndex].table.size();i++){
+        if(key == container[poolIndex].table[i].key){
+            return i;
         }
     }
-    return true;
+    return -1;
 }
 
-bool ElemPropertyData::isSingleChildElemName(QString newName)
+int ElemPropertyData::getChildElemIndex(QString childElemName)
 {
-    for(const auto &i:childElem){
-        if(newName == i.name){
-            return false;
+    for(int i=0;i<childElem.size();i++){
+        if(childElemName == childElem[i].name){
+            return i;
         }
     }
-    return true;
+    return -1;
 }
 
 int ElemPropertyData::getAnimIndex(QString animName)
@@ -78,3 +76,34 @@ QList<QString> ElemPropertyData::getTimelineList(QString filePath)
     return timelineListMap[filePath];
 }
 
+void ElemPropertyData::readFundData(const QJsonObject &json)
+{
+    if(json.contains("labelName") && json["labelName"].isString()){
+        labelName = json["labelName"].toString();
+    }
+    if(json.contains("size") && json["size"].isString()){
+        size = json["size"].toString();
+    }
+    if(json.contains("maxLayer") && json["maxLayer"].isString()){
+        maxLayer = json["maxLayer"].toString();
+    }
+    if(json.contains("score") && json["score"].isString()){
+        score = json["score"].toString();
+    }
+    if(json.contains("dropConfig") && json["maxLayer"].isDouble()){
+        dropConfig = json["dropConfig"].toInt();
+    }
+    if(json.contains("iconPath") && json["iconPath"].isString()){
+        iconPath = json["iconPath"].toString();
+    }
+}
+
+void ElemPropertyData::writeFundData(QJsonObject &json) const
+{
+    json["labelName"] = labelName;
+    json["size"] = size;
+    json["maxLayer"] = maxLayer;
+    json["score"] = score;
+    json["dropConfig"] = dropConfig;
+    json["iconPath"] = iconPath;
+}

+ 8 - 4
elemPropertyData.h

@@ -3,6 +3,7 @@
 #include <QString>
 #include <QVector>
 #include <QMap>
+#include <QJsonObject>
 
 class ElemPropertyData
 {
@@ -22,7 +23,7 @@ public:
         QString res;
         QString timeline;
         QString zOrder;
-        StatusEffect(QString animName):name(animName),res("双击添加资源文件"){}
+        StatusEffect(QString animName):name(animName),res("双击添加资源文件"),timeline("尚未选择"),zOrder("0"){}
     };
     QVector<StatusEffect> statusEffect;
 
@@ -70,7 +71,8 @@ public:
         QString effectTimeline;
         QString vanishTimeline;
         QString zOrder;
-        ContainTable(QString keyName):key(keyName),res("双击添加资源文件"){}
+        ContainTable(QString keyName):key(keyName),res("双击添加资源文件"),initTimeline("尚未选择"),
+            clickTimeline("尚未选择"),effectTimeline("尚未选择"),vanishTimeline("尚未选择"),zOrder("0"){}
     };
 
     struct ContainerConfig{
@@ -88,14 +90,16 @@ public:
         ChildElem(QString childElemName):name(childElemName),container("尚未选择"){}
     };
     QVector<ChildElem> childElem;
-    bool isSingleContainerKey(QString poolKey,QString newKey);
-    bool isSingleChildElemName(QString newName);
+    int getChildElemIndex(QString childElemName);
+    int getKeyIndex(int poolIndex,QString key);
     int getAnimIndex(QString animName);
     int getCollAnimIndex(QString name);
     int getStatusValIndex(QString statusVal);
     int getPoolIndex(QString poolName);
     QList<QString> getTimelineList(QString filePath);
     QMap<QString,QList<QString>> timelineListMap;
+    void readFundData(const QJsonObject &json);
+    void writeFundData(QJsonObject &json) const;
 };
 
 #endif // ELEMPROPERTYDATA_H

+ 0 - 9
main.cpp

@@ -10,13 +10,4 @@ int main(int argc, char *argv[])
     MainWindow w;
     w.show();
     return a.exec();
-//    ReadJsonSrc src("/Users/menglanluo/redFiles/template.json");
-//    ActionSettingDialog dialog;
-//    QVector<ReadJsonSrc::Fields> fields = src.templateMap["collAnimTemp"][0].fields;
-//    QMap<QString,QString> mapData;
-//    mapData["动画"] = "lml";
-//    mapData["节点"] = "竹节";
-//    mapData["阴影"] = "球形";
-//    dialog.setDialogUi(fields,mapData,{"lml","ddd","aaa","baf"});
-//    dialog.exec();
 }

+ 24 - 414
mainwindow.cpp

@@ -27,6 +27,13 @@ MainWindow::MainWindow(QWidget *parent)
     ui->label_pic->setPixmap(pix.scaled(50,50,Qt::KeepAspectRatio));
     this->setAcceptDrops(true);
     ui->tabWidget->setCurrentIndex(0);
+    QStringList elements = DataManager::getInstance()->getList("",DataManager::ListType::Elem);
+    //初始时刻,加载列表元素
+    for(int i=0;i<elements.size();i++){
+        QString elemName = elements[i];
+        QListWidgetItem* item = new QListWidgetItem(QIcon(DataManager::getInstance()->getIconPath(elemName)),elemName);
+        ui->listWidget_elem->addItem(item);
+    }
 }
 
 MainWindow::~MainWindow()
@@ -34,46 +41,6 @@ MainWindow::~MainWindow()
     delete ui;
 }
 
-///创建普通下拉选项
-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;
-}
-
-///创建一个时间线下拉选项
-QComboBox* MainWindow::createTimelineBox(QString chosenTimeline,QString fileName,TimelineType type)
-{
-    ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
-    QComboBox* timeLine = new QComboBox;
-    if(fileName == "双击添加资源文件") return timeLine;
-    QStringList list = elem->getTimelineList(fileName);
-    timeLine = createBox(chosenTimeline,list);
-    if(type == TimelineType::Animation){
-        connect(timeLine,SIGNAL(currentTextChanged(QString)),this,SLOT(onTimelineTextChanged(QString)));
-    }
-    else if(type == TimelineType::Pool){
-        connect(timeLine,SIGNAL(currentTextChanged(QString)),this,SLOT(onPoolTimelineTextChanged(QString)));
-    }
-    return timeLine;
-}
-
-///创建一个使用池子下拉选项
-QComboBox* MainWindow::createPoolBox(QString chosenPool)
-{
-    ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
-    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;
-}
-
 ///切换元素时重置界面数据
 void MainWindow::setUi(QString elem)
 {
@@ -98,27 +65,14 @@ void MainWindow::setUi(QString elem)
     ui->lineEdit_score->setText(DataManager::getInstance()->getScore(elem));
     ui->spinBox_drop->setValue(DataManager::getInstance()->getDropConfig(elem));
 
-    //TODO:调用各个界面的刷新显示
     //设置状态与效果动画表格显示
     animUi->setUi(elem);
     collAnimUi->setUi(elem);
     statusConfigUi->setUi(elem);
     poolUi->setUi(elem);
-
-
-//    //设置子元素界面
-//    rowCnt = ui->tableWidget_childElem->rowCount();
-//    for(int i=0;i<rowCnt;i++){
-//        ui->tableWidget_childElem->removeRow(0);
-//    }
-//    for(const auto &i:elem->childElem){
-//        int rowNum = ui->tableWidget_childElem->rowCount();
-//        ui->tableWidget_childElem->insertRow(rowNum);
-//        ui->tableWidget_childElem->setItem(rowNum,0,new QTableWidgetItem(i.name));
-//        ui->tableWidget_childElem->setCellWidget(rowNum,1,createPoolBox(i.container));
-//    }
 }
 
+///选择文件按钮
 void MainWindow::on_pushButton_chooseFile_clicked()
 {
     //如果未选中列表中的按钮,无法触发此按钮
@@ -134,7 +88,7 @@ void MainWindow::on_pushButton_chooseFile_clicked()
     DataManager::getInstance()->changeIconPath(elem,file_name);
 }
 
-
+///添加元素
 void MainWindow::on_pushButton_addElem_clicked()
 {
     QString elemName = "新加元素";
@@ -150,7 +104,7 @@ void MainWindow::on_pushButton_addElem_clicked()
     DataManager::getInstance()->addElem(elemName);
 }
 
-
+///删除元素
 void MainWindow::on_pushButton_delElem_clicked()
 {
     if(ui->listWidget_elem->currentItem() == nullptr) return;
@@ -162,7 +116,7 @@ void MainWindow::on_pushButton_delElem_clicked()
     }
 }
 
-
+///修改元素名字
 void MainWindow::on_listWidget_elem_itemDoubleClicked(QListWidgetItem *item)
 {
     ChangeNameDialog newName;
@@ -181,6 +135,7 @@ void MainWindow::on_listWidget_elem_itemDoubleClicked(QListWidgetItem *item)
 }
 
 //基础元素数据变化触发保存
+///标示值修改
 void MainWindow::on_lineEdit_name_editingFinished()
 {
     if(ui->listWidget_elem->currentItem() == nullptr) return;
@@ -188,6 +143,7 @@ void MainWindow::on_lineEdit_name_editingFinished()
     DataManager::getInstance()->changeMarkValue(key,ui->lineEdit_name->text());
 }
 
+///大小修改
 void MainWindow::on_lineEdit_size_editingFinished()
 {
     if(ui->listWidget_elem->currentItem() == nullptr) return;
@@ -195,6 +151,7 @@ void MainWindow::on_lineEdit_size_editingFinished()
     DataManager::getInstance()->changeSize(key,ui->lineEdit_size->text());
 }
 
+///最大层数修改
 void MainWindow::on_lineEdit_maxlayer_editingFinished()
 {
     if(ui->listWidget_elem->currentItem() == nullptr) return;
@@ -202,6 +159,7 @@ void MainWindow::on_lineEdit_maxlayer_editingFinished()
     DataManager::getInstance()->changeMaxLayer(key,ui->lineEdit_maxlayer->text());
 }
 
+///分数修改
 void MainWindow::on_lineEdit_score_editingFinished()
 {
     if(ui->listWidget_elem->currentItem() == nullptr) return;
@@ -209,7 +167,7 @@ void MainWindow::on_lineEdit_score_editingFinished()
     DataManager::getInstance()->changeScore(key,ui->lineEdit_score->text());
 }
 
-
+///掉落值修改
 void MainWindow::on_spinBox_drop_valueChanged(int arg1)
 {
     if(ui->listWidget_elem->currentItem() == nullptr) return;
@@ -217,299 +175,12 @@ void MainWindow::on_spinBox_drop_valueChanged(int arg1)
     DataManager::getInstance()->changeDropConfig(key,arg1);
 }
 
-
+///更换选中元素
 void MainWindow::on_listWidget_elem_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
 {
    setUi(current->text());
 }
 
-///容器池区时间线数据发生改变
-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());
-    int x = timeline->frameGeometry().x();
-    int y = timeline->frameGeometry().y();
-    QModelIndex index = ui->tableWidget_containerPool->indexAt(QPoint(x,y));
-    int row = index.row();
-    int column = index.column();
-    //修改数据
-    ElemPropertyData* elem = elements[ui->listWidget_elem->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;
-}
-
-///子元素使用池子数据发生改变
-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();
-    int y = pools->frameGeometry().y();
-    QModelIndex index = ui->tableWidget_childElem->indexAt(QPoint(x,y));
-    int row = index.row();
-    //修改数据
-    ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
-    elem->childElem[row].container = arg1;
-}
-
-
-void MainWindow::on_pushButton_addContainer_clicked()
-{
-    if(ui->listWidget_elem->currentItem() == nullptr) return;
-    QString poolName = "pool";
-    ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
-    int id = 1;
-    while(1){
-        if(elem->getPoolIndex(poolName) == -1){
-            break;
-        }
-        poolName = "pool" + QString::number(id++);
-    }
-    ui->listWidget_pool->addItem(new QListWidgetItem(poolName));
-    ElemPropertyData::ContainerConfig container(poolName);
-    elem->container.push_back(container);
-    //子元素下拉列表添加可选项
-    int rowNum = ui->tableWidget_childElem->rowCount();
-    for(int i=0;i<rowNum;i++){
-        QComboBox *containers = qobject_cast<QComboBox*>(ui->tableWidget_childElem->cellWidget(i,1));
-        containers->addItem(poolName);
-    }
-}
-
-
-void MainWindow::on_pushButton_delContainer_clicked()
-{
-    if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_pool->currentItem() == nullptr) return;
-    ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
-    QMessageBox::StandardButton reply = QMessageBox::question(this,"删除容器","确定要删除此容器吗?");
-    if(reply == QMessageBox::Yes){
-        QString delPoolName = ui->listWidget_pool->currentItem()->text();
-        int index = ui->listWidget_pool->currentRow();
-        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));
-            if(elem->childElem[i].container == delPoolName) containers->setCurrentIndex(0);
-            containers->removeItem(containers->findText(delPoolName));
-        }
-    }
-}
-
-
-void MainWindow::on_listWidget_pool_itemDoubleClicked(QListWidgetItem *item)
-{
-    if(ui->listWidget_elem->currentItem() == nullptr) return;
-    ChangeNameDialog newName;
-    newName.setModal(true);
-    newName.exec();
-    QString name = newName.getNewName();
-    ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
-    if(!name.isEmpty()){
-        //TODO: 检查新名字唯一性
-        if(elem->getPoolIndex(name) != -1){
-            QMessageBox::critical(this,"警告","该容器名已存在!");
-            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);
-    }
-}
-
-
-void MainWindow::on_listWidget_pool_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
-{
-    //TODO:保存切换前界面数据
-    if(current != nullptr){
-        setPoolUi(current->text());
-    }
-}
-
-void MainWindow::on_pushButton_addKey_clicked()
-{
-    if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_pool->currentItem() == nullptr) return;
-    int rowNum = ui->tableWidget_containerPool->rowCount();
-    ui->tableWidget_containerPool->insertRow(rowNum);
-    QString keyName = "0";
-    ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
-    int id = 1;
-    while(1){
-        if(elem->isSingleContainerKey(ui->listWidget_pool->currentItem()->text(),keyName)){
-            break;
-        }
-        keyName = QString::number(id++);
-    }
-    ui->tableWidget_containerPool->setItem(rowNum,0,new QTableWidgetItem(keyName));
-    QTableWidgetItem* res = new QTableWidgetItem("双击添加资源文件");
-    // 此单元格不可编辑
-    res->setFlags(res->flags() & ~Qt::ItemIsEditable);
-    ui->tableWidget_containerPool->setItem(rowNum,1,res);
-    for(int i=2;i<=5;i++){
-        ui->tableWidget_containerPool->setCellWidget(rowNum,i,createBox("",{}));
-    }
-    ui->tableWidget_containerPool->setItem(rowNum,3,new QTableWidgetItem("0"));
-    int index = ui->listWidget_pool->currentRow();
-    ElemPropertyData::ContainTable containTable(keyName);
-    elem->container[index].table.push_back(containTable);
-}
-
-
-void MainWindow::on_pushButton_delKey_clicked()
-{
-    if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_pool->currentItem() == nullptr || ui->tableWidget_containerPool->currentRow() == -1) return;
-    QMessageBox::StandardButton reply = QMessageBox::question(this,"删除键值","确定要删除此键值吗?");
-    if(reply == QMessageBox::Yes){
-        int curRow = ui->tableWidget_containerPool->currentRow();
-        QString containerName = ui->tableWidget_containerPool->item(curRow,0)->text();
-        ElemPropertyData* elem =elements[ui->listWidget_elem->currentItem()->text()];
-        int index = ui->listWidget_pool->currentRow();
-        QVector<ElemPropertyData::ContainTable> &containerTable = elem->container[index].table;
-        containerTable.remove(curRow);
-        ui->tableWidget_containerPool->removeRow(curRow);
-    }
-}
-
-void MainWindow::on_tableWidget_containerPool_cellDoubleClicked(int row, int column)
-{
-    if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_pool->currentItem() == nullptr) return;
-    //容器表格内容修改flag
-    poolTableItemChanged = true;
-    if(column == 1){
-        ResFileDialog res;
-        res.setModal(true);
-        res.exec();
-        QString fileName = res.getResName();
-        if(!fileName.isEmpty()){
-            ui->tableWidget_containerPool->setItem(row,column,new QTableWidgetItem(fileName));
-            ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
-            int index = ui->listWidget_pool->currentRow();
-            elem->container[index].table[row].res = fileName;
-            //加载时间线下拉列表
-            for(int i=2;i<=5;i++){
-                QComboBox* timeline = createTimelineBox("",fileName,TimelineType::Pool);
-                ui->tableWidget_containerPool->setCellWidget(row,i,timeline);
-            }
-        }
-    }
-}
-
-
-void MainWindow::on_tableWidget_containerPool_itemChanged(QTableWidgetItem *item)
-{
-    if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_pool->currentItem() == nullptr) return;
-    if(!poolTableItemChanged) return;
-    poolTableItemChanged = false;
-    int column = item->column();
-    int row = item->row();
-    ElemPropertyData* elem = elements[ui->listWidget_elem->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);
-        if(item->text().toInt() < 0 || !isNum){
-            QMessageBox::critical(this,"错误","键值必须是大于等于0的数字");
-            item->setText(containerVec[row].key);
-            return;
-        }
-        if(!elem->isSingleContainerKey(ui->listWidget_pool->currentItem()->text(),item->text())){
-            QMessageBox::critical(this,"警告","该键值已存在!");
-            item->setText(containerVec[row].key);
-            return;
-        }
-        containerVec[row].key = item->text();
-    }
-    //检查zOrder合法性
-    else if(column == 6){
-        QString zOrder = item->text();
-        bool isNum;double tmp = zOrder.toDouble(&isNum);
-        if(item->text().toInt() < 0 || !isNum){
-            QMessageBox::critical(this,"错误","消失zOrder值必须是大于等于0的数字");
-            item->setText(containerVec[row].zOrder);
-            return;
-        }
-        containerVec[row].zOrder = zOrder;
-    }
-}
-
-void MainWindow::on_pushButton_addChildElem_clicked()
-{
-    if(ui->listWidget_elem->currentItem() == nullptr) return;
-    int rowNum = ui->tableWidget_childElem->rowCount();
-    ui->tableWidget_childElem->insertRow(rowNum);
-    QString childElemName = "item";
-    ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
-    int id = 1;
-    while(1){
-        if(elem->isSingleChildElemName(childElemName)){
-            break;
-        }
-        childElemName = "item" + QString::number(id++);
-    }
-    ui->tableWidget_childElem->setItem(rowNum,0,new QTableWidgetItem(childElemName));
-    ui->tableWidget_childElem->setCellWidget(rowNum,1,createPoolBox("尚未选择"));
-    elem->childElem.push_back(ElemPropertyData::ChildElem(childElemName));
-}
-
-void MainWindow::on_pushButton_delChildElem_clicked()
-{
-    if(ui->listWidget_elem->currentItem() == nullptr || ui->tableWidget_childElem->currentRow() == -1) return;
-    QMessageBox::StandardButton reply = QMessageBox::question(this,"删除子元素","确定要删除此子元素吗?");
-    if(reply == QMessageBox::Yes){
-        int curRow = ui->tableWidget_childElem->currentRow();
-        QString childElemName = ui->tableWidget_childElem->item(curRow,0)->text();
-        QVector<ElemPropertyData::ChildElem> &childElemVec = elements[ui->listWidget_elem->currentItem()->text()]->childElem;
-        childElemVec.remove(curRow);
-        ui->tableWidget_childElem->removeRow(curRow);
-    }
-}
-
-
-void MainWindow::on_tableWidget_childElem_itemChanged(QTableWidgetItem *item)
-{
-    if(ui->listWidget_elem->currentItem() == nullptr) return;
-    if(!childElemTableItemChanged) return;
-    childElemTableItemChanged = false;
-    int column = item->column();
-    int row = item->row();
-    ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
-    QVector<ElemPropertyData::ChildElem> &childElemVec = elem->childElem;
-    if(column == 0){
-        if(!elem->isSingleChildElemName(item->text())){
-            QMessageBox::critical(this,"警告","该子元素名已存在!");
-            item->setText(childElemVec[row].name);
-            return;
-        }
-        childElemVec[row].name = item->text();
-    }
-    //TODO: comboBox值修改后的保存
-}
-
-
-void MainWindow::on_tableWidget_childElem_cellDoubleClicked(int row, int column)
-{
-    if(ui->listWidget_elem->currentItem() == nullptr) return;
-    //子元素表格双击改名置flag为true
-    childElemTableItemChanged = true;
-}
-
 
 ///模板更新后更新与模板配置相关的界面显示
 void MainWindow::updateTempRelatedUi()
@@ -518,86 +189,25 @@ void MainWindow::updateTempRelatedUi()
     collAnimUi->setCollectAnimUi();
     //重置状态配置的模板相关界面
     statusConfigUi->setAnimComboBox();
-
-//    //状态配置
-//    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;
-//                elem->collAnim[ui->listWidget_collectAnim->currentRow()].type = "尚未选择";
-//            }
-//            setCollAnimWidget();
-//        }
-//        //容器池
-//        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;
+    //重置容器类型选项
+    poolUi->updateTempRelated();
 }
 
+///重新加载模板文件
 void MainWindow::on_reloadTempFile_triggered()
 {
     DataManager::getInstance()->updateTempData();
     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_tabWidget_currentChanged(int index)
 {
-    //更新下拉选项
-    if(index == 2){
+    //更新动画、收集动画下拉选项
+    if(index == 1){
         collAnimUi->setCollAnimWidget();
     }
-    else if(index == 3){
+    else if(index == 2){
         statusConfigUi->setAnimComboBox();
     }
 }

+ 0 - 48
mainwindow.h

@@ -34,12 +34,6 @@ private slots:
 
     void on_pushButton_chooseFile_clicked();
 
-    void on_pushButton_addContainer_clicked();
-
-    void on_pushButton_delContainer_clicked();
-
-    void on_listWidget_pool_itemDoubleClicked(QListWidgetItem *item);
-
     void on_listWidget_elem_itemDoubleClicked(QListWidgetItem *item);
 
     void on_listWidget_elem_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous);
@@ -54,57 +48,15 @@ private slots:
 
     void on_spinBox_drop_valueChanged(int arg1);
 
-    void on_tableWidget_containerPool_cellDoubleClicked(int row, int column);
-
-    void on_tableWidget_containerPool_itemChanged(QTableWidgetItem *item);
-
-    void on_pushButton_addKey_clicked();
-
-    void on_pushButton_delKey_clicked();
-
-    void on_listWidget_pool_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous);
-
-    void on_pushButton_addChildElem_clicked();
-
-    void on_pushButton_delChildElem_clicked();
-
-    void on_tableWidget_childElem_itemChanged(QTableWidgetItem *item);
-
-    void on_tableWidget_childElem_cellDoubleClicked(int row, int column);
-
-    void onPoolTimelineTextChanged(const QString &arg1);
-
-    void onPoolsTextChanged(const QString &arg1);
-
     void on_reloadTempFile_triggered();
 
-    void on_comboBox_container_currentTextChanged(const QString &arg1);
-
     void on_tabWidget_currentChanged(int index);
 
 private:
     Ui::MainWindow *ui;
     QMap<QString,ElemPropertyData*> elements;
     void setUi(QString elem);
-    //防止双击修改以外的表格修改操作反复触发itemChanged信号
-    //动画表格
-    bool animTableItemChanged = false;
-    //容器表格
-    bool poolTableItemChanged = false;
-    //子元素表格
-    bool childElemTableItemChanged = false;
-    //事件配置表格
-    bool eventTableItemChanged = false;
-    void setCollectAnimUi(QString collectAnimName);
-    void setPoolUi(QString poolName);
-    enum class TimelineType{Animation,Pool};
-    QComboBox* createBox(QString choice,QStringList list);
-    QComboBox* createTimelineBox(QString chosenTimeline,QString filename,TimelineType type);
-    QComboBox* createPoolBox(QString chosenPool);
     void updateTempRelatedUi();
-    //表示当前正在设置ui界面,改变时不要触发任何数据保存
-    bool isSetUi = false;
-
     //四个ui子界面
     bool firstSelectElem = true;
     StatusEffectAnim* animUi;

+ 1 - 228
mainwindow.ui

@@ -187,238 +187,11 @@
            <enum>QTabWidget::Triangular</enum>
           </property>
           <property name="currentIndex">
-           <number>0</number>
+           <number>-1</number>
           </property>
           <property name="elideMode">
            <enum>Qt::ElideRight</enum>
           </property>
-          <widget class="QWidget" name="tab_container_2">
-           <attribute name="title">
-            <string>容器</string>
-           </attribute>
-           <layout class="QVBoxLayout" name="verticalLayout_12">
-            <item>
-             <widget class="QSplitter" name="splitter_3">
-              <property name="orientation">
-               <enum>Qt::Horizontal</enum>
-              </property>
-              <widget class="QWidget" name="layoutWidget">
-               <layout class="QVBoxLayout" name="verticalLayout_10">
-                <item>
-                 <layout class="QHBoxLayout" name="horizontalLayout_9">
-                  <item>
-                   <widget class="QLabel" name="label">
-                    <property name="text">
-                     <string>容器池:</string>
-                    </property>
-                   </widget>
-                  </item>
-                  <item>
-                   <spacer name="horizontalSpacer">
-                    <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>
-                <item>
-                 <widget class="QListWidget" name="listWidget_pool"/>
-                </item>
-                <item>
-                 <layout class="QHBoxLayout" name="horizontalLayout_15">
-                  <item>
-                   <widget class="QPushButton" name="pushButton_addContainer">
-                    <property name="text">
-                     <string>添加</string>
-                    </property>
-                   </widget>
-                  </item>
-                  <item>
-                   <widget class="QPushButton" name="pushButton_delContainer">
-                    <property name="text">
-                     <string>删除</string>
-                    </property>
-                   </widget>
-                  </item>
-                 </layout>
-                </item>
-               </layout>
-              </widget>
-              <widget class="QWidget" name="layoutWidget">
-               <layout class="QVBoxLayout" name="verticalLayout_9">
-                <item>
-                 <layout class="QHBoxLayout" name="horizontalLayout_29">
-                  <item>
-                   <widget class="QLabel" name="label_containerType">
-                    <property name="text">
-                     <string>容器类型:</string>
-                    </property>
-                   </widget>
-                  </item>
-                  <item>
-                   <widget class="QComboBox" name="comboBox_container"/>
-                  </item>
-                  <item>
-                   <spacer name="horizontalSpacer_9">
-                    <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>
-                <item>
-                 <layout class="QHBoxLayout" name="horizontalLayout_14">
-                  <item>
-                   <widget class="QTableWidget" name="tableWidget_containerPool">
-                    <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="QVBoxLayout" name="verticalLayout_8">
-                    <item>
-                     <widget class="QPushButton" name="pushButton_addKey">
-                      <property name="text">
-                       <string>添加</string>
-                      </property>
-                     </widget>
-                    </item>
-                    <item>
-                     <widget class="QPushButton" name="pushButton_delKey">
-                      <property name="text">
-                       <string>删除</string>
-                      </property>
-                     </widget>
-                    </item>
-                    <item>
-                     <spacer name="verticalSpacer_2">
-                      <property name="orientation">
-                       <enum>Qt::Vertical</enum>
-                      </property>
-                      <property name="sizeHint" stdset="0">
-                       <size>
-                        <width>20</width>
-                        <height>40</height>
-                       </size>
-                      </property>
-                     </spacer>
-                    </item>
-                   </layout>
-                  </item>
-                 </layout>
-                </item>
-               </layout>
-              </widget>
-             </widget>
-            </item>
-            <item>
-             <layout class="QHBoxLayout" name="horizontalLayout_10">
-              <item>
-               <widget class="QLabel" name="label_2">
-                <property name="text">
-                 <string>子元素:</string>
-                </property>
-               </widget>
-              </item>
-              <item>
-               <spacer name="horizontalSpacer_2">
-                <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>
-            <item>
-             <layout class="QHBoxLayout" name="horizontalLayout_16">
-              <item>
-               <widget class="QTableWidget" name="tableWidget_childElem">
-                <property name="columnCount">
-                 <number>2</number>
-                </property>
-                <column/>
-                <column/>
-               </widget>
-              </item>
-              <item>
-               <layout class="QVBoxLayout" name="verticalLayout_11">
-                <item>
-                 <widget class="QPushButton" name="pushButton_addChildElem">
-                  <property name="text">
-                   <string>添加</string>
-                  </property>
-                 </widget>
-                </item>
-                <item>
-                 <widget class="QPushButton" name="pushButton_delChildElem">
-                  <property name="text">
-                   <string>删除</string>
-                  </property>
-                 </widget>
-                </item>
-                <item>
-                 <spacer name="verticalSpacer_3">
-                  <property name="orientation">
-                   <enum>Qt::Vertical</enum>
-                  </property>
-                  <property name="sizeHint" stdset="0">
-                   <size>
-                    <width>20</width>
-                    <height>40</height>
-                   </size>
-                  </property>
-                 </spacer>
-                </item>
-               </layout>
-              </item>
-              <item>
-               <spacer name="horizontalSpacer_10">
-                <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>
-          </widget>
          </widget>
         </item>
        </layout>

+ 369 - 8
pool.cpp

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

+ 46 - 0
pool.h

@@ -2,6 +2,9 @@
 #define POOL_H
 
 #include <QWidget>
+#include <QComboBox>
+#include <QListWidgetItem>
+#include <QTableWidgetItem>
 
 namespace Ui {
 class Pool;
@@ -16,12 +19,55 @@ public:
     ~Pool();
     void updateContainType();
     void setUi(QString elem);
+    void updateTempRelated();
+
+private slots:
+    void on_pushButton_addContainer_clicked();
+    ///容器池区时间线数据发生改变
+    void onPoolTimelineTextChanged(const QString &arg1);
+    ///子元素使用池子数据发生改变
+    void onPoolsTextChanged(const QString &arg1);
+
+    void on_pushButton_delContainer_clicked();
+
+    void on_listWidget_pool_itemDoubleClicked(QListWidgetItem *item);
+
+    void on_listWidget_pool_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous);
+
+    void on_pushButton_addKey_clicked();
+
+    void on_pushButton_delKey_clicked();
+
+    void on_tableWidget_containerPool_cellDoubleClicked(int row, int column);
+
+    void on_tableWidget_containerPool_itemChanged(QTableWidgetItem *item);
+
+    void on_pushButton_addChildElem_clicked();
+
+    void on_pushButton_delChildElem_clicked();
+
+    void on_tableWidget_childElem_itemChanged(QTableWidgetItem *item);
+
+    void on_tableWidget_childElem_cellDoubleClicked(int row, int column);
+
+    void on_comboBox_container_currentTextChanged(const QString &arg1);
 
 private:
     Ui::Pool *ui;
     QString currentElem;
     bool isSetUi = false;
+    bool poolTableItemChanged = false;
+    bool childElemTableItemChanged = false;
+    ///容器池变化时设置表格和类型数据
     void setPoolUi();
+    ///创建普通下拉选项
+    QComboBox* createBox(QString choice,QStringList list);
+    ///创建一个时间线下拉选项
+    QComboBox* createTimelineBox(QString chosenTimeline,QString fileName);
+    ///创建一个使用池子下拉选项
+    QComboBox* createPoolBox(QString chosenPool);
+    ///将路径名转换成文件名
+    QString getFileName(QString filePath);
 };
 
 #endif // POOL_H

+ 2 - 2
statusEffectAnim.cpp

@@ -110,7 +110,7 @@ void StatusEffectAnim::on_pushButton_addAnimation_clicked()
     // 此单元格不可编辑
     res->setFlags(res->flags() & ~Qt::ItemIsEditable);
     ui->tableWidget_animation->setItem(rowNum,1,res);
-    ui->tableWidget_animation->setCellWidget(rowNum,2,createBox("",{}));
+    ui->tableWidget_animation->setCellWidget(rowNum,2,createBox("尚未选择",{}));
     ui->tableWidget_animation->setItem(rowNum,3,new QTableWidgetItem("0"));
     DataManager::getInstance()->addAnim(currentElem,animName);
 }
@@ -174,7 +174,7 @@ void StatusEffectAnim::on_tableWidget_animation_cellDoubleClicked(int row, int c
             // 此单元格不可编辑
             res->setFlags(res->flags() & ~Qt::ItemIsEditable);
             ui->tableWidget_animation->setItem(row,1,res);
-            QComboBox* timeLine = createTimelineBox("",fileName);
+            QComboBox* timeLine = createTimelineBox("尚未选择",fileName);
             ui->tableWidget_animation->setCellWidget(row,2,timeLine);
             //保存当前数据
             DataManager::getInstance()->changeAnimTable(currentElem,fileName,row,1);