Selaa lähdekoodia

导出数据,调整ui

Menglan_Luo 2 vuotta sitten
vanhempi
commit
37fc3cd99e
10 muutettua tiedostoa jossa 665 lisäystä ja 192 poistoa
  1. 234 7
      dataManager.cpp
  2. 18 5
      dataManager.h
  3. 162 6
      elemPropertyData.cpp
  4. 20 3
      elemPropertyData.h
  5. 0 2
      main.cpp
  6. 51 13
      mainwindow.cpp
  7. 9 3
      mainwindow.h
  8. 158 150
      mainwindow.ui
  9. 11 3
      statusConfig.cpp
  10. 2 0
      statusConfig.h

+ 234 - 7
dataManager.cpp

@@ -98,9 +98,9 @@ void DataManager::changeMarkValue(QString elem, QString val)
     elements[elem]->labelName = val;
 }
 
-void DataManager::changeSize(QString elem, QString val)
+void DataManager::changePos(QString elem, QString val)
 {
-    elements[elem]->size = val;
+    elements[elem]->pos = val;
 }
 
 void DataManager::changeMaxLayer(QString elem, QString val)
@@ -112,7 +112,7 @@ void DataManager::changeScore(QString elem, QString val)
 {
     elements[elem]->score = val;
 }
-void DataManager::changeDropConfig(QString elem, int val)
+void DataManager::changeDropConfig(QString elem, QString val)
 {
     elements[elem]->dropConfig = val;
 }
@@ -120,13 +120,21 @@ void DataManager::changeIconPath(QString elem, QString iconPath)
 {
     elements[elem]->iconPath = iconPath;
 }
+void DataManager::changeLinkedState(QString elem, int state)
+{
+    elements[elem]->canBeLinked = state;
+}
+void DataManager::changeMoveAwayState(QString elem, int state)
+{
+    elements[elem]->canMoveAway = state;
+}
 QString DataManager::getMarkValue(QString elem)
 {
     return elements[elem]->labelName;
 }
