Menglan_Luo 2 年之前
父節點
當前提交
c2726564c4
共有 11 個文件被更改,包括 498 次插入73 次删除
  1. 8 3
      ConfigurableTool.pro
  2. 123 0
      dataManager.cpp
  3. 50 0
      dataManager.h
  4. 7 7
      elemPropertyData.cpp
  5. 3 0
      elemPropertyData.h
  6. 25 61
      mainwindow.cpp
  7. 1 1
      mainwindow.h
  8. 1 1
      mainwindow.ui
  9. 169 0
      statusEffectAnim.cpp
  10. 45 0
      statusEffectAnim.h
  11. 66 0
      statusEffectAnim.ui

+ 8 - 3
ConfigurableTool.pro

@@ -12,6 +12,7 @@ SOURCES += \
     actionSettingDialog.cpp \
     changenamedialog.cpp \
     collectionwindow.cpp \
+    dataManager.cpp \
     elemPropertyData.cpp \
     main.cpp \
     mainwindow.cpp \
@@ -20,7 +21,8 @@ SOURCES += \
     plistcpp/pugixml.cpp \
     plistcpp/redream.cpp \
     readJsonSrc.cpp \
-    resfiledialog.cpp
+    resfiledialog.cpp \
+    statusEffectAnim.cpp
 
 HEADERS += \
     actionSettingDialog.h \
@@ -291,6 +293,7 @@ HEADERS += \
     boost/version.hpp \
     changenamedialog.h \
     collectionwindow.h \
+    dataManager.h \
     elemPropertyData.h \
     mainwindow.h \
     plisthpp/Plist.hpp \
@@ -300,14 +303,16 @@ HEADERS += \
     plisthpp/pugixml.hpp \
     plisthpp/redream.h \
     readJsonSrc.h \
-    resfiledialog.h
+    resfiledialog.h \
+    statusEffectAnim.h
 
 FORMS += \
     actionSettingDialog.ui \
     changenamedialog.ui \
     collectionwindow.ui \
     mainwindow.ui \
-    resfiledialog.ui
+    resfiledialog.ui \
+    statusEffectAnim.ui
 
 # Default rules for deployment.
 qnx: target.path = /tmp/$${TARGET}/bin

+ 123 - 0
dataManager.cpp

@@ -0,0 +1,123 @@
+#include "dataManager.h"
+
+DataManager* DataManager::getInstance()
+{
+    static DataManager dataManager;
+    return &dataManager;
+}
+
+DataManager::DataManager()
+{
+    jsonTemp = new ReadJsonSrc(":/file/file/template.json");
+}
+
+DataManager::~DataManager()
+{
+    delete jsonTemp;
+}
+
+bool DataManager::existElem(QString elemName)
+{
+    return elements.contains(elemName);
+}
+
+void DataManager::addElem(QString elemName)
+{
+    elements[elemName] = new ElemPropertyData();
+}
+
+void DataManager::delElem(QString elemName)
+{
+    delete elements[elemName];
+    elements.remove(elemName);
+}
+
+void DataManager::changeElemName(QString oriName, QString newName)
+{
+    ElemPropertyData* tmp = elements[oriName];
+    elements.remove(oriName);
+    elements[newName] = tmp;
+}
+
+void DataManager::changeMarkValue(QString elem, QString val)
+{
+    elements[elem]->labelName = val;
+}
+
+void DataManager::changeSize(QString elem, QString val)
+{
+    elements[elem]->size = val;
+}
+
+void DataManager::changeMaxLayer(QString elem, QString val)
+{
+    elements[elem]->maxLayer = val;
+}
+
+void DataManager::changeScore(QString elem, QString val)
+{
+    elements[elem]->score = val;
+}
+void DataManager::changeDropConfig(QString elem, int val)
+{
+    elements[elem]->dropConfig = val;
+}
+void DataManager::changeIconPath(QString elem, QString iconPath)
+{
+    elements[elem]->iconPath = iconPath;
+}
+QString DataManager::getMarkValue(QString elem)
+{
+    return elements[elem]->labelName;
+}
+QString DataManager::getSize(QString elem)
+{
+    return elements[elem]->size;
+}
+QString DataManager::getMaxLayer(QString elem)
+{
+    return elements[elem]->maxLayer;
+}
+QString DataManager::getScore(QString elem)
+{
+    return elements[elem]->score;
+}
+int DataManager::getDropConfig(QString elem)
+{
+    return  elements[elem]->dropConfig;
+}
+QString DataManager::getIconPath(QString elem)
+{
+    return elements[elem]->iconPath;
+}
+
+//状态与效果动画
+QVector<ElemPropertyData::StatusEffect> DataManager::getAnimVec(QString elem)
+{
+    return elements[elem]->statusEffect;
+}
+QStringList DataManager::getTimelineList(QString elem,QString filePath)
+{
+    return elements[elem]->getTimelineList(filePath);
+}
+void DataManager::changeAnimTimeline(QString elem, QString timeline,int index)
+{
+    elements[elem]->statusEffect[index].timeline = timeline;
+}
+bool DataManager::existAnim(QString elem,QString animName)
+{
+    if(elements[elem]->getAnimIndex(animName) == -1) return false;
+    return true;
+}
+void DataManager::addAnim(QString elem, QString animName)
+{
+    elements[elem]->statusEffect.push_back(ElemPropertyData::StatusEffect(animName));
+}
+void DataManager::delAnim(QString elem,int index)
+{
+    elements[elem]->statusEffect.remove(index);
+}
+void DataManager::changeAnimName(QString elem, QString animName, int index)
+{
+    elements[elem]->statusEffect[index].name = animName;
+}

