#include "mainwindow.h" #include "ui_mainwindow.h" #include "basicproperty.h" #include "changenamedialog.h" #include "collectionwindow.h" #include "statusconfiguration.h" #include "containerpool.h" #include "resfiledialog.h" #include #include #include #include #include #include #include #include #include #include MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); QPixmap pix("/Users/menglanluo/pic.png"); 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() { delete ui; } //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); //设置状态与效果动画表格显示 int rowCnt = ui->tableWidget_animation->rowCount(); for(int i=0;itableWidget_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->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){ 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::on_pushButton_addElem_clicked() { QString elemName = "新加元素"; int id = 1; while(1){ if(elements.find(elemName)==elements.end()){ break; } elemName = "新加元素" + QString::number(id++); } QListWidgetItem* item = new QListWidgetItem(QIcon("/Users/menglanluo/菜狗.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(); } 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(); 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->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->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->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->currentItem() == nullptr) 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->currentItem() == nullptr) 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 &statusEffect,QString name){ for(const auto &i:statusEffect){ if(name == i.name) return false; } return true; } //替换资源文件 void MainWindow::on_tableWidget_animation_cellDoubleClicked(int row, int column) { //表格内容修改flag animTableItemChanged = true; 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() { 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(); 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_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(); QVector &animVec = elements[ui->listWidget_elem->currentItem()->text()]->statusEffect; for(int i=0;itableWidget_animation->removeRow(curRow); } } void MainWindow::on_tableWidget_animation_itemChanged(QTableWidgetItem *item) { if(!animTableItemChanged) return; animTableItemChanged = false; int column = item->column(); int row = item->row(); QVector &animVec = elements[ui->listWidget_elem->currentItem()->text()]->statusEffect; if(column == 0){ QString newName = ui->tableWidget_animation->item(row,0)->text(); if(!isSingleAnimName(animVec,newName)){ QMessageBox::critical(this,"警告","该动画名已存在!"); ui->tableWidget_animation->item(row,0)->setText(animVec[row].name); return; } std::cout<<"名字发生改变,新名字:"<tableWidget_animation->item(row,1)->text())<(ui->tableWidget_animation->cellWidget(row,2)); std::cout<<"timeLine:"<currentText())<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值发生改变,新值为:"<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()); } } void MainWindow::on_listWidget_collectAnim_itemDoubleClicked(QListWidgetItem *item) { ChangeNameDialog newName; newName.setModal(true); newName.exec(); 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<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;ilistWidget_elem->currentItem()->text()]->maxLayer.toInt();i++){ ui->listWidget_status->addItem(QString::number(i)); } } //TODO: 生成一个合法的状态值并修改数据 void MainWindow::on_pushButton_addStatus_clicked() { //TODO: 检查状态值合法性 if(ui->listWidget_elem->currentItem() == nullptr) return; // for(int i=0;ilistWidget_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() { //TODO: 检查名称唯一性 ui->listWidget_pool->addItem("pool1"); } void MainWindow::on_pushButton_delContainer_clicked() { QMessageBox::StandardButton reply = QMessageBox::question(this,"删除状态","确定要删除此容器吗?"); if(reply == QMessageBox::Yes){ delete ui->listWidget_pool->takeItem(ui->listWidget_pool->currentRow()); } } void MainWindow::on_listWidget_pool_itemDoubleClicked(QListWidgetItem *item) { ChangeNameDialog newName; newName.setModal(true); newName.exec(); QString name = newName.getNewName(); if(!name.isEmpty()){ //TODO: 检查新名字唯一性 item->setText(name); } } //切换tab时更新comboBox(或者每一次添加删除动画就更新一下该元素的comboBox?这样也更方便进行逻辑检查) void MainWindow::on_tabWidget_currentChanged(int index) { if(ui->listWidget_elem->currentItem() == nullptr) return; QVector &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()); } }