mainwindow.cpp 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503
  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->tabWidget->setCurrentIndex(0);
  29. }
  30. MainWindow::~MainWindow()
  31. {
  32. delete ui;
  33. }
  34. //TODO: 设置ui所有数据
  35. void MainWindow::setUi(ElemPropertyData *elem)
  36. {
  37. QPixmap pix(elem->iconPath);
  38. ui->label_pic->setPixmap(pix.scaled(50,50,Qt::KeepAspectRatio));
  39. ui->lineEdit_name->setText(elem->labelName);
  40. ui->lineEdit_size->setText(elem->size);
  41. ui->lineEdit_maxlayer->setText(elem->maxLayer);
  42. ui->lineEdit_score->setText(elem->score);
  43. ui->spinBox_drop->setValue(elem->dropConfig);
  44. //设置状态与效果动画表格显示
  45. int rowCnt = ui->tableWidget_animation->rowCount();
  46. for(int i=0;i<rowCnt;i++){
  47. ui->tableWidget_animation->removeRow(0);
  48. }
  49. for(const auto &i:elements[ui->listWidget_elem->currentItem()->text()]->statusEffect){
  50. int rowNum = ui->tableWidget_animation->rowCount();
  51. ui->tableWidget_animation->insertRow(rowNum);
  52. ui->tableWidget_animation->setItem(rowNum,0,new QTableWidgetItem(i.name));
  53. //TODO: 资源和时间线所在单元格替换数据
  54. QTableWidgetItem* res = new QTableWidgetItem("双击添加资源文件");
  55. // 此单元格不可编辑
  56. res->setFlags(res->flags() & ~Qt::ItemIsEditable);
  57. ui->tableWidget_animation->setItem(rowNum,1,res);
  58. ui->tableWidget_animation->setCellWidget(rowNum,2,new QComboBox);
  59. ui->tableWidget_animation->setItem(rowNum,3,new QTableWidgetItem(QString::number(i.zOrder)));
  60. }
  61. //设置收集动画的显示并聚焦到收集动画列表的最后一个元素
  62. ui->listWidget_collectAnim->clear();
  63. ui->listWidget_collectAnim->addItems(elem->collAnim.keys());
  64. // ui->listWidget_collectAnim->item(0)->setSelected(true); // 设置选中
  65. //设置收集动画和状态配置的comboBox
  66. ui->comboBox_initAnim->clear();
  67. ui->comboBox_clickAnim->clear();
  68. ui->comboBox_collectAnimation->clear();
  69. ui->comboBox_animation->clear();
  70. for(const auto &i:elem->statusEffect){
  71. ui->comboBox_clickAnim->addItem(i.name);
  72. ui->comboBox_animation->addItem(i.name);
  73. ui->comboBox_initAnim->addItem(i.name);
  74. }
  75. ui->comboBox_collectAnimation->addItems(elem->collAnim.keys());
  76. }
  77. void MainWindow::on_pushButton_chooseFile_clicked()
  78. {
  79. //如果未选中列表中的按钮,无法触发此按钮
  80. if(ui->listWidget_elem->currentItem() == nullptr) return;
  81. QString elem = ui->listWidget_elem->currentItem()->text();
  82. QString file_name = QFileDialog::getOpenFileName(this,"Open a file",QDir::homePath());
  83. if(file_name == nullptr){
  84. file_name = elements[elem]->iconPath;
  85. }
  86. QPixmap pix(file_name);
  87. ui->label_pic->setPixmap(pix.scaled(50,50,Qt::KeepAspectRatio));
  88. elements[elem]->iconPath = file_name;
  89. ui->listWidget_elem->currentItem()->setIcon(QIcon(file_name));
  90. }
  91. void MainWindow::on_pushButton_addElem_clicked()
  92. {
  93. QString elemName = "新加元素";
  94. int id = 1;
  95. while(1){
  96. if(elements.find(elemName)==elements.end()){
  97. break;
  98. }
  99. elemName = "新加元素" + QString::number(id++);
  100. }
  101. QListWidgetItem* item = new QListWidgetItem(QIcon("/Users/menglanluo/菜狗.png"),elemName);
  102. ui->listWidget_elem->addItem(item);
  103. // ui->listWidget_elem->item(ui->listWidget_elem->count() - 1)->setSelected(true); // 设置选中
  104. // ui->listWidget_elem->scrollToBottom();
  105. elements[elemName] = new ElemPropertyData();
  106. }
  107. void MainWindow::on_pushButton_delElem_clicked()
  108. {
  109. if(ui->listWidget_elem->currentItem() == nullptr) return;
  110. QMessageBox::StandardButton reply = QMessageBox::question(this,"删除元素","确定要删除此元素吗?");
  111. if(reply == QMessageBox::Yes){
  112. QString elemName = ui->listWidget_elem->currentItem()->text();
  113. delete elements[elemName];
  114. elements.erase(elements.find(elemName));
  115. delete ui->listWidget_elem->takeItem(ui->listWidget_elem->currentRow());
  116. }
  117. }
  118. void MainWindow::on_listWidget_elem_itemDoubleClicked(QListWidgetItem *item)
  119. {
  120. ChangeNameDialog newName;
  121. newName.setModal(true);
  122. newName.exec();
  123. QString name = newName.getNewName();
  124. if(!name.isEmpty()){
  125. if(elements.find(name)!=elements.end()){
  126. QMessageBox::critical(this,"警告","该元素名已存在!");
  127. return;
  128. }
  129. QString elemName = ui->listWidget_elem->currentItem()->text();
  130. ElemPropertyData* newElem = elements[elemName];
  131. elements.erase(elements.find(elemName));
  132. elements[newName.getNewName()] = newElem;
  133. item->setText(newName.getNewName());
  134. }
  135. }
  136. void MainWindow::on_lineEdit_name_editingFinished()
  137. {
  138. if(ui->listWidget_elem->currentItem() == nullptr) return;
  139. QString key = ui->listWidget_elem->currentItem()->text();
  140. elements[key]->labelName = ui->lineEdit_name->text();
  141. }
  142. void MainWindow::on_lineEdit_size_editingFinished()
  143. {
  144. if(ui->listWidget_elem->currentItem() == nullptr) return;
  145. QString key = ui->listWidget_elem->currentItem()->text();
  146. elements[key]->size = ui->lineEdit_size->text();
  147. }
  148. void MainWindow::on_lineEdit_maxlayer_editingFinished()
  149. {
  150. if(ui->listWidget_elem->currentItem() == nullptr) return;
  151. QString key = ui->listWidget_elem->currentItem()->text();
  152. elements[key]->maxLayer = ui->lineEdit_maxlayer->text();
  153. }
  154. void MainWindow::on_lineEdit_score_editingFinished()
  155. {
  156. if(ui->listWidget_elem->currentItem() == nullptr) return;
  157. QString key = ui->listWidget_elem->currentItem()->text();
  158. elements[key]->score = ui->lineEdit_score->text();
  159. }
  160. void MainWindow::on_spinBox_drop_valueChanged(int arg1)
  161. {
  162. if(ui->listWidget_elem->currentItem() == nullptr) return;
  163. QString key = ui->listWidget_elem->currentItem()->text();
  164. elements[key]->dropConfig = arg1;
  165. }
  166. //TODO: 保存当前元素的所有数据,界面加载当前元素数据
  167. void MainWindow::on_listWidget_elem_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
  168. {
  169. //每一步改变基本都会触发保存,但是表格内嵌的组件如combobox暂时没找到触发保存的办法
  170. setUi(elements[current->text()]);
  171. }
  172. bool MainWindow::isSingleAnimName(const QVector<ElemPropertyData::StatusEffect> &statusEffect,QString name){
  173. for(const auto &i:statusEffect){
  174. if(name == i.name)
  175. return false;
  176. }
  177. return true;
  178. }
  179. //替换资源文件
  180. void MainWindow::on_tableWidget_animation_cellDoubleClicked(int row, int column)
  181. {
  182. //表格内容修改flag
  183. animTableItemChanged = true;
  184. if(column == 1){
  185. ResFileDialog res;
  186. res.setModal(true);
  187. res.exec();
  188. QString fileName = res.getResName();
  189. if(!fileName.isEmpty()){
  190. ui->tableWidget_animation->setItem(row,column,new QTableWidgetItem(fileName));
  191. //TODO: 加入资源生成时间线代码
  192. QComboBox* timeLine = new QComboBox;
  193. timeLine->addItem("lml");
  194. timeLine->addItem("xdf");
  195. timeLine->addItem("cqf");
  196. ui->tableWidget_animation->setCellWidget(row,column+1,timeLine);
  197. }
  198. }
  199. }
  200. void MainWindow::on_pushButton_addAnimation_clicked()
  201. {
  202. if(ui->listWidget_elem->currentItem()==nullptr) return;
  203. int rowNum = ui->tableWidget_animation->rowCount();
  204. ui->tableWidget_animation->insertRow(rowNum);
  205. QString elemName = ui->listWidget_elem->currentItem()->text();
  206. ElemPropertyData* elem = elements[elemName];
  207. QString animName = "anim";
  208. int id = 1;
  209. while(1){
  210. if(isSingleAnimName(elem->statusEffect,animName)){
  211. break;
  212. }
  213. animName = "anim" + QString::number(id++);
  214. }
  215. ui->tableWidget_animation->setItem(rowNum,0,new QTableWidgetItem(animName));
  216. QTableWidgetItem* res = new QTableWidgetItem("双击添加资源文件");
  217. // 此单元格不可编辑
  218. res->setFlags(res->flags() & ~Qt::ItemIsEditable);
  219. ui->tableWidget_animation->setItem(rowNum,1,res);
  220. ui->tableWidget_animation->setCellWidget(rowNum,2,new QComboBox);
  221. ui->tableWidget_animation->setItem(rowNum,3,new QTableWidgetItem("0"));
  222. elem->statusEffect.push_back({animName,"","",0});
  223. }
  224. void MainWindow::on_pushButton_delAnimation_clicked()
  225. {
  226. if(ui->tableWidget_animation->currentRow() == -1) return;
  227. QMessageBox::StandardButton reply = QMessageBox::question(this,"删除动画","确定要删除此动画吗?");
  228. if(reply == QMessageBox::Yes){
  229. int curRow = ui->tableWidget_animation->currentRow();
  230. QString animName = ui->tableWidget_animation->item(curRow,0)->text();
  231. QVector<ElemPropertyData::StatusEffect> &animVec = elements[ui->listWidget_elem->currentItem()->text()]->statusEffect;
  232. for(int i=0;i<animVec.size();i++){
  233. if(animName == animVec[i].name)
  234. animVec.remove(i);
  235. }
  236. ui->tableWidget_animation->removeRow(curRow);
  237. }
  238. }
  239. void MainWindow::on_tableWidget_animation_itemChanged(QTableWidgetItem *item)
  240. {
  241. if(!animTableItemChanged) return;
  242. animTableItemChanged = false;
  243. int column = item->column();
  244. int row = item->row();
  245. QVector<ElemPropertyData::StatusEffect> &animVec = elements[ui->listWidget_elem->currentItem()->text()]->statusEffect;
  246. if(column == 0){
  247. QString newName = ui->tableWidget_animation->item(row,0)->text();
  248. if(!isSingleAnimName(animVec,newName)){
  249. QMessageBox::critical(this,"警告","该动画名已存在!");
  250. ui->tableWidget_animation->item(row,0)->setText(animVec[row].name);
  251. return;
  252. }
  253. std::cout<<"名字发生改变,新名字:"<<qPrintable(newName)<<std::endl;
  254. animVec[row].name = newName;
  255. }
  256. //资源名发生修改
  257. else if(column == 1){
  258. std::cout<<"动画资源发生改变,新资源名:"<<qPrintable(ui->tableWidget_animation->item(row,1)->text())<<std::endl;
  259. }
  260. // 时间线发生修改,居然没有反应。。。
  261. else if(column == 2){
  262. QComboBox *timeLine = qobject_cast<QComboBox*>(ui->tableWidget_animation->cellWidget(row,2));
  263. std::cout<<"timeLine:"<<qPrintable(timeLine->currentText())<<std::endl;
  264. }
  265. else{
  266. int zOrder = ui->tableWidget_animation->item(row,3)->text().toInt();
  267. if(zOrder<0 || zOrder>100000){
  268. QMessageBox::critical(this,"警告","z-Order值超出范围!");
  269. ui->tableWidget_animation->item(row,3)->setText(QString::number(animVec[row].zOrder));
  270. return;
  271. }
  272. std::cout<<"z-Order值发生改变,新值为:"<<zOrder<<std::endl;
  273. animVec[row].zOrder = zOrder;
  274. }
  275. }
  276. void MainWindow::on_pushButton_addCollectAnim_clicked()
  277. {
  278. if(ui->listWidget_elem->currentItem() == nullptr) return;
  279. QString collAnimName = "collAnim";
  280. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  281. int id = 1;
  282. while(1){
  283. if(elem->collAnim.find(collAnimName)==elem->collAnim.end()){
  284. break;
  285. }
  286. collAnimName = "collAnim" + QString::number(id++);
  287. }
  288. ui->listWidget_collectAnim->addItem(new QListWidgetItem(collAnimName));
  289. elem->collAnim[collAnimName] = {ui->comboBox_animationType->itemText(0),ui->comboBox_animation->itemText(0),"",""};
  290. // ui->listWidget_collectAnim->item(ui->listWidget_collectAnim->count() - 1)->setSelected(true); // 设置选中
  291. // ui->listWidget_collectAnim->scrollToBottom();
  292. }
  293. void MainWindow::on_pushButton_delCollectAnim_clicked()
  294. {
  295. if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_collectAnim->currentItem() == nullptr) return;
  296. QMessageBox::StandardButton reply = QMessageBox::question(this,"删除动画","确定要删除此收集动画吗?");
  297. if(reply == QMessageBox::Yes){
  298. elements[ui->listWidget_elem->currentItem()->text()]->collAnim.remove(ui->listWidget_collectAnim->currentItem()->text());
  299. delete ui->listWidget_collectAnim->takeItem(ui->listWidget_collectAnim->currentRow());
  300. }
  301. }
  302. void MainWindow::on_listWidget_collectAnim_itemDoubleClicked(QListWidgetItem *item)
  303. {
  304. ChangeNameDialog newName;
  305. newName.setModal(true);
  306. newName.exec();
  307. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  308. QString name = newName.getNewName();
  309. if(!name.isEmpty()){
  310. if(elem->collAnim.find(name)!=elem->collAnim.end()){
  311. QMessageBox::critical(this,"警告","该收集动画名已存在!");
  312. return;
  313. }
  314. QString collAnimName = ui->listWidget_collectAnim->currentItem()->text();
  315. ElemPropertyData::CollAnim collAnimData = elem->collAnim[collAnimName];
  316. elem->collAnim.remove(collAnimName);
  317. elem->collAnim[name] = collAnimData;
  318. item->setText(name);
  319. }
  320. }
  321. void MainWindow::on_comboBox_animationType_currentTextChanged(const QString &arg1)
  322. {
  323. if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_collectAnim->currentItem() == nullptr) return;
  324. elements[ui->listWidget_elem->currentItem()->text()]->collAnim[ui->listWidget_collectAnim->currentItem()->text()].type = arg1;
  325. }
  326. void MainWindow::on_comboBox_animation_currentTextChanged(const QString &arg1)
  327. {
  328. if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_collectAnim->currentItem() == nullptr) return;
  329. elements[ui->listWidget_elem->currentItem()->text()]->collAnim[ui->listWidget_collectAnim->currentItem()->text()].anim = arg1;
  330. }
  331. void MainWindow::on_lineEdit_node_editingFinished()
  332. {
  333. if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_collectAnim->currentItem() == nullptr) return;
  334. elements[ui->listWidget_elem->currentItem()->text()]->collAnim[ui->listWidget_collectAnim->currentItem()->text()].node = ui->lineEdit_node->text();
  335. }
  336. void MainWindow::on_lineEdit_shadow_editingFinished()
  337. {
  338. if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_collectAnim->currentItem() == nullptr) return;
  339. elements[ui->listWidget_elem->currentItem()->text()]->collAnim[ui->listWidget_collectAnim->currentItem()->text()].shadow = ui->lineEdit_shadow->text();
  340. }
  341. //设置收集动画显示
  342. void MainWindow::setCollectAnimUi(QString collectAnimName)
  343. {
  344. if(ui->listWidget_collectAnim->currentItem() != nullptr){
  345. ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
  346. ElemPropertyData::CollAnim collAnimData = elem->collAnim[collectAnimName];
  347. ui->lineEdit_node->setText(collAnimData.node);
  348. ui->lineEdit_shadow->setText(collAnimData.shadow);
  349. std::cout<<qPrintable(collAnimData.anim)<<"\t"<<qPrintable(collAnimData.type)<<std::endl;
  350. //TODO: 使用comboBox的index来修改当前要显示的值
  351. // ui->comboBox_animation->setCurrentText(collAnimData.anim);
  352. // ui->comboBox_animationType->setCurrentText(collAnimData.type);
  353. ui->comboBox_animation->setCurrentIndex(1);
  354. ui->comboBox_animationType->setCurrentIndex(1);
  355. }
  356. }
  357. void MainWindow::on_listWidget_collectAnim_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
  358. {
  359. //TODO: 或许需要另外保存当前界面的数据
  360. if(current != nullptr){
  361. setCollectAnimUi(current->text());
  362. }
  363. }
  364. //TODO: 生成模板时更新状态配置的数据,怎么米有反应。。。
  365. void MainWindow::on_pushButton_genTemp_clicked()
  366. {
  367. if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_status->count() > 0) return;
  368. for(int i=0;i<elements[ui->listWidget_elem->currentItem()->text()]->maxLayer.toInt();i++){
  369. ui->listWidget_status->addItem(QString::number(i));
  370. }
  371. }
  372. //TODO: 生成一个合法的状态值并修改数据
  373. void MainWindow::on_pushButton_addStatus_clicked()
  374. {
  375. //TODO: 检查状态值合法性
  376. if(ui->listWidget_elem->currentItem() == nullptr) return;
  377. // for(int i=0;i<elements[ui->listWidget_elem->currentItem()->text()]->maxLayer.toInt();i++){
  378. // ui->listWidget_status->addItem(QString::number(i));
  379. // }
  380. ui->listWidget_status->addItem("3");
  381. }
  382. //TODO: 删除状态值对应的数据
  383. void MainWindow::on_pushButton_delStatus_clicked()
  384. {
  385. if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_status->currentItem() == nullptr) return;
  386. QMessageBox::StandardButton reply = QMessageBox::question(this,"删除状态","确定要删除此状态吗?");
  387. if(reply == QMessageBox::Yes){
  388. delete ui->listWidget_status->takeItem(ui->listWidget_status->currentRow());
  389. }
  390. }
  391. void MainWindow::on_listWidget_status_itemDoubleClicked(QListWidgetItem *item)
  392. {
  393. ChangeNameDialog newName;
  394. newName.setModal(true);
  395. newName.exec();
  396. QString name = newName.getNewName();
  397. if(!name.isEmpty()){
  398. //TODO: 检查状态值合法性并转移数据
  399. // if(1){}
  400. // QString elemName = ui->listWidget_elem->currentItem()->text();
  401. // ElemPropertyData* newElem = elements[elemName];
  402. // elements.erase(elements.find(elemName));
  403. // elements[newName.getNewName()] = newElem;
  404. item->setText(newName.getNewName());
  405. }
  406. }
  407. void MainWindow::on_pushButton_addContainer_clicked()
  408. {
  409. //TODO: 检查名称唯一性
  410. ui->listWidget_pool->addItem("pool1");
  411. }
  412. void MainWindow::on_pushButton_delContainer_clicked()
  413. {
  414. QMessageBox::StandardButton reply = QMessageBox::question(this,"删除状态","确定要删除此容器吗?");
  415. if(reply == QMessageBox::Yes){
  416. delete ui->listWidget_pool->takeItem(ui->listWidget_pool->currentRow());
  417. }
  418. }
  419. void MainWindow::on_listWidget_pool_itemDoubleClicked(QListWidgetItem *item)
  420. {
  421. ChangeNameDialog newName;
  422. newName.setModal(true);
  423. newName.exec();
  424. QString name = newName.getNewName();
  425. if(!name.isEmpty()){
  426. //TODO: 检查新名字唯一性
  427. item->setText(name);
  428. }
  429. }
  430. //切换tab时更新comboBox(或者每一次添加删除动画就更新一下该元素的comboBox?这样也更方便进行逻辑检查)
  431. void MainWindow::on_tabWidget_currentChanged(int index)
  432. {
  433. if(ui->listWidget_elem->currentItem() == nullptr) return;
  434. QVector<ElemPropertyData::StatusEffect> &animVec = elements[ui->listWidget_elem->currentItem()->text()]->statusEffect;
  435. //如果目前展示的是收集动画,加载状态与效果配置中的动画到收集动画的动画下拉列表中
  436. //目前这种方法较为暴力,后期可以视动画数量进行优化
  437. if(index == 1){
  438. ui->comboBox_animation->clear();
  439. for(const auto &i:animVec){
  440. ui->comboBox_animation->addItem(i.name);
  441. }
  442. }
  443. //如果目前展示的是状态配置,加载相应状态效果配置动画和收集动画
  444. else if(index == 2){
  445. ui->comboBox_initAnim->clear();
  446. ui->comboBox_clickAnim->clear();
  447. ui->comboBox_collectAnimation->clear();
  448. for(const auto &i:animVec){
  449. ui->comboBox_initAnim->addItem(i.name);
  450. ui->comboBox_clickAnim->addItem(i.name);
  451. }
  452. ui->comboBox_collectAnimation->addItems(elements[ui->listWidget_elem->currentItem()->text()]->collAnim.keys());
  453. }
  454. }