+ 50 - 0
dataManager.h

@@ -0,0 +1,50 @@
+#ifndef DATAMANAGER_H
+#define DATAMANAGER_H
+#include "elemPropertyData.h"
+#include "readJsonSrc.h"
+
+class DataManager
+{
+public:
+    static DataManager* getInstance();
+    ///检查是否存在此元素
+    bool existElem(QString elemName);
+    void addElem(QString elemName);
+    void delElem(QString elemName);
+    void changeElemName(QString oriName,QString newName);
+    //基础属性值修改
+    ///修改标识值
+    void changeMarkValue(QString elem,QString val);
+    ///修改基础属性大小
+    void changeSize(QString elem,QString val);
+    ///修改最大层数
+    void changeMaxLayer(QString elem,QString val);
+    void changeScore(QString elem,QString val);
+    void changeDropConfig(QString elem,int val);
+    void changeIconPath(QString elem,QString iconPath);
+    //基础属性值获取
+    QString getMarkValue(QString elem);
+    QString getSize(QString elem);
+    QString getMaxLayer(QString elem);
+    QString getScore(QString elem);
+    int getDropConfig(QString elem);
+    QString getIconPath(QString elem);
+
+    //状态与效果动画
+    QVector<ElemPropertyData::StatusEffect> getAnimVec(QString elem);
+    QStringList getTimelineList(QString elem,QString filePath);
+    void changeAnimTimeline(QString elem,QString timeline,int index);
+    bool existAnim(QString elem,QString animName);
+    void addAnim(QString elem,QString animName);
+    void delAnim(QString elem,int index);
+    void changeAnimName(QString elem,QString animName,int index);
+
+private:
+    DataManager();
+    ~DataManager();
+    DataManager(const DataManager &dataManager);
+    QMap<QString,ElemPropertyData*> elements;
+    ReadJsonSrc* jsonTemp;
+};
+
+#endif // DATAMANAGER_H

+ 7 - 7
elemPropertyData.cpp

@@ -4,7 +4,7 @@
 ElemPropertyData::ElemPropertyData()
 {
     //TODO: 把默认图标变成程序内部资源
-    iconPath = "/Users/menglanluo/菜狗.png";
+    iconPath = ":/icon/icon/菜狗.png";
     dropConfig = 0;
 }
 
@@ -29,14 +29,14 @@ bool ElemPropertyData::isSingleChildElemName(QString newName)
     return true;
 }
 
-bool ElemPropertyData::isSingleAnimName(QString newName)
+int ElemPropertyData::getAnimIndex(QString animName)
 {
-    for(const auto &i:statusEffect){
-        if(newName == i.name){
-            return false;
+    for(int i=0;i<statusEffect.size();i++){
+        if(statusEffect[i].name == animName){
+            return i;
         }
     }
-    return true;
+    return -1;
 }
 
 int ElemPropertyData::getCollAnimIndex(QString name)
@@ -46,7 +46,7 @@ int ElemPropertyData::getCollAnimIndex(QString name)
             return i;
         }
     }
-    return -1;;
+    return -1;
 }
 
 int ElemPropertyData::getStatusValIndex(QString statusVal)

+ 3 - 0
elemPropertyData.h

