mainwindow.cpp 43 KB

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