mainwindow.cpp 62 KB

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