@@ -81,6 +81,8 @@ public:
         ContainerConfig(QString pool):poolName(pool),type("尚未选择"){}
     };
     QVector<ContainerConfig> container;
+
+    //子元素
     struct ChildElem{
         QString name;
         QString container;
@@ -90,6 +92,7 @@ public:
     bool isSingleContainerKey(QString poolKey,QString newKey);
     bool isSingleChildElemName(QString newName);
     bool isSingleAnimName(QString newName);
+    int getAnimIndex(QString animName);
     int getCollAnimIndex(QString name);
     int getStatusValIndex(QString statusVal);
     int getPoolIndex(QString poolName);

+ 25 - 61
mainwindow.cpp

@@ -16,6 +16,7 @@
 #include <QUrl>
 #include <QFormLayout>
 #include <QDialogButtonBox>
+#include "dataManager.h"
 
 MainWindow::MainWindow(QWidget *parent)
     : QMainWindow(parent)
@@ -168,36 +169,21 @@ void MainWindow::updateCollAnimComboBox(QString changedAnim)
 }
 
 ///切换元素时重置界面数据
-void MainWindow::setUi(ElemPropertyData *elem)
+void MainWindow::setUi(QString elem)
 {
-    std::cout<<"切换元素,刷新界面"<<std::endl;
+    std::cout<<"切换成元素"<<qPrintable(elem)<<",刷新界面"<<std::endl;
     //基础元素区域的设置
-    QPixmap pix(elem->iconPath);
+    QPixmap pix(DataManager::getInstance()->getIconPath(elem));
     ui->label_pic->setPixmap(pix.scaled(50,50,Qt::KeepAspectRatio));
-    ui->lineEdit_name->setText(elem->labelName);
-    ui->lineEdit_size->setText(elem->size);
-    ui->lineEdit_maxlayer->setText(elem->maxLayer);
-    ui->lineEdit_score->setText(elem->score);
-    ui->spinBox_drop->setValue(elem->dropConfig);
+    ui->lineEdit_name->setText(DataManager::getInstance()->getMarkValue(elem));
+    ui->lineEdit_size->setText(DataManager::getInstance()->getSize(elem));
+    ui->lineEdit_maxlayer->setText(DataManager::getInstance()->getMaxLayer(elem));
+    ui->lineEdit_score->setText(DataManager::getInstance()->getScore(elem));
+    ui->spinBox_drop->setValue(DataManager::getInstance()->getDropConfig(elem));
 
+    //TODO:调用各个界面的刷新显示
     //设置状态与效果动画表格显示
-    int rowCnt = ui->tableWidget_animation->rowCount();
-    for(int i=0;i<rowCnt;i++){
-        ui->tableWidget_animation->removeRow(0);
-    }
-    for(const auto &i:elem->statusEffect){
-        int rowNum = ui->tableWidget_animation->rowCount();
-        ui->tableWidget_animation->insertRow(rowNum);
-        ui->tableWidget_animation->setItem(rowNum,0,new QTableWidgetItem(i.name));
-        QTableWidgetItem* res = new QTableWidgetItem(getFileName(i.res));
-        // 此单元格不可编辑
-        res->setFlags(res->flags() & ~Qt::ItemIsEditable);
-        ui->tableWidget_animation->setItem(rowNum,1,res);
-        //设置时间线
-        QComboBox* timeline = createTimelineBox(i.timeline,i.res,TimelineType::Animation);
-        ui->tableWidget_animation->setCellWidget(rowNum,2,timeline);
-        ui->tableWidget_animation->setItem(rowNum,3,new QTableWidgetItem(i.zOrder));
-    }
+
 
     //设置收集动画的显示并聚焦到收集动画列表的最后一个元素
     ui->listWidget_collectAnim->clear();
@@ -271,8 +257,8 @@ void MainWindow::on_pushButton_chooseFile_clicked()
     }
     QPixmap pix(file_name);
     ui->label_pic->setPixmap(pix.scaled(50,50,Qt::KeepAspectRatio));
-    elements[elem]->iconPath = file_name;
     ui->listWidget_elem->currentItem()->setIcon(QIcon(file_name));
+    DataManager::getInstance()->changeIconPath(elem,file_name);
 }
 
 
