#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"}); } 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); } 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)); } //TODO: 聚焦到新添加的元素上 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->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 &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) { 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); 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() { 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); } } //TODO: 名字变更时的数据变更及重名检查 void MainWindow::on_tableWidget_animation_itemChanged(QTableWidgetItem *item) { int column = item->column(); int row = item->row(); int rowCnt = ui->tableWidget_animation->rowCount(); QVector &animVec = elements[ui->listWidget_elem->currentItem()->text()]->statusEffect; std::cout<<"animVec size:"<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<<"名字发生改变,新名字:"<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_collectAnim->addItem(new QListWidgetItem("collAnim_1")); } void MainWindow::on_pushButton_delCollectAnim_clicked() { QMessageBox::StandardButton reply = QMessageBox::question(this,"删除动画","确定要删除此收集动画吗?"); if(reply == QMessageBox::Yes){ delete ui->listWidget_collectAnim->takeItem(ui->listWidget_collectAnim->currentRow()); } } void MainWindow::on_listWidget_collectAnim_itemDoubleClicked(QListWidgetItem *item) { ChangeNameDialog newName; newName.setModal(true); newName.exec(); if(!newName.getNewName().isEmpty()){ item->setText(newName.getNewName()); } } void MainWindow::on_pushButton_addStatus_clicked() { //TODO: 检查状态值合法性 ui->listWidget_status->addItem("1"); } void MainWindow::on_pushButton_delStatus_clicked() { QMessageBox::StandardButton reply = QMessageBox::question(this,"删除状态","确定要删除此状态吗?"); if(reply == QMessageBox::Yes){ delete ui->listWidget_status->takeItem(ui->listWidget_status->currentRow()); } } 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); } }