#include "statusEffectAnim.h" #include "ui_statusEffectAnim.h" #include "datahpp/dataManager.h" #include "resfiledialog.h" #include #include StatusEffectAnim::StatusEffectAnim(QWidget *parent) : QWidget(parent), ui(new Ui::StatusEffectAnim) { ui->setupUi(this); this->setAcceptDrops(true); ui->tableWidget_animation->setHorizontalHeaderLabels({"名称","资源","时间线","z-Order"}); } StatusEffectAnim::~StatusEffectAnim() { delete ui; } QComboBox* StatusEffectAnim::createBox(QString choice,QStringList list) { QComboBox* box = new QComboBox; box->addItem("尚未选择"); box->addItems(list); int index = box->findText(choice); if(index == -1) index = 0; box->setCurrentIndex(index); return box; } QComboBox* StatusEffectAnim::createTimelineBox(QString chosenTimeline,QString fileName) { QComboBox* timeLine = new QComboBox; if(fileName == "双击添加资源文件") return timeLine; QStringList list = DataManager::getInstance()->getTimelineList(currentElem,fileName); timeLine = createBox(chosenTimeline,list); connect(timeLine,SIGNAL(currentTextChanged(QString)),this,SLOT(onTimelineTextChanged(QString))); return timeLine; } ///动画区时间线数据发生改变 void StatusEffectAnim::onTimelineTextChanged(const QString &arg1) { //获取时间线列表所在位置 std::cout<<"current timeline is:"<(this->sender()); int x = timeline->frameGeometry().x(); int y = timeline->frameGeometry().y(); QModelIndex index = ui->tableWidget_animation->indexAt(QPoint(x,y)); int row = index.row(); //修改数据 DataManager::getInstance()->changeAnimTable(currentElem,arg1,row,2); } void StatusEffectAnim::setUi(QString elem) { currentElem = elem; int rowCnt = ui->tableWidget_animation->rowCount(); for(int i=0;itableWidget_animation->removeRow(0); } for(const auto &i:DataManager::getInstance()->getAnimVec(elem)){ int rowNum = ui->tableWidget_animation->rowCount(); ui->tableWidget_animation->insertRow(rowNum); ui->tableWidget_animation->setItem(rowNum,0,new QTableWidgetItem(i.name)); QTableWidgetItem* res = new QTableWidgetItem(DataManager::getFileName(i.res)); // 此单元格不可编辑 res->setFlags(res->flags() & ~Qt::ItemIsEditable); ui->tableWidget_animation->setItem(rowNum,1,res); //设置时间线 QComboBox* timeline = createTimelineBox(i.timeline,i.res); ui->tableWidget_animation->setCellWidget(rowNum,2,timeline); ui->tableWidget_animation->setItem(rowNum,3,new QTableWidgetItem(i.zOrder)); } } void StatusEffectAnim::on_pushButton_addAnimation_clicked() { int rowNum = ui->tableWidget_animation->rowCount(); ui->tableWidget_animation->insertRow(rowNum); QString animName = "anim"; int id = 1; while(1){ if(!DataManager::getInstance()->existAnim(currentElem,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,createBox("尚未选择",{})); ui->tableWidget_animation->setItem(rowNum,3,new QTableWidgetItem("0")); DataManager::getInstance()->addAnim(currentElem,animName); } void StatusEffectAnim::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(); ui->tableWidget_animation->removeRow(curRow); DataManager::getInstance()->delAnim(currentElem,curRow); } } void StatusEffectAnim::on_tableWidget_animation_itemChanged(QTableWidgetItem *item) { if(!animTableItemChanged) return; animTableItemChanged = false; int column = item->column(); int row = item->row(); QVector animVec = DataManager::getInstance()->getAnimVec(currentElem); if(column == 0){ QString newName = item->text(); if(DataManager::getInstance()->existAnim(currentElem,newName)){ QMessageBox::critical(this,"警告","该动画名已存在!"); ui->tableWidget_animation->item(row,0)->setText(animVec[row].name); return; } std::cout<<"名字发生改变,新名字:"<changeAnimTable(currentElem,newName,row,0); } else if(column == 3){ QString nZOrder = item->text(); bool ok;double a = nZOrder.toDouble(&ok); int zOrder = nZOrder.toInt(); if(!ok || zOrder<0 || zOrder>100000){ QMessageBox::critical(this,"警告","z-Order值超出范围!"); ui->tableWidget_animation->item(row,3)->setText(animVec[row].zOrder); return; } std::cout<<"z-Order值发生改变,新值为:"<changeAnimTable(currentElem,nZOrder,row,3); } } //替换资源文件 void StatusEffectAnim::on_tableWidget_animation_cellDoubleClicked(int row, int column) { //表格内容修改flag animTableItemChanged = true; if(column == 1){ ResFileDialog res; QString oldRes = DataManager::getInstance()->getAnimVec(currentElem)[row].res; if(oldRes != "双击添加资源文件") res.setResName(oldRes); res.setModal(true); res.exec(); QString fileName = res.getResName(); if(!fileName.isEmpty()){ QTableWidgetItem* res = new QTableWidgetItem(DataManager::getFileName(fileName)); // 此单元格不可编辑 res->setFlags(res->flags() & ~Qt::ItemIsEditable); ui->tableWidget_animation->setItem(row,1,res); QComboBox* timeLine = createTimelineBox("尚未选择",fileName); ui->tableWidget_animation->setCellWidget(row,2,timeLine); //保存当前数据 DataManager::getInstance()->changeAnimTable(currentElem,fileName,row,1); } } } void StatusEffectAnim::on_pushButton_copyAnim_clicked() { int curRow = ui->tableWidget_animation->currentRow(); if(curRow == -1) return; int rowNum = ui->tableWidget_animation->rowCount(); ui->tableWidget_animation->insertRow(rowNum); QString animName = "anim"; int id = 1; while(1){ if(!DataManager::getInstance()->existAnim(currentElem,animName)){ break; } animName = "anim" + QString::number(id++); } DataManager::getInstance()->copyAnim(currentElem,animName,curRow); ElemPropertyData::StatusEffect animData = DataManager::getInstance()->getAnimVec(currentElem)[curRow]; ui->tableWidget_animation->setItem(rowNum,0,new QTableWidgetItem(animName)); QTableWidgetItem* res = new QTableWidgetItem(DataManager::getFileName(animData.res)); // 此单元格不可编辑 res->setFlags(res->flags() & ~Qt::ItemIsEditable); ui->tableWidget_animation->setItem(rowNum,1,res); //设置时间线 QComboBox* timeline = createTimelineBox(animData.timeline,animData.res); ui->tableWidget_animation->setCellWidget(rowNum,2,timeline); ui->tableWidget_animation->setItem(rowNum,3,new QTableWidgetItem(animData.zOrder)); }