@@ -281,16 +267,14 @@ void MainWindow::on_pushButton_addElem_clicked()
     QString elemName = "新加元素";
     int id = 1;
     while(1){
-        if(elements.find(elemName)==elements.end()){
+        if(!DataManager::getInstance()->existElem(elemName)){
             break;
         }
         elemName = "新加元素" + QString::number(id++);
     }
     QListWidgetItem* item = new QListWidgetItem(QIcon(":/icon/icon/菜狗.png"),elemName);
     ui->listWidget_elem->addItem(item);
-//    ui->listWidget_elem->item(ui->listWidget_elem->count() - 1)->setSelected(true); // 设置选中
-//    ui->listWidget_elem->scrollToBottom();
-    elements[elemName] = new ElemPropertyData();
+    DataManager::getInstance()->addElem(elemName);
 }
 
 
@@ -300,9 +284,8 @@ void MainWindow::on_pushButton_delElem_clicked()
     QMessageBox::StandardButton reply = QMessageBox::question(this,"删除元素","确定要删除此元素吗?");
     if(reply == QMessageBox::Yes){
         QString elemName = ui->listWidget_elem->currentItem()->text();
-        delete elements[elemName];
-        elements.erase(elements.find(elemName));
         delete ui->listWidget_elem->takeItem(ui->listWidget_elem->currentRow());
+        DataManager::getInstance()->delElem(elemName);
     }
 }
 
@@ -314,15 +297,13 @@ void MainWindow::on_listWidget_elem_itemDoubleClicked(QListWidgetItem *item)
     newName.exec();
     QString name = newName.getNewName();
     if(!name.isEmpty()){
-        if(elements.find(name)!=elements.end()){
+        if(DataManager::getInstance()->existElem(name)){
             QMessageBox::critical(this,"警告","该元素名已存在!");
             return;
         }
-        QString elemName = ui->listWidget_elem->currentItem()->text();
-        ElemPropertyData* newElem = elements[elemName];
-        elements.erase(elements.find(elemName));
-        elements[newName.getNewName()] = newElem;
-        item->setText(newName.getNewName());
+        QString oriName = ui->listWidget_elem->currentItem()->text();
+        item->setText(name);
+        DataManager::getInstance()->changeElemName(oriName,name);
     }
 }
 
@@ -331,28 +312,28 @@ void MainWindow::on_lineEdit_name_editingFinished()
 {
     if(ui->listWidget_elem->currentItem() == nullptr) return;
     QString key = ui->listWidget_elem->currentItem()->text();
-    elements[key]->labelName = ui->lineEdit_name->text();
+    DataManager::getInstance()->changeMarkValue(key,ui->lineEdit_name->text());
 }
 
 void MainWindow::on_lineEdit_size_editingFinished()
 {
     if(ui->listWidget_elem->currentItem() == nullptr) return;
     QString key = ui->listWidget_elem->currentItem()->text();
-    elements[key]->size = ui->lineEdit_size->text();
+    DataManager::getInstance()->changeSize(key,ui->lineEdit_size->text());
 }
 
 void MainWindow::on_lineEdit_maxlayer_editingFinished()
 {
     if(ui->listWidget_elem->currentItem() == nullptr) return;
     QString key = ui->listWidget_elem->currentItem()->text();
-    elements[key]->maxLayer = ui->lineEdit_maxlayer->text();
+    DataManager::getInstance()->changeMaxLayer(key,ui->lineEdit_maxlayer->text());
 }
 
 void MainWindow::on_lineEdit_score_editingFinished()
 {
     if(ui->listWidget_elem->currentItem() == nullptr) return;
     QString key = ui->listWidget_elem->currentItem()->text();
-    elements[key]->score = ui->lineEdit_score->text();
+    DataManager::getInstance()->changeScore(key,ui->lineEdit_score->text());
 }
 
 
@@ -360,13 +341,13 @@ void MainWindow::on_spinBox_drop_valueChanged(int arg1)
 {
     if(ui->listWidget_elem->currentItem() == nullptr) return;
     QString key = ui->listWidget_elem->currentItem()->text();
-    elements[key]->dropConfig = arg1;
+    DataManager::getInstance()->changeDropConfig(key,arg1);
 }
 
 
 void MainWindow::on_listWidget_elem_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
 {
-   setUi(elements[current->text()]);
+   setUi(current->text());
 }
 
 //替换资源文件
@@ -1235,23 +1216,6 @@ void MainWindow::on_pushButton_addEvent_clicked()
     ui->tableWidget_event->setCellWidget(rowNum,6,createSetButton());
 }
 
