mainwindow.cpp 47 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128
  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. #include "changenamedialog.h"
  4. #include "resfiledialog.h"
  5. #include "actionSettingDialog.h"
  6. #include "statusEffectAnim.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. #include "dataManager.h"
  20. MainWindow::MainWindow(QWidget *parent)
  21. : QMainWindow(parent)
  22. , ui(new Ui::MainWindow)
  23. {
  24. jsonTemp = new ReadJsonSrc(":/file/file/template.json");
  25. ui->setupUi(this);
  26. QPixmap pix(":/icon/icon/pic.png");
  27. ui->label_pic->setPixmap(pix.scaled(50,50,Qt::KeepAspectRatio));
  28. this->setAcceptDrops(true);
  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. // updateTempRelatedUi();
  35. }
  36. MainWindow::~MainWindow()
  37. {
  38. delete ui;
  39. delete jsonTemp;
  40. }
  41. ///创建普通下拉选项
  42. QComboBox* MainWindow::createBox(QString choice,QStringList list)
  43. {
  44. QComboBox* box = new QComboBox;
  45. box->addItem("尚未选择");
  46. box->addItems(list);
  47. int index = box->findText(choice);
  48. if(index == -1) index = 0;
  49. box->setCurrentIndex(index);
  50. return box;
  51. }
  52. ///创建一个时间线下拉选项
  53. QComboBox* MainWindow::createTimelineBox(QString chosenTimeline,QString fileName,TimelineType type)
  54. {
  55. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  56. QComboBox* timeLine = new QComboBox;
  57. if(fileName == "双击添加资源文件") return timeLine;
  58. QStringList list = elem->getTimelineList(fileName);
  59. timeLine = createBox(chosenTimeline,list);
  60. if(type == TimelineType::Animation){
  61. connect(timeLine,SIGNAL(currentTextChanged(QString)),this,SLOT(onTimelineTextChanged(QString)));
  62. }
  63. else if(type == TimelineType::Pool){
  64. connect(timeLine,SIGNAL(currentTextChanged(QString)),this,SLOT(onPoolTimelineTextChanged(QString)));
  65. }
  66. return timeLine;
  67. }
  68. ///创建事件下拉选项
  69. QComboBox* MainWindow::createEventBox(QString chosenEvent)
  70. {
  71. QStringList list;
  72. for(const auto &i:jsonTemp->templateMap["eventTemp"]) list.push_back(i.name);
  73. QComboBox* event = createBox(chosenEvent,list);
  74. connect(event,SIGNAL(currentTextChanged(QString)),this,SLOT(onEventBoxTextChanged(QString)));
  75. return event;
  76. }
  77. ///创建一个使用池子下拉选项
  78. QComboBox* MainWindow::createPoolBox(QString chosenPool)
  79. {
  80. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  81. QStringList list;
  82. for(const auto &i:elem->container) list.push_back(i.poolName);
  83. QComboBox* pools = createBox(chosenPool,list);
  84. connect(pools,SIGNAL(currentTextChanged(QString)),this,SLOT(onPoolsTextChanged(QString)));
  85. return pools;
  86. }
  87. ///创建一个checkBox
  88. QCheckBox* MainWindow::createCheckBox(bool chosen)
  89. {
  90. QCheckBox* check = new QCheckBox;
  91. if(chosen) check->setCheckState(Qt::Checked);
  92. else check->setCheckState(Qt::Unchecked);
  93. connect(check,SIGNAL(stateChanged(int)),this,SLOT(onCheckBoxStateChanged(int)));
  94. return check;
  95. }
  96. ///创建一个特效下拉选项
  97. QComboBox* MainWindow::createEffectBox(QString chosenEffect)
  98. {
  99. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  100. QStringList list;
  101. for(const auto &i:elem->statusEffect){
  102. list.push_back(i.name);
  103. }
  104. QComboBox* effect = createBox(chosenEffect,list);
  105. connect(effect,SIGNAL(currentTextChanged(QString)),this,SLOT(onEventBoxTextChanged(QString)));
  106. return effect;
  107. }
  108. ///创建一个触发动作
  109. QComboBox* MainWindow::createTriggerAction(QString chosenAction)
  110. {
  111. QStringList actionlist;
  112. for(const auto &i:jsonTemp->templateMap["actionTemp"]) actionlist.push_back(i.name);
  113. QComboBox* actions = createBox(chosenAction,actionlist);
  114. connect(actions,SIGNAL(currentTextChanged(QString)),this,SLOT(onEventBoxTextChanged(QString)));
  115. return actions;
  116. }
  117. ///创建一个触发动作设置按钮
  118. QPushButton* MainWindow::createSetButton()
  119. {
  120. QPushButton* setAction = new QPushButton("设置");
  121. connect(setAction,SIGNAL(clicked()),this,SLOT(onSetActionButtonClicked()));
  122. return setAction;
  123. }
  124. ///动画删除或改名后其它下拉选项的更新
  125. void MainWindow::updateAnimComboBox(QString changedAnim)
  126. {
  127. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  128. //状态配置界面
  129. if(ui->listWidget_status->currentItem() != nullptr){
  130. int index = ui->listWidget_status->currentRow();
  131. if(elem->statusConfig[index].initAnim == changedAnim) ui->comboBox_initAnim->setCurrentIndex(0);
  132. if(elem->statusConfig[index].clickAnim == changedAnim) ui->comboBox_clickAnim->setCurrentIndex(0);
  133. int rowNum = ui->tableWidget_event->rowCount();
  134. for(int i=0;i<rowNum;i++){
  135. QComboBox *effect = qobject_cast<QComboBox*>(ui->tableWidget_event->cellWidget(i,3));
  136. if(effect->currentText() == changedAnim) effect->setCurrentIndex(0);
  137. }
  138. }
  139. }
  140. ///收集动画删除或改名后下拉选项更新
  141. void MainWindow::updateCollAnimComboBox(QString changedAnim)
  142. {
  143. std::cout<<"收集动画改变,更新下拉选项"<<std::endl;
  144. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  145. //状态配置界面
  146. if(ui->listWidget_status->currentItem() != nullptr){
  147. int index = ui->listWidget_status->currentRow();
  148. if(elem->statusConfig[index].collAnim == changedAnim) ui->comboBox_collectAnimation->setCurrentIndex(0);
  149. }
  150. }
  151. ///切换元素时重置界面数据
  152. void MainWindow::setUi(QString elem)
  153. {
  154. std::cout<<"切换成元素"<<qPrintable(elem)<<",刷新界面"<<std::endl;
  155. if(firstSelectElem){
  156. animUi = new StatusEffectAnim();
  157. ui->tabWidget->addTab(animUi,"状态与效果动画");
  158. collAnimUi = new CollAnim();
  159. ui->tabWidget->addTab(collAnimUi,"收集动画");
  160. firstSelectElem = false;
  161. }
  162. //基础元素区域的设置
  163. QPixmap pix(DataManager::getInstance()->getIconPath(elem));
  164. ui->label_pic->setPixmap(pix.scaled(50,50,Qt::KeepAspectRatio));
  165. ui->lineEdit_name->setText(DataManager::getInstance()->getMarkValue(elem));
  166. ui->lineEdit_size->setText(DataManager::getInstance()->getSize(elem));
  167. ui->lineEdit_maxlayer->setText(DataManager::getInstance()->getMaxLayer(elem));
  168. ui->lineEdit_score->setText(DataManager::getInstance()->getScore(elem));
  169. ui->spinBox_drop->setValue(DataManager::getInstance()->getDropConfig(elem));
  170. //TODO:调用各个界面的刷新显示
  171. //设置状态与效果动画表格显示
  172. animUi->setUi(elem);
  173. collAnimUi->setUi(elem);
  174. // //设置状态配置界面
  175. // ui->listWidget_status->clear();
  176. // for(const auto &i:elem->statusConfig){
  177. // ui->listWidget_status->addItem(i.statusValue);
  178. // }
  179. // //切换元素时状态尚未选中,先清除事件表格内容
  180. // rowCnt = ui->tableWidget_event->rowCount();
  181. // for(int i=0;i<rowCnt;i++){
  182. // ui->tableWidget_event->removeRow(0);
  183. // }
  184. // //设置收集动画和状态配置的comboBox
  185. // ui->comboBox_initAnim->clear();
  186. // ui->comboBox_clickAnim->clear();
  187. // ui->comboBox_collectAnimation->clear();
  188. // ui->comboBox_animation->clear();
  189. // ui->comboBox_initAnim->addItem("尚未选择");
  190. // ui->comboBox_clickAnim->addItem("尚未选择");
  191. // ui->comboBox_collectAnimation->addItem("尚未选择");
  192. // ui->comboBox_animation->addItem("尚未选择");
  193. // for(const auto &i:elem->statusEffect){
  194. // ui->comboBox_clickAnim->addItem(i.name);
  195. // ui->comboBox_animation->addItem(i.name);
  196. // ui->comboBox_initAnim->addItem(i.name);
  197. // }
  198. // for(const auto &i:elem->collAnim){
  199. // ui->comboBox_collectAnimation->addItem(i.name);
  200. // }
  201. // //设置容器池界面
  202. // ui->listWidget_pool->clear();
  203. // for(const auto &i:elem->container){
  204. // ui->listWidget_pool->addItem(i.poolName);
  205. // }
  206. // //切换元素时容器尚未选中,先清除表格内容
  207. // int rowNum = ui->tableWidget_containerPool->rowCount();
  208. // for(int i=0;i<rowNum;i++){
  209. // ui->tableWidget_containerPool->removeRow(0);
  210. // }
  211. // //设置子元素界面
  212. // rowCnt = ui->tableWidget_childElem->rowCount();
  213. // for(int i=0;i<rowCnt;i++){
  214. // ui->tableWidget_childElem->removeRow(0);
  215. // }
  216. // for(const auto &i:elem->childElem){
  217. // int rowNum = ui->tableWidget_childElem->rowCount();
  218. // ui->tableWidget_childElem->insertRow(rowNum);
  219. // ui->tableWidget_childElem->setItem(rowNum,0,new QTableWidgetItem(i.name));
  220. // ui->tableWidget_childElem->setCellWidget(rowNum,1,createPoolBox(i.container));
  221. // }
  222. }
  223. void MainWindow::on_pushButton_chooseFile_clicked()
  224. {
  225. //如果未选中列表中的按钮,无法触发此按钮
  226. if(ui->listWidget_elem->currentItem() == nullptr) return;
  227. QString elem = ui->listWidget_elem->currentItem()->text();
  228. QString file_name = QFileDialog::getOpenFileName(this,"Open a file",QDir::homePath());
  229. if(file_name == nullptr){
  230. file_name = elements[elem]->iconPath;
  231. }
  232. QPixmap pix(file_name);
  233. ui->label_pic->setPixmap(pix.scaled(50,50,Qt::KeepAspectRatio));
  234. ui->listWidget_elem->currentItem()->setIcon(QIcon(file_name));
  235. DataManager::getInstance()->changeIconPath(elem,file_name);
  236. }
  237. void MainWindow::on_pushButton_addElem_clicked()
  238. {
  239. QString elemName = "新加元素";
  240. int id = 1;
  241. while(1){
  242. if(!DataManager::getInstance()->existElem(elemName)){
  243. break;
  244. }
  245. elemName = "新加元素" + QString::number(id++);
  246. }
  247. QListWidgetItem* item = new QListWidgetItem(QIcon(":/icon/icon/菜狗.png"),elemName);
  248. ui->listWidget_elem->addItem(item);
  249. DataManager::getInstance()->addElem(elemName);
  250. }
  251. void MainWindow::on_pushButton_delElem_clicked()
  252. {
  253. if(ui->listWidget_elem->currentItem() == nullptr) return;
  254. QMessageBox::StandardButton reply = QMessageBox::question(this,"删除元素","确定要删除此元素吗?");
  255. if(reply == QMessageBox::Yes){
  256. QString elemName = ui->listWidget_elem->currentItem()->text();
  257. delete ui->listWidget_elem->takeItem(ui->listWidget_elem->currentRow());
  258. DataManager::getInstance()->delElem(elemName);
  259. }
  260. }
  261. void MainWindow::on_listWidget_elem_itemDoubleClicked(QListWidgetItem *item)
  262. {
  263. ChangeNameDialog newName;
  264. newName.setModal(true);
  265. newName.exec();
  266. QString name = newName.getNewName();
  267. if(!name.isEmpty()){
  268. if(DataManager::getInstance()->existElem(name)){
  269. QMessageBox::critical(this,"警告","该元素名已存在!");
  270. return;
  271. }
  272. QString oriName = ui->listWidget_elem->currentItem()->text();
  273. item->setText(name);
  274. DataManager::getInstance()->changeElemName(oriName,name);
  275. }
  276. }
  277. //基础元素数据变化触发保存
  278. void MainWindow::on_lineEdit_name_editingFinished()
  279. {
  280. if(ui->listWidget_elem->currentItem() == nullptr) return;
  281. QString key = ui->listWidget_elem->currentItem()->text();
  282. DataManager::getInstance()->changeMarkValue(key,ui->lineEdit_name->text());
  283. }
  284. void MainWindow::on_lineEdit_size_editingFinished()
  285. {
  286. if(ui->listWidget_elem->currentItem() == nullptr) return;
  287. QString key = ui->listWidget_elem->currentItem()->text();
  288. DataManager::getInstance()->changeSize(key,ui->lineEdit_size->text());
  289. }
  290. void MainWindow::on_lineEdit_maxlayer_editingFinished()
  291. {
  292. if(ui->listWidget_elem->currentItem() == nullptr) return;
  293. QString key = ui->listWidget_elem->currentItem()->text();
  294. DataManager::getInstance()->changeMaxLayer(key,ui->lineEdit_maxlayer->text());
  295. }
  296. void MainWindow::on_lineEdit_score_editingFinished()
  297. {
  298. if(ui->listWidget_elem->currentItem() == nullptr) return;
  299. QString key = ui->listWidget_elem->currentItem()->text();
  300. DataManager::getInstance()->changeScore(key,ui->lineEdit_score->text());
  301. }
  302. void MainWindow::on_spinBox_drop_valueChanged(int arg1)
  303. {
  304. if(ui->listWidget_elem->currentItem() == nullptr) return;
  305. QString key = ui->listWidget_elem->currentItem()->text();
  306. DataManager::getInstance()->changeDropConfig(key,arg1);
  307. }
  308. void MainWindow::on_listWidget_elem_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
  309. {
  310. setUi(current->text());
  311. }
  312. ///容器池区时间线数据发生改变
  313. void MainWindow::onPoolTimelineTextChanged(const QString &arg1)
  314. {
  315. if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_pool->currentItem() == nullptr) return;
  316. //获取时间线列表所在位置
  317. std::cout<<"current timeline is:"<<qPrintable(arg1)<<std::endl;
  318. QComboBox *timeline = dynamic_cast<QComboBox*>(this->sender());
  319. int x = timeline->frameGeometry().x();
  320. int y = timeline->frameGeometry().y();
  321. QModelIndex index = ui->tableWidget_containerPool->indexAt(QPoint(x,y));
  322. int row = index.row();
  323. int column = index.column();
  324. //修改数据
  325. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  326. int poolIndex = ui->listWidget_pool->currentRow();
  327. if(column == 2) elem->container[poolIndex].table[row].initTimeline = timeline->currentText();
  328. else if(column == 3) elem->container[poolIndex].table[row].clickTimeline = timeline->currentText();
  329. else if(column == 4) elem->container[poolIndex].table[row].effectTimeline = timeline->currentText();
  330. else if(column == 5) elem->container[poolIndex].table[row].vanishTimeline = timeline->currentText();
  331. std::cout<<"row:"<<row<<"\tcolumn:"<<column<<std::endl;
  332. }
  333. ///子元素使用池子数据发生改变
  334. void MainWindow::onPoolsTextChanged(const QString &arg1)
  335. {
  336. if(ui->listWidget_elem->currentItem() == nullptr) return;
  337. //获取池子列表所在位置
  338. QComboBox *pools = dynamic_cast<QComboBox*>(this->sender());
  339. int x = pools->frameGeometry().x();
  340. int y = pools->frameGeometry().y();
  341. QModelIndex index = ui->tableWidget_childElem->indexAt(QPoint(x,y));
  342. int row = index.row();
  343. //修改数据
  344. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  345. elem->childElem[row].container = arg1;
  346. }
  347. ///事件配置checkBox状态发生改变
  348. void MainWindow::onCheckBoxStateChanged(int state)
  349. {
  350. if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_status->currentItem() == nullptr) return;
  351. //获取checkBox所在位置
  352. QCheckBox *check = dynamic_cast<QCheckBox*>(this->sender());
  353. int x = check->frameGeometry().x();
  354. int y = check->frameGeometry().y();
  355. QModelIndex index = ui->tableWidget_event->indexAt(QPoint(x,y));
  356. int row = index.row();
  357. int column = index.column();
  358. //修改数据
  359. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  360. int statusIndex = elem->getStatusValIndex(ui->listWidget_status->currentItem()->text());
  361. ElemPropertyData::EventConfig &eventData = elem->statusConfig[statusIndex].eventConfig[row];
  362. //是否需要颜色一致
  363. if(column == 1){
  364. if(state == 0) eventData.consisColor = false;
  365. else eventData.consisColor = true;
  366. std::cout<<"颜色是否需要一致状态:"<<state<<std::endl;
  367. }
  368. else if(column == 4){
  369. if(state == 0) eventData.elimATLattices = false;
  370. else eventData.elimATLattices = true;
  371. std::cout<<"根据格子数量消除状态:"<<state<<std::endl;
  372. }
  373. std::cout<<"row:"<<row<<"\tcolumn:"<<column<<std::endl;
  374. }
  375. ///事件配置ComboBox选择发生改变
  376. void MainWindow::onEventBoxTextChanged(const QString &arg1)
  377. {
  378. if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_status->currentItem() == nullptr) return;
  379. //获取特效列表所在位置
  380. QComboBox *box = dynamic_cast<QComboBox*>(this->sender());
  381. int x = box->frameGeometry().x();
  382. int y = box->frameGeometry().y();
  383. QModelIndex index = ui->tableWidget_event->indexAt(QPoint(x,y));
  384. int row = index.row();
  385. int column = index.column();
  386. //修改数据
  387. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  388. int statusIndex = elem->getStatusValIndex(ui->listWidget_status->currentItem()->text());
  389. QVector<ElemPropertyData::EventConfig> &eventTable = elem->statusConfig[statusIndex].eventConfig;
  390. if(column == 0) eventTable[row].name = arg1;
  391. else if(column == 3) eventTable[row].specialEffect = arg1;
  392. else if(column == 5) eventTable[row].triggerAction = arg1;
  393. std::cout<<"row:"<<row<<"\tcolumn:"<<column<<std::endl;
  394. }
  395. ///动作配置中的设置点击后
  396. void MainWindow::onSetActionButtonClicked()
  397. {
  398. if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_status->currentItem() == nullptr) return;
  399. //获取设置按钮所在位置
  400. QPushButton *button = dynamic_cast<QPushButton*>(this->sender());
  401. int x = button->frameGeometry().x();
  402. int y = button->frameGeometry().y();
  403. QModelIndex index = ui->tableWidget_event->indexAt(QPoint(x,y));
  404. int row = index.row();
  405. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  406. int statusIndex = elem->getStatusValIndex(ui->listWidget_status->currentItem()->text());
  407. QVector<ElemPropertyData::EventConfig> &eventTable = elem->statusConfig[statusIndex].eventConfig;
  408. QString action = eventTable[row].triggerAction;
  409. std::cout<<"row:"<<row<<std::endl;
  410. std::cout<<qPrintable(action)<<std::endl;
  411. createSetWindow(action,row);
  412. }
  413. ///点击动作配置的设置按钮后生成新窗口
  414. void MainWindow::createSetWindow(QString actionName,int row)
  415. {
  416. QVector<ReadJsonSrc::Template> tempVec = jsonTemp->templateMap["actionTemp"];
  417. int index = jsonTemp->getTemplateIndex("actionTemp",actionName);
  418. if(index == -1){
  419. std::cout<<"未找到"<<qPrintable(actionName)<<"该动作配置模板"<<std::endl;
  420. return;
  421. }
  422. QVector<ReadJsonSrc::Fields> fields = tempVec[index].fields;
  423. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  424. //由于目前list只有动画,所以只做了一种情况;后期如果有多种list,可以将函数参数改为map
  425. QStringList list;
  426. for(const auto &i:elem->statusEffect) list.push_back(i.name);
  427. ActionSettingDialog setDialog;
  428. QMap<QString,QString> &dataMap = elem->statusConfig[ui->listWidget_status->currentRow()].eventConfig[row].actionConfig;
  429. setDialog.setDialogUi(fields,dataMap,list);
  430. setDialog.exec();
  431. if(!setDialog.dataMap.empty()) dataMap = setDialog.dataMap;
  432. }
  433. //生成模板并更新状态配置的数据
  434. void MainWindow::on_pushButton_genTemp_clicked()
  435. {
  436. if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_status->count() > 0) return;
  437. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  438. for(int i=0;i<elem->maxLayer.toInt();i++){
  439. ui->listWidget_status->addItem(QString::number(i));
  440. ElemPropertyData::StatusConfig status(QString::number(i));
  441. elem->statusConfig.push_back(status);
  442. }
  443. }
  444. //添加状态,若已经生成最大层数全部状态则按钮无效
  445. void MainWindow::on_pushButton_addStatus_clicked()
  446. {
  447. if(ui->listWidget_elem->currentItem() == nullptr) return;
  448. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  449. QString statusName;
  450. for(int i=0;i<elem->maxLayer.toInt();i++){
  451. if(elem->getStatusValIndex(QString::number(i)) == -1){
  452. statusName = QString::number(i);
  453. break;
  454. }
  455. }
  456. if(!statusName.isEmpty()){
  457. ui->listWidget_status->addItem(statusName);
  458. ElemPropertyData::StatusConfig status(statusName);
  459. elem->statusConfig.push_back(status);
  460. }
  461. }
  462. //TODO: 删除状态值对应的数据
  463. void MainWindow::on_pushButton_delStatus_clicked()
  464. {
  465. if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_status->currentItem() == nullptr) return;
  466. QMessageBox::StandardButton reply = QMessageBox::question(this,"删除状态","确定要删除此状态吗?");
  467. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  468. if(reply == QMessageBox::Yes){
  469. for(int i=0;i<elem->statusConfig.size();i++){
  470. if(elem->statusConfig[i].statusValue == ui->listWidget_status->currentItem()->text()){
  471. elem->statusConfig.remove(i);
  472. break;
  473. }
  474. }
  475. delete ui->listWidget_status->takeItem(ui->listWidget_status->currentRow());
  476. }
  477. }
  478. //修改状态值,检查修改后的状态值是否合法,并转移数据
  479. void MainWindow::on_listWidget_status_itemDoubleClicked(QListWidgetItem *item)
  480. {
  481. ChangeNameDialog newName;
  482. newName.setModal(true);
  483. newName.exec();
  484. QString name = newName.getNewName();
  485. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  486. if(!name.isEmpty()){
  487. //TODO: 检查状态值合法性并转移数据
  488. bool isNum;double tmp = name.toDouble(&isNum);
  489. int maxlayer = ui->lineEdit_maxlayer->text().toInt();
  490. int statusNum = name.toInt();
  491. if(!isNum ||statusNum < 0 || statusNum >= maxlayer){
  492. QMessageBox::critical(this,"错误","状态值必须是大于等于0且小于最大层数的数字");
  493. return;
  494. }
  495. if(elem->getStatusValIndex(name) == -1){
  496. QMessageBox::critical(this,"警告","该状态值已存在");
  497. return;
  498. }
  499. int index = elem->getStatusValIndex(item->text());
  500. elem->statusConfig[index].statusValue = name;
  501. item->setText(name);
  502. }
  503. }
  504. void MainWindow::on_pushButton_addContainer_clicked()
  505. {
  506. if(ui->listWidget_elem->currentItem() == nullptr) return;
  507. QString poolName = "pool";
  508. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  509. int id = 1;
  510. while(1){
  511. if(elem->getPoolIndex(poolName) == -1){
  512. break;
  513. }
  514. poolName = "pool" + QString::number(id++);
  515. }
  516. ui->listWidget_pool->addItem(new QListWidgetItem(poolName));
  517. ElemPropertyData::ContainerConfig container(poolName);
  518. elem->container.push_back(container);
  519. //子元素下拉列表添加可选项
  520. int rowNum = ui->tableWidget_childElem->rowCount();
  521. for(int i=0;i<rowNum;i++){
  522. QComboBox *containers = qobject_cast<QComboBox*>(ui->tableWidget_childElem->cellWidget(i,1));
  523. containers->addItem(poolName);
  524. }
  525. }
  526. void MainWindow::on_pushButton_delContainer_clicked()
  527. {
  528. if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_pool->currentItem() == nullptr) return;
  529. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  530. QMessageBox::StandardButton reply = QMessageBox::question(this,"删除容器","确定要删除此容器吗?");
  531. if(reply == QMessageBox::Yes){
  532. QString delPoolName = ui->listWidget_pool->currentItem()->text();
  533. int index = ui->listWidget_pool->currentRow();
  534. elem->container.remove(index);
  535. delete ui->listWidget_pool->takeItem(ui->listWidget_pool->currentRow());
  536. //子元素下拉列表删除可选项
  537. int rowNum = ui->tableWidget_childElem->rowCount();
  538. for(int i=0;i<rowNum;i++){
  539. QComboBox *containers = qobject_cast<QComboBox*>(ui->tableWidget_childElem->cellWidget(i,1));
  540. if(elem->childElem[i].container == delPoolName) containers->setCurrentIndex(0);
  541. containers->removeItem(containers->findText(delPoolName));
  542. }
  543. }
  544. }
  545. void MainWindow::on_listWidget_pool_itemDoubleClicked(QListWidgetItem *item)
  546. {
  547. if(ui->listWidget_elem->currentItem() == nullptr) return;
  548. ChangeNameDialog newName;
  549. newName.setModal(true);
  550. newName.exec();
  551. QString name = newName.getNewName();
  552. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  553. if(!name.isEmpty()){
  554. //TODO: 检查新名字唯一性
  555. if(elem->getPoolIndex(name) != -1){
  556. QMessageBox::critical(this,"警告","该容器名已存在!");
  557. return;
  558. }
  559. int index = elem->getPoolIndex(item->text());
  560. //子元素下拉列表可选项改名
  561. int rowNum = ui->tableWidget_childElem->rowCount();
  562. for(int i=0;i<rowNum;i++){
  563. QComboBox *containers = qobject_cast<QComboBox*>(ui->tableWidget_childElem->cellWidget(i,1));
  564. if(elem->childElem[i].container == elem->container[index].poolName) containers->setCurrentIndex(0);
  565. containers->removeItem(containers->findText(elem->container[index].poolName));
  566. containers->addItem(name);
  567. }
  568. elem->container[index].poolName = name;
  569. item->setText(name);
  570. }
  571. }
  572. void MainWindow::on_listWidget_pool_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
  573. {
  574. //TODO:保存切换前界面数据
  575. if(current != nullptr){
  576. setPoolUi(current->text());
  577. }
  578. }
  579. void MainWindow::on_pushButton_addKey_clicked()
  580. {
  581. if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_pool->currentItem() == nullptr) return;
  582. int rowNum = ui->tableWidget_containerPool->rowCount();
  583. ui->tableWidget_containerPool->insertRow(rowNum);
  584. QString keyName = "0";
  585. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  586. int id = 1;
  587. while(1){
  588. if(elem->isSingleContainerKey(ui->listWidget_pool->currentItem()->text(),keyName)){
  589. break;
  590. }
  591. keyName = QString::number(id++);
  592. }
  593. ui->tableWidget_containerPool->setItem(rowNum,0,new QTableWidgetItem(keyName));
  594. QTableWidgetItem* res = new QTableWidgetItem("双击添加资源文件");
  595. // 此单元格不可编辑
  596. res->setFlags(res->flags() & ~Qt::ItemIsEditable);
  597. ui->tableWidget_containerPool->setItem(rowNum,1,res);
  598. for(int i=2;i<=5;i++){
  599. ui->tableWidget_containerPool->setCellWidget(rowNum,i,createBox("",{}));
  600. }
  601. ui->tableWidget_containerPool->setItem(rowNum,3,new QTableWidgetItem("0"));
  602. int index = ui->listWidget_pool->currentRow();
  603. ElemPropertyData::ContainTable containTable(keyName);
  604. elem->container[index].table.push_back(containTable);
  605. }
  606. void MainWindow::on_pushButton_delKey_clicked()
  607. {
  608. if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_pool->currentItem() == nullptr || ui->tableWidget_containerPool->currentRow() == -1) return;
  609. QMessageBox::StandardButton reply = QMessageBox::question(this,"删除键值","确定要删除此键值吗?");
  610. if(reply == QMessageBox::Yes){
  611. int curRow = ui->tableWidget_containerPool->currentRow();
  612. QString containerName = ui->tableWidget_containerPool->item(curRow,0)->text();
  613. ElemPropertyData* elem =elements[ui->listWidget_elem->currentItem()->text()];
  614. int index = ui->listWidget_pool->currentRow();
  615. QVector<ElemPropertyData::ContainTable> &containerTable = elem->container[index].table;
  616. containerTable.remove(curRow);
  617. ui->tableWidget_containerPool->removeRow(curRow);
  618. }
  619. }
  620. void MainWindow::setPoolUi(QString poolName)
  621. {
  622. if(ui->listWidget_elem->currentItem() == nullptr) return;
  623. isSetUi = true;
  624. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  625. ElemPropertyData::ContainerConfig poolData = elem->container[elem->getPoolIndex(poolName)];
  626. int contIndex = ui->comboBox_container->findText(poolData.type);
  627. if(contIndex == -1) contIndex=0;
  628. ui->comboBox_container->setCurrentIndex(contIndex);
  629. int rowNum = ui->tableWidget_containerPool->rowCount();
  630. for(int i=0;i<rowNum;i++){
  631. ui->tableWidget_containerPool->removeRow(0);
  632. }
  633. for(const auto &i:poolData.table){
  634. int rowNum = ui->tableWidget_containerPool->rowCount();
  635. ui->tableWidget_containerPool->insertRow(rowNum);
  636. ui->tableWidget_containerPool->setItem(rowNum,0,new QTableWidgetItem(i.key));
  637. QTableWidgetItem* res = new QTableWidgetItem(i.res);
  638. // 此单元格不可编辑
  639. res->setFlags(res->flags() & ~Qt::ItemIsEditable);
  640. ui->tableWidget_containerPool->setItem(rowNum,1,res);
  641. ui->tableWidget_containerPool->setCellWidget(rowNum,2,createTimelineBox(i.initTimeline,i.res,TimelineType::Pool));
  642. ui->tableWidget_containerPool->setCellWidget(rowNum,3,createTimelineBox(i.clickTimeline,i.res,TimelineType::Pool));
  643. ui->tableWidget_containerPool->setCellWidget(rowNum,4,createTimelineBox(i.effectTimeline,i.res,TimelineType::Pool));
  644. ui->tableWidget_containerPool->setCellWidget(rowNum,5,createTimelineBox(i.vanishTimeline,i.res,TimelineType::Pool));
  645. ui->tableWidget_containerPool->setItem(rowNum,6,new QTableWidgetItem(i.zOrder));
  646. }
  647. isSetUi = false;
  648. }
  649. void MainWindow::on_tableWidget_containerPool_cellDoubleClicked(int row, int column)
  650. {
  651. if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_pool->currentItem() == nullptr) return;
  652. //容器表格内容修改flag
  653. poolTableItemChanged = true;
  654. if(column == 1){
  655. ResFileDialog res;
  656. res.setModal(true);
  657. res.exec();
  658. QString fileName = res.getResName();
  659. if(!fileName.isEmpty()){
  660. ui->tableWidget_containerPool->setItem(row,column,new QTableWidgetItem(fileName));
  661. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  662. int index = ui->listWidget_pool->currentRow();
  663. elem->container[index].table[row].res = fileName;
  664. //加载时间线下拉列表
  665. for(int i=2;i<=5;i++){
  666. QComboBox* timeline = createTimelineBox("",fileName,TimelineType::Pool);
  667. ui->tableWidget_containerPool->setCellWidget(row,i,timeline);
  668. }
  669. }
  670. }
  671. }
  672. void MainWindow::on_tableWidget_containerPool_itemChanged(QTableWidgetItem *item)
  673. {
  674. if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_pool->currentItem() == nullptr) return;
  675. if(!poolTableItemChanged) return;
  676. poolTableItemChanged = false;
  677. int column = item->column();
  678. int row = item->row();
  679. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  680. int index = ui->listWidget_pool->currentRow();
  681. QVector<ElemPropertyData::ContainTable> &containerVec = elem->container[index].table;
  682. if(column == 0){
  683. bool isNum;double tmp = item->text().toDouble(&isNum);
  684. if(item->text().toInt() < 0 || !isNum){
  685. QMessageBox::critical(this,"错误","键值必须是大于等于0的数字");
  686. item->setText(containerVec[row].key);
  687. return;
  688. }
  689. if(!elem->isSingleContainerKey(ui->listWidget_pool->currentItem()->text(),item->text())){
  690. QMessageBox::critical(this,"警告","该键值已存在!");
  691. item->setText(containerVec[row].key);
  692. return;
  693. }
  694. containerVec[row].key = item->text();
  695. }
  696. //检查zOrder合法性
  697. else if(column == 6){
  698. QString zOrder = item->text();
  699. bool isNum;double tmp = zOrder.toDouble(&isNum);
  700. if(item->text().toInt() < 0 || !isNum){
  701. QMessageBox::critical(this,"错误","消失zOrder值必须是大于等于0的数字");
  702. item->setText(containerVec[row].zOrder);
  703. return;
  704. }
  705. containerVec[row].zOrder = zOrder;
  706. }
  707. }
  708. void MainWindow::on_pushButton_addChildElem_clicked()
  709. {
  710. if(ui->listWidget_elem->currentItem() == nullptr) return;
  711. int rowNum = ui->tableWidget_childElem->rowCount();
  712. ui->tableWidget_childElem->insertRow(rowNum);
  713. QString childElemName = "item";
  714. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  715. int id = 1;
  716. while(1){
  717. if(elem->isSingleChildElemName(childElemName)){
  718. break;
  719. }
  720. childElemName = "item" + QString::number(id++);
  721. }
  722. ui->tableWidget_childElem->setItem(rowNum,0,new QTableWidgetItem(childElemName));
  723. ui->tableWidget_childElem->setCellWidget(rowNum,1,createPoolBox("尚未选择"));
  724. elem->childElem.push_back(ElemPropertyData::ChildElem(childElemName));
  725. }
  726. void MainWindow::on_pushButton_delChildElem_clicked()
  727. {
  728. if(ui->listWidget_elem->currentItem() == nullptr || ui->tableWidget_childElem->currentRow() == -1) return;
  729. QMessageBox::StandardButton reply = QMessageBox::question(this,"删除子元素","确定要删除此子元素吗?");
  730. if(reply == QMessageBox::Yes){
  731. int curRow = ui->tableWidget_childElem->currentRow();
  732. QString childElemName = ui->tableWidget_childElem->item(curRow,0)->text();
  733. QVector<ElemPropertyData::ChildElem> &childElemVec = elements[ui->listWidget_elem->currentItem()->text()]->childElem;
  734. childElemVec.remove(curRow);
  735. ui->tableWidget_childElem->removeRow(curRow);
  736. }
  737. }
  738. void MainWindow::on_tableWidget_childElem_itemChanged(QTableWidgetItem *item)
  739. {
  740. if(ui->listWidget_elem->currentItem() == nullptr) return;
  741. if(!childElemTableItemChanged) return;
  742. childElemTableItemChanged = false;
  743. int column = item->column();
  744. int row = item->row();
  745. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  746. QVector<ElemPropertyData::ChildElem> &childElemVec = elem->childElem;
  747. if(column == 0){
  748. if(!elem->isSingleChildElemName(item->text())){
  749. QMessageBox::critical(this,"警告","该子元素名已存在!");
  750. item->setText(childElemVec[row].name);
  751. return;
  752. }
  753. childElemVec[row].name = item->text();
  754. }
  755. //TODO: comboBox值修改后的保存
  756. }
  757. void MainWindow::on_tableWidget_childElem_cellDoubleClicked(int row, int column)
  758. {
  759. if(ui->listWidget_elem->currentItem() == nullptr) return;
  760. //子元素表格双击改名置flag为true
  761. childElemTableItemChanged = true;
  762. }
  763. void MainWindow::on_checkBox_multiHit_stateChanged(int arg1)
  764. {
  765. if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_status->currentItem() == nullptr || isSetUi) return;
  766. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  767. int index = ui->listWidget_status->currentRow();
  768. if(arg1){
  769. elem->statusConfig[index].multiHit = true;
  770. }
  771. else{
  772. elem->statusConfig[index].multiHit = false;
  773. }
  774. }
  775. void MainWindow::on_checkBox_dropable_stateChanged(int arg1)
  776. {
  777. if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_status->currentItem() == nullptr || isSetUi) return;
  778. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  779. int index = ui->listWidget_status->currentRow();
  780. if(arg1){
  781. elem->statusConfig[index].dropable = true;
  782. }
  783. else{
  784. elem->statusConfig[index].dropable = false;
  785. }
  786. }
  787. void MainWindow::on_checkBox_needCollect_stateChanged(int arg1)
  788. {
  789. if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_status->currentItem() == nullptr || isSetUi) return;
  790. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  791. int index = ui->listWidget_status->currentRow();
  792. if(arg1){
  793. elem->statusConfig[index].needCollect = true;
  794. ui->lineEdit_collectionType->setReadOnly(false);
  795. }
  796. else{
  797. elem->statusConfig[index].needCollect = false;
  798. ui->lineEdit_collectionType->setReadOnly(true);
  799. }
  800. }
  801. void MainWindow::on_lineEdit_collectionType_editingFinished()
  802. {
  803. if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_status->currentItem() == nullptr) return;
  804. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  805. int index = ui->listWidget_status->currentRow();
  806. ElemPropertyData::StatusConfig &data = elem->statusConfig[index];
  807. data.collTargetType = ui->lineEdit_collectionType->text();
  808. std::cout<<"收集的目标类型"<<qPrintable(data.collTargetType)<<std::endl;
  809. }
  810. void MainWindow::on_pushButton_addEvent_clicked()
  811. {
  812. if(ui->listWidget_elem->currentItem()==nullptr || ui->listWidget_status->currentItem() == nullptr) return;
  813. int rowNum = ui->tableWidget_event->rowCount();
  814. ui->tableWidget_event->insertRow(rowNum);
  815. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  816. ElemPropertyData::EventConfig event;
  817. int index = ui->listWidget_status->currentRow();
  818. elem->statusConfig[index].eventConfig.push_back(event);
  819. ui->tableWidget_event->setCellWidget(rowNum,0,createEventBox("尚未选择"));
  820. ui->tableWidget_event->setCellWidget(rowNum,1,createCheckBox(false));
  821. ui->tableWidget_event->setCellWidget(rowNum,3,createEffectBox("尚未选择"));
  822. ui->tableWidget_event->setCellWidget(rowNum,4,createCheckBox(false));
  823. ui->tableWidget_event->setCellWidget(rowNum,5,createTriggerAction("尚未选择"));
  824. ui->tableWidget_event->setCellWidget(rowNum,6,createSetButton());
  825. }
  826. void MainWindow::on_listWidget_status_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
  827. {
  828. if(ui->listWidget_elem->currentItem() == nullptr || current == nullptr) return;
  829. isSetUi = true;
  830. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  831. int index = elem->getStatusValIndex(current->text());
  832. ElemPropertyData::StatusConfig statusData = elem->statusConfig[index];
  833. int comboIndex;
  834. //初始化动画
  835. comboIndex = ui->comboBox_initAnim->findText(statusData.initAnim);
  836. if(comboIndex == -1) comboIndex = 0;
  837. ui->comboBox_initAnim->setCurrentIndex(comboIndex);
  838. //点击动画
  839. comboIndex = ui->comboBox_clickAnim->findText(statusData.clickAnim);
  840. if(comboIndex == -1) comboIndex = 0;
  841. ui->comboBox_clickAnim->setCurrentIndex(comboIndex);
  842. //收集动画
  843. comboIndex = ui->comboBox_collectAnimation->findText(statusData.collAnim);
  844. if(comboIndex == -1) comboIndex = 0;
  845. ui->comboBox_collectAnimation->setCurrentIndex(comboIndex);
  846. //多重打击
  847. if(statusData.multiHit) ui->checkBox_multiHit->setCheckState(Qt::Checked);
  848. else ui->checkBox_multiHit->setCheckState(Qt::Unchecked);
  849. //可掉落
  850. if(statusData.dropable) ui->checkBox_multiHit->setCheckState(Qt::Checked);
  851. else ui->checkBox_dropable->setCheckState(Qt::Unchecked);
  852. //是否需要收集
  853. ui->lineEdit_collectionType->clear();
  854. if(statusData.needCollect){
  855. ui->checkBox_needCollect->setCheckState(Qt::Checked);
  856. ui->lineEdit_collectionType->setReadOnly(false);
  857. std::cout<<"收集的目标类型"<<qPrintable(statusData.collTargetType)<<std::endl;
  858. ui->lineEdit_collectionType->setText(statusData.collTargetType);
  859. }
  860. else{
  861. ui->checkBox_needCollect->setCheckState(Qt::Unchecked);
  862. ui->lineEdit_collectionType->setReadOnly(true);
  863. }
  864. //事件配置
  865. int rowNum = ui->tableWidget_event->rowCount();
  866. for(int i=0;i<rowNum;i++){
  867. ui->tableWidget_event->removeRow(0);
  868. }
  869. for(const auto &i:statusData.eventConfig){
  870. rowNum = ui->tableWidget_event->rowCount();
  871. ui->tableWidget_event->insertRow(rowNum);
  872. //事件名称
  873. ui->tableWidget_event->setCellWidget(rowNum,0,createEventBox(i.name));
  874. std::cout<<"重置状态配置ui:事件名称:"<<qPrintable(i.name)<<std::endl;
  875. //是否需要颜色一致
  876. ui->tableWidget_event->setCellWidget(rowNum,1,createCheckBox(i.consisColor));
  877. //tableWidget_event
  878. ui->tableWidget_event->setItem(rowNum,2,new QTableWidgetItem(i.changeMagnitude));
  879. //特效
  880. ui->tableWidget_event->setCellWidget(rowNum,3,createEffectBox(i.specialEffect));
  881. //根据格子数量消除
  882. ui->tableWidget_event->setCellWidget(rowNum,4,createCheckBox(i.elimATLattices));
  883. //触发动作
  884. ui->tableWidget_event->setCellWidget(rowNum,5,createTriggerAction(i.triggerAction));
  885. //触发动作设置
  886. ui->tableWidget_event->setCellWidget(rowNum,6,createSetButton());
  887. }
  888. isSetUi = false;
  889. }
  890. void MainWindow::on_tableWidget_event_cellDoubleClicked(int row, int column)
  891. {
  892. if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_status->currentItem() == nullptr) return;
  893. if(column == 2) eventTableItemChanged = true;
  894. }
  895. //状态变化幅度合法性检查及数据保存
  896. void MainWindow::on_tableWidget_event_itemChanged(QTableWidgetItem *item)
  897. {
  898. if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_status->currentItem() == nullptr) return;
  899. if(!eventTableItemChanged) return;
  900. eventTableItemChanged = false;
  901. int column = item->column();
  902. int row = item->row();
  903. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  904. int index = ui->listWidget_status->currentRow();
  905. QVector<ElemPropertyData::EventConfig> &eventVec = elem->statusConfig[index].eventConfig;
  906. if(column == 2){
  907. bool ok;double a = item->text().toDouble(&ok);
  908. int val = item->text().toInt();
  909. if(!ok || val<0){
  910. QMessageBox::critical(this,"警告","状态变化幅度是大于0的数字");
  911. ui->tableWidget_event->item(row,2)->setText(QString::number(eventVec[row].changeMagnitude));
  912. return;
  913. }
  914. std::cout<<"状态变化幅度发生改变,新值为:"<<val<<std::endl;
  915. eventVec[row].changeMagnitude = val;
  916. }
  917. }
  918. void MainWindow::on_comboBox_initAnim_currentTextChanged(const QString &arg1)
  919. {
  920. if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_status->currentItem() == nullptr || isSetUi) return;
  921. std::cout<<"初始化动画:"<<qPrintable(arg1)<<std::endl;
  922. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  923. int index = ui->listWidget_status->currentRow();
  924. elem->statusConfig[index].initAnim = arg1;
  925. }
  926. void MainWindow::on_comboBox_clickAnim_currentTextChanged(const QString &arg1)
  927. {
  928. if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_status->currentItem() == nullptr || isSetUi) return;
  929. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  930. int index = ui->listWidget_status->currentRow();
  931. elem->statusConfig[index].clickAnim = arg1;
  932. }
  933. void MainWindow::on_comboBox_collectAnimation_currentTextChanged(const QString &arg1)
  934. {
  935. if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_status->currentItem() == nullptr || isSetUi) return;
  936. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  937. int index = ui->listWidget_status->currentRow();
  938. elem->statusConfig[index].collAnim = arg1;
  939. }
  940. ///模板更新后更新与模板配置相关的界面显示
  941. void MainWindow::updateTempRelatedUi()
  942. {
  943. //重新设置收集动画界面
  944. collAnimUi->setCollectAnimUi();
  945. // //状态配置
  946. // int rowNum = ui->tableWidget_event->rowCount();
  947. // for(int i=0;i<rowNum;i++){
  948. // //事件名称配置
  949. // ui->tableWidget_event->setCellWidget(i,0,createEventBox("尚未选择"));
  950. // ui->tableWidget_event->setCellWidget(i,5,createTriggerAction("尚未选择"));
  951. // }
  952. // //容器池
  953. // ui->comboBox_container->clear();
  954. // ui->comboBox_container->addItem("尚未选择");
  955. // for(const auto &i:jsonTemp->templateMap["poolTemp"]) ui->comboBox_container->addItem(i.name);
  956. // int animIndex = 0,poolIndex = 0;
  957. // //若当前界面选择的选项没有被改变,仍然保持当前选项
  958. // if(ui->listWidget_elem->currentItem() != nullptr){
  959. // ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  960. // //收集动画
  961. // if(ui->listWidget_collectAnim->currentItem() != nullptr) {
  962. // int index = ui->listWidget_collectAnim->currentRow();
  963. // std::cout<<"当前选择的收集动画类型:"<<qPrintable(elem->collAnim[index].type)<<std::endl;
  964. // animIndex = ui->comboBox_animationType->findText(elem->collAnim[index].type);
  965. // if(animIndex == -1){
  966. // animIndex = 0;
  967. // elem->collAnim[ui->listWidget_collectAnim->currentRow()].type = "尚未选择";
  968. // }
  969. // setCollAnimWidget();
  970. // }
  971. // //容器池
  972. // if(ui->listWidget_pool->currentItem() != nullptr){
  973. // int index = ui->listWidget_pool->currentRow();
  974. // std::cout<<"当前选择的容器类型:"<<qPrintable(elem->container[index].type)<<std::endl;
  975. // poolIndex = ui->comboBox_container->findText(elem->container[index].type);
  976. // if(poolIndex == -1) poolIndex = 0;
  977. // }
  978. // //事件配置
  979. // if(ui->listWidget_status->currentItem() != nullptr){
  980. // int index = ui->listWidget_status->currentRow();
  981. // int rowNum = ui->tableWidget_event->rowCount();
  982. // for(int i=0;i<rowNum;i++){
  983. // //事件配置
  984. // QComboBox* nameBox = dynamic_cast<QComboBox*>(ui->tableWidget_event->cellWidget(i,0));
  985. // QComboBox* actionBox = dynamic_cast<QComboBox*>(ui->tableWidget_event->cellWidget(i,5));
  986. // int eindex = nameBox->findText(elem->statusConfig[index].eventConfig[i].name);
  987. // if(eindex != -1) nameBox->setCurrentIndex(eindex);
  988. // std::cout<<"当前触发动作:"<<qPrintable(elem->statusConfig[index].eventConfig[i].triggerAction)<<std::endl;
  989. // int aindex = actionBox->findText(elem->statusConfig[index].eventConfig[i].triggerAction);
  990. // if(aindex != -1) actionBox->setCurrentIndex(aindex);
  991. // }
  992. // }
  993. // }
  994. // ui->comboBox_animationType->setCurrentIndex(animIndex);
  995. // ui->comboBox_container->setCurrentIndex(poolIndex);
  996. // isSetUi = false;
  997. }
  998. void MainWindow::on_reloadTempFile_triggered()
  999. {
  1000. DataManager::getInstance()->updateTempData();
  1001. updateTempRelatedUi();
  1002. }
  1003. void MainWindow::on_comboBox_container_currentTextChanged(const QString &arg1)
  1004. {
  1005. if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_pool->currentItem() == nullptr || isSetUi) return;
  1006. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  1007. int poolIndex = ui->listWidget_pool->currentRow();
  1008. elem->container[poolIndex].type = arg1;
  1009. std::cout<<"容器池第"<<poolIndex<<"行容器类型改变:"<<qPrintable(arg1)<<std::endl;
  1010. }
  1011. ///删除事件
  1012. void MainWindow::on_pushButton_delEvent_clicked()
  1013. {
  1014. if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_status->currentItem() == nullptr) return;
  1015. if(ui->tableWidget_event->currentRow() == -1) return;
  1016. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  1017. QMessageBox::StandardButton reply = QMessageBox::question(this,"删除事件","确定要删除此事件吗?");
  1018. if(reply == QMessageBox::Yes){
  1019. int curRow = ui->tableWidget_event->currentRow();
  1020. QVector<ElemPropertyData::EventConfig> &eventTable = elem->statusConfig[ui->listWidget_status->currentRow()].eventConfig;
  1021. eventTable.remove(curRow);
  1022. ui->tableWidget_event->removeRow(curRow);
  1023. }
  1024. }
  1025. void MainWindow::on_tabWidget_currentChanged(int index)
  1026. {
  1027. //更新下拉选项
  1028. if(index == 3){
  1029. collAnimUi->setCollAnimWidget();
  1030. }
  1031. }