-QString DataManager::getSize(QString elem)
+QString DataManager::getPos(QString elem)
 {
-    return elements[elem]->size;
+    return elements[elem]->pos;
 }
 QString DataManager::getMaxLayer(QString elem)
 {
@@ -136,7 +144,7 @@ QString DataManager::getScore(QString elem)
 {
     return elements[elem]->score;
 }
-int DataManager::getDropConfig(QString elem)
+QString DataManager::getDropConfig(QString elem)
 {
     return  elements[elem]->dropConfig;
 }
@@ -144,6 +152,14 @@ QString DataManager::getIconPath(QString elem)
 {
     return elements[elem]->iconPath;
 }
+bool DataManager::getMoveAwayState(QString elem)
+{
+    return elements[elem]->canMoveAway;
+}
+bool DataManager::getLinkedState(QString elem)
+{
+    return elements[elem]->canBeLinked;
+}
 
 //状态与效果动画
 QVector<ElemPropertyData::StatusEffect> DataManager::getAnimVec(QString elem)
@@ -250,6 +266,8 @@ bool DataManager::existStatusVal(QString elem, QString statusVal)
 void DataManager::addStatus(QString elem, QString statusVal)
 {
     ElemPropertyData::StatusConfig status(statusVal);
+    if(elements[elem]->dropConfig == "可掉落") status.dropable = true;
+    if(elements[elem]->dropConfig == "不可掉落") status.dropable = false;
     elements[elem]->statusConfig.push_back(status);
 }
 //TODO: 删除状态值时出现数组越界
@@ -280,6 +298,13 @@ void DataManager::delEvent(QString elem, int statusIndex, int row)
 {
     elements[elem]->statusConfig[statusIndex].eventConfig.remove(row);
 }
+void DataManager::updateAllDropState(QString elem, bool state)
+{
+    int size = elements[elem]->statusConfig.size();
+    for(int i=0;i<size;i++){
+        elements[elem]->statusConfig[i].dropable = state;
+    }
+}
 
 //容器池
 ElemPropertyData::ContainerConfig DataManager::getContainData(QString elem,int index)
@@ -365,7 +390,7 @@ void DataManager::delChildElem(QString elem, int index)
 bool DataManager::loadData()
 {
 //    QFile loadFile(":/file/file/data.json");
-    QFile loadFile("/Users/menglanluo/Desktop/export.json");
+    QFile loadFile("/Users/menglanluo/Desktop/data.json");
     if(!loadFile.open(QIODevice::ReadOnly)){
         qWarning("can't open data file!");
         return false;
@@ -409,6 +434,202 @@ bool DataManager::saveData()
     write(dataObj);
     //资源文件不支持写?
 //    QFile file(":/file/file/data.json");
+    QFile file("/Users/menglanluo/Desktop/data.json");
+    if(!file.open(QIODevice::WriteOnly)){
+        qDebug()<<"file open failed!";
+        return false;
+    }
+    QJsonDocument jdoc;
+    jdoc.setObject(dataObj);
+    file.write(jdoc.toJson(QJsonDocument::Indented));
+    file.close();
+    return true;
+}
+
+
+//导出数据
+///数据导出合法性检查
+bool DataManager::exportIsValid()
+{
+    QStringList elems= elements.keys();
+    for(int i=0;i<elems.size();i++)
+    {
+        QString key = elems[i];
+        ElemPropertyData* data = elements[key];
+        QString elemMessage = "元素"+key+"导出错误!";
+        //基础属性合法性检查
+        if(data->labelName.toInt() <= 0){
+            exportMessage = elemMessage+"\n标识值必须是大于0的数字!";
+            return false;
+        }
+        if(data->maxLayer.toInt() <= 0){
+            exportMessage = elemMessage+"\n最大层数必须是大于0的数字!";
+            return false;
+        }
+        if(data->score.toInt() <= 0){
+            exportMessage = elemMessage+"\n分数必须是大于0的数字!";
+            return false;
+        }
+        if(data->pos.isEmpty() || getGridPos(data->pos).isEmpty()){
+            exportMessage = elemMessage+"\n位置数据不合法!";
+            return false;
+        }
+
+        //状态与效果动画检查
+        QVector<ElemPropertyData::StatusEffect> animVec = data->statusEffect;
+        for(int j=0;j<animVec.size();j++)
+        {
+            if(animVec[j].res == "双击添加资源文件"){
+                exportMessage = elemMessage+"\n动画"+animVec[j].name+"未添加资源文件!";
+                return false;
+            }
+            if(animVec[j].timeline == "尚未选择"){
+                exportMessage = elemMessage+"\n动画"+animVec[j].name+"未选择时间线!";
+                return false;
+            }
+        }
+
+        //收集动画
+        QVector<ElemPropertyData::CollAnim> collAnimVec = data->collAnim;
+        for(int j=0;j<collAnimVec.size();j++)
+        {
+            if(collAnimVec[j].type == "尚未选择"){
+                exportMessage = elemMessage+"\n收集动画"+collAnimVec[j].name+"未选择动画类型";
+                return false;
+            }
+            QMap<QString,QString> collMap = collAnimVec[j].dataMap;
+            QStringList collMapKeys = collMap.keys();
+            for(int k=0;k<collMapKeys.size();k++)
+            {
+                QString collMapKey = collMapKeys[k];
+                //检查动态配置选项中有没有为空的单行输入或未选择的下拉选项
+                if(collMap[collMapKey].isEmpty() || collMap[collMapKey] == "尚未选择"){
+                    exportMessage = elemMessage+"\n收集动画"+collAnimVec[j].name+collMapKey+"属性配置不完全";
+                    return false;
+                }
+            }
+        }
+
+        //状态配置
+        QVector<ElemPropertyData::StatusConfig> statusVec = data->statusConfig;
+        for(int j=0;j<statusVec.size();j++)
+        {
+            //基础属性
+            if(statusVec[j].initAnim == "尚未选择"){
+                exportMessage = elemMessage+"\n状态"+statusVec[j].statusValue+"未选择初始动画";
+                return false;
+            }
+            if(statusVec[j].clickAnim == "尚未选择"){
+                exportMessage = elemMessage+"\n状态"+statusVec[j].statusValue+"未选择点击动画";
+                return false;
+            }
+            if(statusVec[j].needCollect){
+                if(statusVec[j].collTargetType.isEmpty() || statusVec[j].collTargetType.toInt() <= 0){
+                    exportMessage = elemMessage+"\n状态"+statusVec[j].statusValue+"收集的目标类型必须是大于0的数字";
+                    return false;
+                }
+                if(statusVec[j].collAnim == "尚未选择"){
+                    exportMessage = elemMessage+"\n状态"+statusVec[j].statusValue+"未选择收集动画";
+                    return false;
+                }
+            }
+            //事件配置
+            QVector<ElemPropertyData::EventConfig> eventVec = statusVec[j].eventConfig;
+            for(int k=0;k<eventVec.size();k++)
+            {
+                if(eventVec[k].name == "尚未选择"){
+                    exportMessage = elemMessage+"\n状态"+statusVec[j].statusValue+"事件配置未选择事件名称";
+                    return false;
+                }
+                if(eventVec[k].specialEffect == "尚未选择"){
+                    exportMessage = elemMessage+"\n状态"+statusVec[j].statusValue+"事件配置未选择特效";
+                    return false;
+                }
+                //触发动作暂不处理
+            }
+        }
+
+        //容器池配置
+        QVector<ElemPropertyData::ContainerConfig> poolVec = data->container;
+        for(int j=0;j<poolVec.size();j++)
+        {
+            if(poolVec[j].type == "尚未选择"){
+                exportMessage = elemMessage+"\n容器"+poolVec[j].poolName+"未选择类型";
+                return false;
+            }
+            QVector<ElemPropertyData::ContainTable> table = poolVec[j].table;
+            for(int k=0;k<table.size();k++)
+            {
+                if(table[k].res == "双击添加资源文件"){
+                    exportMessage = elemMessage+"\n容器"+poolVec[j].poolName+"键"+table[k].key+"未选择资源文件";
+                    return false;
+                }
+                if(table[k].initTimeline == "尚未选择" || table[k].clickTimeline == "尚未选择" || table[k].effectTimeline == "尚未选择" || table[k].vanishTimeline == "尚未选择"){
+                    exportMessage = elemMessage+"\n容器"+poolVec[j].poolName+"键"+table[k].key+"未选择时间线";
+                    return false;
+                }
+            }
+        }
+
+        //子元素配置
+        QVector<ElemPropertyData::ChildElem> childElemVec = data->childElem;
+        for(int j=0;j<childElemVec.size();j++)
+        {
+            if(childElemVec[j].container == "尚未选择"){
+                exportMessage = elemMessage+"\n容器"+poolVec[j].poolName+"子元素"+childElemVec[j].name+"使用的池子未选择";
+                return false;
+            }
+        }
+    }
+    return true;
+}
+
+QString DataManager::getExportMessage()
+{
+    return exportMessage;
+}
+
+///将位置字符串拆分成多对坐标
+QVector<QVector<int>> DataManager::getGridPos(QString str)
+{
+    //转换失败返回空数组
+    QVector<QVector<int>> nullAns;
+    QVector<QVector<int>> posNumPairs;
+    //依据逗号分割
+    QStringList posStrPairs = str.split(QLatin1Char(','));
+    for(int i=0;i<posStrPairs.size();i++)
+    {
+        //依据:分割,若分割组数不为2说明输入不合法
+        QStringList posStrPair = posStrPairs[i].split(QLatin1Char(':'));
+        if(posStrPair.size()!=2) return nullAns;
+        QVector<int> posNumPair;
+        //检查第一个字符串是否为数字
+        bool ok;
+        int num1 = posStrPair[0].toInt(&ok);
+        if(!ok) return nullAns;
+        posNumPair.push_back(num1);
+        //检查第二个字符串是否为数字
+        int num2 = posStrPair[1].toInt(&ok);
+        if(!ok) return nullAns;
+        posNumPair.push_back(num2);
+        posNumPairs.push_back(posNumPair);
+    }
+    return posNumPairs;
+}
+
+bool DataManager::exportData()
+{
+    if(!exportIsValid()) return false;
+    //导出为json
+    QJsonObject dataObj;
+    QStringList keys = elements.keys();
+    for(int i=0;i<keys.size();i++)
+    {
+        QString elem = keys[i];
+        QJsonObject obj;
+        elements[elem]->exportData(obj);
+        dataObj.insert(elements[elem]->labelName,obj);
+    }
     QFile file("/Users/menglanluo/Desktop/export.json");
     if(!file.open(QIODevice::WriteOnly)){
         qDebug()<<"file open failed!";
@@ -420,3 +641,9 @@ bool DataManager::saveData()
     file.close();
     return true;
 }
+
+QString DataManager::getTempId(QString key, QString name)
+{
+    int index = jsonTemp->getTemplateIndex(key,name);
+    return jsonTemp->templateMap[key][index].id;
+}

+ 18 - 5
dataManager.h

@@ -23,20 +23,24 @@ public:
     //基础属性值修改
     ///修改标识值
     void changeMarkValue(QString elem,QString val);
-    ///修改基础属性大小
-    void changeSize(QString elem,QString val);
+    ///修改基础属性位置
+    void changePos(QString elem,QString val);
     ///修改最大层数
     void changeMaxLayer(QString elem,QString val);
     void changeScore(QString elem,QString val);
-    void changeDropConfig(QString elem,int val);
+    void changeDropConfig(QString elem,QString val);
     void changeIconPath(QString elem,QString iconPath);
+    void changeLinkedState(QString elem,int state);
+    void changeMoveAwayState(QString elem,int state);
     //基础属性值获取
     QString getMarkValue(QString elem);
-    QString getSize(QString elem);
+    QString getPos(QString elem);
     QString getMaxLayer(QString elem);
     QString getScore(QString elem);
-    int getDropConfig(QString elem);
+    QString getDropConfig(QString elem);
     QString getIconPath(QString elem);
+    bool getLinkedState(QString elem);
+    bool getMoveAwayState(QString elem);
 
     //状态与效果动画
     QVector<ElemPropertyData::StatusEffect> getAnimVec(QString elem);
@@ -73,6 +77,7 @@ public:
     void setFundCheckBox(QString elem,int statusIndex,CheckType checkType,int state);
     void addEvent(QString elem,int index);
     void delEvent(QString elem,int statusIndex,int row);
+    void updateAllDropState(QString elem,bool state);
 
     //容器池
     ElemPropertyData::ContainerConfig getContainData(QString elem,int index);
@@ -99,12 +104,20 @@ public:
     void read(const QJsonObject &json);
     void write(QJsonObject &json) const;
 
+    //导出数据
+    bool exportData();
+    QString getExportMessage();
+    static QVector<QVector<int>> getGridPos(QString str);
+    QString getTempId(QString key,QString name);
+
 private:
     DataManager();
     ~DataManager();
     DataManager(const DataManager &dataManager);
     QMap<QString,ElemPropertyData*> elements;
     ReadJsonSrc* jsonTemp;
+    QString exportMessage;
+    bool exportIsValid();
 };
 
 #endif // DATAMANAGER_H

+ 162 - 6
elemPropertyData.cpp

@@ -1,11 +1,17 @@
 #include "elemPropertyData.h"
 #include "plisthpp/redream.h"
+#include "dataManager.h"
 #include <QJsonArray>
 
 ElemPropertyData::ElemPropertyData()
 {
     iconPath = ":/icon/icon/菜狗.png";
-    dropConfig = 0;
+    labelName = "0";
+    maxLayer = "1";
+    score = "50";
+    dropConfig = "随状态而定";
+    canBeLinked = false;
+    canMoveAway = false;
 }
 
 int ElemPropertyData::getKeyIndex(int poolIndex, QString key)
@@ -82,8 +88,8 @@ void ElemPropertyData::readData(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("pos") && json["pos"].isString()){
+        pos = json["pos"].toString();
     }
     if(json.contains("maxLayer") && json["maxLayer"].isString()){
         maxLayer = json["maxLayer"].toString();
@@ -91,12 +97,18 @@ void ElemPropertyData::readData(const QJsonObject &json)
     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("dropConfig") && json["maxLayer"].isString()){
+        dropConfig = json["dropConfig"].toString();
     }
     if(json.contains("iconPath") && json["iconPath"].isString()){
         iconPath = json["iconPath"].toString();
     }
+    if(json.contains("canBeLinked") && json["canBeLinked"].isBool()){
+        canBeLinked = json["canBeLinked"].toBool();
+    }
+    if(json.contains("canMoveAway") && json["canMoveAway"].isBool()){
+        canMoveAway = json["canMoveAway"].toBool();
+    }
     //状态与效果动画
     if(json.contains("anims") && json["anims"].isArray()){
         readStatusEffect(json["anims"].toArray());
@@ -123,11 +135,13 @@ void ElemPropertyData::writeData(QJsonObject &json) const
 {
     //基础属性
     json["labelName"] = labelName;
-    json["size"] = size;
+    json["pos"] = pos;
     json["maxLayer"] = maxLayer;
     json["score"] = score;
     json["dropConfig"] = dropConfig;
     json["iconPath"] = iconPath;
+    json["canBeLinked"] = canBeLinked;
+    json["canMoveAway"] = canMoveAway;
     json.insert("anims",writeStatusEffect());
     json.insert("collAnim",writeCollAnim());
     json.insert("statusConfig",writeStatusConfigData());
@@ -377,3 +391,145 @@ QJsonArray ElemPropertyData::writeChildElem() const
     }
     return elemArray;
 }
+
+
+//导出数据
+void ElemPropertyData::exportData(QJsonObject &json) const
+{
+    //基础元素
+    json["maxNum"] = maxLayer;
+    json["canBeLinked"] = canBeLinked;
+    //canDrop是一个bool值,导出的什么数据?在状态配置中导出?
+    json["canMoveAway"] = canMoveAway;
+    json["beatScore"] = score;
+    json["gridPos"] = exportGridPos();
+    json["animation"] = exportAnim();
+    json["states"] = exportStates();
+    //容器池
+    json["subitem_pools"] = exportPools();
+    //子元素
+    //收集动画
+    json["collectConfig"] = exportCollAnim();
+}
+///导出位置
+QJsonArray ElemPropertyData::exportGridPos() const
+{
+    QJsonArray posArray;
+    QVector<QVector<int>> posVec = DataManager::getGridPos(pos);
+    for(int i=0;i<posVec.size();i++)
+    {
+        QJsonArray posPair;
+        posPair.append(posVec[i][0]);
+        posPair.append(posVec[i][1]);
+        posArray.append(posPair);
+    }
+    return posArray;
+}
+///导出状态与效果动画
+QJsonObject ElemPropertyData::exportAnim() const
+{
+    QJsonObject json;
+    for(int i=0;i<statusEffect.size();i++)
+    {
+        QJsonObject animObj;
+        animObj["showCcbi"] = statusEffect[i].res;
+        animObj["showAnim"] = statusEffect[i].timeline;
+        animObj["localZOrder"] = statusEffect[i].zOrder.toInt();
+        json.insert(statusEffect[i].name,animObj);
+    }
+    return json;
+}
+///导出状态配置
+ QJsonObject ElemPropertyData::exportStates() const
+ {
+     QJsonObject json;
+     for(int i=0;i<statusConfig.size();i++)
+     {
+         QJsonObject statusObj;
+         statusObj["playAnim"] = statusConfig[i].initAnim;
+         statusObj["tapAnim"] = statusConfig[i].clickAnim;
+         statusObj["supportMutliBeats"] = statusConfig[i].multiHit;
+         //TODO:确定可掉落的key
+         statusObj["canDrop"] = statusConfig[i].dropable;
+         //收集
+        if(statusConfig[i].needCollect){
+            QJsonObject collObj;
+            collObj["goalType"] = statusConfig[i].collTargetType;
+            //TODO:确定收集动画的key
+            collObj["collAnim"] = statusConfig[i].collAnim;
+            statusObj["collect"] = collObj;
+        }
+        //事件
+        QJsonObject eventObj;
+        QVector<EventConfig> eventVec;
+        for(int j=0;j<eventVec.size();j++)
+        {
+            QJsonObject obj;
+            obj["needColor"] = eventVec[i].consisColor;
+            obj["dataDec"] = eventVec[i].changeMagnitude;
+            obj["efx"] = eventVec[i].specialEffect;
+            obj["isByGridCnt"] = eventVec[i].elimATLattices;
+            eventObj.insert(DataManager::getInstance()->getTempId("eventTemp",eventVec[i].name),obj);
+        }
+        statusObj["eventHandlers"] = eventObj;
+        json.insert(statusConfig[i].statusValue,statusObj);
+     }
+     return json;
+ }
+///导出容器池
+ QJsonObject ElemPropertyData::exportPools() const
+ {
+     QJsonObject obj;
+     for(int i=0;i<container.size();i++)
+     {
+         QJsonObject poolObj;
+         poolObj["method"] = DataManager::getInstance()->getTempId("poolTemp",container[i].type);
+         QJsonObject tableObj;
+         QVector<ContainTable> table;
+         for(int j=0;j<table.size();j++)
+         {
+             QJsonObject keyObj;
+             keyObj["res"] = table[i].res;
+             keyObj["init"] = table[i].initTimeline;
+             keyObj["tap"] = table[i].clickTimeline;
+             keyObj["affect"] = table[i].effectTimeline;
+             keyObj["beat"] = table[i].vanishTimeline;
+             keyObj["localZOrder"] = table[i].zOrder.toInt();
+             tableObj[table[i].key] = keyObj;
+         }
+         poolObj["candidates"] = tableObj;
+         obj.insert(container[i].poolName,poolObj);
+     }
+     return obj;
+ }
+ ///导出子元素
+QJsonArray ElemPropertyData::exportChildElems() const
+{
+    QJsonArray childElemArray;
+//    for(int i=0;i<childElem.size();i++)
+//    {
+//        QJsonObject childElemObj;
+
+//    }
+    return childElemArray;
+}
+///导出收集动画
+QJsonObject ElemPropertyData::exportCollAnim() const
+{
+    QJsonObject obj;
+    for(int i=0;i<collAnim.size();i++)
+    {
+        QJsonObject collAnimObj;
+        collAnimObj["template"] = DataManager::getInstance()->getTempId("collAnimTemp",collAnim[i].type);
+        QMap<QString,QString> data = collAnim[i].dataMap;
+        QStringList dataKeys = data.keys();
+        for(int j=0;j<dataKeys.size();j++)
+        {
+            QString dataKey = dataKeys[i];
+            QString objKey = DataManager::getInstance()->getTempId("collAnimTemp",dataKey);
+            collAnimObj[objKey] = data[dataKey];
+        }
+        obj[collAnim[i].name] = collAnimObj;
+    }
+    return obj;
+}

+ 20 - 3
elemPropertyData.h

@@ -11,11 +11,13 @@ public:
     ElemPropertyData();
     //基础属性
     QString labelName;
-    QString size;
+    QString pos;
     QString maxLayer;
     QString score;
-    int dropConfig;
+    QString dropConfig;
     QString iconPath;
+    bool canBeLinked;
+    bool canMoveAway;
 
     //状态与效果动画
     struct StatusEffect{
@@ -46,7 +48,7 @@ public:
         bool elimATLattices;
         QString triggerAction;
         QMap<QString,QString> actionConfig;
-        EventConfig():name("尚未选择"),specialEffect("尚未选择"),triggerAction("尚未选择"),consisColor(false),changeMagnitude(0),elimATLattices(false){}
+        EventConfig():name("尚未选择"),specialEffect("尚未选择"),triggerAction("尚未选择"),consisColor(false),changeMagnitude(1),elimATLattices(false){}
     };
     struct StatusConfig{
         QString statusValue;
@@ -126,6 +128,21 @@ public:
     //读写子元素数据
     void readChildElem(const QJsonArray &arr);
     QJsonArray writeChildElem() const;
+
+    //导出数据
+    void exportData(QJsonObject &json) const;
+    ///导出位置
+    QJsonArray exportGridPos() const;
+    ///导出状态与效果动画
+    QJsonObject exportAnim() const;
+    ///导出状态配置
+    QJsonObject exportStates() const;
+    ///导出容器池
+    QJsonObject exportPools() const;
+    ///导出子元素
+    QJsonArray exportChildElems() const;
+    ///导出收集动画
+    QJsonObject exportCollAnim() const;
 };
 
 #endif // ELEMPROPERTYDATA_H

+ 0 - 2
main.cpp

@@ -1,6 +1,4 @@
 #include "mainwindow.h"
-#include "readJsonSrc.h"
-#include "actionSettingDialog.h"
 #include <QApplication>
 #include <iostream>
 

+ 51 - 13
mainwindow.cpp

@@ -34,6 +34,7 @@ MainWindow::MainWindow(QWidget *parent)
         QListWidgetItem* item = new QListWidgetItem(QIcon(DataManager::getInstance()->getIconPath(elemName)),elemName);
         ui->listWidget_elem->addItem(item);
     }
+    ui->comboBox_dropConfig->addItems({"随状态而定","可掉落","不可掉落"});
 }
 
 MainWindow::~MainWindow()
