Browse Source

添加数据存储类;ui数据的变动同步更新存储的数据;切换界面时数据的加载,文件的加载

Menglan_Luo 2 years ago
parent
commit
8d9d20e84d
6 changed files with 291 additions and 100 deletions
  1. 2 0
      ConfigurableTool.pro
  2. 4 3
      ConfigurableTool.pro.user
  3. 8 0
      elemPropertyData.cpp
  4. 62 0
      elemPropertyData.h
  5. 198 92
      mainwindow.cpp
  6. 17 5
      mainwindow.h

+ 2 - 0
ConfigurableTool.pro

@@ -13,6 +13,7 @@ SOURCES += \
     changenamedialog.cpp \
     collectionwindow.cpp \
     containerpool.cpp \
+    elemPropertyData.cpp \
     main.cpp \
     mainwindow.cpp \
     resfiledialog.cpp \
@@ -23,6 +24,7 @@ HEADERS += \
     changenamedialog.h \
     collectionwindow.h \
     containerpool.h \
+    elemPropertyData.h \
     mainwindow.h \
     resfiledialog.h \
     statusconfiguration.h

+ 4 - 3
ConfigurableTool.pro.user

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE QtCreatorProject>
-<!-- Written by QtCreator 5.0.2, 2022-09-06T14:13:28. -->
+<!-- Written by QtCreator 5.0.2, 2022-09-13T10:09:16. -->
 <qtcreator>
  <data>
   <variable>EnvironmentId</variable>
@@ -235,8 +235,9 @@
     <valuelist type="QVariantList" key="CustomOutputParsers"/>
     <value type="int" key="PE.EnvironmentAspect.Base">2</value>
     <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:/Users/menglanluo/workspace/ConfigurableTool/ConfigurableTool.pro</value>
-    <value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">/Users/menglanluo/workspace/ConfigurableTool/ConfigurableTool.pro</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">ConfigurableTool2</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:/Users/menglanluo/ElemsConfigTool/ConfigurableTool.pro</value>
+    <value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">/Users/menglanluo/ElemsConfigTool/ConfigurableTool.pro</value>
     <value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
     <value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
     <value type="bool" key="RunConfiguration.UseLibrarySearchPath">true</value>

+ 8 - 0
elemPropertyData.cpp

@@ -0,0 +1,8 @@
+#include "elemPropertyData.h"
+
+ElemPropertyData::ElemPropertyData()
+{
+    //TODO: 把默认图标变成程序内部资源
+    iconPath = "/Users/menglanluo/菜狗.png";
+    dropConfig = 0;
+}

+ 62 - 0
elemPropertyData.h

@@ -0,0 +1,62 @@
+#ifndef ELEMPROPERTYDATA_H
+#define ELEMPROPERTYDATA_H
+#include <QString>
+#include <QVector>
+#include <QMap>
+
+class ElemPropertyData
+{
+public:
+    ElemPropertyData();
+    //基础属性
+    QString labelName;
+    QString size;
+    QString maxLayer;
+    QString score;
+    int dropConfig;
+    QString iconPath;
+
+    //状态与效果动画
+    struct StatusEffect{
+        QString name;
+        QString res;
+        QString timeline;
+        int zOrder;
+    };
+    QVector<StatusEffect> statusEffect;
+
+    //收集动画
+    struct CollAnim{
+        QString type;
+        QString anim;
+        QString node;
+        QString shadow;
+    };
+    QMap<QString,CollAnim> collAnim;
+
+    // 状态配置
+
+    // 容器
+    struct ContainTable{
+        QString key;
+        QString res;
+        QString initTimeline;
+        QString clickTimeline;
+        QString effectTimeline;
+        QString vanishTimeline;
+        QString zOrder;
+    };
+
+    struct ContainerConfig{
+        QString type;
+        ContainTable table;
+    };
+    QMap<QString,ContainerConfig> container;
+    struct ChildElem{
+        QString name;
+        QString container;
+    };
+    QVector<ChildElem> childElem;
+};
+
+#endif // ELEMPROPERTYDATA_H

+ 198 - 92
mainwindow.cpp

@@ -25,8 +25,6 @@ MainWindow::MainWindow(QWidget *parent)
     QPixmap pix("/Users/menglanluo/pic.png");
     ui->label_pic->setPixmap(pix.scaled(50,50,Qt::KeepAspectRatio));
     this->setAcceptDrops(true);
-    resource = new QLineEdit(this);
-    resource->setAcceptDrops(false);
     ui->tableWidget_animation->setHorizontalHeaderLabels({"名称","资源","时间线","z-Order"});
 }
 
@@ -35,63 +33,236 @@ MainWindow::~MainWindow()
     delete ui;
 }
 
