statusEffectAnim.cpp 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. #include "statusEffectAnim.h"
  2. #include "ui_statusEffectAnim.h"
  3. #include "datahpp/dataManager.h"
  4. #include "resfiledialog.h"
  5. #include <iostream>
  6. #include <QMessageBox>
  7. StatusEffectAnim::StatusEffectAnim(QWidget *parent) :
  8. QWidget(parent),
  9. ui(new Ui::StatusEffectAnim)
  10. {
  11. ui->setupUi(this);
  12. this->setAcceptDrops(true);
  13. ui->tableWidget_animation->setHorizontalHeaderLabels({"名称","资源","时间线","z-Order","音效"});
  14. }
  15. StatusEffectAnim::~StatusEffectAnim()
  16. {
  17. delete ui;
  18. }
  19. QComboBox* StatusEffectAnim::createBox(QString choice,QStringList list)
  20. {
  21. QComboBox* box = new QComboBox;
  22. box->addItem("尚未选择");
  23. box->addItems(list);
  24. int index = box->findText(choice);
  25. if(index == -1) index = 0;
  26. box->setCurrentIndex(index);
  27. return box;
  28. }
  29. QComboBox* StatusEffectAnim::createTimelineBox(QString chosenTimeline,QString fileName)
  30. {
  31. QComboBox* timeLine = new QComboBox;
  32. if(fileName == "双击添加资源文件") return timeLine;
  33. QStringList list = DataManager::getInstance()->getTimelineList(currentElem,fileName);
  34. timeLine = createBox(chosenTimeline,list);
  35. connect(timeLine,SIGNAL(currentTextChanged(QString)),this,SLOT(onTimelineTextChanged(QString)));
  36. return timeLine;
  37. }
  38. ///动画区时间线数据发生改变
  39. void StatusEffectAnim::onTimelineTextChanged(const QString &arg1)
  40. {
  41. //获取时间线列表所在位置
  42. std::cout<<"current timeline is:"<<qPrintable(arg1)<<std::endl;
  43. QComboBox *timeline = dynamic_cast<QComboBox*>(this->sender());
  44. int x = timeline->frameGeometry().x();
  45. int y = timeline->frameGeometry().y();
  46. QModelIndex index = ui->tableWidget_animation->indexAt(QPoint(x,y));
  47. int row = index.row();
  48. //修改数据
  49. DataManager::getInstance()->changeAnimTable(currentElem,arg1,row,2);
  50. }
  51. void StatusEffectAnim::setUi(QString elem)
  52. {
  53. currentElem = elem;
  54. int rowCnt = ui->tableWidget_animation->rowCount();
  55. for(int i=0;i<rowCnt;i++){
  56. ui->tableWidget_animation->removeRow(0);
  57. }
  58. for(const auto &i:DataManager::getInstance()->getAnimVec(elem)){
  59. int rowNum = ui->tableWidget_animation->rowCount();
  60. ui->tableWidget_animation->insertRow(rowNum);
  61. ui->tableWidget_animation->setItem(rowNum,0,new QTableWidgetItem(i.name));
  62. QTableWidgetItem* res = new QTableWidgetItem(DataManager::getFileName(i.res));
  63. // 此单元格不可编辑
  64. res->setFlags(res->flags() & ~Qt::ItemIsEditable);
  65. ui->tableWidget_animation->setItem(rowNum,1,res);
  66. //设置时间线
  67. QComboBox* timeline = createTimelineBox(i.timeline,i.res);
  68. ui->tableWidget_animation->setCellWidget(rowNum,2,timeline);
  69. ui->tableWidget_animation->setItem(rowNum,3,new QTableWidgetItem(i.zOrder));
  70. ui->tableWidget_animation->setItem(rowNum,4,new QTableWidgetItem(i.audio));
  71. }
  72. }
  73. void StatusEffectAnim::on_pushButton_addAnimation_clicked()
  74. {
  75. int rowNum = ui->tableWidget_animation->rowCount();
  76. ui->tableWidget_animation->insertRow(rowNum);
  77. QString animName = "anim";
  78. int id = 1;
  79. while(1){
  80. if(!DataManager::getInstance()->existAnim(currentElem,animName)){
  81. break;
  82. }
  83. animName = "anim" + QString::number(id++);
  84. }
  85. ui->tableWidget_animation->setItem(rowNum,0,new QTableWidgetItem(animName));
  86. QTableWidgetItem* res = new QTableWidgetItem("双击添加资源文件");
  87. // 此单元格不可编辑
  88. res->setFlags(res->flags() & ~Qt::ItemIsEditable);
  89. ui->tableWidget_animation->setItem(rowNum,1,res);
  90. ui->tableWidget_animation->setCellWidget(rowNum,2,createBox("尚未选择",{}));
  91. ui->tableWidget_animation->setItem(rowNum,3,new QTableWidgetItem("0"));
  92. ui->tableWidget_animation->setItem(rowNum,4,new QTableWidgetItem(""));
  93. DataManager::getInstance()->addAnim(currentElem,animName);
  94. }
  95. void StatusEffectAnim::on_pushButton_delAnimation_clicked()
  96. {
  97. if(ui->tableWidget_animation->currentRow() == -1) return;
  98. QMessageBox::StandardButton reply = QMessageBox::question(this,"删除动画","确定要删除此动画吗?");
  99. if(reply == QMessageBox::Yes){
  100. int curRow = ui->tableWidget_animation->currentRow();
  101. QString animName = ui->tableWidget_animation->item(curRow,0)->text();
  102. ui->tableWidget_animation->removeRow(curRow);
  103. DataManager::getInstance()->delAnim(currentElem,curRow);
  104. }
  105. }
  106. void StatusEffectAnim::on_tableWidget_animation_itemChanged(QTableWidgetItem *item)
  107. {
  108. if(!animTableItemChanged) return;
  109. animTableItemChanged = false;
  110. int column = item->column();
  111. int row = item->row();
  112. QVector<ElemPropertyData::StatusEffect> animVec = DataManager::getInstance()->getAnimVec(currentElem);
  113. if(column == 0){
  114. QString newName = item->text();
  115. if(DataManager::getInstance()->existAnim(currentElem,newName)){
  116. QMessageBox::critical(this,"警告","该动画名已存在!");
  117. ui->tableWidget_animation->item(row,0)->setText(animVec[row].name);
  118. return;
  119. }
  120. std::cout<<"名字发生改变,新名字:"<<qPrintable(newName)<<std::endl;
  121. DataManager::getInstance()->changeAnimTable(currentElem,newName,row,0);
  122. }
  123. else if(column == 3){
  124. QString nZOrder = item->text();
  125. bool ok;double a = nZOrder.toDouble(&ok);
  126. int zOrder = nZOrder.toInt();
  127. if(!ok || zOrder<0 || zOrder>100000){
  128. QMessageBox::critical(this,"警告","z-Order值超出范围!");
  129. ui->tableWidget_animation->item(row,3)->setText(animVec[row].zOrder);
  130. return;
  131. }
  132. std::cout<<"z-Order值发生改变,新值为:"<<zOrder<<std::endl;
  133. DataManager::getInstance()->changeAnimTable(currentElem,nZOrder,row,3);
  134. } if(column == 4){
  135. QString audio = item->text();
  136. std::cout<<"音效发生改变,新值为:"<<qPrintable(audio)<<std::endl;
  137. DataManager::getInstance()->changeAnimTable(currentElem,audio,row,4);
  138. }
  139. }
  140. //替换资源文件
  141. void StatusEffectAnim::on_tableWidget_animation_cellDoubleClicked(int row, int column)
  142. {
  143. //表格内容修改flag
  144. animTableItemChanged = true;
  145. if(column == 1){
  146. ResFileDialog res;
  147. QString oldRes = DataManager::getInstance()->getAnimVec(currentElem)[row].res;
  148. if(oldRes != "双击添加资源文件") res.setResName(oldRes);
  149. res.setModal(true);
  150. res.exec();
  151. QString fileName = res.getResName();
  152. if(!fileName.isEmpty()){
  153. QTableWidgetItem* res = new QTableWidgetItem(DataManager::getFileName(fileName));
  154. // 此单元格不可编辑
  155. res->setFlags(res->flags() & ~Qt::ItemIsEditable);
  156. ui->tableWidget_animation->setItem(row,1,res);
  157. QComboBox* timeLine = createTimelineBox("尚未选择",fileName);
  158. ui->tableWidget_animation->setCellWidget(row,2,timeLine);
  159. //保存当前数据
  160. DataManager::getInstance()->changeAnimTable(currentElem,fileName,row,1);
  161. }
  162. }
  163. }
  164. void StatusEffectAnim::on_pushButton_copyAnim_clicked()
  165. {
  166. int curRow = ui->tableWidget_animation->currentRow();
  167. if(curRow == -1) return;
  168. int rowNum = ui->tableWidget_animation->rowCount();
  169. ui->tableWidget_animation->insertRow(rowNum);
  170. QString animName = "anim";
  171. int id = 1;
  172. while(1){
  173. if(!DataManager::getInstance()->existAnim(currentElem,animName)){
  174. break;
  175. }
  176. animName = "anim" + QString::number(id++);
  177. }
  178. DataManager::getInstance()->copyAnim(currentElem,animName,curRow);
  179. ElemPropertyData::StatusEffect animData = DataManager::getInstance()->getAnimVec(currentElem)[curRow];
  180. ui->tableWidget_animation->setItem(rowNum,0,new QTableWidgetItem(animName));
  181. QTableWidgetItem* res = new QTableWidgetItem(DataManager::getFileName(animData.res));
  182. // 此单元格不可编辑
  183. res->setFlags(res->flags() & ~Qt::ItemIsEditable);
  184. ui->tableWidget_animation->setItem(rowNum,1,res);
  185. //设置时间线
  186. QComboBox* timeline = createTimelineBox(animData.timeline,animData.res);
  187. ui->tableWidget_animation->setCellWidget(rowNum,2,timeline);
  188. ui->tableWidget_animation->setItem(rowNum,3,new QTableWidgetItem(animData.zOrder));
  189. ui->tableWidget_animation->setItem(rowNum,4,new QTableWidgetItem(animData.audio));
  190. }