CheatsManager.cpp 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. // Copyright 2018 Dolphin Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #include "DolphinQt/CheatsManager.h"
  4. #include <functional>
  5. #include <QDialogButtonBox>
  6. #include <QVBoxLayout>
  7. #include "Core/ActionReplay.h"
  8. #include "Core/CheatSearch.h"
  9. #include "Core/ConfigManager.h"
  10. #include "Core/Core.h"
  11. #include "UICommon/GameFile.h"
  12. #include "DolphinQt/CheatSearchFactoryWidget.h"
  13. #include "DolphinQt/CheatSearchWidget.h"
  14. #include "DolphinQt/Config/ARCodeWidget.h"
  15. #include "DolphinQt/Config/GeckoCodeWidget.h"
  16. #include "DolphinQt/QtUtils/PartiallyClosableTabWidget.h"
  17. #include "DolphinQt/Settings.h"
  18. #include "VideoCommon/VideoEvents.h"
  19. CheatsManager::CheatsManager(Core::System& system, QWidget* parent)
  20. : QDialog(parent), m_system(system)
  21. {
  22. setWindowTitle(tr("Cheats Manager"));
  23. setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
  24. connect(&Settings::Instance(), &Settings::EmulationStateChanged, this,
  25. &CheatsManager::OnStateChanged);
  26. CreateWidgets();
  27. ConnectWidgets();
  28. auto& settings = Settings::GetQSettings();
  29. restoreGeometry(settings.value(QStringLiteral("cheatsmanager/geometry")).toByteArray());
  30. }
  31. CheatsManager::~CheatsManager()
  32. {
  33. auto& settings = Settings::GetQSettings();
  34. settings.setValue(QStringLiteral("cheatsmanager/geometry"), saveGeometry());
  35. }
  36. void CheatsManager::OnStateChanged(Core::State state)
  37. {
  38. RefreshCodeTabs(state);
  39. if (state == Core::State::Paused)
  40. UpdateAllCheatSearchWidgetCurrentValues();
  41. }
  42. void CheatsManager::OnFrameEnd()
  43. {
  44. if (!isVisible())
  45. return;
  46. auto* const selected_cheat_search_widget =
  47. qobject_cast<CheatSearchWidget*>(m_tab_widget->currentWidget());
  48. if (selected_cheat_search_widget != nullptr)
  49. {
  50. selected_cheat_search_widget->UpdateTableVisibleCurrentValues(
  51. CheatSearchWidget::UpdateSource::Auto);
  52. }
  53. }
  54. void CheatsManager::UpdateAllCheatSearchWidgetCurrentValues()
  55. {
  56. for (int i = 0; i < m_tab_widget->count(); ++i)
  57. {
  58. auto* const cheat_search_widget = qobject_cast<CheatSearchWidget*>(m_tab_widget->widget(i));
  59. if (cheat_search_widget != nullptr)
  60. cheat_search_widget->UpdateTableAllCurrentValues(CheatSearchWidget::UpdateSource::Auto);
  61. }
  62. }
  63. void CheatsManager::RegisterAfterFrameEventCallback()
  64. {
  65. m_VI_end_field_event = VIEndFieldEvent::Register([this] { OnFrameEnd(); }, "CheatsManager");
  66. }
  67. void CheatsManager::RemoveAfterFrameEventCallback()
  68. {
  69. m_VI_end_field_event.reset();
  70. }
  71. void CheatsManager::hideEvent(QHideEvent* event)
  72. {
  73. RemoveAfterFrameEventCallback();
  74. }
  75. void CheatsManager::showEvent(QShowEvent* event)
  76. {
  77. RegisterAfterFrameEventCallback();
  78. }
  79. void CheatsManager::RefreshCodeTabs(Core::State state)
  80. {
  81. if (state == Core::State::Starting || state == Core::State::Stopping)
  82. return;
  83. const auto& game_id = state == Core::State::Running || state == Core::State::Paused ?
  84. SConfig::GetInstance().GetGameID() :
  85. std::string();
  86. const auto& game_tdb_id = SConfig::GetInstance().GetGameTDBID();
  87. const u16 revision = SConfig::GetInstance().GetRevision();
  88. if (m_game_id == game_id && m_game_tdb_id == game_tdb_id && m_revision == revision)
  89. return;
  90. m_game_id = game_id;
  91. m_game_tdb_id = game_tdb_id;
  92. m_revision = revision;
  93. m_ar_code->ChangeGame(m_game_id, m_revision);
  94. m_gecko_code->ChangeGame(m_game_id, m_game_tdb_id, m_revision);
  95. }
  96. void CheatsManager::CreateWidgets()
  97. {
  98. m_tab_widget = new PartiallyClosableTabWidget;
  99. m_button_box = new QDialogButtonBox(QDialogButtonBox::Close);
  100. int tab_index;
  101. m_ar_code = new ARCodeWidget(m_game_id, m_revision, false);
  102. tab_index = m_tab_widget->addTab(m_ar_code, tr("AR Code"));
  103. m_tab_widget->setTabUnclosable(tab_index);
  104. m_gecko_code = new GeckoCodeWidget(m_game_id, m_game_tdb_id, m_revision, false);
  105. tab_index = m_tab_widget->addTab(m_gecko_code, tr("Gecko Codes"));
  106. m_tab_widget->setTabUnclosable(tab_index);
  107. m_cheat_search_new = new CheatSearchFactoryWidget();
  108. tab_index = m_tab_widget->addTab(m_cheat_search_new, tr("Start New Cheat Search"));
  109. m_tab_widget->setTabUnclosable(tab_index);
  110. auto* layout = new QVBoxLayout;
  111. layout->addWidget(m_tab_widget);
  112. layout->addWidget(m_button_box);
  113. setLayout(layout);
  114. }
  115. void CheatsManager::OnNewSessionCreated(const Cheats::CheatSearchSessionBase& session)
  116. {
  117. auto* w = new CheatSearchWidget(m_system, session.Clone());
  118. const int tab_index = m_tab_widget->addTab(w, tr("Cheat Search"));
  119. connect(w, &CheatSearchWidget::ActionReplayCodeGenerated, m_ar_code, &ARCodeWidget::AddCode);
  120. connect(w, &CheatSearchWidget::ShowMemory, this, &CheatsManager::ShowMemory);
  121. connect(w, &CheatSearchWidget::RequestWatch, this, &CheatsManager::RequestWatch);
  122. m_tab_widget->setCurrentIndex(tab_index);
  123. }
  124. void CheatsManager::OnTabCloseRequested(int index)
  125. {
  126. auto* w = m_tab_widget->widget(index);
  127. if (w)
  128. w->deleteLater();
  129. }
  130. void CheatsManager::ConnectWidgets()
  131. {
  132. connect(m_button_box, &QDialogButtonBox::rejected, this, &QDialog::reject);
  133. connect(m_cheat_search_new, &CheatSearchFactoryWidget::NewSessionCreated, this,
  134. &CheatsManager::OnNewSessionCreated);
  135. connect(m_tab_widget, &QTabWidget::tabCloseRequested, this, &CheatsManager::OnTabCloseRequested);
  136. connect(m_ar_code, &ARCodeWidget::OpenGeneralSettings, this, &CheatsManager::OpenGeneralSettings);
  137. connect(m_gecko_code, &GeckoCodeWidget::OpenGeneralSettings, this,
  138. &CheatsManager::OpenGeneralSettings);
  139. #ifdef USE_RETRO_ACHIEVEMENTS
  140. connect(m_ar_code, &ARCodeWidget::OpenAchievementSettings, this,
  141. &CheatsManager::OpenAchievementSettings);
  142. connect(m_gecko_code, &GeckoCodeWidget::OpenAchievementSettings, this,
  143. &CheatsManager::OpenAchievementSettings);
  144. #endif // USE_RETRO_ACHIEVEMENTS
  145. }