123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519 |
- #include "statusConfig.h"
- #include "ui_statusConfig.h"
- #include "datahpp/dataManager.h"
- #include "actionSettingDialog.h"
- #include "changenamedialog.h"
- #include <iostream>
- #include <QMessageBox>
- 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);
- // 动作选择和配置
- connect(ui->pushButton_actionCfg,SIGNAL(clicked()),this,SLOT(onSetActionButtonClicked()));
- connect(ui->comboBox_action,SIGNAL(currentTextChanged(QString)),this,SLOT(onActionBoxTextChanged(QString)));
- }
- 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<QCheckBox*>(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<QComboBox*>(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);
- }
- // 动作comboBox选择发生变化
- void StatusConfig::onActionBoxTextChanged(const QString &arg1) {
- int statusIndex = ui->listWidget_status->currentRow();
- if(statusIndex == -1 || isSetUi) return;
- DataManager::getInstance()->changeAction(currentElem,arg1,statusIndex);
- }
- ///动作配置中的设置点击后
- void StatusConfig::onSetActionButtonClicked()
- {
- int statusRow = ui->listWidget_status->currentRow();
- if(statusRow == -1) return;
- auto status = DataManager::getInstance()->getStatusConfigData(currentElem, statusRow);
- QVector<ElemPropertyData::EventConfig> eventTable = DataManager::getInstance()->getStatusConfigData(currentElem,statusRow).eventConfig;
- createSetWindow(status.action);
- }
- ///点击动作配置的设置按钮后生成新窗口
- void StatusConfig::createSetWindow(QString actionName)
- {
- int statusIndex = ui->listWidget_status->currentRow();
- if(actionName == "尚未选择"){
- QMap<QString,QString> nullMap;
- DataManager::getInstance()->changeActionConfigData(currentElem,statusIndex,nullMap);
- return;
- }
- ActionSettingDialog setDialog;
- setDialog.setDialogUi(actionName,currentElem,statusIndex);
- 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;i<rowCnt;i++){
- ui->tableWidget_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_action->clear();
- ui->comboBox_collectAnimation->clear();
- ui->comboBox_initAnim->addItem("尚未选择");
- ui->comboBox_clickAnim->addItem("尚未选择");
- ui->comboBox_collectAnimation->addItem("尚未选择");
- ui->comboBox_action->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));
- ui->comboBox_action->addItems(DataManager::getInstance()->getList(currentElem,DataManager::ListType::Actions));
- 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<ElemPropertyData::EventConfig> event = statusData.eventConfig;
- for(int i=0;i<rowNum;i++){
- ui->tableWidget_event->setCellWidget(i,3,createBox(event[i].specialEffect,BoxType::Effect));
- ui->tableWidget_event->setCellWidget(i,0,createBox(event[i].name,BoxType::Event));
- }
- }
- 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<<"收集的目标类型"<<qPrintable(statusData.collTargetType)<<std::endl;
- ui->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);
- }
- // action
- if (statusData.action != "尚未选择") {
- int index = ui->comboBox_action->findText(statusData.action);
- if(index != -1) {
- ui->comboBox_action->setCurrentIndex(index);
- }
- } else {
- ui->comboBox_action->setCurrentIndex(0);
- }
- // 事件配置
- int rowNum = ui->tableWidget_event->rowCount();
- for(int i=0;i<rowNum;i++){
- ui->tableWidget_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:事件名称:"<<qPrintable(i.name)<<std::endl;
- //是否需要颜色一致
- 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;i<maxLayer;i++){
- QListWidgetItem* item = new QListWidgetItem(QString::number(i));
- ui->listWidget_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<ElemPropertyData::EventConfig> 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<<"状态变化幅度发生改变,新值为:"<<val<<std::endl;
- DataManager::getInstance()->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<<"初始化动画:"<<qPrintable(arg1)<<std::endl;
- DataManager::getInstance()->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<<"初始化动画:"<<qPrintable(arg1)<<std::endl;
- DataManager::getInstance()->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<<"收集动画:"<<qPrintable(arg1)<<std::endl;
- DataManager::getInstance()->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;i<maxLayer;i++){
- if(!DataManager::getInstance()->existStatusVal(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);
- }
- }
|