diff --git a/Source/Core/DolphinQt/Achievements/AchievementSettingsWidget.cpp b/Source/Core/DolphinQt/Achievements/AchievementSettingsWidget.cpp index fe83fe9146..622b2e848f 100644 --- a/Source/Core/DolphinQt/Achievements/AchievementSettingsWidget.cpp +++ b/Source/Core/DolphinQt/Achievements/AchievementSettingsWidget.cpp @@ -266,7 +266,7 @@ void AchievementSettingsWidget::ToggleHardcore() if (Config::Get(Config::MAIN_EMULATION_SPEED) < 1.0f) Config::SetBaseOrCurrent(Config::MAIN_EMULATION_SPEED, 1.0f); Config::SetBaseOrCurrent(Config::FREE_LOOK_ENABLED, false); - Settings::Instance().SetCheatsEnabled(false); + Config::SetBaseOrCurrent(Config::MAIN_ENABLE_CHEATS, false); Settings::Instance().SetDebugModeEnabled(false); } emit Settings::Instance().EmulationStateChanged(Core::GetState(Core::System::GetInstance())); diff --git a/Source/Core/DolphinQt/Settings.cpp b/Source/Core/DolphinQt/Settings.cpp index 195cf16579..ec930711a1 100644 --- a/Source/Core/DolphinQt/Settings.cpp +++ b/Source/Core/DolphinQt/Settings.cpp @@ -539,15 +539,6 @@ bool Settings::GetCheatsEnabled() const return Config::Get(Config::MAIN_ENABLE_CHEATS); } -void Settings::SetCheatsEnabled(bool enabled) -{ - if (Config::Get(Config::MAIN_ENABLE_CHEATS) != enabled) - { - Config::SetBaseOrCurrent(Config::MAIN_ENABLE_CHEATS, enabled); - emit EnableCheatsChanged(enabled); - } -} - void Settings::SetDebugModeEnabled(bool enabled) { if (AchievementManager::GetInstance().IsHardcoreModeActive()) diff --git a/Source/Core/DolphinQt/Settings.h b/Source/Core/DolphinQt/Settings.h index a1ceb0c8c5..f59e7c143b 100644 --- a/Source/Core/DolphinQt/Settings.h +++ b/Source/Core/DolphinQt/Settings.h @@ -145,7 +145,6 @@ public: // Cheats bool GetCheatsEnabled() const; - void SetCheatsEnabled(bool enabled); // Debug void SetDebugModeEnabled(bool enabled); diff --git a/Source/Core/DolphinQt/Settings/GeneralPane.cpp b/Source/Core/DolphinQt/Settings/GeneralPane.cpp index 4804c72102..55dc4f0799 100644 --- a/Source/Core/DolphinQt/Settings/GeneralPane.cpp +++ b/Source/Core/DolphinQt/Settings/GeneralPane.cpp @@ -24,8 +24,11 @@ #include "Core/PowerPC/PowerPC.h" #include "Core/System.h" +#include "DolphinQt/Config/ConfigControls/ConfigBool.h" +#include "DolphinQt/Config/ToolTipControls/ToolTipCheckBox.h" +#include "DolphinQt/Config/ToolTipControls/ToolTipComboBox.h" +#include "DolphinQt/Config/ToolTipControls/ToolTipPushButton.h" #include "DolphinQt/QtUtils/ModalMessageBox.h" -#include "DolphinQt/QtUtils/NonDefaultQPushButton.h" #include "DolphinQt/QtUtils/SetWindowDecorations.h" #include "DolphinQt/QtUtils/SignalBlocking.h" #include "DolphinQt/Settings.h" @@ -52,6 +55,7 @@ GeneralPane::GeneralPane(QWidget* parent) : QWidget(parent) { CreateLayout(); LoadConfig(); + AddDescriptions(); ConnectLayout(); @@ -97,11 +101,8 @@ void GeneralPane::OnEmulationStateChanged(Core::State state) void GeneralPane::ConnectLayout() { - connect(m_checkbox_dualcore, &QCheckBox::toggled, this, &GeneralPane::OnSaveConfig); - connect(m_checkbox_cheats, &QCheckBox::toggled, this, &GeneralPane::OnSaveConfig); - connect(m_checkbox_override_region_settings, &QCheckBox::stateChanged, this, - &GeneralPane::OnSaveConfig); - connect(m_checkbox_auto_disc_change, &QCheckBox::toggled, this, &GeneralPane::OnSaveConfig); + connect(m_checkbox_cheats, &QCheckBox::toggled, &Settings::Instance(), + &Settings::EnableCheatsChanged); #ifdef USE_DISCORD_PRESENCE connect(m_checkbox_discord_presence, &QCheckBox::toggled, this, &GeneralPane::OnSaveConfig); #endif @@ -140,20 +141,22 @@ void GeneralPane::CreateBasic() basic_group->setLayout(basic_group_layout); m_main_layout->addWidget(basic_group); - m_checkbox_dualcore = new QCheckBox(tr("Enable Dual Core (speedhack)")); + m_checkbox_dualcore = new ConfigBool(tr("Enable Dual Core (speedhack)"), Config::MAIN_CPU_THREAD); basic_group_layout->addWidget(m_checkbox_dualcore); - m_checkbox_cheats = new QCheckBox(tr("Enable Cheats")); + m_checkbox_cheats = new ConfigBool(tr("Enable Cheats"), Config::MAIN_ENABLE_CHEATS); basic_group_layout->addWidget(m_checkbox_cheats); - m_checkbox_override_region_settings = new QCheckBox(tr("Allow Mismatched Region Settings")); + m_checkbox_override_region_settings = + new ConfigBool(tr("Allow Mismatched Region Settings"), Config::MAIN_OVERRIDE_REGION_SETTINGS); basic_group_layout->addWidget(m_checkbox_override_region_settings); - m_checkbox_auto_disc_change = new QCheckBox(tr("Change Discs Automatically")); + m_checkbox_auto_disc_change = + new ConfigBool(tr("Change Discs Automatically"), Config::MAIN_AUTO_DISC_CHANGE); basic_group_layout->addWidget(m_checkbox_auto_disc_change); #ifdef USE_DISCORD_PRESENCE - m_checkbox_discord_presence = new QCheckBox(tr("Show Current Game on Discord")); + m_checkbox_discord_presence = new ToolTipCheckBox(tr("Show Current Game on Discord")); basic_group_layout->addWidget(m_checkbox_discord_presence); #endif @@ -162,7 +165,7 @@ void GeneralPane::CreateBasic() speed_limit_layout->setFieldGrowthPolicy(QFormLayout::AllNonFixedFieldsGrow); basic_group_layout->addLayout(speed_limit_layout); - m_combobox_speedlimit = new QComboBox(); + m_combobox_speedlimit = new ToolTipComboBox(); m_combobox_speedlimit->addItem(tr("Unlimited")); for (int i = 10; i <= 200; i += 10) // from 10% to 200% @@ -189,7 +192,7 @@ void GeneralPane::CreateAutoUpdate() auto_update_group_layout->setFormAlignment(Qt::AlignLeft | Qt::AlignTop); auto_update_group_layout->setFieldGrowthPolicy(QFormLayout::AllNonFixedFieldsGrow); - m_combobox_update_track = new QComboBox(this); + m_combobox_update_track = new ToolTipComboBox(); auto_update_group_layout->addRow(tr("&Auto Update:"), m_combobox_update_track); @@ -210,17 +213,11 @@ void GeneralPane::CreateFallbackRegion() fallback_region_dropdown_layout->setFieldGrowthPolicy(QFormLayout::AllNonFixedFieldsGrow); fallback_region_group_layout->addLayout(fallback_region_dropdown_layout); - m_combobox_fallback_region = new QComboBox(this); + m_combobox_fallback_region = new ToolTipComboBox(); fallback_region_dropdown_layout->addRow(tr("Fallback Region:"), m_combobox_fallback_region); for (const QString& option : {tr("NTSC-J"), tr("NTSC-U"), tr("PAL"), tr("NTSC-K")}) m_combobox_fallback_region->addItem(option); - - auto* fallback_region_description = - new QLabel(tr("Dolphin will use this for titles whose region cannot be determined " - "automatically.")); - fallback_region_description->setWordWrap(true); - fallback_region_group_layout->addWidget(fallback_region_description); } #if defined(USE_ANALYTICS) && USE_ANALYTICS @@ -231,9 +228,8 @@ void GeneralPane::CreateAnalytics() analytics_group->setLayout(analytics_group_layout); m_main_layout->addWidget(analytics_group); - m_checkbox_enable_analytics = new QCheckBox(tr("Enable Usage Statistics Reporting")); - m_button_generate_new_identity = - new NonDefaultQPushButton(tr("Generate a New Statistics Identity")); + m_checkbox_enable_analytics = new ToolTipCheckBox(tr("Enable Usage Statistics Reporting")); + m_button_generate_new_identity = new ToolTipPushButton(tr("Generate a New Statistics Identity")); analytics_group_layout->addWidget(m_checkbox_enable_analytics); analytics_group_layout->addWidget(m_button_generate_new_identity); } @@ -261,12 +257,6 @@ void GeneralPane::LoadConfig() SignalBlocking(m_checkbox_enable_analytics) ->setChecked(Settings::Instance().IsAnalyticsEnabled()); #endif - SignalBlocking(m_checkbox_dualcore)->setChecked(Config::Get(Config::MAIN_CPU_THREAD)); - SignalBlocking(m_checkbox_cheats)->setChecked(Settings::Instance().GetCheatsEnabled()); - SignalBlocking(m_checkbox_override_region_settings) - ->setChecked(Config::Get(Config::MAIN_OVERRIDE_REGION_SETTINGS)); - SignalBlocking(m_checkbox_auto_disc_change) - ->setChecked(Config::Get(Config::MAIN_AUTO_DISC_CHANGE)); #ifdef USE_DISCORD_PRESENCE SignalBlocking(m_checkbox_discord_presence) @@ -353,12 +343,6 @@ void GeneralPane::OnSaveConfig() Settings::Instance().SetAnalyticsEnabled(m_checkbox_enable_analytics->isChecked()); DolphinAnalytics::Instance().ReloadConfig(); #endif - Config::SetBaseOrCurrent(Config::MAIN_CPU_THREAD, m_checkbox_dualcore->isChecked()); - Settings::Instance().SetCheatsEnabled(m_checkbox_cheats->isChecked()); - Config::SetBaseOrCurrent(Config::MAIN_OVERRIDE_REGION_SETTINGS, - m_checkbox_override_region_settings->isChecked()); - Config::SetBase(Config::MAIN_AUTO_DISC_CHANGE, m_checkbox_auto_disc_change->isChecked()); - Config::SetBaseOrCurrent(Config::MAIN_ENABLE_CHEATS, m_checkbox_cheats->isChecked()); Settings::Instance().SetFallbackRegion( UpdateFallbackRegionFromIndex(m_combobox_fallback_region->currentIndex())); @@ -378,3 +362,105 @@ void GeneralPane::GenerateNewIdentity() message_box.exec(); } #endif + +void GeneralPane::AddDescriptions() +{ + static constexpr char TR_DUALCORE_DESCRIPTION[] = + QT_TR_NOOP("Separates CPU and GPU emulation work to separate threads. Reduces single-thread " + "burden by spreading Dolphin's heaviest load across two cores, which usually " + "improves performance. However, it can result in glitches and crashes." + "

This setting cannot be changed while emulation is active." + "

If unsure, leave this checked."); + static constexpr char TR_CHEATS_DESCRIPTION[] = QT_TR_NOOP( + "Enables the use of AR and Gecko cheat codes which can be used to modify games' behavior. " + "These codes can be configured with the Cheats Manager in the Tools menu." + "

This setting cannot be changed while emulation is active." + "

If unsure, leave this unchecked."); + static constexpr char TR_OVERRIDE_REGION_SETTINGS_DESCRIPTION[] = + QT_TR_NOOP("Lets you use languages and other region-related settings that the game may not " + "be designed for. May cause various crashes and bugs." + "

This setting cannot be changed while emulation is active." + "

If unsure, leave this unchecked."); + static constexpr char TR_AUTO_DISC_CHANGE_DESCRIPTION[] = QT_TR_NOOP( + "Automatically changes the game disc when requested by games with two discs. This feature " + "requires the game to be launched in one of the following ways:" + "
- From the game list, with both discs being present in the game list." + "
- With File > Open or the command line interface, with the paths to both discs being " + "provided." + "
- By launching an M3U file with File > Open or the command line interface." + "

If unsure, leave this unchecked."); +#ifdef USE_DISCORD_PRESENCE + static constexpr char TR_DISCORD_PRESENCE_DESCRIPTION[] = + QT_TR_NOOP("Shows which game is active and the duration of your current play session in your " + "Discord status." + "

This setting cannot be changed while emulation is active." + "

If unsure, leave this checked."); +#endif + static constexpr char TR_SPEEDLIMIT_DESCRIPTION[] = QT_TR_NOOP( + "Sets the maximum time scale of emulation. Values higher than 100% will accelerate emulated " + "time by processing faster than the original hardware, while values lower than 100% will " + "slow emulated time. Unlimited will emulate as fast as your host hardware can run." + "

Higher speeds are proportionally more costly to emulate. Depending on the title, " + "your settings, and your host hardware, some of these values may not be sustainable." + "

If unsure, select 100%."); + static constexpr char TR_UPDATE_TRACK_DESCRIPTION[] = QT_TR_NOOP( + "Selects which update track Dolphin uses when checking for updates at startup. If a new " + "update is available, Dolphin will show a list of changes made since your current version " + "and ask you if you want to update." + "

The Dev track has the latest version of Dolphin which often updates multiple times " + "per day. Select this track if you want the newest features and fixes." + "

The Releases track has an update every few months. Some reasons you might prefer to " + "use this track:" + "
- You prefer using versions that have had additional testing." + "
- NetPlay requires players to have the same Dolphin version, and the latest Release " + "version will have the most players to match with." + "
- You frequently use Dolphin's savestate system, which doesn't guarantee backward " + "compatibility of savestates between Dolphin versions. If this applies to you, make sure you " + "make an in-game save before updating (i.e. save your game in the same way you would on a " + "physical GameCube or Wii), then load the in-game save after updating Dolphin and before " + "making any new savestates." + "

Selecting \"Don't Update\" will prevent Dolphin from automatically checking for " + "updates." + "

If unsure, select Releases."); + static constexpr char TR_FALLBACK_REGION_DESCRIPTION[] = + QT_TR_NOOP("Sets the region used for titles whose region cannot be determined automatically." + "

This setting cannot be changed while emulation is active."); + static constexpr char TR_ENABLE_ANALYTICS_DESCRIPTION[] = QT_TR_NOOP( + "If selected, Dolphin can collect data on its performance, feature usage, emulated games, " + "and configuration, as well as data on your system's hardware and operating system." + "

No private data is ever collected. This data helps us understand how people and " + "emulated games use Dolphin and prioritize our efforts. It also helps us identify rare " + "configurations that are causing bugs, performance and stability issues."); + static constexpr char TR_GENERATE_NEW_IDENTITY_DESCRIPTION[] = + QT_TR_NOOP("Generate a new anonymous ID for your usage statistics. This will cause any " + "future statistics to be unassociated with your previous statistics."); + + m_checkbox_dualcore->SetDescription(tr(TR_DUALCORE_DESCRIPTION)); + + m_checkbox_cheats->SetDescription(tr(TR_CHEATS_DESCRIPTION)); + + m_checkbox_override_region_settings->SetDescription(tr(TR_OVERRIDE_REGION_SETTINGS_DESCRIPTION)); + + m_checkbox_auto_disc_change->SetDescription(tr(TR_AUTO_DISC_CHANGE_DESCRIPTION)); + +#ifdef USE_DISCORD_PRESENCE + m_checkbox_discord_presence->SetDescription(tr(TR_DISCORD_PRESENCE_DESCRIPTION)); +#endif + + m_combobox_speedlimit->SetTitle(tr("Speed Limit")); + m_combobox_speedlimit->SetDescription(tr(TR_SPEEDLIMIT_DESCRIPTION)); + + if (AutoUpdateChecker::SystemSupportsAutoUpdates()) + { + m_combobox_update_track->SetTitle(tr("Auto Update")); + m_combobox_update_track->SetDescription(tr(TR_UPDATE_TRACK_DESCRIPTION)); + } + + m_combobox_fallback_region->SetTitle(tr("Fallback Region")); + m_combobox_fallback_region->SetDescription(tr(TR_FALLBACK_REGION_DESCRIPTION)); + + m_checkbox_enable_analytics->SetDescription(tr(TR_ENABLE_ANALYTICS_DESCRIPTION)); + + m_button_generate_new_identity->SetTitle(tr("Generate a New Statistics Identity")); + m_button_generate_new_identity->SetDescription(tr(TR_GENERATE_NEW_IDENTITY_DESCRIPTION)); +} diff --git a/Source/Core/DolphinQt/Settings/GeneralPane.h b/Source/Core/DolphinQt/Settings/GeneralPane.h index 476cc67510..ffe850491b 100644 --- a/Source/Core/DolphinQt/Settings/GeneralPane.h +++ b/Source/Core/DolphinQt/Settings/GeneralPane.h @@ -5,6 +5,7 @@ #include +class ConfigBool; class QCheckBox; class QComboBox; class QLabel; @@ -12,6 +13,9 @@ class QPushButton; class QRadioButton; class QSlider; class QVBoxLayout; +class ToolTipCheckBox; +class ToolTipComboBox; +class ToolTipPushButton; namespace Core { @@ -30,6 +34,7 @@ private: void CreateBasic(); void CreateAutoUpdate(); void CreateFallbackRegion(); + void AddDescriptions(); void LoadConfig(); void OnSaveConfig(); @@ -37,24 +42,23 @@ private: // Widgets QVBoxLayout* m_main_layout; - QComboBox* m_combobox_speedlimit; - QComboBox* m_combobox_update_track; - QComboBox* m_combobox_fallback_region; - QCheckBox* m_checkbox_dualcore; - QCheckBox* m_checkbox_cheats; - QCheckBox* m_checkbox_override_region_settings; - QCheckBox* m_checkbox_auto_disc_change; + ToolTipComboBox* m_combobox_speedlimit; + ToolTipComboBox* m_combobox_update_track; + ToolTipComboBox* m_combobox_fallback_region; + ConfigBool* m_checkbox_dualcore; + ConfigBool* m_checkbox_cheats; + ConfigBool* m_checkbox_override_region_settings; + ConfigBool* m_checkbox_auto_disc_change; #ifdef USE_DISCORD_PRESENCE - QCheckBox* m_checkbox_discord_presence; + ToolTipCheckBox* m_checkbox_discord_presence; #endif - QLabel* m_label_speedlimit; // Analytics related #if defined(USE_ANALYTICS) && USE_ANALYTICS void CreateAnalytics(); void GenerateNewIdentity(); - QPushButton* m_button_generate_new_identity; - QCheckBox* m_checkbox_enable_analytics; + ToolTipPushButton* m_button_generate_new_identity; + ToolTipCheckBox* m_checkbox_enable_analytics; #endif };