diff --git a/Source/Core/DolphinQt/Config/ARCodeWidget.cpp b/Source/Core/DolphinQt/Config/ARCodeWidget.cpp index f2cc8b0e59..e4b55c3729 100644 --- a/Source/Core/DolphinQt/Config/ARCodeWidget.cpp +++ b/Source/Core/DolphinQt/Config/ARCodeWidget.cpp @@ -4,6 +4,7 @@ #include "DolphinQt/Config/ARCodeWidget.h" #include +#include #include #include @@ -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(); +} diff --git a/Source/Core/DolphinQt/Config/ARCodeWidget.h b/Source/Core/DolphinQt/Config/ARCodeWidget.h index 94fb8ebbe5..b3be4b9053 100644 --- a/Source/Core/DolphinQt/Config/ARCodeWidget.h +++ b/Source/Core/DolphinQt/Config/ARCodeWidget.h @@ -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;