-//TODO: 修改图标后更新列表对应元素的图标
+//TODO: 设置ui所有数据
+void MainWindow::setUi(ElemPropertyData *elem)
+{
+    QPixmap pix(elem->iconPath);
+    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);
+}
+
 void MainWindow::on_pushButton_chooseFile_clicked()
 {
+    //如果列表中尚未添加任何元素,无法触发按钮
+    if(ui->listWidget_elem->count()==0) return;
+    QString elem = ui->listWidget_elem->currentItem()->text();
     QString file_name = QFileDialog::getOpenFileName(this,"Open a file",QDir::homePath());
+    if(file_name == nullptr){
+        file_name = elements[elem]->iconPath;
+    }
     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));
 }
 
-void MainWindow::dragEnterEvent(QDragEnterEvent *event)
+//TODO: 聚焦到新添加的元素上
+void MainWindow::on_pushButton_addElem_clicked()
 {
-    if(event->mimeData()->hasUrls()){
-        event->acceptProposedAction();
+    QString elemName = "新加元素";
+    int id = 1;
+    while(1){
+        if(elements.find(elemName)==elements.end()){
+            break;
+        }
+        elemName = "新加元素" + QString::number(id++);
     }
-    else{
-        event->ignore();
+    QListWidgetItem* item = new QListWidgetItem(QIcon("/Users/menglanluo/菜狗.png"),elemName);
+    ui->listWidget_elem->addItem(item);
+    //加上这一句之后总是异常闪退
+//    ui->listWidget_elem->setCurrentItem(item);
+    elements[elemName] = new ElemPropertyData();
+}
+
+
+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());
+    }
+}
+
+
+void MainWindow::on_listWidget_elem_itemDoubleClicked(QListWidgetItem *item)
+{
+    ChangeNameDialog newName;
+    newName.setModal(true);
+    newName.exec();
+    QString name = newName.getNewName();
+    if(!name.isEmpty()){
+        if(elements.find(name)!=elements.end()){
+            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());
+    }
+}
+
+void MainWindow::on_lineEdit_name_editingFinished()
+{
+    if(ui->listWidget_elem->count()==0) return;
+    QString key = ui->listWidget_elem->currentItem()->text();
+    elements[key]->labelName = ui->lineEdit_name->text();
+}
+
+void MainWindow::on_lineEdit_size_editingFinished()
+{
+    if(ui->listWidget_elem->count()==0) return;
+    QString key = ui->listWidget_elem->currentItem()->text();
+    elements[key]->size = ui->lineEdit_size->text();
+}
+
+void MainWindow::on_lineEdit_maxlayer_editingFinished()
+{
+    if(ui->listWidget_elem->count()==0) return;
+    QString key = ui->listWidget_elem->currentItem()->text();
+    elements[key]->maxLayer = ui->lineEdit_maxlayer->text();
+}
+
+void MainWindow::on_lineEdit_score_editingFinished()
+{
+    if(ui->listWidget_elem->count()==0) return;
+    QString key = ui->listWidget_elem->currentItem()->text();
+    elements[key]->score = ui->lineEdit_score->text();
+}
+
+
+void MainWindow::on_spinBox_drop_valueChanged(int arg1)
+{
+    if(ui->listWidget_elem->count()==0) return;
+    QString key = ui->listWidget_elem->currentItem()->text();
+    elements[key]->dropConfig = arg1;
+}
+
+
+//TODO: 保存当前元素的所有数据,界面加载当前元素数据
+void MainWindow::on_listWidget_elem_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
+{
+    //每一步改变基本都会触发保存,但是表格内嵌的组件如combobox暂时没找到触发保存的办法
+   setUi(elements[current->text()]);
+}
+
+bool MainWindow::isSingleAnimName(const QVector<ElemPropertyData::StatusEffect> &statusEffect,QString name){
+    for(const auto &i:statusEffect){
+        if(name == i.name)
+            return false;
     }
+    return true;
 }
