mainwindow.cpp 63 KB

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