#include "statusConfig.h" #include "ui_statusConfig.h" #include "datahpp/dataManager.h" #include "actionSettingDialog.h" #include "changenamedialog.h" #include #include StatusConfig::StatusConfig(QWidget *parent) : QWidget(parent), ui(new Ui::StatusConfig) { ui->setupUi(this); ui->tableWidget_event->setHorizontalHeaderLabels({"事件名称","是否需要颜色一致","状态变化幅度","特效","根据格子数量消除","触发动作","触发动作设置"}); ui->lineEdit_collectionType->setReadOnly(true); ui->comboBox_collectAnimation->setDisabled(true); } StatusConfig::~StatusConfig() { delete ui; } ///创建普通下拉选项 QComboBox* StatusConfig::createBox(QString choice,BoxType boxType) { QComboBox* box = new QComboBox; box->addItem("尚未选择"); if(boxType == BoxType::Event){ box->addItems(DataManager::getInstance()->getList(currentElem,DataManager::ListType::Events)); } else if(boxType == BoxType::Effect){ box->addItems(DataManager::getInstance()->getList(currentElem,DataManager::ListType::Anim)); } else if(boxType == BoxType::Action){ box->addItems(DataManager::getInstance()->getList(currentElem,DataManager::ListType::Actions)); } connect(box,SIGNAL(currentTextChanged(QString)),this,SLOT(onEventBoxTextChanged(QString))); int index = box->findText(choice); if(index == -1) index = 0; box->setCurrentIndex(index); return box; } ///创建一个checkBox QCheckBox* StatusConfig::createCheckBox(bool chosen) { QCheckBox* check = new QCheckBox; if(chosen) check->setCheckState(Qt::Checked); else check->setCheckState(Qt::Unchecked); connect(check,SIGNAL(stateChanged(int)),this,SLOT(onCheckBoxStateChanged(int))); return check; } ///创建一个触发动作设置按钮 QPushButton* StatusConfig::createSetButton() { QPushButton* setAction = new QPushButton("设置"); connect(setAction,SIGNAL(clicked()),this,SLOT(onSetActionButtonClicked())); return setAction; } ///事件配置checkBox状态发生改变 void StatusConfig::onCheckBoxStateChanged(int state) { int statusIndex = ui->listWidget_status->currentRow(); if(statusIndex == -1 || isSetUi) return; if(ui->listWidget_status->currentItem() == nullptr) return; //获取checkBox所在位置 QCheckBox *check = dynamic_cast(this->sender()); int x = check->frameGeometry().x(); int y = check->frameGeometry().y(); QModelIndex index = ui->tableWidget_event->indexAt(QPoint(x,y)); int row = index.row(); int column = index.column(); //修改数据 DataManager::getInstance()->setEventTableCheckBox(currentElem,statusIndex,row,column,state); } ///事件配置ComboBox选择发生改变 void StatusConfig::onEventBoxTextChanged(const QString &arg1) { int statusIndex = ui->listWidget_status->currentRow(); if(statusIndex == -1 || isSetUi) return; //获取特效列表所在位置 QComboBox *box = dynamic_cast(this->sender()); int x = box->frameGeometry().x(); int y = box->frameGeometry().y(); QModelIndex index = ui->tableWidget_event->indexAt(QPoint(x,y)); int row = index.row(); int column = index.column(); //修改数据 DataManager::getInstance()->changeEventTable(currentElem,arg1,statusIndex,row,column); } ///动作配置中的设置点击后 void StatusConfig::onSetActionButtonClicked() { int statusRow = ui->listWidget_status->currentRow(); if(statusRow == -1) return; //获取设置按钮所在位置 QPushButton *button = dynamic_cast(this->sender()); int x = button->frameGeometry().x(); int y = button->frameGeometry().y(); QModelIndex index = ui->tableWidget_event->indexAt(QPoint(x,y)); int row = index.row(); QVector eventTable = DataManager::getInstance()->getStatusConfigData(currentElem,statusRow).eventConfig; QString action = eventTable[row].triggerAction; std::cout<<"row:"<listWidget_status->currentRow(); if(actionName == "尚未选择"){ QMap nullMap; DataManager::getInstance()->changeActionConfigData(currentElem,statusIndex,row,nullMap); return; } ActionSettingDialog setDialog; setDialog.setDialogUi(actionName,currentElem,statusIndex,row); setDialog.exec(); } ///切换元素,重置全部ui void StatusConfig::setUi(QString elem) { isSetUi = true; currentElem = elem; //设置状态配置界面 ui->listWidget_status->clear(); for(const QString &i:DataManager::getInstance()->getList(elem,DataManager::ListType::StatusVal)){ QListWidgetItem* item = new QListWidgetItem(i); ui->listWidget_status->addItem(item); } //切换元素时状态尚未选中,先清除事件表格内容 int rowCnt = ui->tableWidget_event->rowCount(); for(int i=0;itableWidget_event->removeRow(0); } //设置收集动画和状态配置的comboBox setAnimComboBox(); ui->lineEdit_collectionType->clear(); isSetUi = false; } ///重置容易变化的动画下拉选项 void StatusConfig::setAnimComboBox() { isSetUi = true; ui->comboBox_initAnim->clear(); ui->comboBox_clickAnim->clear(); ui->comboBox_collectAnimation->clear(); ui->comboBox_initAnim->addItem("尚未选择"); ui->comboBox_clickAnim->addItem("尚未选择"); ui->comboBox_collectAnimation->addItem("尚未选择"); QStringList animList = DataManager::getInstance()->getList(currentElem,DataManager::ListType::Anim); ui->comboBox_clickAnim->addItems(animList); ui->comboBox_initAnim->addItems(animList); ui->comboBox_collectAnimation->addItems(DataManager::getInstance()->getList(currentElem,DataManager::ListType::CollAnim)); int row = ui->listWidget_status->currentRow(); if(row != -1) { ElemPropertyData::StatusConfig statusData = DataManager::getInstance()->getStatusConfigData(currentElem,row); setAnimIndex(statusData); //表格中的特效选项更新 int rowNum = ui->tableWidget_event->rowCount(); QVector event = statusData.eventConfig; for(int i=0;itableWidget_event->setCellWidget(i,3,createBox(event[i].specialEffect,BoxType::Effect)); ui->tableWidget_event->setCellWidget(i,0,createBox(event[i].name,BoxType::Event)); ui->tableWidget_event->setCellWidget(i,5,createBox(event[i].triggerAction,BoxType::Action)); } } isSetUi = false; } ///基础属性的可掉落变化时刷新可掉落勾选情况 void StatusConfig::updateDropBox(bool state) { if(state) ui->checkBox_dropable->setCheckState(Qt::Checked); else ui->checkBox_dropable->setCheckState(Qt::Unchecked); } ///设置动画当前选择项 void StatusConfig::setAnimIndex(ElemPropertyData::StatusConfig statusData) { int comboIndex; int row = ui->listWidget_status->currentRow(); //初始化动画 comboIndex = ui->comboBox_initAnim->findText(statusData.initAnim); if(comboIndex == -1){ comboIndex = 0; DataManager::getInstance()->changeStatusFundVal(currentElem,DataManager::StatusDataType::InitAnim,"尚未选择",row); } ui->comboBox_initAnim->setCurrentIndex(comboIndex); //点击动画 comboIndex = ui->comboBox_clickAnim->findText(statusData.clickAnim); if(comboIndex == -1){ DataManager::getInstance()->changeStatusFundVal(currentElem,DataManager::StatusDataType::ClickAnim,"尚未选择",row); comboIndex = 0; } ui->comboBox_clickAnim->setCurrentIndex(comboIndex); //收集动画 comboIndex = ui->comboBox_collectAnimation->findText(statusData.collAnim); if(comboIndex == -1){ comboIndex = 0; DataManager::getInstance()->changeStatusFundVal(currentElem,DataManager::StatusDataType::CollAnim,"尚未选择",row); } ui->comboBox_collectAnimation->setCurrentIndex(comboIndex); } ///切换状态,重置状态配置界面 void StatusConfig::setStatusUi() { int row = ui->listWidget_status->currentRow(); if(row == -1) return; isSetUi = true; ElemPropertyData::StatusConfig statusData = DataManager::getInstance()->getStatusConfigData(currentElem,row); setAnimIndex(statusData); //多重打击 if(statusData.multiHit) ui->checkBox_multiHit->setCheckState(Qt::Checked); else ui->checkBox_multiHit->setCheckState(Qt::Unchecked); //可掉落 if(statusData.dropable) ui->checkBox_dropable->setCheckState(Qt::Checked); else ui->checkBox_dropable->setCheckState(Qt::Unchecked); // 打击子元素 if(statusData.beatSubItem) ui->checkBox_beatSubItem->setCheckState(Qt::Checked); else ui->checkBox_beatSubItem->setCheckState(Qt::Unchecked); //是否需要收集 ui->lineEdit_collectionType->clear(); if(statusData.needCollect){ ui->checkBox_needCollect->setCheckState(Qt::Checked); ui->lineEdit_collectionType->setReadOnly(false); ui->comboBox_collectAnimation->setDisabled(false); std::cout<<"收集的目标类型"<lineEdit_collectionType->setText(statusData.collTargetType); } else{ ui->checkBox_needCollect->setCheckState(Qt::Unchecked); ui->lineEdit_collectionType->setReadOnly(true); ui->comboBox_collectAnimation->setDisabled(true); ui->comboBox_collectAnimation->setCurrentIndex(0); } //事件配置 int rowNum = ui->tableWidget_event->rowCount(); for(int i=0;itableWidget_event->removeRow(0); } for(const auto &i:statusData.eventConfig){ rowNum = ui->tableWidget_event->rowCount(); ui->tableWidget_event->insertRow(rowNum); //事件名称 ui->tableWidget_event->setCellWidget(rowNum,0,createBox(i.name,BoxType::Event)); std::cout<<"重置状态配置ui:事件名称:"<tableWidget_event->setCellWidget(rowNum,1,createCheckBox(i.consisColor)); //变化幅度 ui->tableWidget_event->setItem(rowNum,2,new QTableWidgetItem(QString::number(i.changeMagnitude))); //特效 ui->tableWidget_event->setCellWidget(rowNum,3,createBox(i.specialEffect,BoxType::Effect)); //根据格子数量消除 ui->tableWidget_event->setCellWidget(rowNum,4,createCheckBox(i.elimATLattices)); //触发动作 ui->tableWidget_event->setCellWidget(rowNum,5,createBox(i.triggerAction,BoxType::Action)); //触发动作设置 ui->tableWidget_event->setCellWidget(rowNum,6,createSetButton()); } isSetUi = false; } ///生成模板 void StatusConfig::on_pushButton_genTemp_clicked() { if(ui->listWidget_status->count() > 0) return; int maxLayer = DataManager::getInstance()->getMaxLayer(currentElem).toInt(); for(int i=0;ilistWidget_status->addItem(item); DataManager::getInstance()->addStatus(currentElem,QString::number(i)); } } ///添加状态,若已经生成最大层数全部状态则按钮无效 void StatusConfig::on_pushButton_addStatus_clicked() { int maxLayer = DataManager::getInstance()->getMaxLayer(currentElem).toInt(); QString statusName; for(int i=0;i<=maxLayer;i++){ if(!DataManager::getInstance()->existStatusVal(currentElem,QString::number(i))){ statusName = QString::number(i); break; } } if(!statusName.isEmpty()){ QListWidgetItem* item = new QListWidgetItem(statusName); ui->listWidget_status->addItem(item); ElemPropertyData::StatusConfig status(statusName); DataManager::getInstance()->addStatus(currentElem,statusName); } } ///删除状态 void StatusConfig::on_pushButton_delStatus_clicked() { int row = ui->listWidget_status->currentRow(); if(row == -1) return; QMessageBox::StandardButton reply = QMessageBox::question(this,"删除状态","确定要删除此状态吗?"); if(reply == QMessageBox::Yes){ delete ui->listWidget_status->takeItem(row); DataManager::getInstance()->delStatus(currentElem,row); } } ///修改状态值,检查修改后的状态值是否合法,并转移数据 void StatusConfig::on_listWidget_status_itemDoubleClicked(QListWidgetItem *item) { ChangeNameDialog newName; newName.setModal(true); newName.exec(); QString name = newName.getNewName(); if(!name.isEmpty()){ bool isNum;double tmp = name.toDouble(&isNum); int maxLayer = DataManager::getInstance()->getMaxLayer(currentElem).toInt(); int statusNum = name.toInt(); if(!isNum ||statusNum < 0 || statusNum > maxLayer){ QMessageBox::critical(this,"错误","状态值必须是大于等于0且小于最大层数的数字"); return; } if(DataManager::getInstance()->existStatusVal(currentElem,name)){ QMessageBox::critical(this,"警告","该状态值已存在"); return; } int row = ui->listWidget_status->currentRow(); DataManager::getInstance()->changeStatusVal(currentElem,row,name); item->setText(name); } } ///多重打击数据变化 void StatusConfig::on_checkBox_multiHit_stateChanged(int arg1) { int index = ui->listWidget_status->currentRow(); if(index == -1 || isSetUi) return; DataManager::getInstance()->setFundCheckBox(currentElem,index,DataManager::CheckType::MultiHit,arg1); } ///可掉落数据变化 void StatusConfig::on_checkBox_dropable_stateChanged(int arg1) { int index = ui->listWidget_status->currentRow(); if(index == -1 || isSetUi) return; DataManager::getInstance()->setFundCheckBox(currentElem,index,DataManager::CheckType::Dropable,arg1); } ///多重打击数据变化 void StatusConfig::on_checkBox_beatSubItem_stateChanged(int arg1) { int index = ui->listWidget_status->currentRow(); if(index == -1 || isSetUi) return; DataManager::getInstance()->setFundCheckBox(currentElem,index,DataManager::CheckType::BeatSubitem,arg1); } ///需要收集数据变化 void StatusConfig::on_checkBox_needCollect_stateChanged(int arg1) { int index = ui->listWidget_status->currentRow(); if(index == -1 || isSetUi) return; DataManager::getInstance()->setFundCheckBox(currentElem,index,DataManager::CheckType::NeedColl,arg1); if(arg1){ ui->lineEdit_collectionType->setReadOnly(false); ui->comboBox_collectAnimation->setDisabled(false); } else{ ui->lineEdit_collectionType->setReadOnly(true); ui->comboBox_collectAnimation->setDisabled(true); } } ///收集的目标类型变化 void StatusConfig::on_lineEdit_collectionType_editingFinished() { int index = ui->listWidget_status->currentRow(); if(index == -1) return; DataManager::getInstance()->changeStatusFundVal(currentElem,DataManager::StatusDataType::CollTar,ui->lineEdit_collectionType->text(),index); } ///添加事件 void StatusConfig::on_pushButton_addEvent_clicked() { int index = ui->listWidget_status->currentRow(); if(index == -1) return; int rowNum = ui->tableWidget_event->rowCount(); ui->tableWidget_event->insertRow(rowNum); ui->tableWidget_event->setCellWidget(rowNum,0,createBox("尚未选择",BoxType::Event)); ui->tableWidget_event->setCellWidget(rowNum,1,createCheckBox(false)); ui->tableWidget_event->setItem(rowNum,2,new QTableWidgetItem("1")); ui->tableWidget_event->setCellWidget(rowNum,3,createBox("尚未选择",BoxType::Effect)); ui->tableWidget_event->setCellWidget(rowNum,4,createCheckBox(false)); ui->tableWidget_event->setCellWidget(rowNum,5,createBox("尚未选择",BoxType::Action)); ui->tableWidget_event->setCellWidget(rowNum,6,createSetButton()); DataManager::getInstance()->addEvent(currentElem,index); } ///事件表格双击改变数据 void StatusConfig::on_tableWidget_event_cellDoubleClicked(int row, int column) { if(ui->listWidget_status->currentItem() == nullptr) return; if(column == 2) eventTableItemChanged = true; } ///状态变化幅度合法性检查及数据保存 void StatusConfig::on_tableWidget_event_itemChanged(QTableWidgetItem *item) { int statusIndex = ui->listWidget_status->currentRow(); if(statusIndex == -1) return; if(!eventTableItemChanged) return; eventTableItemChanged = false; int column = item->column(); int row = item->row(); QVector eventVec = DataManager::getInstance()->getStatusConfigData(currentElem,statusIndex).eventConfig; if(column == 2){ bool ok;double a = item->text().toDouble(&ok); int val = item->text().toInt(); if(!ok || val<0){ QMessageBox::critical(this,"警告","状态变化幅度是大于等于0的数字"); ui->tableWidget_event->item(row,2)->setText(QString::number(eventVec[row].changeMagnitude)); return; } std::cout<<"状态变化幅度发生改变,新值为:"<changeEventTable(currentElem,item->text(),statusIndex,row,2); } } ///初始化动画数据修改 void StatusConfig::on_comboBox_initAnim_currentTextChanged(const QString &arg1) { int index = ui->listWidget_status->currentRow(); if(index==-1 || isSetUi) return; std::cout<<"初始化动画:"<changeStatusFundVal(currentElem,DataManager::StatusDataType::InitAnim,arg1,index); } ///点击动画数据修改 void StatusConfig::on_comboBox_clickAnim_currentTextChanged(const QString &arg1) { int index = ui->listWidget_status->currentRow(); if(index==-1 || isSetUi) return; std::cout<<"初始化动画:"<changeStatusFundVal(currentElem,DataManager::StatusDataType::ClickAnim,arg1,index); } ///收集动画数据修改 void StatusConfig::on_comboBox_collectAnimation_currentTextChanged(const QString &arg1) { int index = ui->listWidget_status->currentRow(); if(index==-1 || isSetUi) return; std::cout<<"初始化动画:"<changeStatusFundVal(currentElem,DataManager::StatusDataType::CollAnim,arg1,index); } ///删除事件 void StatusConfig::on_pushButton_delEvent_clicked() { int statusIndex = ui->listWidget_status->currentRow(); int row = ui->tableWidget_event->currentRow(); if(statusIndex == -1 || row == -1) return; QMessageBox::StandardButton reply = QMessageBox::question(this,"删除事件","确定要删除此事件吗?"); if(reply == QMessageBox::Yes){ ui->tableWidget_event->removeRow(row); DataManager::getInstance()->delEvent(currentElem,statusIndex,row); } } ///当前选中状态修改 void StatusConfig::on_listWidget_status_currentRowChanged(int currentRow) { if(currentRow == -1) return; setStatusUi(); } void StatusConfig::on_pushButton_copyStatus_clicked() { int curRow = ui->listWidget_status->currentRow(); if(curRow == -1) return; int maxLayer = DataManager::getInstance()->getMaxLayer(currentElem).toInt(); QString statusName; for(int i=0;iexistStatusVal(currentElem,QString::number(i))){ statusName = QString::number(i); break; } } if(!statusName.isEmpty()){ DataManager::getInstance()->copyStatus(currentElem,statusName,curRow); QListWidgetItem* item = new QListWidgetItem(statusName); ui->listWidget_status->addItem(item); } }