Bladeren bron

解决重复命名弹窗问题,更新收集动画界面的逻辑;状态配置的自动生成逻辑;更新comboBox下拉选项;

Menglan_Luo 2 jaren geleden
bovenliggende
commit
8a2095eb93
3 gewijzigde bestanden met toevoegingen van 226 en 35 verwijderingen
  1. 187 23
      mainwindow.cpp
  2. 19 0
      mainwindow.h
  3. 20 12
      mainwindow.ui

+ 187 - 23
mainwindow.cpp

@@ -26,6 +26,7 @@ MainWindow::MainWindow(QWidget *parent)
     ui->label_pic->setPixmap(pix.scaled(50,50,Qt::KeepAspectRatio));
     this->setAcceptDrops(true);
     ui->tableWidget_animation->setHorizontalHeaderLabels({"名称","资源","时间线","z-Order"});
+    ui->tabWidget->setCurrentIndex(0);
 }
 
 MainWindow::~MainWindow()
@@ -43,12 +44,45 @@ void MainWindow::setUi(ElemPropertyData *elem)
     ui->lineEdit_maxlayer->setText(elem->maxLayer);
     ui->lineEdit_score->setText(elem->score);
     ui->spinBox_drop->setValue(elem->dropConfig);
+    //设置状态与效果动画表格显示
+    int rowCnt = ui->tableWidget_animation->rowCount();
+    for(int i=0;i<rowCnt;i++){
+        ui->tableWidget_animation->removeRow(0);
+    }
+    for(const auto &i:elements[ui->listWidget_elem->currentItem()->text()]->statusEffect){
+        int rowNum = ui->tableWidget_animation->rowCount();
+        ui->tableWidget_animation->insertRow(rowNum);
+        ui->tableWidget_animation->setItem(rowNum,0,new QTableWidgetItem(i.name));
+        //TODO: 资源和时间线所在单元格替换数据
+        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(QString::number(i.zOrder)));
+    }
+    //设置收集动画的显示并聚焦到收集动画列表的最后一个元素
+    ui->listWidget_collectAnim->clear();
+    ui->listWidget_collectAnim->addItems(elem->collAnim.keys());
+//    ui->listWidget_collectAnim->item(0)->setSelected(true); // 设置选中
+
+    //设置收集动画和状态配置的comboBox
+    ui->comboBox_initAnim->clear();
+    ui->comboBox_clickAnim->clear();
+    ui->comboBox_collectAnimation->clear();
+    ui->comboBox_animation->clear();
+    for(const auto &i:elem->statusEffect){
+        ui->comboBox_clickAnim->addItem(i.name);
+        ui->comboBox_animation->addItem(i.name);
+        ui->comboBox_initAnim->addItem(i.name);
+    }
+    ui->comboBox_collectAnimation->addItems(elem->collAnim.keys());
 }
 
 void MainWindow::on_pushButton_chooseFile_clicked()
 {
-    //如果列表中尚未添加任何元素,无法触发按钮
-    if(ui->listWidget_elem->count()==0) return;
+    //如果未选中列表中的按钮,无法触发此按钮
+    if(ui->listWidget_elem->currentItem() == nullptr) return;
     QString elem = ui->listWidget_elem->currentItem()->text();
     QString file_name = QFileDialog::getOpenFileName(this,"Open a file",QDir::homePath());
     if(file_name == nullptr){
@@ -60,7 +94,7 @@ void MainWindow::on_pushButton_chooseFile_clicked()
     ui->listWidget_elem->currentItem()->setIcon(QIcon(file_name));
 }
 
-//TODO: 聚焦到新添加的元素上
+
 void MainWindow::on_pushButton_addElem_clicked()
 {
     QString elemName = "新加元素";
@@ -73,14 +107,15 @@ void MainWindow::on_pushButton_addElem_clicked()
     }
     QListWidgetItem* item = new QListWidgetItem(QIcon("/Users/menglanluo/菜狗.png"),elemName);
     ui->listWidget_elem->addItem(item);
-    //加上这一句之后总是异常闪退
-//    ui->listWidget_elem->setCurrentItem(item);
+//    ui->listWidget_elem->item(ui->listWidget_elem->count() - 1)->setSelected(true); // 设置选中
+//    ui->listWidget_elem->scrollToBottom();
     elements[elemName] = new ElemPropertyData();
 }
 
 
 void MainWindow::on_pushButton_delElem_clicked()
 {
+    if(ui->listWidget_elem->currentItem() == nullptr) return;
     QMessageBox::StandardButton reply = QMessageBox::question(this,"删除元素","确定要删除此元素吗?");
     if(reply == QMessageBox::Yes){
         QString elemName = ui->listWidget_elem->currentItem()->text();
@@ -112,28 +147,28 @@ void MainWindow::on_listWidget_elem_itemDoubleClicked(QListWidgetItem *item)
 
 void MainWindow::on_lineEdit_name_editingFinished()
 {
-    if(ui->listWidget_elem->count()==0) return;
+    if(ui->listWidget_elem->currentItem() == nullptr) 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;
+    if(ui->listWidget_elem->currentItem() == nullptr) 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;
+    if(ui->listWidget_elem->currentItem() == nullptr) 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;
+    if(ui->listWidget_elem->currentItem() == nullptr) return;
     QString key = ui->listWidget_elem->currentItem()->text();
     elements[key]->score = ui->lineEdit_score->text();
 }
@@ -141,7 +176,7 @@ void MainWindow::on_lineEdit_score_editingFinished()
 
 void MainWindow::on_spinBox_drop_valueChanged(int arg1)
 {
-    if(ui->listWidget_elem->count()==0) return;
+    if(ui->listWidget_elem->currentItem() == nullptr) return;
     QString key = ui->listWidget_elem->currentItem()->text();
     elements[key]->dropConfig = arg1;
 }
@@ -165,6 +200,8 @@ bool MainWindow::isSingleAnimName(const QVector<ElemPropertyData::StatusEffect>
 //替换资源文件
 void MainWindow::on_tableWidget_animation_cellDoubleClicked(int row, int column)
 {
+    //表格内容修改flag
+    animTableItemChanged = true;
     if(column == 1){
         ResFileDialog res;
         res.setModal(true);
@@ -184,6 +221,7 @@ void MainWindow::on_tableWidget_animation_cellDoubleClicked(int row, int column)
 
 void MainWindow::on_pushButton_addAnimation_clicked()
 {
+    if(ui->listWidget_elem->currentItem()==nullptr) return;
     int rowNum = ui->tableWidget_animation->rowCount();
     ui->tableWidget_animation->insertRow(rowNum);
     QString elemName = ui->listWidget_elem->currentItem()->text();
@@ -209,6 +247,7 @@ void MainWindow::on_pushButton_addAnimation_clicked()
 
 void MainWindow::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();
@@ -222,21 +261,17 @@ void MainWindow::on_pushButton_delAnimation_clicked()
     }
 }
 
-//TODO: 名字变更时的数据变更及重名检查
 void MainWindow::on_tableWidget_animation_itemChanged(QTableWidgetItem *item)
 {
+    if(!animTableItemChanged) return;
+    animTableItemChanged = false;
     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;
         }
@@ -266,14 +301,28 @@ void MainWindow::on_tableWidget_animation_itemChanged(QTableWidgetItem *item)
 
 void MainWindow::on_pushButton_addCollectAnim_clicked()
 {
-    //TODO: 检查默认名称唯一性
-    ui->listWidget_collectAnim->addItem(new QListWidgetItem("collAnim_1"));
+    if(ui->listWidget_elem->currentItem() == nullptr) return;
+    QString collAnimName = "collAnim";
+    ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
+    int id = 1;
+    while(1){
+        if(elem->collAnim.find(collAnimName)==elem->collAnim.end()){
+            break;
+        }
+        collAnimName = "collAnim" + QString::number(id++);
+    }
+    ui->listWidget_collectAnim->addItem(new QListWidgetItem(collAnimName));
+    elem->collAnim[collAnimName] = {ui->comboBox_animationType->itemText(0),ui->comboBox_animation->itemText(0),"",""};
+//    ui->listWidget_collectAnim->item(ui->listWidget_collectAnim->count() - 1)->setSelected(true); // 设置选中
+//    ui->listWidget_collectAnim->scrollToBottom();
 }
 
 void MainWindow::on_pushButton_delCollectAnim_clicked()
 {
+    if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_collectAnim->currentItem() == nullptr) return;
     QMessageBox::StandardButton reply = QMessageBox::question(this,"删除动画","确定要删除此收集动画吗?");
     if(reply == QMessageBox::Yes){
+        elements[ui->listWidget_elem->currentItem()->text()]->collAnim.remove(ui->listWidget_collectAnim->currentItem()->text());
         delete ui->listWidget_collectAnim->takeItem(ui->listWidget_collectAnim->currentRow());
     }
 }
@@ -284,27 +333,118 @@ void MainWindow::on_listWidget_collectAnim_itemDoubleClicked(QListWidgetItem *it
     ChangeNameDialog newName;
     newName.setModal(true);
     newName.exec();
-    if(!newName.getNewName().isEmpty()){
-        item->setText(newName.getNewName());
+    ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
+    QString name = newName.getNewName();
+    if(!name.isEmpty()){
+        if(elem->collAnim.find(name)!=elem->collAnim.end()){
+            QMessageBox::critical(this,"警告","该收集动画名已存在!");
+            return;
+        }
+        QString collAnimName = ui->listWidget_collectAnim->currentItem()->text();
+        ElemPropertyData::CollAnim collAnimData = elem->collAnim[collAnimName];
+        elem->collAnim.remove(collAnimName);
+        elem->collAnim[name] = collAnimData;
+        item->setText(name);
+    }
+}
+
+void MainWindow::on_comboBox_animationType_currentTextChanged(const QString &arg1)
+{
+    if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_collectAnim->currentItem() ==  nullptr) return;
+    elements[ui->listWidget_elem->currentItem()->text()]->collAnim[ui->listWidget_collectAnim->currentItem()->text()].type = arg1;
+}
+
+
+void MainWindow::on_comboBox_animation_currentTextChanged(const QString &arg1)
+{
+    if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_collectAnim->currentItem() ==  nullptr) return;
+    elements[ui->listWidget_elem->currentItem()->text()]->collAnim[ui->listWidget_collectAnim->currentItem()->text()].anim = arg1;
+}
+
+void MainWindow::on_lineEdit_node_editingFinished()
+{
+    if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_collectAnim->currentItem() == nullptr) return;
+    elements[ui->listWidget_elem->currentItem()->text()]->collAnim[ui->listWidget_collectAnim->currentItem()->text()].node = ui->lineEdit_node->text();
+}
+
+void MainWindow::on_lineEdit_shadow_editingFinished()
+{
+    if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_collectAnim->currentItem() == nullptr) return;
+    elements[ui->listWidget_elem->currentItem()->text()]->collAnim[ui->listWidget_collectAnim->currentItem()->text()].shadow = ui->lineEdit_shadow->text();
+}
+
+//设置收集动画显示
+void MainWindow::setCollectAnimUi(QString collectAnimName)
+{
+    if(ui->listWidget_collectAnim->currentItem() != nullptr){
+        ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
+        ElemPropertyData::CollAnim collAnimData = elem->collAnim[collectAnimName];
+        ui->lineEdit_node->setText(collAnimData.node);
+        ui->lineEdit_shadow->setText(collAnimData.shadow);
+        std::cout<<qPrintable(collAnimData.anim)<<"\t"<<qPrintable(collAnimData.type)<<std::endl;
+        //TODO: 使用comboBox的index来修改当前要显示的值
+//        ui->comboBox_animation->setCurrentText(collAnimData.anim);
+//        ui->comboBox_animationType->setCurrentText(collAnimData.type);
+        ui->comboBox_animation->setCurrentIndex(1);
+        ui->comboBox_animationType->setCurrentIndex(1);
     }
 }
 
