statusEffectAnim.cpp 6.7 KB

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