quickdev16/tools/bsnes/ui_qt/settings/cheateditor.cpp
2009-05-12 22:17:42 +02:00

157 lines
5.6 KiB
C++
Executable File

void CheatEditorWindow::setup() {
panel = new QWidget;
layout = new QVBoxLayout;
layout->setMargin(0);
layout->setSpacing(0);
title = new QLabel("Cheat Code Editor");
title->setProperty("class", "title");
layout->addWidget(title);
list = new QTreeWidget;
list->setColumnCount(4);
list->setHeaderLabels(QStringList() << "Hidden" << "" << "Code" << "Description");
list->sortByColumn(0, Qt::AscendingOrder); //set initial sorting, preserve user setting after reloadList()
list->hideColumn(0); //used for default sorting + hides child expansion box
layout->addWidget(list);
layout->addSpacing(Style::WidgetSpacing);
controls = new QHBoxLayout; {
addCode = new QPushButton("Add Code ...");
controls->addWidget(addCode);
editCode = new QPushButton("Edit Code ...");
controls->addWidget(editCode);
deleteCode = new QPushButton("Delete Code");
controls->addWidget(deleteCode);
}
controls->setSpacing(Style::WidgetSpacing);
layout->addLayout(controls);
panel->setLayout(layout);
connect(list, SIGNAL(itemChanged(QTreeWidgetItem*, int)), this, SLOT(itemChanged(QTreeWidgetItem*)));
connect(list, SIGNAL(itemActivated(QTreeWidgetItem*, int)), this, SLOT(editSelectedCode()));
connect(list, SIGNAL(itemSelectionChanged()), this, SLOT(listChanged()));
connect(addCode, SIGNAL(released()), this, SLOT(addNewCode()));
connect(editCode, SIGNAL(released()), this, SLOT(editSelectedCode()));
connect(deleteCode, SIGNAL(released()), this, SLOT(deleteSelectedCode()));
reloadList();
}
void CheatEditorWindow::syncUi() {
addCode->setEnabled(SNES::cartridge.loaded());
QList<QTreeWidgetItem*> itemList = list->selectedItems();
editCode->setEnabled(SNES::cartridge.loaded() && itemList.count() == 1);
deleteCode->setEnabled(SNES::cartridge.loaded() && itemList.count() == 1);
}
//called when loading a new game, or after adding / deleting a code:
//synchronizes list with cheat class list
void CheatEditorWindow::reloadList() {
disconnect(list, SIGNAL(itemChanged(QTreeWidgetItem*, int)), this, SLOT(itemChanged(QTreeWidgetItem*)));
list->clear();
list->setSortingEnabled(false);
listItem.reset();
if(SNES::cartridge.loaded()) {
for(unsigned i = 0; i < SNES::cheat.count(); i++) {
SNES::Cheat::cheat_t code;
SNES::cheat.get(i, code);
//only want to show one code / description line in list
lstring lcode, ldesc;
lcode.split("+", code.code);
ldesc.split("\n", code.desc);
if(lcode.size() > 1) lcode[0] << "+" << (int)(lcode.size() - 1);
if(ldesc.size() > 1) ldesc[0] << " ...";
QTreeWidgetItem *item = new QTreeWidgetItem(list);
item->setText(0, utf8() << (int)(1000000 + i));
item->setCheckState(1, code.enabled ? Qt::Checked : Qt::Unchecked);
item->setText(2, utf8() << lcode[0]);
item->setText(3, utf8() << ldesc[0]);
listItem.add(item);
}
}
list->setSortingEnabled(true);
list->resizeColumnToContents(1); //shrink checkbox column width
list->resizeColumnToContents(2); //shrink code column width
connect(list, SIGNAL(itemChanged(QTreeWidgetItem*, int)), this, SLOT(itemChanged(QTreeWidgetItem*)));
syncUi();
}
//called when modifying an existing code:
//list items are all still valid, only need to update item codes + descriptions
void CheatEditorWindow::updateList() {
disconnect(list, SIGNAL(itemChanged(QTreeWidgetItem*, int)), this, SLOT(itemChanged(QTreeWidgetItem*)));
for(unsigned i = 0; i < listItem.size(); i++) {
SNES::Cheat::cheat_t code;
SNES::cheat.get(i, code);
//only want to show one code / description line in list
lstring lcode, ldesc;
lcode.split("+", code.code);
ldesc.split("\n", code.desc);
if(lcode.size() > 1) lcode[0] << "+" << (int)(lcode.size() - 1);
if(ldesc.size() > 1) ldesc[0] << " ...";
QTreeWidgetItem *item = listItem[i];
item->setCheckState(1, code.enabled ? Qt::Checked : Qt::Unchecked);
item->setText(2, utf8() << lcode[0]);
item->setText(3, utf8() << ldesc[0]);
}
list->resizeColumnToContents(1); //shrink checkbox column width
list->resizeColumnToContents(2); //shrink code column width
connect(list, SIGNAL(itemChanged(QTreeWidgetItem*, int)), this, SLOT(itemChanged(QTreeWidgetItem*)));
syncUi();
}
//called when item enabled checkbox was clicked (eg cheat code enable state was toggled on or off)
void CheatEditorWindow::itemChanged(QTreeWidgetItem *item) {
signed i = listItem.find(item);
if(i >= 0) item->checkState(1) == Qt::Checked ? SNES::cheat.enable(i) : SNES::cheat.disable(i);
}
void CheatEditorWindow::listChanged() {
syncUi();
}
void CheatEditorWindow::addNewCode() {
if(SNES::cartridge.loaded()) winCodeEditor->addCode();
}
void CheatEditorWindow::editSelectedCode() {
if(SNES::cartridge.loaded()) {
QTreeWidgetItem *item = list->currentItem();
if(item && item->isSelected()) {
signed i = listItem.find(item);
if(i >= 0) winCodeEditor->editCode(i);
}
}
}
void CheatEditorWindow::deleteSelectedCode() {
if(SNES::cartridge.loaded()) {
QTreeWidgetItem *item = list->currentItem();
if(item && item->isSelected()) {
signed i = listItem.find(item);
if(i >= 0) {
//if code editor is modifying an existing code, its index will be invalidated by delete;
//therefore, the editor window must be closed first
if(winCodeEditor->activeCode >= 0) winCodeEditor->dismiss();
//remove code, and resync listItem with cheat list
SNES::cheat.remove(i);
reloadList();
}
}
}
}