GeckoCodeWidget: Add Enable/Disable All button

This commit is contained in:
Dentomologist
2026-04-20 13:11:00 -07:00
parent 0d3ccfada5
commit 39240edc2a
2 changed files with 51 additions and 0 deletions
@@ -4,6 +4,7 @@
#include "DolphinQt/Config/GeckoCodeWidget.h"
#include <algorithm>
#include <functional>
#include <utility>
#include <QCursor>
@@ -108,6 +109,7 @@ void GeckoCodeWidget::CreateWidgets()
m_edit_code = new NonDefaultQPushButton(tr("&Edit Code..."));
m_remove_code = new NonDefaultQPushButton(tr("&Remove Code"));
m_download_codes = new NonDefaultQPushButton(tr("Download Codes"));
m_toggle_all_codes = new NonDefaultQPushButton(tr("Disable All"));
m_cheat_code_editor = new CheatCodeEditor(this);
@@ -145,6 +147,7 @@ void GeckoCodeWidget::CreateWidgets()
btn_layout->addWidget(m_edit_code);
btn_layout->addWidget(m_remove_code);
btn_layout->addWidget(m_download_codes);
btn_layout->addWidget(m_toggle_all_codes);
layout->addLayout(btn_layout);
}
@@ -163,6 +166,7 @@ void GeckoCodeWidget::ConnectWidgets()
connect(m_remove_code, &QPushButton::clicked, this, &GeckoCodeWidget::RemoveCode);
connect(m_edit_code, &QPushButton::clicked, this, &GeckoCodeWidget::EditCode);
connect(m_download_codes, &QPushButton::clicked, this, &GeckoCodeWidget::DownloadCodes);
connect(m_toggle_all_codes, &QPushButton::clicked, this, &GeckoCodeWidget::ToggleAllCodes);
connect(m_warning, &CheatWarningWidget::OpenCheatEnableSettings, this,
&GeckoCodeWidget::OpenGeneralSettings);
#ifdef USE_RETRO_ACHIEVEMENTS
@@ -212,6 +216,7 @@ void GeckoCodeWidget::OnItemChanged(QListWidgetItem* item)
if (!m_restart_required)
Gecko::SetActiveCodes(m_gecko_codes, m_game_id, m_game_revision);
UpdateToggleButton();
SaveCodes();
}
@@ -336,6 +341,21 @@ void GeckoCodeWidget::SortDisabledCodesFirst()
SaveCodes();
}
bool GeckoCodeWidget::IsEveryCodeEnabled()
{
return std::ranges::all_of(m_gecko_codes, &Gecko::GeckoCode::enabled);
}
void GeckoCodeWidget::UpdateToggleButton()
{
if (IsEveryCodeEnabled())
m_toggle_all_codes->setText(tr("Disable All"));
else
m_toggle_all_codes->setText(tr("Enable All"));
m_toggle_all_codes->setDisabled(m_gecko_codes.empty());
}
void GeckoCodeWidget::OnListReordered()
{
// Reorder codes based on the indices of table item
@@ -391,6 +411,7 @@ void GeckoCodeWidget::UpdateList()
}
m_code_list->setDragDropMode(QAbstractItemView::InternalMove);
UpdateToggleButton();
}
void GeckoCodeWidget::DownloadCodes()
@@ -438,3 +459,28 @@ void GeckoCodeWidget::DownloadCodes()
tr("Downloaded %1 codes. (added %2)")
.arg(QString::number(codes.size()), QString::number(added_count)));
}
void GeckoCodeWidget::ToggleAllCodes()
{
const bool new_state = !IsEveryCodeEnabled();
const Qt::CheckState new_check_state =
new_state ? Qt::CheckState::Checked : Qt::CheckState::Unchecked;
{
// Without this blocker, the call to setCheckState below would end up loading and saving the ini
// file once per code.
QSignalBlocker blocker(m_code_list);
for (int i = 0; i < m_gecko_codes.size(); ++i)
{
m_gecko_codes[i].enabled = new_state;
m_code_list->item(i)->setCheckState(new_check_state);
}
}
if (!m_restart_required)
Gecko::SetActiveCodes(m_gecko_codes, m_game_id, m_game_revision);
UpdateList();
SaveCodes();
}
@@ -55,11 +55,15 @@ private:
void EditCode();
void RemoveCode();
void DownloadCodes();
void ToggleAllCodes();
void LoadCodes();
void SaveCodes();
void SortAlphabetically();
void SortEnabledCodesFirst();
void SortDisabledCodesFirst();
void UpdateToggleButton();
bool IsEveryCodeEnabled();
std::string m_game_id;
std::string m_gametdb_id;
@@ -78,6 +82,7 @@ private:
QPushButton* m_edit_code;
QPushButton* m_remove_code;
QPushButton* m_download_codes;
QPushButton* m_toggle_all_codes;
CheatCodeEditor* m_cheat_code_editor;
std::vector<Gecko::GeckoCode> m_gecko_codes;
bool m_restart_required;