@@ -45,6 +46,7 @@ MainWindow::~MainWindow()
 void MainWindow::setUi(QString elem)
 {
     std::cout<<"切换成元素"<<qPrintable(elem)<<",刷新界面"<<std::endl;
+    //首次选择元素设置四个子界面
     if(firstSelectElem){
         animUi = new StatusEffectAnim();
         ui->tabWidget->addTab(animUi,"状态与效果动画");
@@ -60,12 +62,16 @@ void MainWindow::setUi(QString elem)
     QPixmap pix(DataManager::getInstance()->getIconPath(elem));
     ui->label_pic->setPixmap(pix.scaled(50,50,Qt::KeepAspectRatio));
     ui->lineEdit_name->setText(DataManager::getInstance()->getMarkValue(elem));
-    ui->lineEdit_size->setText(DataManager::getInstance()->getSize(elem));
+    ui->lineEdit_pos->setText(DataManager::getInstance()->getPos(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));
+    ui->comboBox_dropConfig->setCurrentIndex(ui->comboBox_dropConfig->findText(DataManager::getInstance()->getDropConfig(elem)));
+    if(DataManager::getInstance()->getLinkedState(elem)) ui->checkBox_canBeLinked->setCheckState(Qt::Checked);
+    else ui->checkBox_canBeLinked->setCheckState(Qt::Unchecked);
+    if(DataManager::getInstance()->getMoveAwayState(elem)) ui->checkBox_canMoveAway->setCheckState(Qt::Checked);
+    else ui->checkBox_canMoveAway->setCheckState(Qt::Unchecked);
 
-    //设置状态与效果动画表格显示
+    //设置四个子界面显示
     animUi->setUi(elem);
     collAnimUi->setUi(elem);
     statusConfigUi->setUi(elem);
@@ -144,11 +150,11 @@ void MainWindow::on_lineEdit_name_editingFinished()
 }
 
 ///大小修改
-void MainWindow::on_lineEdit_size_editingFinished()
+void MainWindow::on_lineEdit_pos_editingFinished()
 {
     if(ui->listWidget_elem->currentItem() == nullptr) return;
     QString key = ui->listWidget_elem->currentItem()->text();
-    DataManager::getInstance()->changeSize(key,ui->lineEdit_size->text());
+    DataManager::getInstance()->changePos(key,ui->lineEdit_pos->text());
 }
 
 ///最大层数修改
@@ -167,14 +173,6 @@ 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;
-    QString key = ui->listWidget_elem->currentItem()->text();
-    DataManager::getInstance()->changeDropConfig(key,arg1);
-}
-
 ///更换选中元素
 void MainWindow::on_listWidget_elem_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
 {
@@ -212,5 +210,45 @@ void MainWindow::on_tabWidget_currentChanged(int index)
     }
 }
 