+void MainWindow::on_listWidget_collectAnim_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
+{
+    //TODO: 或许需要另外保存当前界面的数据
+    if(current != nullptr){
+        setCollectAnimUi(current->text());
+    }
+}
 
+//TODO: 生成模板时更新状态配置的数据,怎么米有反应。。。
+void MainWindow::on_pushButton_genTemp_clicked()
+{
+    if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_status->count() > 0) return;
+    for(int i=0;i<elements[ui->listWidget_elem->currentItem()->text()]->maxLayer.toInt();i++){
+        ui->listWidget_status->addItem(QString::number(i));
+    }
+}
+
+//TODO: 生成一个合法的状态值并修改数据
 void MainWindow::on_pushButton_addStatus_clicked()
 {
     //TODO: 检查状态值合法性
-    ui->listWidget_status->addItem("1");
+    if(ui->listWidget_elem->currentItem() == nullptr) return;
+//    for(int i=0;i<elements[ui->listWidget_elem->currentItem()->text()]->maxLayer.toInt();i++){
+//        ui->listWidget_status->addItem(QString::number(i));
+//    }
+    ui->listWidget_status->addItem("3");
 }
 
-
+//TODO: 删除状态值对应的数据
 void MainWindow::on_pushButton_delStatus_clicked()
 {
+    if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_status->currentItem() == nullptr) return;
     QMessageBox::StandardButton reply = QMessageBox::question(this,"删除状态","确定要删除此状态吗?");
     if(reply == QMessageBox::Yes){
         delete ui->listWidget_status->takeItem(ui->listWidget_status->currentRow());
     }
 }
 
