ARCodeWidget: Add Enable/Disable All button

This commit is contained in:
Dentomologist
2026-04-20 12:29:29 -07:00
parent 914f5c5621
commit 0d3ccfada5
2 changed files with 51 additions and 1 deletions
+46 -1
View File
@@ -4,6 +4,7 @@
#include "DolphinQt/Config/ARCodeWidget.h"
#include <algorithm>
#include <functional>
#include <utility>
#include <QCursor>
@@ -72,6 +73,7 @@ void ARCodeWidget::CreateWidgets()
m_code_add = new NonDefaultQPushButton(tr("&Add New Code..."));
m_code_edit = new NonDefaultQPushButton(tr("&Edit Code..."));
m_code_remove = new NonDefaultQPushButton(tr("&Remove Code"));
m_code_toggle_all = new NonDefaultQPushButton(tr("Disable All"));
m_cheat_code_editor = new CheatCodeEditor(this);
@@ -82,6 +84,7 @@ void ARCodeWidget::CreateWidgets()
button_layout->addWidget(m_code_add);
button_layout->addWidget(m_code_edit);
button_layout->addWidget(m_code_remove);
button_layout->addWidget(m_code_toggle_all);
auto* const layout = new QVBoxLayout{this};
@@ -113,6 +116,7 @@ void ARCodeWidget::ConnectWidgets()
connect(m_code_add, &QPushButton::clicked, this, &ARCodeWidget::OnCodeAddClicked);
connect(m_code_edit, &QPushButton::clicked, this, &ARCodeWidget::OnCodeEditClicked);
connect(m_code_remove, &QPushButton::clicked, this, &ARCodeWidget::OnCodeRemoveClicked);
connect(m_code_toggle_all, &QPushButton::clicked, this, &ARCodeWidget::OnCodeToggleAllClicked);
}
void ARCodeWidget::OnItemChanged(QListWidgetItem* item)
@@ -122,7 +126,7 @@ void ARCodeWidget::OnItemChanged(QListWidgetItem* item)
if (!m_restart_required)
ActionReplay::ApplyCodes(m_ar_codes, m_game_id, m_game_revision);
UpdateList();
UpdateToggleButton();
SaveCodes();
}
@@ -157,6 +161,21 @@ void ARCodeWidget::SortDisabledCodesFirst()
SaveCodes();
}
bool ARCodeWidget::IsEveryCodeEnabled()
{
return std::ranges::all_of(m_ar_codes, &ActionReplay::ARCode::enabled);
}
void ARCodeWidget::UpdateToggleButton()
{
if (IsEveryCodeEnabled())
m_code_toggle_all->setText(tr("Disable All"));
else
m_code_toggle_all->setText(tr("Enable All"));
m_code_toggle_all->setDisabled(m_ar_codes.empty());
}
void ARCodeWidget::OnListReordered()
{
// Reorder codes based on the indices of table item
@@ -229,6 +248,7 @@ void ARCodeWidget::UpdateList()
}
m_code_list->setDragDropMode(QAbstractItemView::InternalMove);
UpdateToggleButton();
}
void ARCodeWidget::LoadCodes()
@@ -341,3 +361,28 @@ void ARCodeWidget::OnCodeRemoveClicked()
m_code_remove->setEnabled(false);
}
void ARCodeWidget::OnCodeToggleAllClicked()
{
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_ar_codes.size(); ++i)
{
m_ar_codes[i].enabled = new_state;
m_code_list->item(i)->setCheckState(new_check_state);
}
}
if (!m_restart_required)
ActionReplay::ApplyCodes(m_ar_codes, m_game_id, m_game_revision);
UpdateList();
SaveCodes();
}
@@ -54,13 +54,17 @@ private:
void SortAlphabetically();
void SortEnabledCodesFirst();
void SortDisabledCodesFirst();
void UpdateToggleButton();
void OnCodeAddClicked();
void OnCodeEditClicked();
void OnCodeRemoveClicked();
void OnCodeToggleAllClicked();
void OnListReordered();
bool IsEveryCodeEnabled();
std::string m_game_id;
u16 m_game_revision;
@@ -72,6 +76,7 @@ private:
QPushButton* m_code_add;
QPushButton* m_code_edit;
QPushButton* m_code_remove;
QPushButton* m_code_toggle_all;
CheatCodeEditor* m_cheat_code_editor;