+///掉落设定值改变
+void MainWindow::on_comboBox_dropConfig_currentTextChanged(const QString &arg1)
+{
+    if(ui->listWidget_elem->currentItem() == nullptr) return;
+    QString key = ui->listWidget_elem->currentItem()->text();
+    DataManager::getInstance()->changeDropConfig(key,arg1);
+    if(arg1 == "可掉落"){
+        DataManager::getInstance()->updateAllDropState(key,true);
+        statusConfigUi->updateDropBox(true);
+    }
+    else if(arg1 == "不可掉落"){
+        DataManager::getInstance()->updateAllDropState(key,false);
+        statusConfigUi->updateDropBox(false);
+    }
+}
+
+///可连接状态改变
+void MainWindow::on_checkBox_canBeLinked_stateChanged(int arg1)
+{
+    if(ui->listWidget_elem->currentItem() == nullptr) return;
+    QString key = ui->listWidget_elem->currentItem()->text();
+    DataManager::getInstance()->changeLinkedState(key,arg1);
+}
 
+///可挤压状态改变
+void MainWindow::on_checkBox_canMoveAway_stateChanged(int arg1)
+{
+    if(ui->listWidget_elem->currentItem() == nullptr) return;
+    QString key = ui->listWidget_elem->currentItem()->text();
+    DataManager::getInstance()->changeMoveAwayState(key,arg1);
+}
+
+///导出配置按钮按下
+void MainWindow::on_pushButton_exportConfig_clicked()
+{
+    if(!DataManager::getInstance()->exportData()){
+        QMessageBox::critical(this,"错误",DataManager::getInstance()->getExportMessage());
+        return;
+    }
+    else QMessageBox::information(this,"提示","成功导出至桌面!");
+}
 

