mainwindow.cpp 55 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304
  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. #include "basicproperty.h"
  4. #include "changenamedialog.h"
  5. #include "collectionwindow.h"
  6. #include "statusconfiguration.h"
  7. #include "containerpool.h"
  8. #include "resfiledialog.h"
  9. #include <QListWidgetItem>
  10. #include <QListWidget>
  11. #include <QLabel>
  12. #include <iostream>
  13. #include <QHBoxLayout>
  14. #include <QMessageBox>
  15. #include <QFileDialog>
  16. #include <QDragEnterEvent>
  17. #include <QMimeData>
  18. #include <QUrl>
  19. MainWindow::MainWindow(QWidget *parent)
  20. : QMainWindow(parent)
  21. , ui(new Ui::MainWindow)
  22. {
  23. ui->setupUi(this);
  24. QPixmap pix("/Users/menglanluo/pic.png");
  25. ui->label_pic->setPixmap(pix.scaled(50,50,Qt::KeepAspectRatio));
  26. this->setAcceptDrops(true);
  27. ui->tableWidget_animation->setHorizontalHeaderLabels({"名称","资源","时间线","z-Order"});
  28. ui->tableWidget_containerPool->setHorizontalHeaderLabels({"键值","资源名","初始时间线","点击时间线","影响时间线","消失时间线","消失z-Order"});
  29. ui->tableWidget_childElem->setHorizontalHeaderLabels({"名称","使用的池子"});
  30. ui->tableWidget_event->setHorizontalHeaderLabels({"事件名称","是否需要颜色一致","状态变化幅度","特效","根据格子数量消除","触发动作"});
  31. ui->tabWidget->setCurrentIndex(0);
  32. ui->lineEdit_collectionType->setReadOnly(true);
  33. }
  34. MainWindow::~MainWindow()
  35. {
  36. delete ui;
  37. }
  38. ///创建一个时间线下拉选项
  39. QComboBox* MainWindow::createTimelineBox(QString chosenTimeline,QString fileName,TimelineType type)
  40. {
  41. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  42. QComboBox* timeLine = new QComboBox;
  43. if(fileName == "双击添加资源文件") return timeLine;
  44. timeLine->addItems(elem->getTimelineList(fileName));
  45. int index;
  46. if(chosenTimeline.isEmpty()) index = -1;
  47. else index= timeLine->findText(chosenTimeline);
  48. timeLine->setCurrentIndex(index);
  49. if(type == TimelineType::Animation){
  50. connect(timeLine,SIGNAL(currentTextChanged(QString)),this,SLOT(onTimelineTextChanged(QString)));
  51. }
  52. else if(type == TimelineType::Pool){
  53. connect(timeLine,SIGNAL(currentTextChanged(QString)),this,SLOT(onPoolTimelineTextChanged(QString)));
  54. }
  55. return timeLine;
  56. }
  57. ///创建一个使用池子下拉选项
  58. QComboBox* MainWindow::createPoolBox(QString chosenPool)
  59. {
  60. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  61. QComboBox* pools = new QComboBox;
  62. pools->addItem("尚未选择池子");
  63. for(const auto &i:elem->container){
  64. pools->addItem(i.poolName);
  65. }
  66. int index;
  67. if(chosenPool == "尚未选择池子") index = 0;
  68. else index= pools->findText(chosenPool);
  69. pools->setCurrentIndex(index);
  70. connect(pools,SIGNAL(currentTextChanged(QString)),this,SLOT(onPoolsTextChanged(QString)));
  71. return pools;
  72. }
  73. ///创建一个checkBox
  74. QCheckBox* MainWindow::createCheckBox(bool chosen)
  75. {
  76. QCheckBox* check = new QCheckBox;
  77. if(chosen) check->setCheckState(Qt::Checked);
  78. else check->setCheckState(Qt::Unchecked);
  79. connect(check,SIGNAL(stateChanged(int)),this,SLOT(onCheckBoxStateChanged(int)));
  80. return check;
  81. }
  82. ///创建一个特效下拉选项
  83. QComboBox* MainWindow::createEffectBox(QString chosenEffect)
  84. {
  85. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  86. QComboBox* effect = new QComboBox;
  87. effect->addItem("尚未选择动画");
  88. for(const auto &i:elem->statusEffect){
  89. effect->addItem(i.name);
  90. }
  91. int index;
  92. if(chosenEffect == "尚未选择动画") index = 0;
  93. else index= effect->findText(chosenEffect);
  94. effect->setCurrentIndex(index);
  95. connect(effect,SIGNAL(currentTextChanged(QString)),this,SLOT(onEffectTextChanged(QString)));
  96. return effect;
  97. }
  98. ///创建一个触发动作
  99. QWidget* MainWindow::createTriggerAction()
  100. {
  101. QComboBox* actions = new QComboBox;
  102. QPushButton* setAction = new QPushButton("设置");
  103. QHBoxLayout *layout = new QHBoxLayout();
  104. QWidget *triggerAction = new QWidget;
  105. layout->addWidget(actions);
  106. layout->addWidget(setAction);
  107. triggerAction->setLayout(layout);
  108. layout->setMargin(0);
  109. return triggerAction;
  110. }
  111. ///动画删除或改名后其它下拉选项的更新
  112. void MainWindow::updateAnimComboBox(QString changedAnim)
  113. {
  114. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  115. //收集动画界面
  116. if(ui->listWidget_collectAnim->currentItem() != nullptr){
  117. int index = elem->getCollAnimIndex(ui->listWidget_collectAnim->currentItem()->text());
  118. if(elem->collAnim[index].anim == changedAnim) ui->comboBox_animation->setCurrentIndex(0);
  119. }
  120. //状态配置界面
  121. if(ui->listWidget_status->currentItem() != nullptr){
  122. int index = elem->getStatusValIndex(ui->listWidget_status->currentItem()->text());
  123. if(elem->statusConfig[index].initAnim == changedAnim) ui->comboBox_initAnim->setCurrentIndex(0);
  124. if(elem->statusConfig[index].clickAnim == changedAnim) ui->comboBox_clickAnim->setCurrentIndex(0);
  125. int rowNum = ui->tableWidget_event->rowCount();
  126. for(int i=0;i<rowNum;i++){
  127. QComboBox *effect = qobject_cast<QComboBox*>(ui->tableWidget_event->cellWidget(i,3));
  128. if(effect->currentText() == changedAnim) effect->setCurrentIndex(0);
  129. }
  130. }
  131. }
  132. ///收集动画删除或改名后下拉选项更新
  133. void MainWindow::updateCollAnimComboBox(QString changedAnim)
  134. {
  135. std::cout<<"收集动画改变,更新下拉选项"<<std::endl;
  136. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  137. //状态配置界面
  138. if(ui->listWidget_status->currentItem() != nullptr){
  139. int index = elem->getStatusValIndex(ui->listWidget_status->currentItem()->text());
  140. if(elem->statusConfig[index].collAnim == changedAnim) ui->comboBox_collectAnimation->setCurrentIndex(0);
  141. }
  142. }
  143. //TODO: 设置ui所有数据
  144. void MainWindow::setUi(ElemPropertyData *elem)
  145. {
  146. std::cout<<"切换元素,刷新界面"<<std::endl;
  147. //基础元素区域的设置
  148. QPixmap pix(elem->iconPath);
  149. ui->label_pic->setPixmap(pix.scaled(50,50,Qt::KeepAspectRatio));
  150. ui->lineEdit_name->setText(elem->labelName);
  151. ui->lineEdit_size->setText(elem->size);
  152. ui->lineEdit_maxlayer->setText(elem->maxLayer);
  153. ui->lineEdit_score->setText(elem->score);
  154. ui->spinBox_drop->setValue(elem->dropConfig);
  155. //设置状态与效果动画表格显示
  156. int rowCnt = ui->tableWidget_animation->rowCount();
  157. for(int i=0;i<rowCnt;i++){
  158. ui->tableWidget_animation->removeRow(0);
  159. }
  160. for(const auto &i:elem->statusEffect){
  161. int rowNum = ui->tableWidget_animation->rowCount();
  162. ui->tableWidget_animation->insertRow(rowNum);
  163. ui->tableWidget_animation->setItem(rowNum,0,new QTableWidgetItem(i.name));
  164. QTableWidgetItem* res = new QTableWidgetItem(getFileName(i.res));
  165. // 此单元格不可编辑
  166. res->setFlags(res->flags() & ~Qt::ItemIsEditable);
  167. ui->tableWidget_animation->setItem(rowNum,1,res);
  168. //设置时间线
  169. QComboBox* timeline = createTimelineBox(i.timeline,i.res,TimelineType::Animation);
  170. ui->tableWidget_animation->setCellWidget(rowNum,2,timeline);
  171. ui->tableWidget_animation->setItem(rowNum,3,new QTableWidgetItem(i.zOrder));
  172. }
  173. //设置收集动画的显示并聚焦到收集动画列表的最后一个元素
  174. ui->listWidget_collectAnim->clear();
  175. for(const auto &i:elem->collAnim){
  176. ui->listWidget_collectAnim->addItem(i.name);
  177. }
  178. // ui->listWidget_collectAnim->item(0)->setSelected(true); // 设置选中
  179. //设置状态配置界面
  180. ui->listWidget_status->clear();
  181. for(const auto &i:elem->statusConfig){
  182. ui->listWidget_status->addItem(i.statusValue);
  183. }
  184. //设置收集动画和状态配置的comboBox
  185. ui->comboBox_initAnim->clear();
  186. ui->comboBox_clickAnim->clear();
  187. ui->comboBox_collectAnimation->clear();
  188. ui->comboBox_animation->clear();
  189. ui->comboBox_initAnim->addItem("尚未选择动画");
  190. ui->comboBox_clickAnim->addItem("尚未选择动画");
  191. ui->comboBox_collectAnimation->addItem("尚未选择动画");
  192. ui->comboBox_animation->addItem("尚未选择动画");
  193. for(const auto &i:elem->statusEffect){
  194. ui->comboBox_clickAnim->addItem(i.name);
  195. ui->comboBox_animation->addItem(i.name);
  196. ui->comboBox_initAnim->addItem(i.name);
  197. }
  198. for(const auto &i:elem->collAnim){
  199. ui->comboBox_collectAnimation->addItem(i.name);
  200. }
  201. //设置容器池界面
  202. ui->listWidget_pool->clear();
  203. for(const auto &i:elem->container){
  204. ui->listWidget_pool->addItem(i.poolName);
  205. }
  206. //切换元素时容器尚未选中,先清除表格内容
  207. int rowNum = ui->tableWidget_containerPool->rowCount();
  208. for(int i=0;i<rowNum;i++){
  209. ui->tableWidget_containerPool->removeRow(0);
  210. }
  211. //设置子元素界面
  212. rowCnt = ui->tableWidget_childElem->rowCount();
  213. for(int i=0;i<rowCnt;i++){
  214. ui->tableWidget_childElem->removeRow(0);
  215. }
  216. for(const auto &i:elem->childElem){
  217. int rowNum = ui->tableWidget_childElem->rowCount();
  218. ui->tableWidget_childElem->insertRow(rowNum);
  219. ui->tableWidget_childElem->setItem(rowNum,0,new QTableWidgetItem(i.name));
  220. //TODO: 根据记载的comboBox数据设置当前选中项
  221. QComboBox* containers = new QComboBox;
  222. for(const auto &i:elem->container){
  223. containers->addItem(i.poolName);
  224. }
  225. int index = containers->findText(i.container);
  226. containers->setCurrentIndex(index);
  227. containers->setCurrentIndex(0);
  228. ui->tableWidget_childElem->setCellWidget(rowNum,1,containers);
  229. }
  230. }
  231. void MainWindow::on_pushButton_chooseFile_clicked()
  232. {
  233. //如果未选中列表中的按钮,无法触发此按钮
  234. if(ui->listWidget_elem->currentItem() == nullptr) return;
  235. QString elem = ui->listWidget_elem->currentItem()->text();
  236. QString file_name = QFileDialog::getOpenFileName(this,"Open a file",QDir::homePath());
  237. if(file_name == nullptr){
  238. file_name = elements[elem]->iconPath;
  239. }
  240. QPixmap pix(file_name);
  241. ui->label_pic->setPixmap(pix.scaled(50,50,Qt::KeepAspectRatio));
  242. elements[elem]->iconPath = file_name;
  243. ui->listWidget_elem->currentItem()->setIcon(QIcon(file_name));
  244. }
  245. void MainWindow::on_pushButton_addElem_clicked()
  246. {
  247. QString elemName = "新加元素";
  248. int id = 1;
  249. while(1){
  250. if(elements.find(elemName)==elements.end()){
  251. break;
  252. }
  253. elemName = "新加元素" + QString::number(id++);
  254. }
  255. QListWidgetItem* item = new QListWidgetItem(QIcon("/Users/menglanluo/菜狗.png"),elemName);
  256. ui->listWidget_elem->addItem(item);
  257. // ui->listWidget_elem->item(ui->listWidget_elem->count() - 1)->setSelected(true); // 设置选中
  258. // ui->listWidget_elem->scrollToBottom();
  259. elements[elemName] = new ElemPropertyData();
  260. }
  261. void MainWindow::on_pushButton_delElem_clicked()
  262. {
  263. if(ui->listWidget_elem->currentItem() == nullptr) return;
  264. QMessageBox::StandardButton reply = QMessageBox::question(this,"删除元素","确定要删除此元素吗?");
  265. if(reply == QMessageBox::Yes){
  266. QString elemName = ui->listWidget_elem->currentItem()->text();
  267. delete elements[elemName];
  268. elements.erase(elements.find(elemName));
  269. delete ui->listWidget_elem->takeItem(ui->listWidget_elem->currentRow());
  270. }
  271. }
  272. void MainWindow::on_listWidget_elem_itemDoubleClicked(QListWidgetItem *item)
  273. {
  274. ChangeNameDialog newName;
  275. newName.setModal(true);
  276. newName.exec();
  277. QString name = newName.getNewName();
  278. if(!name.isEmpty()){
  279. if(elements.find(name)!=elements.end()){
  280. QMessageBox::critical(this,"警告","该元素名已存在!");
  281. return;
  282. }
  283. QString elemName = ui->listWidget_elem->currentItem()->text();
  284. ElemPropertyData* newElem = elements[elemName];
  285. elements.erase(elements.find(elemName));
  286. elements[newName.getNewName()] = newElem;
  287. item->setText(newName.getNewName());
  288. }
  289. }
  290. //基础元素数据变化触发保存
  291. void MainWindow::on_lineEdit_name_editingFinished()
  292. {
  293. if(ui->listWidget_elem->currentItem() == nullptr) return;
  294. QString key = ui->listWidget_elem->currentItem()->text();
  295. elements[key]->labelName = ui->lineEdit_name->text();
  296. }
  297. void MainWindow::on_lineEdit_size_editingFinished()
  298. {
  299. if(ui->listWidget_elem->currentItem() == nullptr) return;
  300. QString key = ui->listWidget_elem->currentItem()->text();
  301. elements[key]->size = ui->lineEdit_size->text();
  302. }
  303. void MainWindow::on_lineEdit_maxlayer_editingFinished()
  304. {
  305. if(ui->listWidget_elem->currentItem() == nullptr) return;
  306. QString key = ui->listWidget_elem->currentItem()->text();
  307. elements[key]->maxLayer = ui->lineEdit_maxlayer->text();
  308. }
  309. void MainWindow::on_lineEdit_score_editingFinished()
  310. {
  311. if(ui->listWidget_elem->currentItem() == nullptr) return;
  312. QString key = ui->listWidget_elem->currentItem()->text();
  313. elements[key]->score = ui->lineEdit_score->text();
  314. }
  315. void MainWindow::on_spinBox_drop_valueChanged(int arg1)
  316. {
  317. if(ui->listWidget_elem->currentItem() == nullptr) return;
  318. QString key = ui->listWidget_elem->currentItem()->text();
  319. elements[key]->dropConfig = arg1;
  320. }
  321. //TODO: 保存当前元素的所有数据,界面加载当前元素数据
  322. void MainWindow::on_listWidget_elem_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
  323. {
  324. //每一步改变基本都会触发保存,但是表格内嵌的组件如combobox暂时没找到触发保存的办法
  325. setUi(elements[current->text()]);
  326. }
  327. //替换资源文件
  328. void MainWindow::on_tableWidget_animation_cellDoubleClicked(int row, int column)
  329. {
  330. if(ui->listWidget_elem->currentItem()==nullptr) return;
  331. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  332. //表格内容修改flag
  333. animTableItemChanged = true;
  334. if(column == 1){
  335. ResFileDialog res;
  336. res.setModal(true);
  337. res.exec();
  338. QString fileName = res.getResName();
  339. if(!fileName.isEmpty()){
  340. QTableWidgetItem* res = new QTableWidgetItem(getFileName(fileName));
  341. // 此单元格不可编辑
  342. res->setFlags(res->flags() & ~Qt::ItemIsEditable);
  343. ui->tableWidget_animation->setItem(row,1,res);
  344. QComboBox* timeLine = createTimelineBox("",fileName,TimelineType::Animation);
  345. ui->tableWidget_animation->setCellWidget(row,column+1,timeLine);
  346. //保存当前数据
  347. elem->statusEffect[row].res = fileName;
  348. }
  349. }
  350. }
  351. ///动画区时间线数据发生改变
  352. void MainWindow::onTimelineTextChanged(const QString &arg1)
  353. {
  354. if(ui->listWidget_elem->currentItem() == nullptr) return;
  355. //获取时间线列表所在位置
  356. std::cout<<"current timeline is:"<<qPrintable(arg1)<<std::endl;
  357. QComboBox *timeline = dynamic_cast<QComboBox*>(this->sender());
  358. int x = timeline->frameGeometry().x();
  359. int y = timeline->frameGeometry().y();
  360. QModelIndex index = ui->tableWidget_animation->indexAt(QPoint(x,y));
  361. int row = index.row();
  362. //修改数据
  363. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  364. elem->statusEffect[row].timeline = timeline->currentText();
  365. }
  366. ///容器池区时间线数据发生改变
  367. void MainWindow::onPoolTimelineTextChanged(const QString &arg1)
  368. {
  369. if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_pool->currentItem() == nullptr) return;
  370. //获取时间线列表所在位置
  371. std::cout<<"current timeline is:"<<qPrintable(arg1)<<std::endl;
  372. QComboBox *timeline = dynamic_cast<QComboBox*>(this->sender());
  373. int x = timeline->frameGeometry().x();
  374. int y = timeline->frameGeometry().y();
  375. QModelIndex index = ui->tableWidget_containerPool->indexAt(QPoint(x,y));
  376. int row = index.row();
  377. int column = index.column();
  378. //修改数据
  379. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  380. int poolIndex = elem->getPoolIndex(ui->listWidget_pool->currentItem()->text());
  381. if(column == 2) elem->container[poolIndex].table[row].initTimeline = timeline->currentText();
  382. else if(column == 3) elem->container[poolIndex].table[row].clickTimeline = timeline->currentText();
  383. else if(column == 4) elem->container[poolIndex].table[row].effectTimeline = timeline->currentText();
  384. else if(column == 5) elem->container[poolIndex].table[row].vanishTimeline = timeline->currentText();
  385. }
  386. ///子元素使用池子数据发生改变
  387. void MainWindow::onPoolsTextChanged(const QString &arg1)
  388. {
  389. if(ui->listWidget_elem->currentItem() == nullptr) return;
  390. //获取池子列表所在位置
  391. QComboBox *pools = dynamic_cast<QComboBox*>(this->sender());
  392. int x = pools->frameGeometry().x();
  393. int y = pools->frameGeometry().y();
  394. QModelIndex index = ui->tableWidget_childElem->indexAt(QPoint(x,y));
  395. int row = index.row();
  396. //修改数据
  397. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  398. elem->childElem[row].container = arg1;
  399. }
  400. ///事件配置checkBox状态发生改变
  401. void MainWindow::onCheckBoxStateChanged(int state)
  402. {
  403. if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_status->currentItem() == nullptr) return;
  404. //获取checkBox所在位置
  405. QCheckBox *check = dynamic_cast<QCheckBox*>(this->sender());
  406. int x = check->frameGeometry().x();
  407. int y = check->frameGeometry().y();
  408. QModelIndex index = ui->tableWidget_event->indexAt(QPoint(x,y));
  409. int row = index.row();
  410. int column = index.column();
  411. //修改数据
  412. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  413. int statusIndex = elem->getStatusValIndex(ui->listWidget_status->currentItem()->text());
  414. ElemPropertyData::EventConfig &eventData = elem->statusConfig[statusIndex].eventConfig[row];
  415. //是否需要颜色一致
  416. if(column == 1){
  417. if(state == 0) eventData.consisColor = false;
  418. else eventData.consisColor = true;
  419. std::cout<<"颜色是否需要一致状态:"<<state<<std::endl;
  420. }
  421. else if(column == 4){
  422. if(state == 0) eventData.elimATLattices = false;
  423. else eventData.elimATLattices = true;
  424. std::cout<<"根据格子数量消除状态:"<<state<<std::endl;
  425. }
  426. }
  427. ///特效ComboBox选择发生改变
  428. void MainWindow::onEffectTextChanged(const QString &arg1)
  429. {
  430. if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_status->currentItem() == nullptr) return;
  431. //获取特效列表所在位置
  432. QComboBox *effect = dynamic_cast<QComboBox*>(this->sender());
  433. int x = effect->frameGeometry().x();
  434. int y = effect->frameGeometry().y();
  435. QModelIndex index = ui->tableWidget_event->indexAt(QPoint(x,y));
  436. int row = index.row();
  437. //修改数据
  438. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  439. int statusIndex = elem->getStatusValIndex(ui->listWidget_status->currentItem()->text());
  440. elem->statusConfig[statusIndex].eventConfig[row].specialEffect = arg1;
  441. }
  442. void MainWindow::on_pushButton_addAnimation_clicked()
  443. {
  444. if(ui->listWidget_elem->currentItem()==nullptr) return;
  445. int rowNum = ui->tableWidget_animation->rowCount();
  446. ui->tableWidget_animation->insertRow(rowNum);
  447. QString elemName = ui->listWidget_elem->currentItem()->text();
  448. ElemPropertyData* elem = elements[elemName];
  449. QString animName = "anim";
  450. int id = 1;
  451. while(1){
  452. if(elem->isSingleAnimName(animName)){
  453. break;
  454. }
  455. animName = "anim" + QString::number(id++);
  456. }
  457. ui->tableWidget_animation->setItem(rowNum,0,new QTableWidgetItem(animName));
  458. QTableWidgetItem* res = new QTableWidgetItem("双击添加资源文件");
  459. // 此单元格不可编辑
  460. res->setFlags(res->flags() & ~Qt::ItemIsEditable);
  461. ui->tableWidget_animation->setItem(rowNum,1,res);
  462. ui->tableWidget_animation->setCellWidget(rowNum,2,new QComboBox);
  463. ui->tableWidget_animation->setItem(rowNum,3,new QTableWidgetItem("0"));
  464. elem->statusEffect.push_back(ElemPropertyData::StatusEffect(animName));
  465. //更新与动画相关的下拉选项
  466. ui->comboBox_initAnim->addItem(animName);
  467. ui->comboBox_clickAnim->addItem(animName);
  468. ui->comboBox_animation->addItem(animName);
  469. //更新状态配置表格当前状态的特效下拉选项
  470. if(ui->listWidget_status->currentItem() != nullptr){
  471. int rowNum = ui->tableWidget_event->rowCount();
  472. for(int i=0;i<rowNum;i++){
  473. QComboBox *effect = qobject_cast<QComboBox*>(ui->tableWidget_event->cellWidget(i,3));
  474. effect->addItem(animName);
  475. }
  476. }
  477. }
  478. void MainWindow::on_pushButton_delAnimation_clicked()
  479. {
  480. if(ui->listWidget_elem->currentItem() == nullptr || ui->tableWidget_animation->currentRow() == -1) return;
  481. QMessageBox::StandardButton reply = QMessageBox::question(this,"删除动画","确定要删除此动画吗?");
  482. if(reply == QMessageBox::Yes){
  483. int curRow = ui->tableWidget_animation->currentRow();
  484. QString animName = ui->tableWidget_animation->item(curRow,0)->text();
  485. QVector<ElemPropertyData::StatusEffect> &animVec = elements[ui->listWidget_elem->currentItem()->text()]->statusEffect;
  486. for(int i=0;i<animVec.size();i++){
  487. if(animName == animVec[i].name){
  488. animVec.remove(i);
  489. break;
  490. }
  491. }
  492. ui->tableWidget_animation->removeRow(curRow);
  493. //更新动画相关的下拉选项
  494. updateAnimComboBox(animName);
  495. ui->comboBox_initAnim->removeItem(ui->comboBox_initAnim->findText(animName));
  496. ui->comboBox_clickAnim->removeItem(ui->comboBox_clickAnim->findText(animName));
  497. ui->comboBox_animation->removeItem(ui->comboBox_animation->findText(animName));
  498. }
  499. }
  500. void MainWindow::on_tableWidget_animation_itemChanged(QTableWidgetItem *item)
  501. {
  502. if(!animTableItemChanged) return;
  503. animTableItemChanged = false;
  504. int column = item->column();
  505. int row = item->row();
  506. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  507. QVector<ElemPropertyData::StatusEffect> &animVec = elem->statusEffect;
  508. if(column == 0){
  509. QString newName = ui->tableWidget_animation->item(row,0)->text();
  510. if(!elem->isSingleAnimName(newName)){
  511. QMessageBox::critical(this,"警告","该动画名已存在!");
  512. ui->tableWidget_animation->item(row,0)->setText(animVec[row].name);
  513. return;
  514. }
  515. std::cout<<"名字发生改变,新名字:"<<qPrintable(newName)<<std::endl;
  516. //更新动画相关的下拉选项
  517. updateAnimComboBox(animVec[row].name);
  518. ui->comboBox_initAnim->removeItem(ui->comboBox_initAnim->findText(animVec[row].name));
  519. ui->comboBox_clickAnim->removeItem(ui->comboBox_clickAnim->findText(animVec[row].name));
  520. ui->comboBox_animation->removeItem(ui->comboBox_animation->findText(animVec[row].name));
  521. ui->comboBox_initAnim->addItem(newName);
  522. ui->comboBox_clickAnim->addItem(newName);
  523. ui->comboBox_animation->addItem(newName);
  524. animVec[row].name = newName;
  525. }
  526. //资源名发生修改
  527. else if(column == 1){
  528. std::cout<<"动画资源发生改变,新资源名:"<<qPrintable(ui->tableWidget_animation->item(row,1)->text())<<std::endl;
  529. }
  530. else{
  531. bool ok;double a = ui->tableWidget_animation->item(row,3)->text().toDouble(&ok);
  532. int zOrder = ui->tableWidget_animation->item(row,3)->text().toInt();
  533. if(!ok || zOrder<0 || zOrder>100000){
  534. QMessageBox::critical(this,"警告","z-Order值超出范围!");
  535. ui->tableWidget_animation->item(row,3)->setText(animVec[row].zOrder);
  536. return;
  537. }
  538. std::cout<<"z-Order值发生改变,新值为:"<<zOrder<<std::endl;
  539. animVec[row].zOrder = item->text();
  540. }
  541. }
  542. void MainWindow::on_pushButton_addCollectAnim_clicked()
  543. {
  544. if(ui->listWidget_elem->currentItem() == nullptr) return;
  545. QString collAnimName = "collAnim";
  546. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  547. int id = 1;
  548. while(1){
  549. if(elem->getCollAnimIndex(collAnimName) == -1){
  550. break;
  551. }
  552. collAnimName = "collAnim" + QString::number(id++);
  553. }
  554. ui->listWidget_collectAnim->addItem(new QListWidgetItem(collAnimName));
  555. ElemPropertyData::CollAnim collAnim(collAnimName);
  556. elem->collAnim.push_back(collAnim);
  557. ui->comboBox_collectAnimation->addItem(collAnimName);
  558. // ui->listWidget_collectAnim->item(ui->listWidget_collectAnim->count() - 1)->setSelected(true); // 设置选中
  559. // ui->listWidget_collectAnim->scrollToBottom();
  560. }
  561. void MainWindow::on_pushButton_delCollectAnim_clicked()
  562. {
  563. if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_collectAnim->currentItem() == nullptr) return;
  564. QMessageBox::StandardButton reply = QMessageBox::question(this,"删除动画","确定要删除此收集动画吗?");
  565. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  566. if(reply == QMessageBox::Yes){
  567. QString delName = ui->listWidget_collectAnim->currentItem()->text();
  568. QVector<ElemPropertyData::CollAnim> &collAnimVec = elem->collAnim;
  569. for(int i=0;i<collAnimVec.size();i++){
  570. if(collAnimVec[i].name == delName){
  571. collAnimVec.remove(i);
  572. }
  573. }
  574. delete ui->listWidget_collectAnim->takeItem(ui->listWidget_collectAnim->currentRow());
  575. updateCollAnimComboBox(delName);
  576. ui->comboBox_collectAnimation->removeItem(ui->comboBox_collectAnimation->findText(delName));
  577. }
  578. }
  579. void MainWindow::on_listWidget_collectAnim_itemDoubleClicked(QListWidgetItem *item)
  580. {
  581. ChangeNameDialog newName;
  582. newName.setModal(true);
  583. newName.exec();
  584. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  585. QString name = newName.getNewName();
  586. if(!name.isEmpty()){
  587. if(elem->getCollAnimIndex(name) != -1){
  588. QMessageBox::critical(this,"警告","该收集动画名已存在!");
  589. return;
  590. }
  591. updateCollAnimComboBox(item->text());
  592. ui->comboBox_collectAnimation->removeItem(ui->comboBox_collectAnimation->findText(item->text()));
  593. ui->comboBox_collectAnimation->addItem(name);
  594. elem->collAnim[elem->getCollAnimIndex(item->text())].name = name;
  595. item->setText(name);
  596. }
  597. }
  598. void MainWindow::on_comboBox_animationType_currentTextChanged(const QString &arg1)
  599. {
  600. if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_collectAnim->currentItem() == nullptr) return;
  601. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  602. int index = elem->getCollAnimIndex(ui->listWidget_collectAnim->currentItem()->text());
  603. elem->collAnim[index].type = arg1;
  604. }
  605. void MainWindow::on_comboBox_animation_currentTextChanged(const QString &arg1)
  606. {
  607. if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_collectAnim->currentItem() == nullptr) return;
  608. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  609. int index = elem->getCollAnimIndex(ui->listWidget_collectAnim->currentItem()->text());
  610. elem->collAnim[index].anim = arg1;
  611. }
  612. void MainWindow::on_lineEdit_node_editingFinished()
  613. {
  614. if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_collectAnim->currentItem() == nullptr) return;
  615. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  616. int index = elem->getCollAnimIndex(ui->listWidget_collectAnim->currentItem()->text());
  617. elem->collAnim[index].node = ui->lineEdit_node->text();
  618. }
  619. void MainWindow::on_lineEdit_shadow_editingFinished()
  620. {
  621. if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_collectAnim->currentItem() == nullptr) return;
  622. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  623. int index = elem->getCollAnimIndex(ui->listWidget_collectAnim->currentItem()->text());
  624. elem->collAnim[index].shadow = ui->lineEdit_shadow->text();
  625. }
  626. //设置收集动画显示
  627. void MainWindow::setCollectAnimUi(QString collectAnimName)
  628. {
  629. if(ui->listWidget_collectAnim->currentItem() != nullptr){
  630. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  631. ElemPropertyData::CollAnim collAnimData = elem->collAnim[elem->getCollAnimIndex(collectAnimName)];
  632. ui->lineEdit_node->setText(collAnimData.node);
  633. ui->lineEdit_shadow->setText(collAnimData.shadow);
  634. std::cout<<qPrintable(collAnimData.anim)<<"\t"<<qPrintable(collAnimData.type)<<std::endl;
  635. ui->comboBox_animationType->setCurrentIndex(1);
  636. int index = ui->comboBox_animation->findText(collAnimData.anim);
  637. if(index == -1) index = 0;
  638. ui->comboBox_animation->setCurrentIndex(index);
  639. }
  640. }
  641. void MainWindow::on_listWidget_collectAnim_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
  642. {
  643. //TODO: 或许需要另外保存当前界面的数据
  644. if(current != nullptr){
  645. setCollectAnimUi(current->text());
  646. }
  647. }
  648. //生成模板并更新状态配置的数据
  649. void MainWindow::on_pushButton_genTemp_clicked()
  650. {
  651. if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_status->count() > 0) return;
  652. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  653. for(int i=0;i<elem->maxLayer.toInt();i++){
  654. ui->listWidget_status->addItem(QString::number(i));
  655. ElemPropertyData::StatusConfig status(QString::number(i));
  656. elem->statusConfig.push_back(status);
  657. }
  658. }
  659. //添加状态,若已经生成最大层数全部状态则按钮无效
  660. void MainWindow::on_pushButton_addStatus_clicked()
  661. {
  662. if(ui->listWidget_elem->currentItem() == nullptr) return;
  663. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  664. QString statusName;
  665. for(int i=0;i<elem->maxLayer.toInt();i++){
  666. if(elem->getStatusValIndex(QString::number(i)) == -1){
  667. statusName = QString::number(i);
  668. break;
  669. }
  670. }
  671. if(!statusName.isEmpty()){
  672. ui->listWidget_status->addItem(statusName);
  673. ElemPropertyData::StatusConfig status(statusName);
  674. elem->statusConfig.push_back(status);
  675. }
  676. }
  677. //TODO: 删除状态值对应的数据
  678. void MainWindow::on_pushButton_delStatus_clicked()
  679. {
  680. if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_status->currentItem() == nullptr) return;
  681. QMessageBox::StandardButton reply = QMessageBox::question(this,"删除状态","确定要删除此状态吗?");
  682. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  683. if(reply == QMessageBox::Yes){
  684. for(int i=0;i<elem->statusConfig.size();i++){
  685. if(elem->statusConfig[i].statusValue == ui->listWidget_status->currentItem()->text()){
  686. elem->statusConfig.remove(i);
  687. break;
  688. }
  689. }
  690. delete ui->listWidget_status->takeItem(ui->listWidget_status->currentRow());
  691. }
  692. }
  693. //修改状态值,检查修改后的状态值是否合法,并转移数据
  694. void MainWindow::on_listWidget_status_itemDoubleClicked(QListWidgetItem *item)
  695. {
  696. ChangeNameDialog newName;
  697. newName.setModal(true);
  698. newName.exec();
  699. QString name = newName.getNewName();
  700. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  701. if(!name.isEmpty()){
  702. //TODO: 检查状态值合法性并转移数据
  703. bool isNum;double tmp = name.toDouble(&isNum);
  704. int maxlayer = ui->lineEdit_maxlayer->text().toInt();
  705. int statusNum = name.toInt();
  706. if(!isNum ||statusNum < 0 || statusNum >= maxlayer){
  707. QMessageBox::critical(this,"错误","状态值必须是大于等于0且小于最大层数的数字");
  708. return;
  709. }
  710. if(elem->getStatusValIndex(name) == -1){
  711. QMessageBox::critical(this,"警告","该状态值已存在");
  712. return;
  713. }
  714. int index = elem->getStatusValIndex(item->text());
  715. elem->statusConfig[index].statusValue = name;
  716. item->setText(name);
  717. }
  718. }
  719. void MainWindow::on_pushButton_addContainer_clicked()
  720. {
  721. if(ui->listWidget_elem->currentItem() == nullptr) return;
  722. QString poolName = "pool";
  723. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  724. int id = 1;
  725. while(1){
  726. if(elem->getPoolIndex(poolName) == -1){
  727. break;
  728. }
  729. poolName = "pool" + QString::number(id++);
  730. }
  731. ui->listWidget_pool->addItem(new QListWidgetItem(poolName));
  732. ElemPropertyData::ContainerConfig container(poolName);
  733. elem->container.push_back(container);
  734. //子元素下拉列表添加可选项
  735. int rowNum = ui->tableWidget_childElem->rowCount();
  736. for(int i=0;i<rowNum;i++){
  737. QComboBox *containers = qobject_cast<QComboBox*>(ui->tableWidget_childElem->cellWidget(i,1));
  738. containers->addItem(poolName);
  739. }
  740. }
  741. void MainWindow::on_pushButton_delContainer_clicked()
  742. {
  743. if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_pool->currentItem() == nullptr) return;
  744. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  745. QMessageBox::StandardButton reply = QMessageBox::question(this,"删除状态","确定要删除此容器吗?");
  746. if(reply == QMessageBox::Yes){
  747. QString delPoolName = ui->listWidget_pool->currentItem()->text();
  748. int index = elem->getPoolIndex(delPoolName);
  749. elem->container.remove(index);
  750. delete ui->listWidget_pool->takeItem(ui->listWidget_pool->currentRow());
  751. //子元素下拉列表删除可选项
  752. int rowNum = ui->tableWidget_childElem->rowCount();
  753. for(int i=0;i<rowNum;i++){
  754. QComboBox *containers = qobject_cast<QComboBox*>(ui->tableWidget_childElem->cellWidget(i,1));
  755. if(elem->childElem[i].container == delPoolName) containers->setCurrentIndex(0);
  756. containers->removeItem(containers->findText(delPoolName));
  757. }
  758. }
  759. }
  760. void MainWindow::on_listWidget_pool_itemDoubleClicked(QListWidgetItem *item)
  761. {
  762. if(ui->listWidget_elem->currentItem() == nullptr) return;
  763. ChangeNameDialog newName;
  764. newName.setModal(true);
  765. newName.exec();
  766. QString name = newName.getNewName();
  767. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  768. if(!name.isEmpty()){
  769. //TODO: 检查新名字唯一性
  770. if(elem->getPoolIndex(name) != -1){
  771. QMessageBox::critical(this,"警告","该容器名已存在!");
  772. return;
  773. }
  774. int index = elem->getPoolIndex(item->text());
  775. //子元素下拉列表可选项改名
  776. int rowNum = ui->tableWidget_childElem->rowCount();
  777. for(int i=0;i<rowNum;i++){
  778. QComboBox *containers = qobject_cast<QComboBox*>(ui->tableWidget_childElem->cellWidget(i,1));
  779. if(elem->childElem[i].container == elem->container[index].poolName) containers->setCurrentIndex(0);
  780. containers->removeItem(containers->findText(elem->container[index].poolName));
  781. containers->addItem(name);
  782. }
  783. elem->container[index].poolName = name;
  784. item->setText(name);
  785. }
  786. }
  787. void MainWindow::on_listWidget_pool_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
  788. {
  789. //TODO:保存切换前界面数据
  790. if(current != nullptr){
  791. setPoolUi(current->text());
  792. }
  793. }
  794. void MainWindow::on_pushButton_addKey_clicked()
  795. {
  796. if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_pool->currentItem() == nullptr) return;
  797. int rowNum = ui->tableWidget_containerPool->rowCount();
  798. ui->tableWidget_containerPool->insertRow(rowNum);
  799. QString keyName = "0";
  800. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  801. int id = 1;
  802. while(1){
  803. if(elem->isSingleContainerKey(ui->listWidget_pool->currentItem()->text(),keyName)){
  804. break;
  805. }
  806. keyName = QString::number(id++);
  807. }
  808. ui->tableWidget_containerPool->setItem(rowNum,0,new QTableWidgetItem(keyName));
  809. QTableWidgetItem* res = new QTableWidgetItem("双击添加资源文件");
  810. // 此单元格不可编辑
  811. res->setFlags(res->flags() & ~Qt::ItemIsEditable);
  812. ui->tableWidget_containerPool->setItem(rowNum,1,res);
  813. for(int i=2;i<=5;i++){
  814. ui->tableWidget_containerPool->setCellWidget(rowNum,i,new QComboBox);
  815. }
  816. ui->tableWidget_containerPool->setItem(rowNum,3,new QTableWidgetItem("0"));
  817. int index = elem->getPoolIndex(ui->listWidget_pool->currentItem()->text());
  818. ElemPropertyData::ContainTable containTable(keyName);
  819. elem->container[index].table.push_back(containTable);
  820. }
  821. void MainWindow::on_pushButton_delKey_clicked()
  822. {
  823. if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_pool->currentItem() == nullptr || ui->tableWidget_containerPool->currentRow() == -1) return;
  824. QMessageBox::StandardButton reply = QMessageBox::question(this,"删除容器","确定要删除此容器吗?");
  825. if(reply == QMessageBox::Yes){
  826. int curRow = ui->tableWidget_containerPool->currentRow();
  827. QString containerName = ui->tableWidget_containerPool->item(curRow,0)->text();
  828. ElemPropertyData* elem =elements[ui->listWidget_elem->currentItem()->text()];
  829. int index = elem->getPoolIndex(ui->listWidget_pool->currentItem()->text());
  830. QVector<ElemPropertyData::ContainTable> &containerTable = elem->container[index].table;
  831. for(int i=0;i<containerTable.size();i++){
  832. if(containerName == containerTable[i].key){
  833. containerTable.remove(i);
  834. break;
  835. }
  836. }
  837. ui->tableWidget_containerPool->removeRow(curRow);
  838. }
  839. }
  840. void MainWindow::setPoolUi(QString poolName)
  841. {
  842. if(ui->listWidget_elem->currentItem() == nullptr) return;
  843. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  844. ElemPropertyData::ContainerConfig poolData = elem->container[elem->getPoolIndex(poolName)];
  845. int rowNum = ui->tableWidget_containerPool->rowCount();
  846. for(int i=0;i<rowNum;i++){
  847. ui->tableWidget_containerPool->removeRow(0);
  848. }
  849. for(const auto &i:poolData.table){
  850. int rowNum = ui->tableWidget_containerPool->rowCount();
  851. ui->tableWidget_containerPool->insertRow(rowNum);
  852. ui->tableWidget_containerPool->setItem(rowNum,0,new QTableWidgetItem(i.key));
  853. QTableWidgetItem* res = new QTableWidgetItem(getFileName(i.res));
  854. // 此单元格不可编辑
  855. res->setFlags(res->flags() & ~Qt::ItemIsEditable);
  856. ui->tableWidget_containerPool->setItem(rowNum,1,res);
  857. ui->tableWidget_containerPool->setCellWidget(rowNum,2,createTimelineBox(i.initTimeline,i.res,TimelineType::Pool));
  858. ui->tableWidget_containerPool->setCellWidget(rowNum,3,createTimelineBox(i.clickTimeline,i.res,TimelineType::Pool));
  859. ui->tableWidget_containerPool->setCellWidget(rowNum,4,createTimelineBox(i.effectTimeline,i.res,TimelineType::Pool));
  860. ui->tableWidget_containerPool->setCellWidget(rowNum,5,createTimelineBox(i.vanishTimeline,i.res,TimelineType::Pool));
  861. ui->tableWidget_containerPool->setItem(rowNum,6,new QTableWidgetItem(i.zOrder));
  862. }
  863. }
  864. void MainWindow::on_tableWidget_containerPool_cellDoubleClicked(int row, int column)
  865. {
  866. if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_pool->currentItem() == nullptr) return;
  867. //容器表格内容修改flag
  868. poolTableItemChanged = true;
  869. if(column == 1){
  870. ResFileDialog res;
  871. res.setModal(true);
  872. res.exec();
  873. QString fileName = res.getResName();
  874. if(!fileName.isEmpty()){
  875. //TODO: 加载comboBox,随后文件名去除路径
  876. ui->tableWidget_containerPool->setItem(row,column,new QTableWidgetItem(getFileName(fileName)));
  877. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  878. int index = elem->getPoolIndex(ui->listWidget_pool->currentItem()->text());
  879. elem->container[index].table[row].res = fileName;
  880. //加载时间线下拉列表
  881. for(int i=2;i<=5;i++){
  882. QComboBox* timeline = createTimelineBox("",fileName,TimelineType::Pool);
  883. ui->tableWidget_containerPool->setCellWidget(row,i,timeline);
  884. }
  885. }
  886. }
  887. }
  888. void MainWindow::on_tableWidget_containerPool_itemChanged(QTableWidgetItem *item)
  889. {
  890. if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_pool->currentItem() == nullptr) return;
  891. if(!poolTableItemChanged) return;
  892. poolTableItemChanged = false;
  893. int column = item->column();
  894. int row = item->row();
  895. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  896. int index = elem->getPoolIndex(ui->listWidget_pool->currentItem()->text());
  897. QVector<ElemPropertyData::ContainTable> &containerVec = elem->container[index].table;
  898. if(column == 0){
  899. bool isNum;double tmp = item->text().toDouble(&isNum);
  900. if(item->text().toInt() < 0 || !isNum){
  901. QMessageBox::critical(this,"错误","键值必须是大于等于0的数字");
  902. item->setText(containerVec[row].key);
  903. return;
  904. }
  905. if(!elem->isSingleContainerKey(ui->listWidget_pool->currentItem()->text(),item->text())){
  906. QMessageBox::critical(this,"警告","该键值已存在!");
  907. item->setText(containerVec[row].key);
  908. return;
  909. }
  910. containerVec[row].key = item->text();
  911. }
  912. //检查zOrder合法性
  913. else if(column == 6){
  914. QString zOrder = item->text();
  915. bool isNum;double tmp = zOrder.toDouble(&isNum);
  916. if(item->text().toInt() < 0 || !isNum){
  917. QMessageBox::critical(this,"错误","消失zOrder值必须是大于等于0的数字");
  918. item->setText(containerVec[row].zOrder);
  919. return;
  920. }
  921. containerVec[row].zOrder = zOrder;
  922. }
  923. }
  924. ////切换tab时更新comboBox(或者每一次添加删除动画就更新一下该元素的comboBox?这样也更方便进行逻辑检查)
  925. //void MainWindow::on_tabWidget_currentChanged(int index)
  926. //{
  927. // if(ui->listWidget_elem->currentItem() == nullptr) return;
  928. // QVector<ElemPropertyData::StatusEffect> &animVec = elements[ui->listWidget_elem->currentItem()->text()]->statusEffect;
  929. // //如果目前展示的是收集动画,加载状态与效果配置中的动画到收集动画的动画下拉列表中
  930. // //目前这种方法较为暴力,后期可以视动画数量进行优化
  931. // if(index == 1){
  932. // ui->comboBox_animation->clear();
  933. // for(const auto &i:animVec){
  934. // ui->comboBox_animation->addItem(i.name);
  935. // }
  936. // }
  937. // //如果目前展示的是状态配置,加载相应状态效果配置动画和收集动画
  938. // else if(index == 2){
  939. // ui->comboBox_initAnim->clear();
  940. // ui->comboBox_clickAnim->clear();
  941. // ui->comboBox_collectAnimation->clear();
  942. // for(const auto &i:animVec){
  943. // ui->comboBox_initAnim->addItem(i.name);
  944. // ui->comboBox_clickAnim->addItem(i.name);
  945. // }
  946. // for(auto i:elements[ui->listWidget_elem->currentItem()->text()]->collAnim){
  947. // ui->comboBox_collectAnimation->addItem(i.name);
  948. // }
  949. // }
  950. //}
  951. void MainWindow::on_pushButton_addChildElem_clicked()
  952. {
  953. if(ui->listWidget_elem->currentItem() == nullptr) return;
  954. int rowNum = ui->tableWidget_childElem->rowCount();
  955. ui->tableWidget_childElem->insertRow(rowNum);
  956. QString childElemName = "item";
  957. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  958. int id = 1;
  959. while(1){
  960. if(elem->isSingleChildElemName(childElemName)){
  961. break;
  962. }
  963. childElemName = "item" + QString::number(id++);
  964. }
  965. ui->tableWidget_childElem->setItem(rowNum,0,new QTableWidgetItem(childElemName));
  966. ui->tableWidget_childElem->setCellWidget(rowNum,1,createPoolBox("尚未选择池子"));
  967. elem->childElem.push_back(ElemPropertyData::ChildElem(childElemName));
  968. }
  969. void MainWindow::on_pushButton_delChildElem_clicked()
  970. {
  971. if(ui->listWidget_elem->currentItem() == nullptr || ui->tableWidget_childElem->currentRow() == -1) return;
  972. QMessageBox::StandardButton reply = QMessageBox::question(this,"删除子元素","确定要删除此子元素吗?");
  973. if(reply == QMessageBox::Yes){
  974. int curRow = ui->tableWidget_childElem->currentRow();
  975. QString childElemName = ui->tableWidget_childElem->item(curRow,0)->text();
  976. QVector<ElemPropertyData::ChildElem> &childElemVec = elements[ui->listWidget_elem->currentItem()->text()]->childElem;
  977. for(int i=0;i<childElemVec.size();i++){
  978. if(childElemName == childElemVec[i].name){
  979. childElemVec.remove(i);
  980. break;
  981. }
  982. }
  983. ui->tableWidget_childElem->removeRow(curRow);
  984. }
  985. }
  986. void MainWindow::on_tableWidget_childElem_itemChanged(QTableWidgetItem *item)
  987. {
  988. if(ui->listWidget_elem->currentItem() == nullptr) return;
  989. if(!childElemTableItemChanged) return;
  990. childElemTableItemChanged = false;
  991. int column = item->column();
  992. int row = item->row();
  993. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  994. QVector<ElemPropertyData::ChildElem> &childElemVec = elem->childElem;
  995. if(column == 0){
  996. if(!elem->isSingleChildElemName(item->text())){
  997. QMessageBox::critical(this,"警告","该子元素名已存在!");
  998. item->setText(childElemVec[row].name);
  999. return;
  1000. }
  1001. childElemVec[row].name = item->text();
  1002. }
  1003. //TODO: comboBox值修改后的保存
  1004. }
  1005. void MainWindow::on_tableWidget_childElem_cellDoubleClicked(int row, int column)
  1006. {
  1007. if(ui->listWidget_elem->currentItem() == nullptr) return;
  1008. //子元素表格双击改名置flag为true
  1009. childElemTableItemChanged = true;
  1010. }
  1011. void MainWindow::on_checkBox_multiHit_stateChanged(int arg1)
  1012. {
  1013. if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_status->currentItem() == nullptr) return;
  1014. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  1015. if(arg1){
  1016. int index = elem->getStatusValIndex(ui->listWidget_status->currentItem()->text());
  1017. elem->statusConfig[index].multiHit = true;
  1018. }
  1019. else{
  1020. int index = elem->getStatusValIndex(ui->listWidget_status->currentItem()->text());
  1021. elem->statusConfig[index].multiHit = false;
  1022. }
  1023. }
  1024. void MainWindow::on_checkBox_dropable_stateChanged(int arg1)
  1025. {
  1026. if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_status->currentItem() == nullptr) return;
  1027. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  1028. if(arg1){
  1029. int index = elem->getStatusValIndex(ui->listWidget_status->currentItem()->text());
  1030. elem->statusConfig[index].dropable = true;
  1031. }
  1032. else{
  1033. int index = elem->getStatusValIndex(ui->listWidget_status->currentItem()->text());
  1034. elem->statusConfig[index].dropable = false;
  1035. }
  1036. }
  1037. void MainWindow::on_checkBox_needCollect_stateChanged(int arg1)
  1038. {
  1039. if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_status->currentItem() == nullptr) return;
  1040. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  1041. if(arg1){
  1042. int index = elem->getStatusValIndex(ui->listWidget_status->currentItem()->text());
  1043. elem->statusConfig[index].needCollect = true;
  1044. ui->lineEdit_collectionType->setReadOnly(false);
  1045. }
  1046. else{
  1047. int index = elem->getStatusValIndex(ui->listWidget_status->currentItem()->text());
  1048. elem->statusConfig[index].needCollect = false;
  1049. ui->lineEdit_collectionType->setReadOnly(true);
  1050. }
  1051. }
  1052. void MainWindow::on_lineEdit_collectionType_editingFinished()
  1053. {
  1054. if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_status->currentItem() == nullptr) return;
  1055. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  1056. int index = elem->getStatusValIndex(ui->listWidget_status->currentItem()->text());
  1057. ElemPropertyData::StatusConfig &data = elem->statusConfig[index];
  1058. data.collTargetType = ui->lineEdit_collectionType->text();
  1059. std::cout<<"收集的目标类型"<<qPrintable(data.collTargetType)<<std::endl;
  1060. }
  1061. void MainWindow::on_pushButton_addEvent_clicked()
  1062. {
  1063. if(ui->listWidget_elem->currentItem()==nullptr || ui->listWidget_status->currentItem() == nullptr) return;
  1064. int rowNum = ui->tableWidget_event->rowCount();
  1065. ui->tableWidget_event->insertRow(rowNum);
  1066. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  1067. ElemPropertyData::EventConfig event;
  1068. int index = elem->getStatusValIndex(ui->listWidget_status->currentItem()->text());
  1069. elem->statusConfig[index].eventConfig.push_back(event);
  1070. ui->tableWidget_event->setCellWidget(rowNum,0,new QComboBox);
  1071. ui->tableWidget_event->setCellWidget(rowNum,1,createCheckBox(false));
  1072. ui->tableWidget_event->setCellWidget(rowNum,3,createEffectBox("尚未选择动画"));
  1073. ui->tableWidget_event->setCellWidget(rowNum,4,createCheckBox(false));
  1074. //设置触发动作
  1075. ui->tableWidget_event->setCellWidget(rowNum,5,createTriggerAction());
  1076. }
  1077. QString MainWindow::getFileName(QString filePath)
  1078. {
  1079. if(filePath == "双击添加资源文件") return filePath;
  1080. int size = filePath.count();
  1081. int pos = 0;
  1082. for(int i=size-1;i>=0;i--){
  1083. if(filePath[i] == '/'){
  1084. pos = i+1;
  1085. break;
  1086. }
  1087. }
  1088. QString fileName;
  1089. for(int i=pos;i<size;i++){
  1090. fileName.push_back(filePath[i]);
  1091. }
  1092. return fileName;
  1093. }
  1094. void MainWindow::on_listWidget_status_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
  1095. {
  1096. if(ui->listWidget_elem->currentItem() == nullptr || current == nullptr) return;
  1097. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  1098. int index = elem->getStatusValIndex(current->text());
  1099. ElemPropertyData::StatusConfig statusData = elem->statusConfig[index];
  1100. int comboIndex;
  1101. //初始化动画
  1102. comboIndex = ui->comboBox_initAnim->findText(statusData.initAnim);
  1103. if(comboIndex == -1) comboIndex = 0;
  1104. ui->comboBox_initAnim->setCurrentIndex(comboIndex);
  1105. //点击动画
  1106. comboIndex = ui->comboBox_clickAnim->findText(statusData.clickAnim);
  1107. if(comboIndex == -1) comboIndex = 0;
  1108. ui->comboBox_clickAnim->setCurrentIndex(comboIndex);
  1109. //收集动画
  1110. comboIndex = ui->comboBox_collectAnimation->findText(statusData.collAnim);
  1111. if(comboIndex == -1) comboIndex = 0;
  1112. ui->comboBox_collectAnimation->setCurrentIndex(comboIndex);
  1113. //多重打击
  1114. if(statusData.multiHit) ui->checkBox_multiHit->setCheckState(Qt::Checked);
  1115. else ui->checkBox_multiHit->setCheckState(Qt::Unchecked);
  1116. //可掉落
  1117. if(statusData.dropable) ui->checkBox_multiHit->setCheckState(Qt::Checked);
  1118. else ui->checkBox_dropable->setCheckState(Qt::Unchecked);
  1119. //是否需要收集
  1120. //TODO: 加载收集动画数据
  1121. ui->lineEdit_collectionType->clear();
  1122. if(statusData.needCollect){
  1123. ui->checkBox_needCollect->setCheckState(Qt::Checked);
  1124. ui->lineEdit_collectionType->setReadOnly(false);
  1125. std::cout<<"收集的目标类型"<<qPrintable(statusData.collTargetType)<<std::endl;
  1126. ui->lineEdit_collectionType->setText(statusData.collTargetType);
  1127. }
  1128. else{
  1129. ui->checkBox_needCollect->setCheckState(Qt::Unchecked);
  1130. ui->lineEdit_collectionType->setReadOnly(true);
  1131. }
  1132. //事件配置
  1133. //TODO:设置事件表格下拉项
  1134. int rowNum = ui->tableWidget_event->rowCount();
  1135. for(int i=0;i<rowNum;i++){
  1136. ui->tableWidget_event->removeRow(0);
  1137. }
  1138. for(const auto &i:statusData.eventConfig){
  1139. int rowNum = ui->tableWidget_event->rowCount();
  1140. ui->tableWidget_event->insertRow(rowNum);
  1141. //事件名称
  1142. ui->tableWidget_event->setCellWidget(rowNum,0,new QComboBox);
  1143. //是否需要颜色一致
  1144. ui->tableWidget_event->setCellWidget(rowNum,1,createCheckBox(i.consisColor));
  1145. //tableWidget_event
  1146. ui->tableWidget_event->setItem(rowNum,2,new QTableWidgetItem(i.changeMagnitude));
  1147. //特效
  1148. ui->tableWidget_event->setCellWidget(rowNum,3,createEffectBox(i.specialEffect));
  1149. //根据格子数量消除
  1150. ui->tableWidget_event->setCellWidget(rowNum,4,createCheckBox(i.elimATLattices));
  1151. //触发动作
  1152. ui->tableWidget_event->setCellWidget(rowNum,5,createTriggerAction());
  1153. }
  1154. }
  1155. void MainWindow::on_tableWidget_event_cellDoubleClicked(int row, int column)
  1156. {
  1157. if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_status->currentItem() == nullptr) return;
  1158. if(column == 2) eventTableItemChanged = true;
  1159. }
  1160. //状态变化幅度合法性检查及数据保存
  1161. void MainWindow::on_tableWidget_event_itemChanged(QTableWidgetItem *item)
  1162. {
  1163. if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_status->currentItem() == nullptr) return;
  1164. if(!eventTableItemChanged) return;
  1165. eventTableItemChanged = false;
  1166. int column = item->column();
  1167. int row = item->row();
  1168. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  1169. int index = elem->getStatusValIndex(ui->listWidget_status->currentItem()->text());
  1170. QVector<ElemPropertyData::EventConfig> &eventVec = elem->statusConfig[index].eventConfig;
  1171. if(column == 2){
  1172. bool ok;double a = item->text().toDouble(&ok);
  1173. int val = item->text().toInt();
  1174. if(!ok || val<0){
  1175. QMessageBox::critical(this,"警告","状态变化幅度是大于0的数字");
  1176. ui->tableWidget_event->item(row,2)->setText(QString::number(eventVec[row].changeMagnitude));
  1177. return;
  1178. }
  1179. std::cout<<"状态变化幅度发生改变,新值为:"<<val<<std::endl;
  1180. eventVec[row].changeMagnitude = val;
  1181. }
  1182. }
  1183. void MainWindow::on_comboBox_initAnim_currentTextChanged(const QString &arg1)
  1184. {
  1185. if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_status->currentItem() == nullptr) return;
  1186. std::cout<<"初始化动画:"<<qPrintable(arg1)<<std::endl;
  1187. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  1188. int index = elem->getStatusValIndex(ui->listWidget_status->currentItem()->text());
  1189. elem->statusConfig[index].initAnim = arg1;
  1190. }
  1191. void MainWindow::on_comboBox_clickAnim_currentTextChanged(const QString &arg1)
  1192. {
  1193. if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_status->currentItem() == nullptr) return;
  1194. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  1195. int index = elem->getStatusValIndex(ui->listWidget_status->currentItem()->text());
  1196. elem->statusConfig[index].clickAnim = arg1;
  1197. }
  1198. void MainWindow::on_comboBox_collectAnimation_currentTextChanged(const QString &arg1)
  1199. {
  1200. if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_status->currentItem() == nullptr) return;
  1201. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  1202. int index = elem->getStatusValIndex(ui->listWidget_status->currentItem()->text());
  1203. elem->statusConfig[index].collAnim = arg1;
  1204. }