+void MainWindow::on_listWidget_status_itemDoubleClicked(QListWidgetItem *item)
+{
+    ChangeNameDialog newName;
+    newName.setModal(true);
+    newName.exec();
+    QString name = newName.getNewName();
+    if(!name.isEmpty()){
+        //TODO: 检查状态值合法性并转移数据
+//        if(1){}
+//        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_pushButton_addContainer_clicked()
 {
@@ -334,6 +474,30 @@ void MainWindow::on_listWidget_pool_itemDoubleClicked(QListWidgetItem *item)
     }
 }
 
-
+//切换tab时更新comboBox(或者每一次添加删除动画就更新一下该元素的comboBox?这样也更方便进行逻辑检查)
+void MainWindow::on_tabWidget_currentChanged(int index)
+{
+    if(ui->listWidget_elem->currentItem() == nullptr) return;
+    QVector<ElemPropertyData::StatusEffect> &animVec = elements[ui->listWidget_elem->currentItem()->text()]->statusEffect;
+    //如果目前展示的是收集动画,加载状态与效果配置中的动画到收集动画的动画下拉列表中
+    //目前这种方法较为暴力,后期可以视动画数量进行优化
+    if(index == 1){
+        ui->comboBox_animation->clear();
+        for(const auto &i:animVec){
+            ui->comboBox_animation->addItem(i.name);
+        }
+    }
+    //如果目前展示的是状态配置,加载相应状态效果配置动画和收集动画
+    else if(index == 2){
+        ui->comboBox_initAnim->clear();
+        ui->comboBox_clickAnim->clear();
+        ui->comboBox_collectAnimation->clear();
+        for(const auto &i:animVec){
+            ui->comboBox_initAnim->addItem(i.name);
+            ui->comboBox_clickAnim->addItem(i.name);
+        }
+        ui->comboBox_collectAnimation->addItems(elements[ui->listWidget_elem->currentItem()->text()]->collAnim.keys());
+    }
+}
 
 

+ 19 - 0
mainwindow.h

@@ -64,10 +64,29 @@ private slots:
 
     void on_spinBox_drop_valueChanged(int arg1);
 
+    void on_comboBox_animationType_currentTextChanged(const QString &arg1);
+
+    void on_comboBox_animation_currentTextChanged(const QString &arg1);
+
+    void on_lineEdit_node_editingFinished();
+
+    void on_lineEdit_shadow_editingFinished();
+
+    void on_listWidget_collectAnim_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous);
+
+    void on_tabWidget_currentChanged(int index);
+
+    void on_pushButton_genTemp_clicked();
+
+    void on_listWidget_status_itemDoubleClicked(QListWidgetItem *item);
+
 private:
     Ui::MainWindow *ui;
     QMap<QString,ElemPropertyData*> elements;
     void setUi(ElemPropertyData* elem);
     bool isSingleAnimName(const QVector<ElemPropertyData::StatusEffect> &statusEffect,QString name);