-QString MainWindow::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 MainWindow::on_listWidget_status_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
 {

+ 1 - 1
mainwindow.h

@@ -147,7 +147,7 @@ private slots:
 private:
     Ui::MainWindow *ui;
     QMap<QString,ElemPropertyData*> elements;
-    void setUi(ElemPropertyData* elem);
+    void setUi(QString elem);
     //防止双击修改以外的表格修改操作反复触发itemChanged信号
     //动画表格
     bool animTableItemChanged = false;

+ 1 - 1
mainwindow.ui

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

+ 169 - 0
statusEffectAnim.cpp

@@ -0,0 +1,169 @@
+#include "statusEffectAnim.h"
+#include "ui_statusEffectAnim.h"
+#include "dataManager.h"
+#include <iostream>
+#include <QMessageBox>
+
+StatusEffectAnim::StatusEffectAnim(QWidget *parent) :
+    QWidget(parent),
+    ui(new Ui::StatusEffectAnim)
+{
+    ui->setupUi(this);
+    this->setAcceptDrops(true);
+    ui->tableWidget_animation->setHorizontalHeaderLabels({"名称","资源","时间线","z-Order"});
+}
+
+StatusEffectAnim::~StatusEffectAnim()
+{
+    delete ui;
+}
+
+StatusEffectAnim* StatusEffectAnim::getInstance()
+{
+    static StatusEffectAnim anim;
+    return &anim;
+}
+
+QString StatusEffectAnim::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;
+}
+
+QComboBox* StatusEffectAnim::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* StatusEffectAnim::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(onTimelineTextChanged(QString)));
+    return timeLine;
+}
+
+///动画区时间线数据发生改变
+void StatusEffectAnim::onTimelineTextChanged(const QString &arg1)
+{
+    //获取时间线列表所在位置
+    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_animation->indexAt(QPoint(x,y));
+    int row = index.row();
+    //修改数据
+    DataManager::getInstance()->changeAnimTimeline(currentElem,arg1,row);
+}
+
+void StatusEffectAnim::setUi(QString elem)
+{
+    currentElem = elem;
+    int rowCnt = ui->tableWidget_animation->rowCount();
+    for(int i=0;i<rowCnt;i++){
+        ui->tableWidget_animation->removeRow(0);
+    }
+    for(const auto &i:DataManager::getInstance()->getAnimVec(elem)){
+        int rowNum = ui->tableWidget_animation->rowCount();
+        ui->tableWidget_animation->insertRow(rowNum);
+        ui->tableWidget_animation->setItem(rowNum,0,new QTableWidgetItem(i.name));
+        QTableWidgetItem* res = new QTableWidgetItem(getFileName(i.res));
+        // 此单元格不可编辑
+        res->setFlags(res->flags() & ~Qt::ItemIsEditable);
+        ui->tableWidget_animation->setItem(rowNum,1,res);
+        //设置时间线
+        QComboBox* timeline = createTimelineBox(i.timeline,i.res);
+        ui->tableWidget_animation->setCellWidget(rowNum,2,timeline);
+        ui->tableWidget_animation->setItem(rowNum,3,new QTableWidgetItem(i.zOrder));
+    }
+}
+void StatusEffectAnim::on_pushButton_addAnimation_clicked()
+{
+    int rowNum = ui->tableWidget_animation->rowCount();
+    ui->tableWidget_animation->insertRow(rowNum);
+    QString animName = "anim";
+    int id = 1;
+    while(1){
+        if(!DataManager::getInstance()->existAnim(currentElem,animName)){
+            break;
+        }
+        animName = "anim" + QString::number(id++);
+    }
+    ui->tableWidget_animation->setItem(rowNum,0,new QTableWidgetItem(animName));
+    QTableWidgetItem* res = new QTableWidgetItem("双击添加资源文件");
+    // 此单元格不可编辑
+    res->setFlags(res->flags() & ~Qt::ItemIsEditable);
+    ui->tableWidget_animation->setItem(rowNum,1,res);
+    ui->tableWidget_animation->setCellWidget(rowNum,2,createBox("",{}));
+    ui->tableWidget_animation->setItem(rowNum,3,new QTableWidgetItem("0"));
+    DataManager::getInstance()->addAnim(currentElem,animName);
+}
+
+
+void StatusEffectAnim::on_pushButton_delAnimation_clicked()
+{
+    if(ui->tableWidget_animation->currentRow() == -1) return;
+    QMessageBox::StandardButton reply = QMessageBox::question(this,"删除动画","确定要删除此动画吗?");
+    if(reply == QMessageBox::Yes){
+        int curRow = ui->tableWidget_animation->currentRow();
+        QString animName = ui->tableWidget_animation->item(curRow,0)->text();
+        DataManager::getInstance()->delAnim(currentElem,curRow);
+        ui->tableWidget_animation->removeRow(curRow);
+    }
+}
+
+void StatusEffectAnim::on_tableWidget_animation_itemChanged(QTableWidgetItem *item)
+{
+    if(!animTableItemChanged) return;
+    animTableItemChanged = false;
+    int column = item->column();
+    int row = item->row();
+    QVector<ElemPropertyData::StatusEffect> animVec = elem->statusEffect;
+    if(column == 0){
+        QString newName = ui->tableWidget_animation->item(row,0)->text();
+        if(!DataManager::getInstance()->existAnim(currentElem,newName)){
+            QMessageBox::critical(this,"警告","该动画名已存在!");
+            ui->tableWidget_animation->item(row,0)->setText(animVec[row].name);
+            return;
+        }
+        std::cout<<"名字发生改变,新名字:"<<qPrintable(newName)<<std::endl;
+        DataManager::getInstance()->changeAnimName(currentElem,newName,row);
+    }
+    //资源名发生修改
+    else if(column == 1){
+        std::cout<<"动画资源发生改变,新资源名:"<<qPrintable(ui->tableWidget_animation->item(row,1)->text())<<std::endl;
+    }
+    else{
+        bool ok;double a = ui->tableWidget_animation->item(row,3)->text().toDouble(&ok);
+        int zOrder = ui->tableWidget_animation->item(row,3)->text().toInt();
+        if(!ok || zOrder<0 || zOrder>100000){
+            QMessageBox::critical(this,"警告","z-Order值超出范围!");
+            ui->tableWidget_animation->item(row,3)->setText(animVec[row].zOrder);
+            return;
+        }
+        std::cout<<"z-Order值发生改变,新值为:"<<zOrder<<std::endl;
+        animVec[row].zOrder = item->text();
+    }
+}
+

