statusEffectAnim.cpp 6.1 KB

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