mainwindow.cpp 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793
  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->tabWidget->setCurrentIndex(0);
  31. }
  32. MainWindow::~MainWindow()
  33. {
  34. delete ui;
  35. }
  36. //TODO: 设置ui所有数据
  37. void MainWindow::setUi(ElemPropertyData *elem)
  38. {
  39. //基础元素区域的设置
  40. QPixmap pix(elem->iconPath);
  41. ui->label_pic->setPixmap(pix.scaled(50,50,Qt::KeepAspectRatio));
  42. ui->lineEdit_name->setText(elem->labelName);
  43. ui->lineEdit_size->setText(elem->size);
  44. ui->lineEdit_maxlayer->setText(elem->maxLayer);
  45. ui->lineEdit_score->setText(elem->score);
  46. ui->spinBox_drop->setValue(elem->dropConfig);
  47. //设置状态与效果动画表格显示
  48. int rowCnt = ui->tableWidget_animation->rowCount();
  49. for(int i=0;i<rowCnt;i++){
  50. ui->tableWidget_animation->removeRow(0);
  51. }
  52. for(const auto &i:elem->statusEffect){
  53. int rowNum = ui->tableWidget_animation->rowCount();
  54. ui->tableWidget_animation->insertRow(rowNum);
  55. ui->tableWidget_animation->setItem(rowNum,0,new QTableWidgetItem(i.name));
  56. //TODO: 资源和时间线所在单元格替换数据
  57. QTableWidgetItem* res = new QTableWidgetItem("双击添加资源文件");
  58. // 此单元格不可编辑
  59. res->setFlags(res->flags() & ~Qt::ItemIsEditable);
  60. ui->tableWidget_animation->setItem(rowNum,1,res);
  61. ui->tableWidget_animation->setCellWidget(rowNum,2,new QComboBox);
  62. ui->tableWidget_animation->setItem(rowNum,3,new QTableWidgetItem(i.zOrder));
  63. }
  64. //设置收集动画的显示并聚焦到收集动画列表的最后一个元素
  65. ui->listWidget_collectAnim->clear();
  66. ui->listWidget_collectAnim->addItems(elem->collAnim.keys());
  67. // ui->listWidget_collectAnim->item(0)->setSelected(true); // 设置选中
  68. //设置收集动画和状态配置的comboBox
  69. ui->comboBox_initAnim->clear();
  70. ui->comboBox_clickAnim->clear();
  71. ui->comboBox_collectAnimation->clear();
  72. ui->comboBox_animation->clear();
  73. for(const auto &i:elem->statusEffect){
  74. ui->comboBox_clickAnim->addItem(i.name);
  75. ui->comboBox_animation->addItem(i.name);
  76. ui->comboBox_initAnim->addItem(i.name);
  77. }
  78. ui->comboBox_collectAnimation->addItems(elem->collAnim.keys());
  79. //设置容器池界面
  80. ui->listWidget_pool->clear();
  81. ui->listWidget_pool->addItems(elem->container.keys());
  82. //切换元素时容器尚未选中,先清除表格内容
  83. int rowNum = ui->tableWidget_containerPool->rowCount();
  84. for(int i=0;i<rowNum;i++){
  85. ui->tableWidget_containerPool->removeRow(0);
  86. }
  87. //设置子元素界面
  88. rowCnt = ui->tableWidget_childElem->rowCount();
  89. for(int i=0;i<rowCnt;i++){
  90. ui->tableWidget_childElem->removeRow(0);
  91. }
  92. for(const auto &i:elem->childElem){
  93. int rowNum = ui->tableWidget_childElem->rowCount();
  94. ui->tableWidget_childElem->insertRow(rowNum);
  95. ui->tableWidget_childElem->setItem(rowNum,0,new QTableWidgetItem(i.name));
  96. //TODO: 根据记载的comboBox数据设置当前选中项
  97. QComboBox* containers = new QComboBox;
  98. containers->addItems(elem->container.keys());
  99. containers->setCurrentIndex(0);
  100. ui->tableWidget_childElem->setCellWidget(rowNum,1,containers);
  101. }
  102. }
  103. void MainWindow::on_pushButton_chooseFile_clicked()
  104. {
  105. //如果未选中列表中的按钮,无法触发此按钮
  106. if(ui->listWidget_elem->currentItem() == nullptr) return;
  107. QString elem = ui->listWidget_elem->currentItem()->text();
  108. QString file_name = QFileDialog::getOpenFileName(this,"Open a file",QDir::homePath());
  109. if(file_name == nullptr){
  110. file_name = elements[elem]->iconPath;
  111. }
  112. QPixmap pix(file_name);
  113. ui->label_pic->setPixmap(pix.scaled(50,50,Qt::KeepAspectRatio));
  114. elements[elem]->iconPath = file_name;
  115. ui->listWidget_elem->currentItem()->setIcon(QIcon(file_name));
  116. }
  117. void MainWindow::on_pushButton_addElem_clicked()
  118. {
  119. QString elemName = "新加元素";
  120. int id = 1;
  121. while(1){
  122. if(elements.find(elemName)==elements.end()){
  123. break;
  124. }
  125. elemName = "新加元素" + QString::number(id++);
  126. }
  127. QListWidgetItem* item = new QListWidgetItem(QIcon("/Users/menglanluo/菜狗.png"),elemName);
  128. ui->listWidget_elem->addItem(item);
  129. // ui->listWidget_elem->item(ui->listWidget_elem->count() - 1)->setSelected(true); // 设置选中
  130. // ui->listWidget_elem->scrollToBottom();
  131. elements[elemName] = new ElemPropertyData();
  132. }
  133. void MainWindow::on_pushButton_delElem_clicked()
  134. {
  135. if(ui->listWidget_elem->currentItem() == nullptr) return;
  136. QMessageBox::StandardButton reply = QMessageBox::question(this,"删除元素","确定要删除此元素吗?");
  137. if(reply == QMessageBox::Yes){
  138. QString elemName = ui->listWidget_elem->currentItem()->text();
  139. delete elements[elemName];
  140. elements.erase(elements.find(elemName));
  141. delete ui->listWidget_elem->takeItem(ui->listWidget_elem->currentRow());
  142. }
  143. }
  144. void MainWindow::on_listWidget_elem_itemDoubleClicked(QListWidgetItem *item)
  145. {
  146. ChangeNameDialog newName;
  147. newName.setModal(true);
  148. newName.exec();
  149. QString name = newName.getNewName();
  150. if(!name.isEmpty()){
  151. if(elements.find(name)!=elements.end()){
  152. QMessageBox::critical(this,"警告","该元素名已存在!");
  153. return;
  154. }
  155. QString elemName = ui->listWidget_elem->currentItem()->text();
  156. ElemPropertyData* newElem = elements[elemName];
  157. elements.erase(elements.find(elemName));
  158. elements[newName.getNewName()] = newElem;
  159. item->setText(newName.getNewName());
  160. }
  161. }
  162. void MainWindow::on_lineEdit_name_editingFinished()
  163. {
  164. if(ui->listWidget_elem->currentItem() == nullptr) return;
  165. QString key = ui->listWidget_elem->currentItem()->text();
  166. elements[key]->labelName = ui->lineEdit_name->text();
  167. }
  168. void MainWindow::on_lineEdit_size_editingFinished()
  169. {
  170. if(ui->listWidget_elem->currentItem() == nullptr) return;
  171. QString key = ui->listWidget_elem->currentItem()->text();
  172. elements[key]->size = ui->lineEdit_size->text();
  173. }
  174. void MainWindow::on_lineEdit_maxlayer_editingFinished()
  175. {
  176. if(ui->listWidget_elem->currentItem() == nullptr) return;
  177. QString key = ui->listWidget_elem->currentItem()->text();
  178. elements[key]->maxLayer = ui->lineEdit_maxlayer->text();
  179. }
  180. void MainWindow::on_lineEdit_score_editingFinished()
  181. {
  182. if(ui->listWidget_elem->currentItem() == nullptr) return;
  183. QString key = ui->listWidget_elem->currentItem()->text();
  184. elements[key]->score = ui->lineEdit_score->text();
  185. }
  186. void MainWindow::on_spinBox_drop_valueChanged(int arg1)
  187. {
  188. if(ui->listWidget_elem->currentItem() == nullptr) return;
  189. QString key = ui->listWidget_elem->currentItem()->text();
  190. elements[key]->dropConfig = arg1;
  191. }
  192. //TODO: 保存当前元素的所有数据,界面加载当前元素数据
  193. void MainWindow::on_listWidget_elem_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
  194. {
  195. //每一步改变基本都会触发保存,但是表格内嵌的组件如combobox暂时没找到触发保存的办法
  196. setUi(elements[current->text()]);
  197. }
  198. //替换资源文件
  199. void MainWindow::on_tableWidget_animation_cellDoubleClicked(int row, int column)
  200. {
  201. //表格内容修改flag
  202. animTableItemChanged = true;
  203. if(column == 1){
  204. ResFileDialog res;
  205. res.setModal(true);
  206. res.exec();
  207. QString fileName = res.getResName();
  208. if(!fileName.isEmpty()){
  209. ui->tableWidget_animation->setItem(row,column,new QTableWidgetItem(fileName));
  210. //TODO: 加入资源生成时间线代码
  211. QComboBox* timeLine = new QComboBox;
  212. timeLine->addItem("lml");
  213. timeLine->addItem("xdf");
  214. timeLine->addItem("cqf");
  215. ui->tableWidget_animation->setCellWidget(row,column+1,timeLine);
  216. }
  217. }
  218. }
  219. void MainWindow::on_pushButton_addAnimation_clicked()
  220. {
  221. if(ui->listWidget_elem->currentItem()==nullptr) return;
  222. int rowNum = ui->tableWidget_animation->rowCount();
  223. ui->tableWidget_animation->insertRow(rowNum);
  224. QString elemName = ui->listWidget_elem->currentItem()->text();
  225. ElemPropertyData* elem = elements[elemName];
  226. QString animName = "anim";
  227. int id = 1;
  228. while(1){
  229. if(elem->isSingleAnimName(animName)){
  230. break;
  231. }
  232. animName = "anim" + QString::number(id++);
  233. }
  234. ui->tableWidget_animation->setItem(rowNum,0,new QTableWidgetItem(animName));
  235. QTableWidgetItem* res = new QTableWidgetItem("双击添加资源文件");
  236. // 此单元格不可编辑
  237. res->setFlags(res->flags() & ~Qt::ItemIsEditable);
  238. ui->tableWidget_animation->setItem(rowNum,1,res);
  239. ui->tableWidget_animation->setCellWidget(rowNum,2,new QComboBox);
  240. ui->tableWidget_animation->setItem(rowNum,3,new QTableWidgetItem("0"));
  241. elem->statusEffect.push_back({animName,"","","0"});
  242. }
  243. void MainWindow::on_pushButton_delAnimation_clicked()
  244. {
  245. if(ui->listWidget_elem->currentItem() == nullptr || ui->tableWidget_animation->currentRow() == -1) return;
  246. QMessageBox::StandardButton reply = QMessageBox::question(this,"删除动画","确定要删除此动画吗?");
  247. if(reply == QMessageBox::Yes){
  248. int curRow = ui->tableWidget_animation->currentRow();
  249. QString animName = ui->tableWidget_animation->item(curRow,0)->text();
  250. QVector<ElemPropertyData::StatusEffect> &animVec = elements[ui->listWidget_elem->currentItem()->text()]->statusEffect;
  251. for(int i=0;i<animVec.size();i++){
  252. if(animName == animVec[i].name){
  253. animVec.remove(i);
  254. break;
  255. }
  256. }
  257. ui->tableWidget_animation->removeRow(curRow);
  258. }
  259. }
  260. void MainWindow::on_tableWidget_animation_itemChanged(QTableWidgetItem *item)
  261. {
  262. if(!animTableItemChanged) return;
  263. animTableItemChanged = false;
  264. int column = item->column();
  265. int row = item->row();
  266. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  267. QVector<ElemPropertyData::StatusEffect> &animVec = elem->statusEffect;
  268. if(column == 0){
  269. QString newName = ui->tableWidget_animation->item(row,0)->text();
  270. if(!elem->isSingleAnimName(newName)){
  271. QMessageBox::critical(this,"警告","该动画名已存在!");
  272. ui->tableWidget_animation->item(row,0)->setText(animVec[row].name);
  273. return;
  274. }
  275. std::cout<<"名字发生改变,新名字:"<<qPrintable(newName)<<std::endl;
  276. animVec[row].name = newName;
  277. }
  278. //资源名发生修改
  279. else if(column == 1){
  280. std::cout<<"动画资源发生改变,新资源名:"<<qPrintable(ui->tableWidget_animation->item(row,1)->text())<<std::endl;
  281. }
  282. // 时间线发生修改,居然没有反应。。。
  283. else if(column == 2){
  284. QComboBox *timeLine = qobject_cast<QComboBox*>(ui->tableWidget_animation->cellWidget(row,2));
  285. std::cout<<"timeLine:"<<qPrintable(timeLine->currentText())<<std::endl;
  286. }
  287. else{
  288. int zOrder = ui->tableWidget_animation->item(row,3)->text().toInt();
  289. if(zOrder<0 || zOrder>100000){
  290. QMessageBox::critical(this,"警告","z-Order值超出范围!");
  291. ui->tableWidget_animation->item(row,3)->setText(animVec[row].zOrder);
  292. return;
  293. }
  294. std::cout<<"z-Order值发生改变,新值为:"<<zOrder<<std::endl;
  295. animVec[row].zOrder = item->text();
  296. }
  297. }
  298. void MainWindow::on_pushButton_addCollectAnim_clicked()
  299. {
  300. if(ui->listWidget_elem->currentItem() == nullptr) return;
  301. QString collAnimName = "collAnim";
  302. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  303. int id = 1;
  304. while(1){
  305. if(elem->collAnim.find(collAnimName)==elem->collAnim.end()){
  306. break;
  307. }
  308. collAnimName = "collAnim" + QString::number(id++);
  309. }
  310. ui->listWidget_collectAnim->addItem(new QListWidgetItem(collAnimName));
  311. elem->collAnim[collAnimName] = {ui->comboBox_animationType->itemText(0),ui->comboBox_animation->itemText(0),"",""};
  312. // ui->listWidget_collectAnim->item(ui->listWidget_collectAnim->count() - 1)->setSelected(true); // 设置选中
  313. // ui->listWidget_collectAnim->scrollToBottom();
  314. }
  315. void MainWindow::on_pushButton_delCollectAnim_clicked()
  316. {
  317. if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_collectAnim->currentItem() == nullptr) return;
  318. QMessageBox::StandardButton reply = QMessageBox::question(this,"删除动画","确定要删除此收集动画吗?");
  319. if(reply == QMessageBox::Yes){
  320. elements[ui->listWidget_elem->currentItem()->text()]->collAnim.remove(ui->listWidget_collectAnim->currentItem()->text());
  321. delete ui->listWidget_collectAnim->takeItem(ui->listWidget_collectAnim->currentRow());
  322. }
  323. }
  324. void MainWindow::on_listWidget_collectAnim_itemDoubleClicked(QListWidgetItem *item)
  325. {
  326. ChangeNameDialog newName;
  327. newName.setModal(true);
  328. newName.exec();
  329. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  330. QString name = newName.getNewName();
  331. if(!name.isEmpty()){
  332. if(elem->collAnim.find(name)!=elem->collAnim.end()){
  333. QMessageBox::critical(this,"警告","该收集动画名已存在!");
  334. return;
  335. }
  336. QString collAnimName = ui->listWidget_collectAnim->currentItem()->text();
  337. ElemPropertyData::CollAnim collAnimData = elem->collAnim[collAnimName];
  338. elem->collAnim.remove(collAnimName);
  339. elem->collAnim[name] = collAnimData;
  340. item->setText(name);
  341. }
  342. }
  343. void MainWindow::on_comboBox_animationType_currentTextChanged(const QString &arg1)
  344. {
  345. if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_collectAnim->currentItem() == nullptr) return;
  346. elements[ui->listWidget_elem->currentItem()->text()]->collAnim[ui->listWidget_collectAnim->currentItem()->text()].type = arg1;
  347. }
  348. void MainWindow::on_comboBox_animation_currentTextChanged(const QString &arg1)
  349. {
  350. if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_collectAnim->currentItem() == nullptr) return;
  351. elements[ui->listWidget_elem->currentItem()->text()]->collAnim[ui->listWidget_collectAnim->currentItem()->text()].anim = arg1;
  352. }
  353. void MainWindow::on_lineEdit_node_editingFinished()
  354. {
  355. if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_collectAnim->currentItem() == nullptr) return;
  356. elements[ui->listWidget_elem->currentItem()->text()]->collAnim[ui->listWidget_collectAnim->currentItem()->text()].node = ui->lineEdit_node->text();
  357. }
  358. void MainWindow::on_lineEdit_shadow_editingFinished()
  359. {
  360. if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_collectAnim->currentItem() == nullptr) return;
  361. elements[ui->listWidget_elem->currentItem()->text()]->collAnim[ui->listWidget_collectAnim->currentItem()->text()].shadow = ui->lineEdit_shadow->text();
  362. }
  363. //设置收集动画显示
  364. void MainWindow::setCollectAnimUi(QString collectAnimName)
  365. {
  366. if(ui->listWidget_collectAnim->currentItem() != nullptr){
  367. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  368. ElemPropertyData::CollAnim collAnimData = elem->collAnim[collectAnimName];
  369. ui->lineEdit_node->setText(collAnimData.node);
  370. ui->lineEdit_shadow->setText(collAnimData.shadow);
  371. std::cout<<qPrintable(collAnimData.anim)<<"\t"<<qPrintable(collAnimData.type)<<std::endl;
  372. //TODO: 使用comboBox的index来修改当前要显示的值
  373. // ui->comboBox_animation->setCurrentText(collAnimData.anim);
  374. // ui->comboBox_animationType->setCurrentText(collAnimData.type);
  375. ui->comboBox_animation->setCurrentIndex(1);
  376. ui->comboBox_animationType->setCurrentIndex(1);
  377. }
  378. }
  379. void MainWindow::on_listWidget_collectAnim_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
  380. {
  381. //TODO: 或许需要另外保存当前界面的数据
  382. if(current != nullptr){
  383. setCollectAnimUi(current->text());
  384. }
  385. }
  386. //生成模板并更新状态配置的数据
  387. void MainWindow::on_pushButton_genTemp_clicked()
  388. {
  389. if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_status->count() > 0) return;
  390. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  391. for(int i=0;i<elem->maxLayer.toInt();i++){
  392. ui->listWidget_status->addItem(QString::number(i));
  393. elem->statusConfig[QString::number(i)];
  394. }
  395. }
  396. //TODO: 生成一个合法的状态值并修改数据
  397. void MainWindow::on_pushButton_addStatus_clicked()
  398. {
  399. if(ui->listWidget_elem->currentItem() == nullptr) return;
  400. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  401. QString statusName;
  402. for(int i=0;i<elem->maxLayer.toInt();i++){
  403. if(elem->statusConfig.find(QString::number(i)) == elem->statusConfig.end()){
  404. statusName = QString::number(i);
  405. break;
  406. }
  407. }
  408. if(!statusName.isEmpty()){
  409. ui->listWidget_status->addItem(statusName);
  410. elem->statusConfig[statusName];
  411. }
  412. }
  413. //TODO: 删除状态值对应的数据
  414. void MainWindow::on_pushButton_delStatus_clicked()
  415. {
  416. if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_status->currentItem() == nullptr) return;
  417. QMessageBox::StandardButton reply = QMessageBox::question(this,"删除状态","确定要删除此状态吗?");
  418. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  419. if(reply == QMessageBox::Yes){
  420. elem->statusConfig.remove(ui->listWidget_status->currentItem()->text());
  421. delete ui->listWidget_status->takeItem(ui->listWidget_status->currentRow());
  422. }
  423. }
  424. //修改状态值,检查修改后的状态值是否合法,并转移数据
  425. void MainWindow::on_listWidget_status_itemDoubleClicked(QListWidgetItem *item)
  426. {
  427. ChangeNameDialog newName;
  428. newName.setModal(true);
  429. newName.exec();
  430. QString name = newName.getNewName();
  431. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  432. if(!name.isEmpty()){
  433. //TODO: 检查状态值合法性并转移数据
  434. bool isNum;double tmp = name.toDouble(&isNum);
  435. int maxlayer = ui->lineEdit_maxlayer->text().toInt();
  436. int statusNum = name.toInt();
  437. if(!isNum ||statusNum < 0 || statusNum >= maxlayer){
  438. QMessageBox::critical(this,"错误","状态值必须是大于等于0且小于最大层数的数字");
  439. return;
  440. }
  441. if(elem->statusConfig.find(name) != elem->statusConfig.end()){
  442. QMessageBox::critical(this,"警告","该状态值已存在");
  443. return;
  444. }
  445. ElemPropertyData::StatusConfig data = elem->statusConfig[item->text()];
  446. elem->statusConfig.remove(item->text());
  447. elem->statusConfig[name] = data;
  448. item->setText(name);
  449. }
  450. }
  451. void MainWindow::on_pushButton_addContainer_clicked()
  452. {
  453. if(ui->listWidget_elem->currentItem() == nullptr) return;
  454. QString poolName = "pool";
  455. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  456. int id = 1;
  457. while(1){
  458. if(elem->container.find(poolName)==elem->container.end()){
  459. break;
  460. }
  461. poolName = "pool" + QString::number(id++);
  462. }
  463. ui->listWidget_pool->addItem(new QListWidgetItem(poolName));
  464. elem->container[poolName];
  465. //子元素下拉列表添加可选项
  466. int rowNum = ui->tableWidget_childElem->rowCount();
  467. for(int i=0;i<rowNum;i++){
  468. QComboBox *containers = qobject_cast<QComboBox*>(ui->tableWidget_childElem->cellWidget(i,1));
  469. containers->addItem(poolName);
  470. }
  471. }
  472. void MainWindow::on_pushButton_delContainer_clicked()
  473. {
  474. if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_pool->currentItem() == nullptr) return;
  475. QMessageBox::StandardButton reply = QMessageBox::question(this,"删除状态","确定要删除此容器吗?");
  476. if(reply == QMessageBox::Yes){
  477. QString key = ui->listWidget_pool->currentItem()->text();
  478. elements[ui->listWidget_elem->currentItem()->text()]->container.remove(key);
  479. delete ui->listWidget_pool->takeItem(ui->listWidget_pool->currentRow());
  480. }
  481. }
  482. void MainWindow::on_listWidget_pool_itemDoubleClicked(QListWidgetItem *item)
  483. {
  484. if(ui->listWidget_elem->currentItem() == nullptr) return;
  485. ChangeNameDialog newName;
  486. newName.setModal(true);
  487. newName.exec();
  488. QString name = newName.getNewName();
  489. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  490. if(!name.isEmpty()){
  491. //TODO: 检查新名字唯一性
  492. if(elem->container.find(name) != elem->container.end()){
  493. QMessageBox::critical(this,"警告","该容器名已存在!");
  494. return;
  495. }
  496. ElemPropertyData::ContainerConfig containerData = elem->container[item->text()];
  497. elem->container.remove(item->text());
  498. elem->container[name] = containerData;
  499. item->setText(name);
  500. }
  501. }
  502. void MainWindow::on_listWidget_pool_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
  503. {
  504. //TODO:保存切换前界面数据
  505. if(current != nullptr){
  506. setPoolUi(current->text());
  507. }
  508. }
  509. void MainWindow::on_pushButton_addKey_clicked()
  510. {
  511. if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_pool->currentItem() == nullptr) return;
  512. int rowNum = ui->tableWidget_containerPool->rowCount();
  513. ui->tableWidget_containerPool->insertRow(rowNum);
  514. QString keyName = "0";
  515. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  516. int id = 1;
  517. while(1){
  518. if(elem->isSingleContainerKey(ui->listWidget_pool->currentItem()->text(),keyName)){
  519. break;
  520. }
  521. keyName = QString::number(id++);
  522. }
  523. ui->tableWidget_containerPool->setItem(rowNum,0,new QTableWidgetItem(keyName));
  524. QTableWidgetItem* res = new QTableWidgetItem("双击添加资源文件");
  525. // 此单元格不可编辑
  526. res->setFlags(res->flags() & ~Qt::ItemIsEditable);
  527. ui->tableWidget_containerPool->setItem(rowNum,1,res);
  528. for(int i=2;i<=5;i++){
  529. ui->tableWidget_containerPool->setCellWidget(rowNum,i,new QComboBox);
  530. }
  531. ui->tableWidget_containerPool->setItem(rowNum,3,new QTableWidgetItem("0"));
  532. elem->container[ui->listWidget_pool->currentItem()->text()].table.push_back({keyName,"","","","","","0"});
  533. }
  534. void MainWindow::on_pushButton_delKey_clicked()
  535. {
  536. if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_pool->currentItem() == nullptr || ui->tableWidget_containerPool->currentRow() == -1) return;
  537. QMessageBox::StandardButton reply = QMessageBox::question(this,"删除容器","确定要删除此容器吗?");
  538. if(reply == QMessageBox::Yes){
  539. int curRow = ui->tableWidget_containerPool->currentRow();
  540. QString containerName = ui->tableWidget_containerPool->item(curRow,0)->text();
  541. QVector<ElemPropertyData::ContainTable> &containerTable = elements[ui->listWidget_elem->currentItem()->text()]->container[ui->listWidget_pool->currentItem()->text()].table;
  542. for(int i=0;i<containerTable.size();i++){
  543. if(containerName == containerTable[i].key){
  544. containerTable.remove(i);
  545. break;
  546. }
  547. }
  548. ui->tableWidget_containerPool->removeRow(curRow);
  549. }
  550. }
  551. void MainWindow::setPoolUi(QString poolName)
  552. {
  553. if(ui->listWidget_elem->currentItem() == nullptr) return;
  554. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  555. ElemPropertyData::ContainerConfig poolData = elem->container[poolName];
  556. int rowNum = ui->tableWidget_containerPool->rowCount();
  557. for(int i=0;i<rowNum;i++){
  558. ui->tableWidget_containerPool->removeRow(0);
  559. }
  560. //TODO: 设置comboBox选项
  561. int rowCnt = ui->tableWidget_containerPool->rowCount();
  562. for(int i=0;i<rowCnt;i++){
  563. ui->tableWidget_containerPool->removeRow(0);
  564. }
  565. for(const auto &i:poolData.table){
  566. int rowNum = ui->tableWidget_containerPool->rowCount();
  567. ui->tableWidget_containerPool->insertRow(rowNum);
  568. ui->tableWidget_containerPool->setItem(rowNum,0,new QTableWidgetItem(i.key));
  569. //TODO: 资源和时间线所在单元格替换数据
  570. QTableWidgetItem* res = new QTableWidgetItem("双击添加资源文件");
  571. // 此单元格不可编辑
  572. res->setFlags(res->flags() & ~Qt::ItemIsEditable);
  573. ui->tableWidget_containerPool->setItem(rowNum,1,res);
  574. for(int col=2;col<=5;col++){
  575. ui->tableWidget_containerPool->setCellWidget(rowNum,col,new QComboBox);
  576. }
  577. ui->tableWidget_containerPool->setItem(rowNum,6,new QTableWidgetItem(i.zOrder));
  578. }
  579. }
  580. void MainWindow::on_tableWidget_containerPool_cellDoubleClicked(int row, int column)
  581. {
  582. if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_pool->currentItem() == nullptr) return;
  583. //容器表格内容修改flag
  584. poolTableItemChanged = true;
  585. if(column == 1){
  586. ResFileDialog res;
  587. res.setModal(true);
  588. res.exec();
  589. QString fileName = res.getResName();
  590. if(!fileName.isEmpty()){
  591. //TODO: 加载comboBox,随后文件名去除路径
  592. ui->tableWidget_containerPool->setItem(row,column,new QTableWidgetItem(fileName));
  593. elements[ui->listWidget_elem->currentItem()->text()]->container[ui->listWidget_pool->currentItem()->text()].table[row].res = fileName;
  594. // QComboBox* timeLine = new QComboBox;
  595. // timeLine->addItem("lml");
  596. // timeLine->addItem("xdf");
  597. // timeLine->addItem("cqf");
  598. // ui->tableWidget_animation->setCellWidget(row,column+1,timeLine);
  599. }
  600. }
  601. }
  602. void MainWindow::on_tableWidget_containerPool_itemChanged(QTableWidgetItem *item)
  603. {
  604. if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_pool->currentItem() == nullptr) return;
  605. if(!poolTableItemChanged) return;
  606. poolTableItemChanged = false;
  607. int column = item->column();
  608. int row = item->row();
  609. QVector<ElemPropertyData::ContainTable> &containerVec = elements[ui->listWidget_elem->currentItem()->text()]->container[ui->listWidget_pool->currentItem()->text()].table;
  610. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  611. if(column == 0){
  612. bool isNum;double tmp = item->text().toDouble(&isNum);
  613. if(item->text().toInt() < 0 || !isNum){
  614. QMessageBox::critical(this,"错误","键值必须是大于等于0的数字");
  615. item->setText(containerVec[row].key);
  616. return;
  617. }
  618. if(!elem->isSingleContainerKey(ui->listWidget_pool->currentItem()->text(),item->text())){
  619. QMessageBox::critical(this,"警告","该键值已存在!");
  620. item->setText(containerVec[row].key);
  621. return;
  622. }
  623. containerVec[row].key = item->text();
  624. }
  625. //检查zOrder合法性
  626. else if(column == 6){
  627. QString zOrder = item->text();
  628. bool isNum;double tmp = zOrder.toDouble(&isNum);
  629. if(item->text().toInt() < 0 || !isNum){
  630. QMessageBox::critical(this,"错误","消失zOrder值必须是大于等于0的数字");
  631. item->setText(containerVec[row].zOrder);
  632. return;
  633. }
  634. containerVec[row].zOrder = zOrder;
  635. }
  636. }
  637. //切换tab时更新comboBox(或者每一次添加删除动画就更新一下该元素的comboBox?这样也更方便进行逻辑检查)
  638. void MainWindow::on_tabWidget_currentChanged(int index)
  639. {
  640. if(ui->listWidget_elem->currentItem() == nullptr) return;
  641. QVector<ElemPropertyData::StatusEffect> &animVec = elements[ui->listWidget_elem->currentItem()->text()]->statusEffect;
  642. //如果目前展示的是收集动画,加载状态与效果配置中的动画到收集动画的动画下拉列表中
  643. //目前这种方法较为暴力,后期可以视动画数量进行优化
  644. if(index == 1){
  645. ui->comboBox_animation->clear();
  646. for(const auto &i:animVec){
  647. ui->comboBox_animation->addItem(i.name);
  648. }
  649. }
  650. //如果目前展示的是状态配置,加载相应状态效果配置动画和收集动画
  651. else if(index == 2){
  652. ui->comboBox_initAnim->clear();
  653. ui->comboBox_clickAnim->clear();
  654. ui->comboBox_collectAnimation->clear();
  655. for(const auto &i:animVec){
  656. ui->comboBox_initAnim->addItem(i.name);
  657. ui->comboBox_clickAnim->addItem(i.name);
  658. }
  659. ui->comboBox_collectAnimation->addItems(elements[ui->listWidget_elem->currentItem()->text()]->collAnim.keys());
  660. }
  661. }
  662. void MainWindow::on_pushButton_addChildElem_clicked()
  663. {
  664. if(ui->listWidget_elem->currentItem() == nullptr) return;
  665. int rowNum = ui->tableWidget_childElem->rowCount();
  666. ui->tableWidget_childElem->insertRow(rowNum);
  667. QString childElemName = "item";
  668. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  669. int id = 1;
  670. while(1){
  671. if(elem->isSingleChildElemName(childElemName)){
  672. break;
  673. }
  674. childElemName = "item" + QString::number(id++);
  675. }
  676. ui->tableWidget_childElem->setItem(rowNum,0,new QTableWidgetItem(childElemName));
  677. QComboBox* containers = new QComboBox;
  678. containers->addItems(elem->container.keys());
  679. ui->tableWidget_childElem->setCellWidget(rowNum,1,containers);
  680. elem->childElem.push_back({childElemName,""});
  681. }
  682. void MainWindow::on_pushButton_delChildElem_clicked()
  683. {
  684. if(ui->listWidget_elem->currentItem() == nullptr || ui->tableWidget_childElem->currentRow() == -1) return;
  685. QMessageBox::StandardButton reply = QMessageBox::question(this,"删除子元素","确定要删除此子元素吗?");
  686. if(reply == QMessageBox::Yes){
  687. int curRow = ui->tableWidget_childElem->currentRow();
  688. QString childElemName = ui->tableWidget_childElem->item(curRow,0)->text();
  689. QVector<ElemPropertyData::ChildElem> &childElemVec = elements[ui->listWidget_elem->currentItem()->text()]->childElem;
  690. for(int i=0;i<childElemVec.size();i++){
  691. if(childElemName == childElemVec[i].name){
  692. childElemVec.remove(i);
  693. break;
  694. }
  695. }
  696. ui->tableWidget_childElem->removeRow(curRow);
  697. }
  698. }
  699. void MainWindow::on_tableWidget_childElem_itemChanged(QTableWidgetItem *item)
  700. {
  701. if(ui->listWidget_elem->currentItem() == nullptr) return;
  702. if(!childElemTableItemChanged) return;
  703. childElemTableItemChanged = false;
  704. int column = item->column();
  705. int row = item->row();
  706. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  707. QVector<ElemPropertyData::ChildElem> &childElemVec = elem->childElem;
  708. if(column == 0){
  709. if(!elem->isSingleChildElemName(item->text())){
  710. QMessageBox::critical(this,"警告","该子元素名已存在!");
  711. item->setText(childElemVec[row].name);
  712. return;
  713. }
  714. childElemVec[row].name = item->text();
  715. }
  716. //TODO: comboBox值修改后的保存
  717. }
  718. void MainWindow::on_tableWidget_childElem_cellDoubleClicked(int row, int column)
  719. {
  720. if(ui->listWidget_elem->currentItem() == nullptr) return;
  721. //子元素表格双击改名置flag为true
  722. childElemTableItemChanged = true;
  723. }