123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503 |
- #include "mainwindow.h"
- #include "ui_mainwindow.h"
- #include "basicproperty.h"
- #include "changenamedialog.h"
- #include "collectionwindow.h"
- #include "statusconfiguration.h"
- #include "containerpool.h"
- #include "resfiledialog.h"
- #include <QListWidgetItem>
- #include <QListWidget>
- #include <QLabel>
- #include <iostream>
- #include <QHBoxLayout>
- #include <QMessageBox>
- #include <QFileDialog>
- #include <QDragEnterEvent>
- #include <QMimeData>
- #include <QUrl>
- MainWindow::MainWindow(QWidget *parent)
- : QMainWindow(parent)
- , ui(new Ui::MainWindow)
- {
- ui->setupUi(this);
- QPixmap pix("/Users/menglanluo/pic.png");
- ui->label_pic->setPixmap(pix.scaled(50,50,Qt::KeepAspectRatio));
- this->setAcceptDrops(true);
- ui->tableWidget_animation->setHorizontalHeaderLabels({"名称","资源","时间线","z-Order"});
- ui->tabWidget->setCurrentIndex(0);
- }
- MainWindow::~MainWindow()
- {
- delete ui;
- }
- //TODO: 设置ui所有数据
- void MainWindow::setUi(ElemPropertyData *elem)
- {
- QPixmap pix(elem->iconPath);
- ui->label_pic->setPixmap(pix.scaled(50,50,Qt::KeepAspectRatio));
- ui->lineEdit_name->setText(elem->labelName);
- ui->lineEdit_size->setText(elem->size);
- ui->lineEdit_maxlayer->setText(elem->maxLayer);
- ui->lineEdit_score->setText(elem->score);
- ui->spinBox_drop->setValue(elem->dropConfig);
- //设置状态与效果动画表格显示
- int rowCnt = ui->tableWidget_animation->rowCount();
- for(int i=0;i<rowCnt;i++){
- ui->tableWidget_animation->removeRow(0);
- }
- for(const auto &i:elements[ui->listWidget_elem->currentItem()->text()]->statusEffect){
- int rowNum = ui->tableWidget_animation->rowCount();
- ui->tableWidget_animation->insertRow(rowNum);
- ui->tableWidget_animation->setItem(rowNum,0,new QTableWidgetItem(i.name));
- //TODO: 资源和时间线所在单元格替换数据
- QTableWidgetItem* res = new QTableWidgetItem("双击添加资源文件");
- // 此单元格不可编辑
- res->setFlags(res->flags() & ~Qt::ItemIsEditable);
- ui->tableWidget_animation->setItem(rowNum,1,res);
- ui->tableWidget_animation->setCellWidget(rowNum,2,new QComboBox);
- ui->tableWidget_animation->setItem(rowNum,3,new QTableWidgetItem(QString::number(i.zOrder)));
- }
- //设置收集动画的显示并聚焦到收集动画列表的最后一个元素
- ui->listWidget_collectAnim->clear();
- ui->listWidget_collectAnim->addItems(elem->collAnim.keys());
- // ui->listWidget_collectAnim->item(0)->setSelected(true); // 设置选中
- //设置收集动画和状态配置的comboBox
- ui->comboBox_initAnim->clear();
- ui->comboBox_clickAnim->clear();
- ui->comboBox_collectAnimation->clear();
- ui->comboBox_animation->clear();
- for(const auto &i:elem->statusEffect){
- ui->comboBox_clickAnim->addItem(i.name);
- ui->comboBox_animation->addItem(i.name);
- ui->comboBox_initAnim->addItem(i.name);
- }
- ui->comboBox_collectAnimation->addItems(elem->collAnim.keys());
- }
- void MainWindow::on_pushButton_chooseFile_clicked()
- {
- //如果未选中列表中的按钮,无法触发此按钮
- if(ui->listWidget_elem->currentItem() == nullptr) return;
- QString elem = ui->listWidget_elem->currentItem()->text();
- QString file_name = QFileDialog::getOpenFileName(this,"Open a file",QDir::homePath());
- if(file_name == nullptr){
- file_name = elements[elem]->iconPath;
- }
- QPixmap pix(file_name);
- ui->label_pic->setPixmap(pix.scaled(50,50,Qt::KeepAspectRatio));
- elements[elem]->iconPath = file_name;
- ui->listWidget_elem->currentItem()->setIcon(QIcon(file_name));
- }
- void MainWindow::on_pushButton_addElem_clicked()
- {
- QString elemName = "新加元素";
- int id = 1;
- while(1){
- if(elements.find(elemName)==elements.end()){
- break;
- }
- elemName = "新加元素" + QString::number(id++);
- }
- QListWidgetItem* item = new QListWidgetItem(QIcon("/Users/menglanluo/菜狗.png"),elemName);
- ui->listWidget_elem->addItem(item);
- // ui->listWidget_elem->item(ui->listWidget_elem->count() - 1)->setSelected(true); // 设置选中
- // ui->listWidget_elem->scrollToBottom();
- elements[elemName] = new ElemPropertyData();
- }
- void MainWindow::on_pushButton_delElem_clicked()
- {
- if(ui->listWidget_elem->currentItem() == nullptr) return;
- QMessageBox::StandardButton reply = QMessageBox::question(this,"删除元素","确定要删除此元素吗?");
- if(reply == QMessageBox::Yes){
- QString elemName = ui->listWidget_elem->currentItem()->text();
- delete elements[elemName];
- elements.erase(elements.find(elemName));
- delete ui->listWidget_elem->takeItem(ui->listWidget_elem->currentRow());
- }
- }
- void MainWindow::on_listWidget_elem_itemDoubleClicked(QListWidgetItem *item)
- {
- ChangeNameDialog newName;
- newName.setModal(true);
- newName.exec();
- QString name = newName.getNewName();
- if(!name.isEmpty()){
- if(elements.find(name)!=elements.end()){
- QMessageBox::critical(this,"警告","该元素名已存在!");
- return;
- }
- QString elemName = ui->listWidget_elem->currentItem()->text();
- ElemPropertyData* newElem = elements[elemName];
- elements.erase(elements.find(elemName));
- elements[newName.getNewName()] = newElem;
- item->setText(newName.getNewName());
- }
- }
- void MainWindow::on_lineEdit_name_editingFinished()
- {
- if(ui->listWidget_elem->currentItem() == nullptr) return;
- QString key = ui->listWidget_elem->currentItem()->text();
- elements[key]->labelName = ui->lineEdit_name->text();
- }
- void MainWindow::on_lineEdit_size_editingFinished()
- {
- if(ui->listWidget_elem->currentItem() == nullptr) return;
- QString key = ui->listWidget_elem->currentItem()->text();
- elements[key]->size = ui->lineEdit_size->text();
- }
- void MainWindow::on_lineEdit_maxlayer_editingFinished()
- {
- if(ui->listWidget_elem->currentItem() == nullptr) return;
- QString key = ui->listWidget_elem->currentItem()->text();
- elements[key]->maxLayer = ui->lineEdit_maxlayer->text();
- }
- void MainWindow::on_lineEdit_score_editingFinished()
- {
- if(ui->listWidget_elem->currentItem() == nullptr) return;
- QString key = ui->listWidget_elem->currentItem()->text();
- elements[key]->score = ui->lineEdit_score->text();
- }
- void MainWindow::on_spinBox_drop_valueChanged(int arg1)
- {
- if(ui->listWidget_elem->currentItem() == nullptr) return;
- QString key = ui->listWidget_elem->currentItem()->text();
- elements[key]->dropConfig = arg1;
- }
- //TODO: 保存当前元素的所有数据,界面加载当前元素数据
- void MainWindow::on_listWidget_elem_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
- {
- //每一步改变基本都会触发保存,但是表格内嵌的组件如combobox暂时没找到触发保存的办法
- setUi(elements[current->text()]);
- }
- bool MainWindow::isSingleAnimName(const QVector<ElemPropertyData::StatusEffect> &statusEffect,QString name){
- for(const auto &i:statusEffect){
- if(name == i.name)
- return false;
- }
- return true;
- }
- //替换资源文件
- void MainWindow::on_tableWidget_animation_cellDoubleClicked(int row, int column)
- {
- //表格内容修改flag
- animTableItemChanged = true;
- if(column == 1){
- ResFileDialog res;
- res.setModal(true);
- res.exec();
- QString fileName = res.getResName();
- if(!fileName.isEmpty()){
- ui->tableWidget_animation->setItem(row,column,new QTableWidgetItem(fileName));
- //TODO: 加入资源生成时间线代码
- QComboBox* timeLine = new QComboBox;
- timeLine->addItem("lml");
- timeLine->addItem("xdf");
- timeLine->addItem("cqf");
- ui->tableWidget_animation->setCellWidget(row,column+1,timeLine);
- }
- }
- }
- void MainWindow::on_pushButton_addAnimation_clicked()
- {
- if(ui->listWidget_elem->currentItem()==nullptr) return;
- int rowNum = ui->tableWidget_animation->rowCount();
- ui->tableWidget_animation->insertRow(rowNum);
- QString elemName = ui->listWidget_elem->currentItem()->text();
- ElemPropertyData* elem = elements[elemName];
- QString animName = "anim";
- int id = 1;
- while(1){
- if(isSingleAnimName(elem->statusEffect,animName)){
- break;
- }
- animName = "anim" + QString::number(id++);
- }
- ui->tableWidget_animation->setItem(rowNum,0,new QTableWidgetItem(animName));
- QTableWidgetItem* res = new QTableWidgetItem("双击添加资源文件");
- // 此单元格不可编辑
- res->setFlags(res->flags() & ~Qt::ItemIsEditable);
- ui->tableWidget_animation->setItem(rowNum,1,res);
- ui->tableWidget_animation->setCellWidget(rowNum,2,new QComboBox);
- ui->tableWidget_animation->setItem(rowNum,3,new QTableWidgetItem("0"));
- elem->statusEffect.push_back({animName,"","",0});
- }
- void MainWindow::on_pushButton_delAnimation_clicked()
- {
- if(ui->tableWidget_animation->currentRow() == -1) return;
- QMessageBox::StandardButton reply = QMessageBox::question(this,"删除动画","确定要删除此动画吗?");
- if(reply == QMessageBox::Yes){
- int curRow = ui->tableWidget_animation->currentRow();
- QString animName = ui->tableWidget_animation->item(curRow,0)->text();
- QVector<ElemPropertyData::StatusEffect> &animVec = elements[ui->listWidget_elem->currentItem()->text()]->statusEffect;
- for(int i=0;i<animVec.size();i++){
- if(animName == animVec[i].name)
- animVec.remove(i);
- }
- ui->tableWidget_animation->removeRow(curRow);
- }
- }
- void MainWindow::on_tableWidget_animation_itemChanged(QTableWidgetItem *item)
- {
- if(!animTableItemChanged) return;
- animTableItemChanged = false;
- int column = item->column();
- int row = item->row();
- QVector<ElemPropertyData::StatusEffect> &animVec = elements[ui->listWidget_elem->currentItem()->text()]->statusEffect;
- if(column == 0){
- QString newName = ui->tableWidget_animation->item(row,0)->text();
- if(!isSingleAnimName(animVec,newName)){
- QMessageBox::critical(this,"警告","该动画名已存在!");
- ui->tableWidget_animation->item(row,0)->setText(animVec[row].name);
- return;
- }
- std::cout<<"名字发生改变,新名字:"<<qPrintable(newName)<<std::endl;
- animVec[row].name = newName;
- }
- //资源名发生修改
- else if(column == 1){
- std::cout<<"动画资源发生改变,新资源名:"<<qPrintable(ui->tableWidget_animation->item(row,1)->text())<<std::endl;
- }
- // 时间线发生修改,居然没有反应。。。
- else if(column == 2){
- QComboBox *timeLine = qobject_cast<QComboBox*>(ui->tableWidget_animation->cellWidget(row,2));
- std::cout<<"timeLine:"<<qPrintable(timeLine->currentText())<<std::endl;
- }
- else{
- int zOrder = ui->tableWidget_animation->item(row,3)->text().toInt();
- if(zOrder<0 || zOrder>100000){
- QMessageBox::critical(this,"警告","z-Order值超出范围!");
- ui->tableWidget_animation->item(row,3)->setText(QString::number(animVec[row].zOrder));
- return;
- }
- std::cout<<"z-Order值发生改变,新值为:"<<zOrder<<std::endl;
- animVec[row].zOrder = zOrder;
- }
- }
- void MainWindow::on_pushButton_addCollectAnim_clicked()
- {
- if(ui->listWidget_elem->currentItem() == nullptr) return;
- QString collAnimName = "collAnim";
- ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
- int id = 1;
- while(1){
- if(elem->collAnim.find(collAnimName)==elem->collAnim.end()){
- break;
- }
- collAnimName = "collAnim" + QString::number(id++);
- }
- ui->listWidget_collectAnim->addItem(new QListWidgetItem(collAnimName));
- elem->collAnim[collAnimName] = {ui->comboBox_animationType->itemText(0),ui->comboBox_animation->itemText(0),"",""};
- // ui->listWidget_collectAnim->item(ui->listWidget_collectAnim->count() - 1)->setSelected(true); // 设置选中
- // ui->listWidget_collectAnim->scrollToBottom();
- }
- void MainWindow::on_pushButton_delCollectAnim_clicked()
- {
- if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_collectAnim->currentItem() == nullptr) return;
- QMessageBox::StandardButton reply = QMessageBox::question(this,"删除动画","确定要删除此收集动画吗?");
- if(reply == QMessageBox::Yes){
- elements[ui->listWidget_elem->currentItem()->text()]->collAnim.remove(ui->listWidget_collectAnim->currentItem()->text());
- delete ui->listWidget_collectAnim->takeItem(ui->listWidget_collectAnim->currentRow());
- }
- }
- void MainWindow::on_listWidget_collectAnim_itemDoubleClicked(QListWidgetItem *item)
- {
- ChangeNameDialog newName;
- newName.setModal(true);
- newName.exec();
- ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
- QString name = newName.getNewName();
- if(!name.isEmpty()){
- if(elem->collAnim.find(name)!=elem->collAnim.end()){
- QMessageBox::critical(this,"警告","该收集动画名已存在!");
- return;
- }
- QString collAnimName = ui->listWidget_collectAnim->currentItem()->text();
- ElemPropertyData::CollAnim collAnimData = elem->collAnim[collAnimName];
- elem->collAnim.remove(collAnimName);
- elem->collAnim[name] = collAnimData;
- item->setText(name);
- }
- }
- void MainWindow::on_comboBox_animationType_currentTextChanged(const QString &arg1)
- {
- if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_collectAnim->currentItem() == nullptr) return;
- elements[ui->listWidget_elem->currentItem()->text()]->collAnim[ui->listWidget_collectAnim->currentItem()->text()].type = arg1;
- }
- void MainWindow::on_comboBox_animation_currentTextChanged(const QString &arg1)
- {
- if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_collectAnim->currentItem() == nullptr) return;
- elements[ui->listWidget_elem->currentItem()->text()]->collAnim[ui->listWidget_collectAnim->currentItem()->text()].anim = arg1;
- }
- void MainWindow::on_lineEdit_node_editingFinished()
- {
- if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_collectAnim->currentItem() == nullptr) return;
- elements[ui->listWidget_elem->currentItem()->text()]->collAnim[ui->listWidget_collectAnim->currentItem()->text()].node = ui->lineEdit_node->text();
- }
- void MainWindow::on_lineEdit_shadow_editingFinished()
- {
- if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_collectAnim->currentItem() == nullptr) return;
- elements[ui->listWidget_elem->currentItem()->text()]->collAnim[ui->listWidget_collectAnim->currentItem()->text()].shadow = ui->lineEdit_shadow->text();
- }
- //设置收集动画显示
- void MainWindow::setCollectAnimUi(QString collectAnimName)
- {
- if(ui->listWidget_collectAnim->currentItem() != nullptr){
- ElemPropertyData* elem = elements[ui->listWidget_elem->currentItem()->text()];
- ElemPropertyData::CollAnim collAnimData = elem->collAnim[collectAnimName];
- ui->lineEdit_node->setText(collAnimData.node);
- ui->lineEdit_shadow->setText(collAnimData.shadow);
- std::cout<<qPrintable(collAnimData.anim)<<"\t"<<qPrintable(collAnimData.type)<<std::endl;
- //TODO: 使用comboBox的index来修改当前要显示的值
- // ui->comboBox_animation->setCurrentText(collAnimData.anim);
- // ui->comboBox_animationType->setCurrentText(collAnimData.type);
- ui->comboBox_animation->setCurrentIndex(1);
- ui->comboBox_animationType->setCurrentIndex(1);
- }
- }
- void MainWindow::on_listWidget_collectAnim_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
- {
- //TODO: 或许需要另外保存当前界面的数据
- if(current != nullptr){
- setCollectAnimUi(current->text());
- }
- }
- //TODO: 生成模板时更新状态配置的数据,怎么米有反应。。。
- void MainWindow::on_pushButton_genTemp_clicked()
- {
- if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_status->count() > 0) return;
- for(int i=0;i<elements[ui->listWidget_elem->currentItem()->text()]->maxLayer.toInt();i++){
- ui->listWidget_status->addItem(QString::number(i));
- }
- }
- //TODO: 生成一个合法的状态值并修改数据
- void MainWindow::on_pushButton_addStatus_clicked()
- {
- //TODO: 检查状态值合法性
- if(ui->listWidget_elem->currentItem() == nullptr) return;
- // for(int i=0;i<elements[ui->listWidget_elem->currentItem()->text()]->maxLayer.toInt();i++){
- // ui->listWidget_status->addItem(QString::number(i));
- // }
- ui->listWidget_status->addItem("3");
- }
- //TODO: 删除状态值对应的数据
- void MainWindow::on_pushButton_delStatus_clicked()
- {
- if(ui->listWidget_elem->currentItem() == nullptr || ui->listWidget_status->currentItem() == nullptr) return;
- QMessageBox::StandardButton reply = QMessageBox::question(this,"删除状态","确定要删除此状态吗?");
- if(reply == QMessageBox::Yes){
- delete ui->listWidget_status->takeItem(ui->listWidget_status->currentRow());
- }
- }
- void MainWindow::on_listWidget_status_itemDoubleClicked(QListWidgetItem *item)
- {
- ChangeNameDialog newName;
- newName.setModal(true);
- newName.exec();
- QString name = newName.getNewName();
- if(!name.isEmpty()){
- //TODO: 检查状态值合法性并转移数据
- // if(1){}
- // QString elemName = ui->listWidget_elem->currentItem()->text();
- // ElemPropertyData* newElem = elements[elemName];
- // elements.erase(elements.find(elemName));
- // elements[newName.getNewName()] = newElem;
- item->setText(newName.getNewName());
- }
- }
- void MainWindow::on_pushButton_addContainer_clicked()
- {
- //TODO: 检查名称唯一性
- ui->listWidget_pool->addItem("pool1");
- }
- void MainWindow::on_pushButton_delContainer_clicked()
- {
- QMessageBox::StandardButton reply = QMessageBox::question(this,"删除状态","确定要删除此容器吗?");
- if(reply == QMessageBox::Yes){
- delete ui->listWidget_pool->takeItem(ui->listWidget_pool->currentRow());
- }
- }
- void MainWindow::on_listWidget_pool_itemDoubleClicked(QListWidgetItem *item)
- {
- ChangeNameDialog newName;
- newName.setModal(true);
- newName.exec();
- QString name = newName.getNewName();
- if(!name.isEmpty()){
- //TODO: 检查新名字唯一性
- item->setText(name);
- }
- }
- //切换tab时更新comboBox(或者每一次添加删除动画就更新一下该元素的comboBox?这样也更方便进行逻辑检查)
- void MainWindow::on_tabWidget_currentChanged(int index)
- {
- if(ui->listWidget_elem->currentItem() == nullptr) return;
- QVector<ElemPropertyData::StatusEffect> &animVec = elements[ui->listWidget_elem->currentItem()->text()]->statusEffect;
- //如果目前展示的是收集动画,加载状态与效果配置中的动画到收集动画的动画下拉列表中
- //目前这种方法较为暴力,后期可以视动画数量进行优化
- if(index == 1){
- ui->comboBox_animation->clear();
- for(const auto &i:animVec){
- ui->comboBox_animation->addItem(i.name);
- }
- }
- //如果目前展示的是状态配置,加载相应状态效果配置动画和收集动画
- else if(index == 2){
- ui->comboBox_initAnim->clear();
- ui->comboBox_clickAnim->clear();
- ui->comboBox_collectAnimation->clear();
- for(const auto &i:animVec){
- ui->comboBox_initAnim->addItem(i.name);
- ui->comboBox_clickAnim->addItem(i.name);
- }
- ui->comboBox_collectAnimation->addItems(elements[ui->listWidget_elem->currentItem()->text()]->collAnim.keys());
- }
- }
|