-void MainWindow::dropEvent(QDropEvent *event)
+
+//替换资源文件
+void MainWindow::on_tableWidget_animation_cellDoubleClicked(int row, int column)
 {
-    const QMimeData *mimeData = event->mimeData();
-    if(mimeData->hasUrls()){
-        QList<QUrl> urls = mimeData->urls();
-        QString urlName = urls.at(0).toLocalFile();
-        QString fileName = urlName;
-        resource->setText(fileName);
+    if(column == 1){
+        ResFileDialog res;
+        res.setModal(true);
+        res.exec();
+        QString fileName = res.getResName();
+        if(!fileName.isEmpty()){
+            ui->tableWidget_animation->setItem(row,column,new QTableWidgetItem(fileName));
+            //TODO: 加入资源生成时间线代码
+            QComboBox* timeLine = new QComboBox;
+            timeLine->addItem("lml");
+            timeLine->addItem("xdf");
+            timeLine->addItem("cqf");
+            ui->tableWidget_animation->setCellWidget(row,column+1,timeLine);
+        }
     }
 }
 
 void MainWindow::on_pushButton_addAnimation_clicked()
 {
     int rowNum = ui->tableWidget_animation->rowCount();
-//    ui->tableWidget_animation->insertRow(rowNum);
-    ui->tableWidget_animation->setRowCount(rowNum+1);
-    //TODO: 命名唯一性检查
-    ui->tableWidget_animation->setItem(rowNum,0,new QTableWidgetItem("anim_1"));
+    ui->tableWidget_animation->insertRow(rowNum);
+    QString elemName = ui->listWidget_elem->currentItem()->text();
+    ElemPropertyData* elem = elements[elemName];
+    QString animName = "anim";
+    int id = 1;
+    while(1){
+        if(isSingleAnimName(elem->statusEffect,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,new QComboBox);
     ui->tableWidget_animation->setItem(rowNum,3,new QTableWidgetItem("0"));
+    elem->statusEffect.push_back({animName,"","",0});
 }
 
-void MainWindow::on_pushButton_addElem_clicked()
-{
-    ui->listWidget_elem->addItem(new QListWidgetItem(QIcon("/Users/menglanluo/菜狗.png"),"新加元素"));
-}
 
-
-void MainWindow::on_pushButton_delElem_clicked()
+void MainWindow::on_pushButton_delAnimation_clicked()
 {
-    QMessageBox::StandardButton reply = QMessageBox::question(this,"删除元素","确定要删除此元素吗?");
+    QMessageBox::StandardButton reply = QMessageBox::question(this,"删除动画","确定要删除此动画吗?");
     if(reply == QMessageBox::Yes){
-        delete ui->listWidget_elem->takeItem(ui->listWidget_elem->currentRow());
+        int curRow = ui->tableWidget_animation->currentRow();
+        QString animName = ui->tableWidget_animation->item(curRow,0)->text();
+        QVector<ElemPropertyData::StatusEffect> &animVec = elements[ui->listWidget_elem->currentItem()->text()]->statusEffect;
+        for(int i=0;i<animVec.size();i++){
+            if(animName == animVec[i].name)
+                animVec.remove(i);
+        }
+        ui->tableWidget_animation->removeRow(curRow);
     }
 }
 
+//TODO: 名字变更时的数据变更及重名检查
+void MainWindow::on_tableWidget_animation_itemChanged(QTableWidgetItem *item)
+{
+    int column = item->column();
+    int row = item->row();
+    int rowCnt = ui->tableWidget_animation->rowCount();
+    QVector<ElemPropertyData::StatusEffect> &animVec = elements[ui->listWidget_elem->currentItem()->text()]->statusEffect;
+    std::cout<<"animVec size:"<<animVec.size()<<std::endl;
+    std::cout<<"row:"<<rowCnt<<std::endl;
+    if(rowCnt != animVec.size()) return;
+    if(column == 0){
+        QString newName = ui->tableWidget_animation->item(row,0)->text();
+        if(!isSingleAnimName(animVec,newName)){
+            QMessageBox::critical(this,"警告","该动画名已存在!");
+            //TODO: 解决setText导致的重复触发itemChanged
+            ui->tableWidget_animation->item(row,0)->setText(animVec[row].name);
+            return;
+        }
+        std::cout<<"名字发生改变,新名字:"<<qPrintable(newName)<<std::endl;
+        animVec[row].name = newName;
+    }
+    //资源名发生修改
+    else if(column == 1){
+        std::cout<<"动画资源发生改变,新资源名:"<<qPrintable(ui->tableWidget_animation->item(row,1)->text())<<std::endl;
+    }
+    // 时间线发生修改,居然没有反应。。。
+    else if(column == 2){
+        QComboBox *timeLine = qobject_cast<QComboBox*>(ui->tableWidget_animation->cellWidget(row,2));
+        std::cout<<"timeLine:"<<qPrintable(timeLine->currentText())<<std::endl;
+    }
+    else{
+        int zOrder = ui->tableWidget_animation->item(row,3)->text().toInt();
+        if(zOrder<0 || zOrder>100000){
+            QMessageBox::critical(this,"警告","z-Order值超出范围!");
+            ui->tableWidget_animation->item(row,3)->setText(QString::number(animVec[row].zOrder));
+            return;
+        }
+        std::cout<<"z-Order值发生改变,新值为:"<<zOrder<<std::endl;
+        animVec[row].zOrder = zOrder;
+    }
+}
 
 void MainWindow::on_pushButton_addCollectAnim_clicked()
 {
@@ -99,7 +270,6 @@ void MainWindow::on_pushButton_addCollectAnim_clicked()
     ui->listWidget_collectAnim->addItem(new QListWidgetItem("collAnim_1"));
 }
 
-
 void MainWindow::on_pushButton_delCollectAnim_clicked()
 {
     QMessageBox::StandardButton reply = QMessageBox::question(this,"删除动画","确定要删除此收集动画吗?");
@@ -165,69 +335,5 @@ void MainWindow::on_listWidget_pool_itemDoubleClicked(QListWidgetItem *item)
 }
 
 
-void MainWindow::on_listWidget_elem_itemDoubleClicked(QListWidgetItem *item)
-{
-    ChangeNameDialog newName;
-    newName.setModal(true);
-    newName.exec();
-    if(!newName.getNewName().isEmpty()){
-        item->setText(newName.getNewName());
-    }
-}
-
-
-void MainWindow::on_tableWidget_animation_cellDoubleClicked(int row, int column)
-{
-    if(column == 1){
-        ResFileDialog res;
-        res.setModal(true);
-        res.exec();
-        QString fileName = res.getResName();
-        if(!fileName.isEmpty()){
-            ui->tableWidget_animation->setItem(row,column,new QTableWidgetItem(fileName));
-            //TODO: 加入资源生成时间线代码
-            QComboBox* timeLine = new QComboBox;
-            timeLine->addItem("lml");
-            timeLine->addItem("xdf");
-            timeLine->addItem("cqf");
-            ui->tableWidget_animation->setCellWidget(row,column+1,timeLine);
-        }
-    }
-}
-
-
-//TODO: 同步删除数据
-void MainWindow::on_pushButton_delAnimation_clicked()
-{
-    QMessageBox::StandardButton reply = QMessageBox::question(this,"删除动画","确定要删除此动画吗?");
-    if(reply == QMessageBox::Yes){
-        int curRow = ui->tableWidget_animation->currentRow();
-        ui->tableWidget_animation->removeRow(curRow);
-    }
-}
-
-
-void MainWindow::on_tableWidget_animation_itemChanged(QTableWidgetItem *item)
-{
-    int column = item->column();
-    int row = item->row();
-    //名字发生修改,检查新名称唯一性
-    if(column == 0){
-        std::cout<<"name:"<<qPrintable(ui->tableWidget_animation->item(row,0)->text())<<std::endl;
-    }
-    //资源名发生修改
-    else if(column == 1){
-        std::cout<<"resource:"<<qPrintable(ui->tableWidget_animation->item(row,1)->text())<<std::endl;
-    }
-    // 时间线发生修改,居然没有反应。。。
-    else if(column == 2){
-        QComboBox *timeLine = qobject_cast<QComboBox*>(ui->tableWidget_animation->cellWidget(row,2));
-        std::cout<<"timeLine:"<<qPrintable(timeLine->currentText())<<std::endl;
-    }
-    //z-Order值发生修改,检查z-Order值合法性
-    else{
-        std::cout<<"z-Order:"<<qPrintable(ui->tableWidget_animation->item(row,3)->text())<<std::endl;
-    }
-}
 
 

+ 17 - 5
mainwindow.h

@@ -4,6 +4,8 @@
 #include <QMainWindow>
 #include <QListWidgetItem>
 #include <QTableWidgetItem>
+#include <elemPropertyData.h>
+#include <QMap>
 
 QT_BEGIN_NAMESPACE
 namespace Ui { class MainWindow; }
@@ -17,10 +19,6 @@ public:
     MainWindow(QWidget *parent = nullptr);
     ~MainWindow();
 
-protected:
-    void dragEnterEvent(QDragEnterEvent *event);
-    void dropEvent(QDropEvent *event);
-
 private slots:
     void on_pushButton_addElem_clicked();
 
@@ -54,8 +52,22 @@ private slots:
 
     void on_tableWidget_animation_itemChanged(QTableWidgetItem *item);
 
+    void on_listWidget_elem_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous);
+
+    void on_lineEdit_name_editingFinished();
+
+    void on_lineEdit_size_editingFinished();
+
+    void on_lineEdit_maxlayer_editingFinished();
+
+    void on_lineEdit_score_editingFinished();
+
+    void on_spinBox_drop_valueChanged(int arg1);
+
 private:
     Ui::MainWindow *ui;
-    QLineEdit *resource;
+    QMap<QString,ElemPropertyData*> elements;
+    void setUi(ElemPropertyData* elem);
+    bool isSingleAnimName(const QVector<ElemPropertyData::StatusEffect> &statusEffect,QString name);
 };
 #endif // MAINWINDOW_H