+ 9 - 3
mainwindow.h

@@ -40,18 +40,24 @@ private slots:
 
     void on_lineEdit_name_editingFinished();
 
-    void on_lineEdit_size_editingFinished();
+    void on_lineEdit_pos_editingFinished();
 
     void on_lineEdit_maxlayer_editingFinished();
 
     void on_lineEdit_score_editingFinished();
 
-    void on_spinBox_drop_valueChanged(int arg1);
-
     void on_reloadTempFile_triggered();
 
     void on_tabWidget_currentChanged(int index);
 
+    void on_comboBox_dropConfig_currentTextChanged(const QString &arg1);
+
+    void on_checkBox_canBeLinked_stateChanged(int arg1);
+
+    void on_checkBox_canMoveAway_stateChanged(int arg1);
+
+    void on_pushButton_exportConfig_clicked();
+
 private:
     Ui::MainWindow *ui;
     QMap<QString,ElemPropertyData*> elements;

+ 158 - 150
mainwindow.ui

@@ -14,189 +14,197 @@
    <string>MainWindow</string>
   </property>
   <widget class="QWidget" name="centralwidget">
-   <layout class="QHBoxLayout" name="horizontalLayout_13">
+   <layout class="QHBoxLayout" name="horizontalLayout_3">
     <item>
