From 1f948b12668dfaf42f574d7918d82610743a18cc Mon Sep 17 00:00:00 2001 From: Connor McLaughlin Date: Wed, 21 Oct 2020 21:30:23 +1000 Subject: [PATCH] Qt: Add groups to cheat manager --- src/duckstation-qt/cheatcodeeditordialog.cpp | 27 ++++---- src/duckstation-qt/cheatcodeeditordialog.h | 4 +- src/duckstation-qt/cheatmanagerdialog.cpp | 65 +++++++++++++++----- src/duckstation-qt/cheatmanagerdialog.h | 4 +- src/duckstation-qt/cheatmanagerdialog.ui | 5 +- 5 files changed, 71 insertions(+), 34 deletions(-) diff --git a/src/duckstation-qt/cheatcodeeditordialog.cpp b/src/duckstation-qt/cheatcodeeditordialog.cpp index fc6adf6ec..e216cff60 100644 --- a/src/duckstation-qt/cheatcodeeditordialog.cpp +++ b/src/duckstation-qt/cheatcodeeditordialog.cpp @@ -1,11 +1,11 @@ #include "cheatcodeeditordialog.h" #include -CheatCodeEditorDialog::CheatCodeEditorDialog(CheatList* list, CheatCode* code, QWidget* parent) +CheatCodeEditorDialog::CheatCodeEditorDialog(const QStringList& group_names, CheatCode* code, QWidget* parent) : m_code(code), QDialog(parent) { m_ui.setupUi(this); - setupAdditionalUi(list); + setupAdditionalUi(group_names); fillUi(); connectUi(); } @@ -40,7 +40,7 @@ void CheatCodeEditorDialog::cancelClicked() done(0); } -void CheatCodeEditorDialog::setupAdditionalUi(CheatList* list) +void CheatCodeEditorDialog::setupAdditionalUi(const QStringList& group_names) { for (u32 i = 0; i < static_cast(CheatCode::Type::Count); i++) { @@ -53,27 +53,28 @@ void CheatCodeEditorDialog::setupAdditionalUi(CheatList* list) qApp->translate("Cheats", CheatCode::GetActivationDisplayName(static_cast(i)))); } - const auto groups = list->GetCodeGroups(); - if (!groups.empty()) - { - for (const std::string& group_name : groups) - m_ui.group->addItem(QString::fromStdString(group_name)); - } + if (!group_names.isEmpty()) + m_ui.group->addItems(group_names); else - { m_ui.group->addItem(QStringLiteral("Ungrouped")); - } } void CheatCodeEditorDialog::fillUi() { m_ui.description->setText(QString::fromStdString(m_code->description)); - int index = m_ui.group->findText(QString::fromStdString(m_code->group)); + const QString group_qstr(QString::fromStdString(m_code->group)); + int index = m_ui.group->findText(group_qstr); if (index >= 0) + { m_ui.group->setCurrentIndex(index); + } else - m_ui.group->setCurrentIndex(0); + { + index = m_ui.group->count(); + m_ui.group->addItem(group_qstr); + m_ui.group->setCurrentIndex(index); + } m_ui.type->setCurrentIndex(static_cast(m_code->type)); m_ui.activation->setCurrentIndex(static_cast(m_code->activation)); diff --git a/src/duckstation-qt/cheatcodeeditordialog.h b/src/duckstation-qt/cheatcodeeditordialog.h index 0487d043c..8beb310d9 100644 --- a/src/duckstation-qt/cheatcodeeditordialog.h +++ b/src/duckstation-qt/cheatcodeeditordialog.h @@ -7,7 +7,7 @@ class CheatCodeEditorDialog : public QDialog Q_OBJECT public: - CheatCodeEditorDialog(CheatList* list, CheatCode* code, QWidget* parent); + CheatCodeEditorDialog(const QStringList& group_names, CheatCode* code, QWidget* parent); ~CheatCodeEditorDialog(); private Q_SLOTS: @@ -15,7 +15,7 @@ private Q_SLOTS: void cancelClicked(); private: - void setupAdditionalUi(CheatList* list); + void setupAdditionalUi(const QStringList& group_names); void fillUi(); void connectUi(); diff --git a/src/duckstation-qt/cheatmanagerdialog.cpp b/src/duckstation-qt/cheatmanagerdialog.cpp index f65505e52..36fb7f70a 100644 --- a/src/duckstation-qt/cheatmanagerdialog.cpp +++ b/src/duckstation-qt/cheatmanagerdialog.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include @@ -165,20 +166,42 @@ QTreeWidgetItem* CheatManagerDialog::getItemForCheatIndex(u32 index) const return nullptr; } -QTreeWidgetItem* CheatManagerDialog::getItemForCheatGroup(const std::string& group) const +QTreeWidgetItem* CheatManagerDialog::getItemForCheatGroup(const QString& group_name) const { - const QString group_qstr(QString::fromStdString(group)); const int count = m_ui.cheatList->topLevelItemCount(); for (int i = 0; i < count; i++) { QTreeWidgetItem* item = m_ui.cheatList->topLevelItem(i); - if (item->text(0) == group_qstr) + if (item->text(0) == group_name) return item; } return nullptr; } +QTreeWidgetItem* CheatManagerDialog::createItemForCheatGroup(const QString& group_name) const +{ + QTreeWidgetItem* group = new QTreeWidgetItem(); + group->setFlags(group->flags() | Qt::ItemIsUserCheckable); + group->setText(0, group_name); + m_ui.cheatList->addTopLevelItem(group); + return group; +} + +QStringList CheatManagerDialog::getCheatGroupNames() const +{ + QStringList group_names; + + const int count = m_ui.cheatList->topLevelItemCount(); + for (int i = 0; i < count; i++) + { + QTreeWidgetItem* item = m_ui.cheatList->topLevelItem(i); + group_names.push_back(item->text(0)); + } + + return group_names; +} + static int getCheatIndexFromItem(QTreeWidgetItem* item) { QVariant item_data(item->data(0, Qt::UserRole)); @@ -225,10 +248,7 @@ void CheatManagerDialog::updateCheatList() const std::vector groups = list->GetCodeGroups(); for (const std::string& group_name : groups) { - QTreeWidgetItem* group = new QTreeWidgetItem(); - group->setFlags(group->flags() | Qt::ItemIsUserCheckable); - group->setText(0, QString::fromStdString(group_name)); - m_ui.cheatList->addTopLevelItem(group); + QTreeWidgetItem* group = createItemForCheatGroup(QString::fromStdString(group_name)); const u32 count = list->GetCodeCount(); bool all_enabled = true; @@ -363,7 +383,17 @@ void CheatManagerDialog::activateCheat(u32 index) void CheatManagerDialog::newCategoryClicked() { - // + QString group_name = QInputDialog::getText(this, tr("Add Group"), tr("Group Name:")); + if (group_name.isEmpty()) + return; + + if (getItemForCheatGroup(group_name) != nullptr) + { + QMessageBox::critical(this, tr("Error"), tr("This group name already exists.")); + return; + } + + createItemForCheatGroup(group_name); } void CheatManagerDialog::addCodeClicked() @@ -371,15 +401,19 @@ void CheatManagerDialog::addCodeClicked() CheatList* list = getCheatList(); CheatCode new_code; - CheatCodeEditorDialog editor(list, &new_code, this); + new_code.group = "Ungrouped"; + + CheatCodeEditorDialog editor(getCheatGroupNames(), &new_code, this); if (editor.exec() > 0) { - QTreeWidgetItem* group_item = getItemForCheatGroup(new_code.group); + const QString group_name_qstr(QString::fromStdString(new_code.group)); + QTreeWidgetItem* group_item = getItemForCheatGroup(group_name_qstr); if (!group_item) - group_item = m_ui.cheatList->topLevelItem(0); + group_item = createItemForCheatGroup(group_name_qstr); QTreeWidgetItem* item = new QTreeWidgetItem(group_item); fillItemForCheatCode(item, list->GetCodeCount(), new_code); + group_item->setExpanded(true); QtHostInterface::GetInstance()->executeOnEmulationThread( [this, &new_code]() { @@ -401,7 +435,7 @@ void CheatManagerDialog::editCodeClicked() return; CheatCode new_code = list->GetCode(static_cast(index)); - CheatCodeEditorDialog editor(list, &new_code, this); + CheatCodeEditorDialog editor(getCheatGroupNames(), &new_code, this); if (editor.exec() > 0) { QTreeWidgetItem* item = getItemForCheatIndex(static_cast(index)); @@ -410,10 +444,13 @@ void CheatManagerDialog::editCodeClicked() if (new_code.group != list->GetCode(static_cast(index)).group) { item = item->parent()->takeChild(item->parent()->indexOfChild(item)); - QTreeWidgetItem* group_item = getItemForCheatGroup(new_code.group); + + const QString group_name_qstr(QString::fromStdString(new_code.group)); + QTreeWidgetItem* group_item = getItemForCheatGroup(group_name_qstr); if (!group_item) - group_item = m_ui.cheatList->topLevelItem(0); + group_item = createItemForCheatGroup(group_name_qstr); group_item->addChild(item); + group_item->setExpanded(true); } fillItemForCheatCode(item, static_cast(index), new_code); diff --git a/src/duckstation-qt/cheatmanagerdialog.h b/src/duckstation-qt/cheatmanagerdialog.h index 9bd80db07..0195a0a2d 100644 --- a/src/duckstation-qt/cheatmanagerdialog.h +++ b/src/duckstation-qt/cheatmanagerdialog.h @@ -59,7 +59,9 @@ private: void fillItemForCheatCode(QTreeWidgetItem* item, u32 index, const CheatCode& code); QTreeWidgetItem* getItemForCheatIndex(u32 index) const; - QTreeWidgetItem* getItemForCheatGroup(const std::string& group) const; + QTreeWidgetItem* getItemForCheatGroup(const QString& group_name) const; + QTreeWidgetItem* createItemForCheatGroup(const QString& group_name) const; + QStringList getCheatGroupNames() const; int getSelectedCheatIndex() const; int getSelectedResultIndex() const; int getSelectedWatchIndex() const; diff --git a/src/duckstation-qt/cheatmanagerdialog.ui b/src/duckstation-qt/cheatmanagerdialog.ui index 0017a7b49..586878780 100644 --- a/src/duckstation-qt/cheatmanagerdialog.ui +++ b/src/duckstation-qt/cheatmanagerdialog.ui @@ -28,11 +28,8 @@ - - false - - &New Category... + &Add Group...