mainwindow.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339
  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. }
  29. MainWindow::~MainWindow()
  30. {
  31. delete ui;
  32. }
  33. //TODO: 设置ui所有数据
  34. void MainWindow::setUi(ElemPropertyData *elem)
  35. {
  36. QPixmap pix(elem->iconPath);
  37. ui->label_pic->setPixmap(pix.scaled(50,50,Qt::KeepAspectRatio));
  38. ui->lineEdit_name->setText(elem->labelName);
  39. ui->lineEdit_size->setText(elem->size);
  40. ui->lineEdit_maxlayer->setText(elem->maxLayer);
  41. ui->lineEdit_score->setText(elem->score);
  42. ui->spinBox_drop->setValue(elem->dropConfig);
  43. }
  44. void MainWindow::on_pushButton_chooseFile_clicked()
  45. {
  46. //如果列表中尚未添加任何元素,无法触发按钮
  47. if(ui->listWidget_elem->count()==0) return;
  48. QString elem = ui->listWidget_elem->currentItem()->text();
  49. QString file_name = QFileDialog::getOpenFileName(this,"Open a file",QDir::homePath());
  50. if(file_name == nullptr){
  51. file_name = elements[elem]->iconPath;
  52. }
  53. QPixmap pix(file_name);
  54. ui->label_pic->setPixmap(pix.scaled(50,50,Qt::KeepAspectRatio));
  55. elements[elem]->iconPath = file_name;
  56. ui->listWidget_elem->currentItem()->setIcon(QIcon(file_name));
  57. }
  58. //TODO: 聚焦到新添加的元素上
  59. void MainWindow::on_pushButton_addElem_clicked()
  60. {
  61. QString elemName = "新加元素";
  62. int id = 1;
  63. while(1){
  64. if(elements.find(elemName)==elements.end()){
  65. break;
  66. }
  67. elemName = "新加元素" + QString::number(id++);
  68. }
  69. QListWidgetItem* item = new QListWidgetItem(QIcon("/Users/menglanluo/菜狗.png"),elemName);
  70. ui->listWidget_elem->addItem(item);
  71. //加上这一句之后总是异常闪退
  72. // ui->listWidget_elem->setCurrentItem(item);
  73. elements[elemName] = new ElemPropertyData();
  74. }
  75. void MainWindow::on_pushButton_delElem_clicked()
  76. {
  77. QMessageBox::StandardButton reply = QMessageBox::question(this,"删除元素","确定要删除此元素吗?");
  78. if(reply == QMessageBox::Yes){
  79. QString elemName = ui->listWidget_elem->currentItem()->text();
  80. delete elements[elemName];
  81. elements.erase(elements.find(elemName));
  82. delete ui->listWidget_elem->takeItem(ui->listWidget_elem->currentRow());
  83. }
  84. }
  85. void MainWindow::on_listWidget_elem_itemDoubleClicked(QListWidgetItem *item)
  86. {
  87. ChangeNameDialog newName;
  88. newName.setModal(true);
  89. newName.exec();
  90. QString name = newName.getNewName();
  91. if(!name.isEmpty()){
  92. if(elements.find(name)!=elements.end()){
  93. QMessageBox::critical(this,"警告","该元素名已存在!");
  94. return;
  95. }
  96. QString elemName = ui->listWidget_elem->currentItem()->text();
  97. ElemPropertyData* newElem = elements[elemName];
  98. elements.erase(elements.find(elemName));
  99. elements[newName.getNewName()] = newElem;
  100. item->setText(newName.getNewName());
  101. }
  102. }
  103. void MainWindow::on_lineEdit_name_editingFinished()
  104. {
  105. if(ui->listWidget_elem->count()==0) return;
  106. QString key = ui->listWidget_elem->currentItem()->text();
  107. elements[key]->labelName = ui->lineEdit_name->text();
  108. }
  109. void MainWindow::on_lineEdit_size_editingFinished()
  110. {
  111. if(ui->listWidget_elem->count()==0) return;
  112. QString key = ui->listWidget_elem->currentItem()->text();
  113. elements[key]->size = ui->lineEdit_size->text();
  114. }
  115. void MainWindow::on_lineEdit_maxlayer_editingFinished()
  116. {
  117. if(ui->listWidget_elem->count()==0) return;
  118. QString key = ui->listWidget_elem->currentItem()->text();
  119. elements[key]->maxLayer = ui->lineEdit_maxlayer->text();
  120. }
  121. void MainWindow::on_lineEdit_score_editingFinished()
  122. {
  123. if(ui->listWidget_elem->count()==0) return;
  124. QString key = ui->listWidget_elem->currentItem()->text();
  125. elements[key]->score = ui->lineEdit_score->text();
  126. }
  127. void MainWindow::on_spinBox_drop_valueChanged(int arg1)
  128. {
  129. if(ui->listWidget_elem->count()==0) return;
  130. QString key = ui->listWidget_elem->currentItem()->text();
  131. elements[key]->dropConfig = arg1;
  132. }
  133. //TODO: 保存当前元素的所有数据,界面加载当前元素数据
  134. void MainWindow::on_listWidget_elem_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
  135. {
  136. //每一步改变基本都会触发保存,但是表格内嵌的组件如combobox暂时没找到触发保存的办法
  137. setUi(elements[current->text()]);
  138. }
  139. bool MainWindow::isSingleAnimName(const QVector<ElemPropertyData::StatusEffect> &statusEffect,QString name){
  140. for(const auto &i:statusEffect){
  141. if(name == i.name)
  142. return false;
  143. }
  144. return true;
  145. }
  146. //替换资源文件
  147. void MainWindow::on_tableWidget_animation_cellDoubleClicked(int row, int column)
  148. {
  149. if(column == 1){
  150. ResFileDialog res;
  151. res.setModal(true);
  152. res.exec();
  153. QString fileName = res.getResName();
  154. if(!fileName.isEmpty()){
  155. ui->tableWidget_animation->setItem(row,column,new QTableWidgetItem(fileName));
  156. //TODO: 加入资源生成时间线代码
  157. QComboBox* timeLine = new QComboBox;
  158. timeLine->addItem("lml");
  159. timeLine->addItem("xdf");
  160. timeLine->addItem("cqf");
  161. ui->tableWidget_animation->setCellWidget(row,column+1,timeLine);
  162. }
  163. }
  164. }
  165. void MainWindow::on_pushButton_addAnimation_clicked()
  166. {
  167. int rowNum = ui->tableWidget_animation->rowCount();
  168. ui->tableWidget_animation->insertRow(rowNum);
  169. QString elemName = ui->listWidget_elem->currentItem()->text();
  170. ElemPropertyData* elem = elements[elemName];
  171. QString animName = "anim";
  172. int id = 1;
  173. while(1){
  174. if(isSingleAnimName(elem->statusEffect,animName)){
  175. break;
  176. }
  177. animName = "anim" + QString::number(id++);
  178. }
  179. ui->tableWidget_animation->setItem(rowNum,0,new QTableWidgetItem(animName));
  180. QTableWidgetItem* res = new QTableWidgetItem("双击添加资源文件");
  181. // 此单元格不可编辑
  182. res->setFlags(res->flags() & ~Qt::ItemIsEditable);
  183. ui->tableWidget_animation->setItem(rowNum,1,res);
  184. ui->tableWidget_animation->setCellWidget(rowNum,2,new QComboBox);
  185. ui->tableWidget_animation->setItem(rowNum,3,new QTableWidgetItem("0"));
  186. elem->statusEffect.push_back({animName,"","",0});
  187. }
  188. void MainWindow::on_pushButton_delAnimation_clicked()
  189. {
  190. QMessageBox::StandardButton reply = QMessageBox::question(this,"删除动画","确定要删除此动画吗?");
  191. if(reply == QMessageBox::Yes){
  192. int curRow = ui->tableWidget_animation->currentRow();
  193. QString animName = ui->tableWidget_animation->item(curRow,0)->text();
  194. QVector<ElemPropertyData::StatusEffect> &animVec = elements[ui->listWidget_elem->currentItem()->text()]->statusEffect;
  195. for(int i=0;i<animVec.size();i++){
  196. if(animName == animVec[i].name)
  197. animVec.remove(i);
  198. }
  199. ui->tableWidget_animation->removeRow(curRow);
  200. }
  201. }
  202. //TODO: 名字变更时的数据变更及重名检查
  203. void MainWindow::on_tableWidget_animation_itemChanged(QTableWidgetItem *item)
  204. {
  205. int column = item->column();
  206. int row = item->row();
  207. int rowCnt = ui->tableWidget_animation->rowCount();
  208. QVector<ElemPropertyData::StatusEffect> &animVec = elements[ui->listWidget_elem->currentItem()->text()]->statusEffect;
  209. std::cout<<"animVec size:"<<animVec.size()<<std::endl;
  210. std::cout<<"row:"<<rowCnt<<std::endl;
  211. if(rowCnt != animVec.size()) return;
  212. if(column == 0){
  213. QString newName = ui->tableWidget_animation->item(row,0)->text();
  214. if(!isSingleAnimName(animVec,newName)){
  215. QMessageBox::critical(this,"警告","该动画名已存在!");
  216. //TODO: 解决setText导致的重复触发itemChanged
  217. ui->tableWidget_animation->item(row,0)->setText(animVec[row].name);
  218. return;
  219. }
  220. std::cout<<"名字发生改变,新名字:"<<qPrintable(newName)<<std::endl;
  221. animVec[row].name = newName;
  222. }
  223. //资源名发生修改
  224. else if(column == 1){
  225. std::cout<<"动画资源发生改变,新资源名:"<<qPrintable(ui->tableWidget_animation->item(row,1)->text())<<std::endl;
  226. }
  227. // 时间线发生修改,居然没有反应。。。
  228. else if(column == 2){
  229. QComboBox *timeLine = qobject_cast<QComboBox*>(ui->tableWidget_animation->cellWidget(row,2));
  230. std::cout<<"timeLine:"<<qPrintable(timeLine->currentText())<<std::endl;
  231. }
  232. else{
  233. int zOrder = ui->tableWidget_animation->item(row,3)->text().toInt();
  234. if(zOrder<0 || zOrder>100000){
  235. QMessageBox::critical(this,"警告","z-Order值超出范围!");
  236. ui->tableWidget_animation->item(row,3)->setText(QString::number(animVec[row].zOrder));
  237. return;
  238. }
  239. std::cout<<"z-Order值发生改变,新值为:"<<zOrder<<std::endl;
  240. animVec[row].zOrder = zOrder;
  241. }
  242. }
  243. void MainWindow::on_pushButton_addCollectAnim_clicked()
  244. {
  245. //TODO: 检查默认名称唯一性
  246. ui->listWidget_collectAnim->addItem(new QListWidgetItem("collAnim_1"));
  247. }
  248. void MainWindow::on_pushButton_delCollectAnim_clicked()
  249. {
  250. QMessageBox::StandardButton reply = QMessageBox::question(this,"删除动画","确定要删除此收集动画吗?");
  251. if(reply == QMessageBox::Yes){
  252. delete ui->listWidget_collectAnim->takeItem(ui->listWidget_collectAnim->currentRow());
  253. }
  254. }
  255. void MainWindow::on_listWidget_collectAnim_itemDoubleClicked(QListWidgetItem *item)
  256. {
  257. ChangeNameDialog newName;
  258. newName.setModal(true);
  259. newName.exec();
  260. if(!newName.getNewName().isEmpty()){
  261. item->setText(newName.getNewName());
  262. }
  263. }
  264. void MainWindow::on_pushButton_addStatus_clicked()
  265. {
  266. //TODO: 检查状态值合法性
  267. ui->listWidget_status->addItem("1");
  268. }
  269. void MainWindow::on_pushButton_delStatus_clicked()
  270. {
  271. QMessageBox::StandardButton reply = QMessageBox::question(this,"删除状态","确定要删除此状态吗?");
  272. if(reply == QMessageBox::Yes){
  273. delete ui->listWidget_status->takeItem(ui->listWidget_status->currentRow());
  274. }
  275. }
  276. void MainWindow::on_pushButton_addContainer_clicked()
  277. {
  278. //TODO: 检查名称唯一性
  279. ui->listWidget_pool->addItem("pool1");
  280. }
  281. void MainWindow::on_pushButton_delContainer_clicked()
  282. {
  283. QMessageBox::StandardButton reply = QMessageBox::question(this,"删除状态","确定要删除此容器吗?");
  284. if(reply == QMessageBox::Yes){
  285. delete ui->listWidget_pool->takeItem(ui->listWidget_pool->currentRow());
  286. }
  287. }
  288. void MainWindow::on_listWidget_pool_itemDoubleClicked(QListWidgetItem *item)
  289. {
  290. ChangeNameDialog newName;
  291. newName.setModal(true);
  292. newName.exec();
  293. QString name = newName.getNewName();
  294. if(!name.isEmpty()){
  295. //TODO: 检查新名字唯一性
  296. item->setText(name);
  297. }
  298. }