statusConfig.cpp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441
  1. #include "statusConfig.h"
  2. #include "ui_statusConfig.h"
  3. #include "dataManager.h"
  4. #include "actionSettingDialog.h"
  5. #include "changenamedialog.h"
  6. #include <iostream>
  7. #include <QMessageBox>
  8. StatusConfig::StatusConfig(QWidget *parent) :
  9. QWidget(parent),
  10. ui(new Ui::StatusConfig)
  11. {
  12. ui->setupUi(this);
  13. ui->tableWidget_event->setHorizontalHeaderLabels({"事件名称","是否需要颜色一致","状态变化幅度","特效","根据格子数量消除","触发动作","触发动作设置"});
  14. ui->lineEdit_collectionType->setReadOnly(true);
  15. }
  16. StatusConfig::~StatusConfig()
  17. {
  18. delete ui;
  19. }
  20. ///创建普通下拉选项
  21. QComboBox* StatusConfig::createBox(QString choice,BoxType boxType)
  22. {
  23. QComboBox* box = new QComboBox;
  24. box->addItem("尚未选择");
  25. if(boxType == BoxType::Event){
  26. box->addItems(DataManager::getInstance()->getList(currentElem,DataManager::ListType::Events));
  27. }
  28. else if(boxType == BoxType::Effect){
  29. box->addItems(DataManager::getInstance()->getList(currentElem,DataManager::ListType::Anim));
  30. }
  31. else if(boxType == BoxType::Action){
  32. box->addItems(DataManager::getInstance()->getList(currentElem,DataManager::ListType::Actions));
  33. }
  34. connect(box,SIGNAL(currentTextChanged(QString)),this,SLOT(onEventBoxTextChanged(QString)));
  35. int index = box->findText(choice);
  36. if(index == -1)index = 0;
  37. box->setCurrentIndex(index);
  38. return box;
  39. }
  40. ///创建一个checkBox
  41. QCheckBox* StatusConfig::createCheckBox(bool chosen)
  42. {
  43. QCheckBox* check = new QCheckBox;
  44. if(chosen) check->setCheckState(Qt::Checked);
  45. else check->setCheckState(Qt::Unchecked);
  46. connect(check,SIGNAL(stateChanged(int)),this,SLOT(onCheckBoxStateChanged(int)));
  47. return check;
  48. }
  49. ///创建一个触发动作设置按钮
  50. QPushButton* StatusConfig::createSetButton()
  51. {
  52. QPushButton* setAction = new QPushButton("设置");
  53. connect(setAction,SIGNAL(clicked()),this,SLOT(onSetActionButtonClicked()));
  54. return setAction;
  55. }
  56. ///事件配置checkBox状态发生改变
  57. void StatusConfig::onCheckBoxStateChanged(int state)
  58. {
  59. int statusIndex = ui->listWidget_status->currentRow();
  60. if(statusIndex == -1) return;
  61. if(ui->listWidget_status->currentItem() == nullptr) return;
  62. //获取checkBox所在位置
  63. QCheckBox *check = dynamic_cast<QCheckBox*>(this->sender());
  64. int x = check->frameGeometry().x();
  65. int y = check->frameGeometry().y();
  66. QModelIndex index = ui->tableWidget_event->indexAt(QPoint(x,y));
  67. int row = index.row();
  68. int column = index.column();
  69. //修改数据
  70. DataManager::getInstance()->setEventTableCheckBox(currentElem,statusIndex,row,column,state);
  71. }
  72. ///事件配置ComboBox选择发生改变
  73. void StatusConfig::onEventBoxTextChanged(const QString &arg1)
  74. {
  75. int statusIndex = ui->listWidget_status->currentRow();
  76. if(statusIndex == -1) return;
  77. //获取特效列表所在位置
  78. QComboBox *box = dynamic_cast<QComboBox*>(this->sender());
  79. int x = box->frameGeometry().x();
  80. int y = box->frameGeometry().y();
  81. QModelIndex index = ui->tableWidget_event->indexAt(QPoint(x,y));
  82. int row = index.row();
  83. int column = index.column();
  84. //修改数据
  85. DataManager::getInstance()->changeEventTable(currentElem,arg1,statusIndex,row,column);
  86. }
  87. ///动作配置中的设置点击后
  88. void StatusConfig::onSetActionButtonClicked()
  89. {
  90. int statusRow = ui->listWidget_status->currentRow();
  91. if(statusRow == -1) return;
  92. //获取设置按钮所在位置
  93. QPushButton *button = dynamic_cast<QPushButton*>(this->sender());
  94. int x = button->frameGeometry().x();
  95. int y = button->frameGeometry().y();
  96. QModelIndex index = ui->tableWidget_event->indexAt(QPoint(x,y));
  97. int row = index.row();
  98. QVector<ElemPropertyData::EventConfig> eventTable = DataManager::getInstance()->getStatusConfigData(currentElem,statusRow).eventConfig;
  99. QString action = eventTable[row].triggerAction;
  100. std::cout<<"row:"<<row<<std::endl;
  101. std::cout<<qPrintable(action)<<std::endl;
  102. createSetWindow(action,row);
  103. }
  104. ///点击动作配置的设置按钮后生成新窗口
  105. void StatusConfig::createSetWindow(QString actionName,int row)
  106. {
  107. int statusIndex = ui->listWidget_status->currentRow();
  108. if(actionName == "尚未选择"){
  109. QMap<QString,QString> nullMap;
  110. DataManager::getInstance()->changeActionConfigData(currentElem,statusIndex,row,nullMap);
  111. return;
  112. }
  113. ActionSettingDialog setDialog;
  114. setDialog.setDialogUi(actionName,currentElem,statusIndex,row);
  115. setDialog.exec();
  116. }
  117. ///切换元素,重置全部ui
  118. void StatusConfig::setUi(QString elem)
  119. {
  120. currentElem = elem;
  121. //设置状态配置界面
  122. ui->listWidget_status->clear();
  123. ui->listWidget_status->addItems(DataManager::getInstance()->getList(elem,DataManager::ListType::StatusVal));
  124. //切换元素时状态尚未选中,先清除事件表格内容
  125. int rowCnt = ui->tableWidget_event->rowCount();
  126. for(int i=0;i<rowCnt;i++){
  127. ui->tableWidget_event->removeRow(0);
  128. }
  129. //设置收集动画和状态配置的comboBox
  130. setAnimComboBox();
  131. ui->lineEdit_collectionType->clear();
  132. }
  133. ///重置容易变化的动画下拉选项
  134. void StatusConfig::setAnimComboBox()
  135. {
  136. ui->comboBox_initAnim->clear();
  137. ui->comboBox_clickAnim->clear();
  138. ui->comboBox_collectAnimation->clear();
  139. ui->comboBox_initAnim->addItem("尚未选择");
  140. ui->comboBox_clickAnim->addItem("尚未选择");
  141. ui->comboBox_collectAnimation->addItem("尚未选择");
  142. QStringList animList = DataManager::getInstance()->getList(currentElem,DataManager::ListType::Anim);
  143. ui->comboBox_clickAnim->addItems(animList);
  144. ui->comboBox_initAnim->addItems(animList);
  145. ui->comboBox_collectAnimation->addItems(DataManager::getInstance()->getList(currentElem,DataManager::ListType::CollAnim));
  146. int row = ui->listWidget_status->currentRow();
  147. if(row != -1) {
  148. ElemPropertyData::StatusConfig statusData = DataManager::getInstance()->getStatusConfigData(currentElem,row);
  149. setAnimIndex(statusData);
  150. //表格中的特效选项更新
  151. int rowNum = ui->tableWidget_event->rowCount();
  152. QVector<ElemPropertyData::EventConfig> event = statusData.eventConfig;
  153. for(int i=0;i<rowNum;i++){
  154. ui->tableWidget_event->setCellWidget(i,3,createBox(event[i].specialEffect,BoxType::Effect));
  155. ui->tableWidget_event->setCellWidget(i,0,createBox(event[i].name,BoxType::Event));
  156. ui->tableWidget_event->setCellWidget(i,5,createBox(event[i].triggerAction,BoxType::Action));
  157. }
  158. }
  159. }
  160. ///设置动画当前选择项
  161. void StatusConfig::setAnimIndex(ElemPropertyData::StatusConfig statusData)
  162. {
  163. int comboIndex;
  164. //初始化动画
  165. comboIndex = ui->comboBox_initAnim->findText(statusData.initAnim);
  166. if(comboIndex == -1) comboIndex = 0;
  167. ui->comboBox_initAnim->setCurrentIndex(comboIndex);
  168. //点击动画
  169. comboIndex = ui->comboBox_clickAnim->findText(statusData.clickAnim);
  170. if(comboIndex == -1) comboIndex = 0;
  171. ui->comboBox_clickAnim->setCurrentIndex(comboIndex);
  172. //收集动画
  173. comboIndex = ui->comboBox_collectAnimation->findText(statusData.collAnim);
  174. if(comboIndex == -1) comboIndex = 0;
  175. ui->comboBox_collectAnimation->setCurrentIndex(comboIndex);
  176. }
  177. ///切换状态,重置状态配置界面
  178. void StatusConfig::setStatusUi()
  179. {
  180. int row = ui->listWidget_status->currentRow();
  181. if(row == -1) return;
  182. isSetUi = true;
  183. ElemPropertyData::StatusConfig statusData = DataManager::getInstance()->getStatusConfigData(currentElem,row);
  184. setAnimIndex(statusData);
  185. //多重打击
  186. if(statusData.multiHit) ui->checkBox_multiHit->setCheckState(Qt::Checked);
  187. else ui->checkBox_multiHit->setCheckState(Qt::Unchecked);
  188. //可掉落
  189. if(statusData.dropable) ui->checkBox_dropable->setCheckState(Qt::Checked);
  190. else ui->checkBox_dropable->setCheckState(Qt::Unchecked);
  191. //是否需要收集
  192. ui->lineEdit_collectionType->clear();
  193. if(statusData.needCollect){
  194. ui->checkBox_needCollect->setCheckState(Qt::Checked);
  195. ui->lineEdit_collectionType->setReadOnly(false);
  196. std::cout<<"收集的目标类型"<<qPrintable(statusData.collTargetType)<<std::endl;
  197. ui->lineEdit_collectionType->setText(statusData.collTargetType);
  198. }
  199. else{
  200. ui->checkBox_needCollect->setCheckState(Qt::Unchecked);
  201. ui->lineEdit_collectionType->setReadOnly(true);
  202. }
  203. //事件配置
  204. int rowNum = ui->tableWidget_event->rowCount();
  205. for(int i=0;i<rowNum;i++){
  206. ui->tableWidget_event->removeRow(0);
  207. }
  208. for(const auto &i:statusData.eventConfig){
  209. rowNum = ui->tableWidget_event->rowCount();
  210. ui->tableWidget_event->insertRow(rowNum);
  211. //事件名称
  212. ui->tableWidget_event->setCellWidget(rowNum,0,createBox(i.name,BoxType::Event));
  213. std::cout<<"重置状态配置ui:事件名称:"<<qPrintable(i.name)<<std::endl;
  214. //是否需要颜色一致
  215. ui->tableWidget_event->setCellWidget(rowNum,1,createCheckBox(i.consisColor));
  216. //tableWidget_event
  217. ui->tableWidget_event->setItem(rowNum,2,new QTableWidgetItem(i.changeMagnitude));
  218. //特效
  219. ui->tableWidget_event->setCellWidget(rowNum,3,createBox(i.specialEffect,BoxType::Effect));
  220. //根据格子数量消除
  221. ui->tableWidget_event->setCellWidget(rowNum,4,createCheckBox(i.elimATLattices));
  222. //触发动作
  223. ui->tableWidget_event->setCellWidget(rowNum,5,createBox(i.triggerAction,BoxType::Action));
  224. //触发动作设置
  225. ui->tableWidget_event->setCellWidget(rowNum,6,createSetButton());
  226. }
  227. isSetUi = false;
  228. }
  229. ///生成模板
  230. void StatusConfig::on_pushButton_genTemp_clicked()
  231. {
  232. if(ui->listWidget_status->count() > 0) return;
  233. int maxLayer = DataManager::getInstance()->getMaxLayer(currentElem).toInt();
  234. for(int i=0;i<maxLayer;i++){
  235. ui->listWidget_status->addItem(QString::number(i));
  236. DataManager::getInstance()->addStatus(currentElem,QString::number(i));
  237. }
  238. }
  239. ///添加状态,若已经生成最大层数全部状态则按钮无效
  240. void StatusConfig::on_pushButton_addStatus_clicked()
  241. {
  242. int maxLayer = DataManager::getInstance()->getMaxLayer(currentElem).toInt();
  243. QString statusName;
  244. for(int i=0;i<maxLayer;i++){
  245. if(!DataManager::getInstance()->existStatusVal(currentElem,QString::number(i))){
  246. statusName = QString::number(i);
  247. break;
  248. }
  249. }
  250. if(!statusName.isEmpty()){
  251. ui->listWidget_status->addItem(statusName);
  252. ElemPropertyData::StatusConfig status(statusName);
  253. DataManager::getInstance()->addStatus(currentElem,statusName);
  254. }
  255. }
  256. //TODO: 删除状态值时出现数组越界
  257. ///删除状态
  258. void StatusConfig::on_pushButton_delStatus_clicked()
  259. {
  260. int row = ui->listWidget_status->currentRow();
  261. if(row == -1) return;
  262. QMessageBox::StandardButton reply = QMessageBox::question(this,"删除状态","确定要删除此状态吗?");
  263. if(reply == QMessageBox::Yes){
  264. DataManager::getInstance()->delStatus(currentElem,row);
  265. delete ui->listWidget_status->takeItem(ui->listWidget_status->currentRow());
  266. }
  267. }
  268. ///修改状态值,检查修改后的状态值是否合法,并转移数据
  269. void StatusConfig::on_listWidget_status_itemDoubleClicked(QListWidgetItem *item)
  270. {
  271. ChangeNameDialog newName;
  272. newName.setModal(true);
  273. newName.exec();
  274. QString name = newName.getNewName();
  275. if(!name.isEmpty()){
  276. //TODO: 检查状态值合法性并转移数据
  277. bool isNum;double tmp = name.toDouble(&isNum);
  278. int maxLayer = DataManager::getInstance()->getMaxLayer(currentElem).toInt();
  279. int statusNum = name.toInt();
  280. if(!isNum ||statusNum < 0 || statusNum >= maxLayer){
  281. QMessageBox::critical(this,"错误","状态值必须是大于等于0且小于最大层数的数字");
  282. return;
  283. }
  284. if(DataManager::getInstance()->existStatusVal(currentElem,name)){
  285. QMessageBox::critical(this,"警告","该状态值已存在");
  286. return;
  287. }
  288. int row = ui->listWidget_status->currentRow();
  289. DataManager::getInstance()->changeStatusVal(currentElem,row,name);
  290. item->setText(name);
  291. }
  292. }
  293. ///多重打击数据变化
  294. void StatusConfig::on_checkBox_multiHit_stateChanged(int arg1)
  295. {
  296. int index = ui->listWidget_status->currentRow();
  297. if(index == -1 || isSetUi) return;
  298. DataManager::getInstance()->setFundCheckBox(currentElem,index,DataManager::CheckType::MultiHit,arg1);
  299. }
  300. ///可掉落数据变化
  301. void StatusConfig::on_checkBox_dropable_stateChanged(int arg1)
  302. {
  303. int index = ui->listWidget_status->currentRow();
  304. if(index == -1 || isSetUi) return;
  305. DataManager::getInstance()->setFundCheckBox(currentElem,index,DataManager::CheckType::Dropable,arg1);
  306. }
  307. ///需要收集数据变化
  308. void StatusConfig::on_checkBox_needCollect_stateChanged(int arg1)
  309. {
  310. int index = ui->listWidget_status->currentRow();
  311. if(index == -1 || isSetUi) return;
  312. DataManager::getInstance()->setFundCheckBox(currentElem,index,DataManager::CheckType::NeedColl,arg1);
  313. if(arg1){
  314. ui->lineEdit_collectionType->setReadOnly(false);
  315. }
  316. else{
  317. ui->lineEdit_collectionType->setReadOnly(true);
  318. }
  319. }
  320. ///收集的目标类型变化
  321. void StatusConfig::on_lineEdit_collectionType_editingFinished()
  322. {
  323. int index = ui->listWidget_status->currentRow();
  324. if(index == -1) return;
  325. DataManager::getInstance()->changeStatusFundVal(currentElem,DataManager::StatusDataType::CollTar,ui->lineEdit_collectionType->text(),index);
  326. }
  327. ///添加事件
  328. void StatusConfig::on_pushButton_addEvent_clicked()
  329. {
  330. int index = ui->listWidget_status->currentRow();
  331. if(index == -1) return;
  332. int rowNum = ui->tableWidget_event->rowCount();
  333. ui->tableWidget_event->insertRow(rowNum);
  334. ui->tableWidget_event->setCellWidget(rowNum,0,createBox("尚未选择",BoxType::Event));
  335. ui->tableWidget_event->setCellWidget(rowNum,1,createCheckBox(false));
  336. ui->tableWidget_event->setCellWidget(rowNum,3,createBox("尚未选择",BoxType::Effect));
  337. ui->tableWidget_event->setCellWidget(rowNum,4,createCheckBox(false));
  338. ui->tableWidget_event->setCellWidget(rowNum,5,createBox("尚未选择",BoxType::Action));
  339. ui->tableWidget_event->setCellWidget(rowNum,6,createSetButton());
  340. DataManager::getInstance()->addEvent(currentElem,index);
  341. }
  342. ///事件表格双击改变数据
  343. void StatusConfig::on_tableWidget_event_cellDoubleClicked(int row, int column)
  344. {
  345. if(ui->listWidget_status->currentItem() == nullptr) return;
  346. if(column == 2) eventTableItemChanged = true;
  347. }
  348. ///状态变化幅度合法性检查及数据保存
  349. void StatusConfig::on_tableWidget_event_itemChanged(QTableWidgetItem *item)
  350. {
  351. int statusIndex = ui->listWidget_status->currentRow();
  352. if(statusIndex == -1) return;
  353. if(!eventTableItemChanged) return;
  354. eventTableItemChanged = false;
  355. int column = item->column();
  356. int row = item->row();
  357. QVector<ElemPropertyData::EventConfig> eventVec = DataManager::getInstance()->getStatusConfigData(currentElem,statusIndex).eventConfig;
  358. if(column == 2){
  359. bool ok;double a = item->text().toDouble(&ok);
  360. int val = item->text().toInt();
  361. if(!ok || val<0){
  362. QMessageBox::critical(this,"警告","状态变化幅度是大于0的数字");
  363. ui->tableWidget_event->item(row,2)->setText(QString::number(eventVec[row].changeMagnitude));
  364. return;
  365. }
  366. std::cout<<"状态变化幅度发生改变,新值为:"<<val<<std::endl;
  367. DataManager::getInstance()->changeEventTable(currentElem,item->text(),statusIndex,row,2);
  368. }
  369. }
  370. ///初始化动画数据修改
  371. void StatusConfig::on_comboBox_initAnim_currentTextChanged(const QString &arg1)
  372. {
  373. int index = ui->listWidget_status->currentRow();
  374. if(index==-1 || isSetUi) return;
  375. std::cout<<"初始化动画:"<<qPrintable(arg1)<<std::endl;
  376. DataManager::getInstance()->changeStatusFundVal(currentElem,DataManager::StatusDataType::InitAnim,arg1,index);
  377. }
  378. ///点击动画数据修改
  379. void StatusConfig::on_comboBox_clickAnim_currentTextChanged(const QString &arg1)
  380. {
  381. int index = ui->listWidget_status->currentRow();
  382. if(index==-1 || isSetUi) return;
  383. std::cout<<"初始化动画:"<<qPrintable(arg1)<<std::endl;
  384. DataManager::getInstance()->changeStatusFundVal(currentElem,DataManager::StatusDataType::ClickAnim,arg1,index);
  385. }
  386. ///收集动画数据修改
  387. void StatusConfig::on_comboBox_collectAnimation_currentTextChanged(const QString &arg1)
  388. {
  389. int index = ui->listWidget_status->currentRow();
  390. if(index==-1 || isSetUi) return;
  391. std::cout<<"初始化动画:"<<qPrintable(arg1)<<std::endl;
  392. DataManager::getInstance()->changeStatusFundVal(currentElem,DataManager::StatusDataType::CollAnim,arg1,index);
  393. }
  394. ///删除事件
  395. void StatusConfig::on_pushButton_delEvent_clicked()
  396. {
  397. int statusIndex = ui->listWidget_status->currentRow();
  398. int row = ui->tableWidget_event->currentRow();
  399. if(statusIndex == -1 || row == -1) return;
  400. QMessageBox::StandardButton reply = QMessageBox::question(this,"删除事件","确定要删除此事件吗?");
  401. if(reply == QMessageBox::Yes){
  402. DataManager::getInstance()->delEvent(currentElem,statusIndex,row);
  403. ui->tableWidget_event->removeRow(row);
  404. }
  405. }
  406. ///当前选中状态修改
  407. void StatusConfig::on_listWidget_status_currentRowChanged(int currentRow)
  408. {
  409. if(currentRow == -1) return;
  410. setStatusUi();
  411. }