-     <widget class="QSplitter" name="splitter">
-      <property name="orientation">
-       <enum>Qt::Horizontal</enum>
-      </property>
-      <widget class="QWidget" name="layoutWidget">
-       <layout class="QVBoxLayout" name="verticalLayout_2">
+     <layout class="QVBoxLayout" name="verticalLayout_2">
+      <item>
+       <widget class="QListWidget" name="listWidget_elem"/>
+      </item>
+      <item>
+       <layout class="QHBoxLayout" name="horizontalLayout_12">
         <item>
-         <widget class="QListWidget" name="listWidget_elem"/>
+         <widget class="QPushButton" name="pushButton_addElem">
+          <property name="text">
+           <string>添加</string>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <widget class="QPushButton" name="pushButton_delElem">
+          <property name="text">
+           <string>删除</string>
+          </property>
+         </widget>
         </item>
+       </layout>
+      </item>
+      <item>
+       <widget class="QPushButton" name="pushButton_exportConfig">
+        <property name="text">
+         <string>  导出配置</string>
+        </property>
+       </widget>
+      </item>
+     </layout>
+    </item>
+    <item>
+     <layout class="QVBoxLayout" name="verticalLayout_5">
+      <item>
+       <widget class="QLabel" name="label_3">
+        <property name="text">
+         <string>基础属性</string>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <layout class="QHBoxLayout" name="horizontalLayout_2">
         <item>