+    //防止双击修改以外的表格修改操作反复触发itemChanged信号
+    bool animTableItemChanged = false;
+    void setCollectAnimUi(QString collectAnimName);
 };
 #endif // MAINWINDOW_H

+ 20 - 12
mainwindow.ui

@@ -20,7 +20,7 @@
       <property name="orientation">
        <enum>Qt::Horizontal</enum>
       </property>
-      <widget class="QWidget" name="">
+      <widget class="QWidget" name="layoutWidget">
        <layout class="QVBoxLayout" name="verticalLayout_2">
         <item>
          <widget class="QListWidget" name="listWidget_elem"/>
@@ -52,7 +52,7 @@
         </item>
        </layout>
       </widget>
-      <widget class="QWidget" name="">
+      <widget class="QWidget" name="layoutWidget">
        <layout class="QVBoxLayout" name="verticalLayout_6">
         <item>
          <widget class="QLabel" name="label_3">
@@ -187,7 +187,7 @@
            <enum>QTabWidget::Triangular</enum>
           </property>
           <property name="currentIndex">
-           <number>0</number>
+           <number>2</number>
           </property>
           <property name="elideMode">
            <enum>Qt::ElideRight</enum>
@@ -253,7 +253,7 @@
               <property name="orientation">
                <enum>Qt::Horizontal</enum>
               </property>