+ 45 - 0
statusEffectAnim.h

@@ -0,0 +1,45 @@
+#ifndef STATUSEFFECTANIM_H
+#define STATUSEFFECTANIM_H
+
+#include "elemPropertyData.h"
+#include <QWidget>
+#include <QComboBox>
+#include <QTableWidgetItem>
+
+namespace Ui {
+class StatusEffectAnim;
+}
+
+class StatusEffectAnim : public QWidget
+{
+    Q_OBJECT
+
+public:
+    static StatusEffectAnim* getInstance();
+    void setUi(QString elem);
+    ///将路径名转换成文件名
+    QString getFileName(QString filePath);
+
+private slots:
+    void on_pushButton_addAnimation_clicked();
+
+    void onTimelineTextChanged(const QString &arg1);
+
+    void on_pushButton_delAnimation_clicked();
+
+
+    void on_tableWidget_animation_itemChanged(QTableWidgetItem *item);
+
+private:
+    Ui::StatusEffectAnim *ui;
+    QMap<QString,QVector<StatusEffectAnim>> Anims;
+    StatusEffectAnim(QWidget *parent = nullptr);
+    ~StatusEffectAnim();
+    QString currentElem;
+    QComboBox* createTimelineBox(QString chosenTimeline,QString filename);
+    QComboBox* createBox(QString choice,QStringList list);
+    //防止双击修改以外的表格修改操作反复触发itemChanged信号
+    bool animTableItemChanged = false;
+};
+
+#endif // STATUSEFFECTANIM_H

+ 66 - 0
statusEffectAnim.ui

@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>StatusEffectAnim</class>
+ <widget class="QWidget" name="StatusEffectAnim">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>892</width>
+    <height>537</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Form</string>
+  </property>
+  <layout class="QHBoxLayout" name="horizontalLayout">
+   <item>
+    <widget class="QTableWidget" name="tableWidget_animation">
+     <property name="rowCount">
+      <number>0</number>
+     </property>
+     <property name="columnCount">
+      <number>4</number>
+     </property>
+     <column/>
+     <column/>
+     <column/>
+     <column/>
+    </widget>
+   </item>
+   <item>
+    <layout class="QVBoxLayout" name="verticalLayout_4">
+     <item>
+      <widget class="QPushButton" name="pushButton_addAnimation">
+       <property name="text">
+        <string>添加动画</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QPushButton" name="pushButton_delAnimation">
+       <property name="text">
+        <string>删除动画</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <spacer name="verticalSpacer">
+       <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>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>