-         <layout class="QHBoxLayout" name="horizontalLayout_12">
+         <layout class="QHBoxLayout" name="horizontalLayout">
           <item>
-           <widget class="QPushButton" name="pushButton_addElem">
-            <property name="text">
-             <string>添加</string>
-            </property>
-           </widget>
+           <layout class="QVBoxLayout" name="verticalLayout">
+            <item>
+             <widget class="QLabel" name="label_name">
+              <property name="text">
+               <string>标识值:</string>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QLabel" name="label_size">
+              <property name="text">
+               <string>位置:</string>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QLabel" name="label_maxlayer">
+              <property name="text">
+               <string>最大层数:</string>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QLabel" name="label_score">
+              <property name="text">
+               <string>分数:</string>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QLabel" name="label_drop">
+              <property name="text">
+               <string>掉落设定:</string>
+              </property>
+             </widget>
+            </item>
+           </layout>
           </item>
           <item>
-           <widget class="QPushButton" name="pushButton_delElem">
-            <property name="text">
-             <string>删除</string>
-            </property>
-           </widget>
+           <layout class="QVBoxLayout" name="verticalLayout_4">
+            <item>
+             <widget class="QLineEdit" name="lineEdit_name"/>
+            </item>
+            <item>
+             <widget class="QLineEdit" name="lineEdit_pos"/>
+            </item>
+            <item>
+             <widget class="QLineEdit" name="lineEdit_maxlayer"/>
+            </item>
+            <item>
+             <widget class="QLineEdit" name="lineEdit_score"/>
+            </item>
+            <item>
+             <widget class="QComboBox" name="comboBox_dropConfig"/>
+            </item>
+           </layout>
           </item>
          </layout>
         </item>
         <item>
-         <widget class="QPushButton" name="pushButton_exportConfig">
-          <property name="text">
-           <string>  导出配置</string>
+         <spacer name="horizontalSpacer">
+          <property name="orientation">
+           <enum>Qt::Horizontal</enum>
           </property>
-         </widget>
-        </item>
-       </layout>
-      </widget>
-      <widget class="QWidget" name="layoutWidget">
-       <layout class="QVBoxLayout" name="verticalLayout_6">
-        <item>
-         <widget class="QLabel" name="label_3">
-          <property name="text">
-           <string>基础属性</string>
+          <property name="sizeHint" stdset="0">
+           <size>
+            <width>40</width>
+            <height>20</height>
+           </size>
           </property>
-         </widget>
+         </spacer>
         </item>
         <item>
-         <layout class="QHBoxLayout" name="horizontalLayout_11">
+         <layout class="QVBoxLayout" name="verticalLayout_3">
           <item>
-           <layout class="QHBoxLayout" name="horizontalLayout_7">
+           <layout class="QHBoxLayout" name="horizontalLayout_6">
             <item>
-             <layout class="QVBoxLayout" name="verticalLayout">
-              <item>
-               <layout class="QHBoxLayout" name="horizontalLayout">
-                <item>
-                 <widget class="QLabel" name="label_name">
-                  <property name="text">
-                   <string>标识值:</string>
-                  </property>
-                 </widget>
-                </item>
-                <item>
-                 <widget class="QLineEdit" name="lineEdit_name"/>
-                </item>
-               </layout>
-              </item>
-              <item>
-               <layout class="QHBoxLayout" name="horizontalLayout_2">
-                <item>
-                 <widget class="QLabel" name="label_size">
-                  <property name="text">
-                   <string>大小:</string>
-                  </property>
-                 </widget>
-                </item>
-                <item>
-                 <widget class="QLineEdit" name="lineEdit_size"/>
-                </item>
-               </layout>
-              </item>
-              <item>
-               <layout class="QHBoxLayout" name="horizontalLayout_3">
-                <item>
-                 <widget class="QLabel" name="label_maxlayer">
-                  <property name="text">
-                   <string>最大层数:</string>
-                  </property>
-                 </widget>
-                </item>
-                <item>
-                 <widget class="QLineEdit" name="lineEdit_maxlayer"/>
-                </item>
-               </layout>
-              </item>
-              <item>
-               <layout class="QHBoxLayout" name="horizontalLayout_4">
-                <item>
-                 <widget class="QLabel" name="label_score">
-                  <property name="text">
-                   <string>分数:</string>
-                  </property>
-                 </widget>
-                </item>
-                <item>
-                 <widget class="QLineEdit" name="lineEdit_score"/>
-                </item>
-               </layout>
-              </item>
-              <item>
-               <layout class="QHBoxLayout" name="horizontalLayout_5">
-                <item>
-                 <widget class="QLabel" name="label_drop">
-                  <property name="text">
-                   <string>掉落设定:</string>
-                  </property>
-                 </widget>
-                </item>
-                <item>
-                 <widget class="QSpinBox" name="spinBox_drop"/>
-                </item>
-               </layout>
-              </item>
-             </layout>
+             <widget class="QLabel" name="label_icon">
+              <property name="text">
+               <string>图标:</string>
+              </property>
+             </widget>
             </item>
             <item>