-              <widget class="QWidget" name="">
+              <widget class="QWidget" name="layoutWidget">
                <layout class="QVBoxLayout" name="verticalLayout_3">
                 <item>
                  <widget class="QListWidget" name="listWidget_collectAnim"/>
@@ -278,7 +278,7 @@
                 </item>
                </layout>
               </widget>
-              <widget class="QWidget" name="">
+              <widget class="QWidget" name="layoutWidget">
                <layout class="QVBoxLayout" name="verticalLayout_7">
                 <item>
                  <layout class="QHBoxLayout" name="horizontalLayout_20">
@@ -290,7 +290,7 @@
                    </widget>
                   </item>
                   <item>
-                   <widget class="QComboBox" name="comboBox_animationType_2"/>
+                   <widget class="QComboBox" name="comboBox_animationType"/>
                   </item>
                  </layout>
                 </item>
@@ -304,7 +304,7 @@
                    </widget>
                   </item>
                   <item>
-                   <widget class="QComboBox" name="comboBox_animation_2"/>
+                   <widget class="QComboBox" name="comboBox_animation"/>
                   </item>
                  </layout>
                 </item>
@@ -318,7 +318,7 @@
                    </widget>
                   </item>
                   <item>
-                   <widget class="QLineEdit" name="lineEdit_node_2"/>
+                   <widget class="QLineEdit" name="lineEdit_node"/>
                   </item>
                  </layout>
                 </item>
@@ -332,7 +332,7 @@
                    </widget>
                   </item>
                   <item>
-                   <widget class="QLineEdit" name="lineEdit_shadow_2"/>
+                   <widget class="QLineEdit" name="lineEdit_shadow"/>
                   </item>
                  </layout>
                 </item>
@@ -459,7 +459,7 @@
              <string>删除事件</string>
             </property>
            </widget>
-           <widget class="QWidget" name="">
+           <widget class="QWidget" name="layoutWidget">
             <property name="geometry">
              <rect>
               <x>190</x>
@@ -784,7 +784,15 @@
              <string>删除</string>
             </property>
            </widget>
-           <widget class="QWidget" name="">
+           <widget class="QWidget" name="layoutWidget">
+            <property name="geometry">
+             <rect>
+              <x>0</x>
+              <y>0</y>
+              <width>100</width>
+              <height>30</height>
+             </rect>
+            </property>
             <layout class="QHBoxLayout" name="horizontalLayout_9">
              <item>
               <widget class="QLabel" name="label">
@@ -808,7 +816,7 @@
              </item>
             </layout>
            </widget>
-           <widget class="QWidget" name="">
+           <widget class="QWidget" name="layoutWidget">
             <property name="geometry">
              <rect>
               <x>10</x>