-             <layout class="QHBoxLayout" name="horizontalLayout_6">
-              <item>
-               <widget class="QLabel" name="label_icon">
-                <property name="text">
-                 <string>图标:</string>
-                </property>
-               </widget>
-              </item>
-              <item>
-               <widget class="QLabel" name="label_pic">
-                <property name="text">
-                 <string>icon</string>
-                </property>
-               </widget>
-              </item>
-              <item>
-               <widget class="QPushButton" name="pushButton_chooseFile">
-                <property name="text">
-                 <string>选择文件</string>
-                </property>
-               </widget>
-              </item>
-             </layout>
+             <widget class="QLabel" name="label_pic">
+              <property name="text">
+               <string>icon</string>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QPushButton" name="pushButton_chooseFile">
+              <property name="text">
+               <string>选择文件</string>
+              </property>
+             </widget>
             </item>
            </layout>
           </item>
           <item>
-           <spacer name="horizontalSpacer_3">
-            <property name="orientation">
-             <enum>Qt::Horizontal</enum>
+           <widget class="QCheckBox" name="checkBox_canBeLinked">
+            <property name="text">
+             <string>可连接</string>
             </property>
-            <property name="sizeHint" stdset="0">
-             <size>
-              <width>148</width>
-              <height>68</height>
-             </size>
+           </widget>
+          </item>
+          <item>
+           <widget class="QCheckBox" name="checkBox_canMoveAway">
+            <property name="text">
+             <string>可挤压</string>
             </property>
-           </spacer>
+           </widget>
           </item>
          </layout>
         </item>
         <item>
-         <widget class="QTabWidget" name="tabWidget">
-          <property name="tabShape">
-           <enum>QTabWidget::Triangular</enum>
-          </property>
-          <property name="currentIndex">
-           <number>-1</number>
+         <spacer name="horizontalSpacer_3">
+          <property name="orientation">
+           <enum>Qt::Horizontal</enum>
           </property>
-          <property name="elideMode">
-           <enum>Qt::ElideRight</enum>
+          <property name="sizeHint" stdset="0">
+           <size>
+            <width>148</width>
+            <height>68</height>
+           </size>
           </property>
-         </widget>
+         </spacer>
         </item>
        </layout>
-      </widget>
-     </widget>
+      </item>
+      <item>
+       <widget class="QTabWidget" name="tabWidget">
+        <property name="tabShape">
+         <enum>QTabWidget::Triangular</enum>
+        </property>
+        <property name="currentIndex">
+         <number>-1</number>
+        </property>
+        <property name="elideMode">
+         <enum>Qt::ElideRight</enum>
+        </property>
+       </widget>
+      </item>
+     </layout>
     </item>
    </layout>
   </widget>

+ 11 - 3
statusConfig.cpp

@@ -169,10 +169,17 @@ void StatusConfig::setAnimComboBox()
             ui->tableWidget_event->setCellWidget(i,0,createBox(event[i].name,BoxType::Event));
             ui->tableWidget_event->setCellWidget(i,5,createBox(event[i].triggerAction,BoxType::Action));
         }
-    }
+    }   
     isSetUi = false;
 }
 
+///基础属性的可掉落变化时刷新可掉落勾选情况
+void StatusConfig::updateDropBox(bool state)
+{
+    if(state) ui->checkBox_dropable->setCheckState(Qt::Checked);
+    else ui->checkBox_dropable->setCheckState(Qt::Unchecked);
+}
+
 ///设置动画当前选择项
 void StatusConfig::setAnimIndex(ElemPropertyData::StatusConfig statusData)
 {
@@ -230,7 +237,7 @@ void StatusConfig::setStatusUi()
         std::cout<<"重置状态配置ui:事件名称:"<<qPrintable(i.name)<<std::endl;
         //是否需要颜色一致
         ui->tableWidget_event->setCellWidget(rowNum,1,createCheckBox(i.consisColor));
-        //tableWidget_event
+        //变化幅度
         ui->tableWidget_event->setItem(rowNum,2,new QTableWidgetItem(i.changeMagnitude));
         //特效
         ui->tableWidget_event->setCellWidget(rowNum,3,createBox(i.specialEffect,BoxType::Effect));
@@ -359,6 +366,7 @@ void StatusConfig::on_pushButton_addEvent_clicked()
     ui->tableWidget_event->insertRow(rowNum);
     ui->tableWidget_event->setCellWidget(rowNum,0,createBox("尚未选择",BoxType::Event));
     ui->tableWidget_event->setCellWidget(rowNum,1,createCheckBox(false));
+    ui->tableWidget_event->setItem(rowNum,2,new QTableWidgetItem("1"));
     ui->tableWidget_event->setCellWidget(rowNum,3,createBox("尚未选择",BoxType::Effect));
     ui->tableWidget_event->setCellWidget(rowNum,4,createCheckBox(false));
     ui->tableWidget_event->setCellWidget(rowNum,5,createBox("尚未选择",BoxType::Action));
@@ -387,7 +395,7 @@ void StatusConfig::on_tableWidget_event_itemChanged(QTableWidgetItem *item)
         bool ok;double a = item->text().toDouble(&ok);
         int val = item->text().toInt();
         if(!ok || val<0){
-            QMessageBox::critical(this,"警告","状态变化幅度是大于0的数字");
+            QMessageBox::critical(this,"警告","状态变化幅度是大于等于0的数字");
             ui->tableWidget_event->item(row,2)->setText(QString::number(eventVec[row].changeMagnitude));
             return;
         }

+ 2 - 0
statusConfig.h

@@ -26,6 +26,8 @@ public:
     void setStatusUi();
     ///重置变动可能较大的点击动画、初始动画和收集动画
     void setAnimComboBox();
+    ///基础属性中的可掉落变化时刷新可掉落checkbox
+    void updateDropBox(bool state);
 
 private slots:
     ///添加状态,若已经生成最大层数全部状态则按钮无效