settingswindow.h (6717B)
1 // SPDX-FileCopyrightText: 2019-2024 Connor McLaughlin <stenzek@gmail.com> 2 // SPDX-License-Identifier: (GPL-3.0 OR CC-BY-NC-ND-4.0) 3 4 #pragma once 5 #include "ui_settingswindow.h" 6 7 #include "util/ini_settings_interface.h" 8 9 #include "common/types.h" 10 11 #include <QtCore/QMap> 12 #include <QtCore/QString> 13 #include <QtWidgets/QDialog> 14 #include <array> 15 16 class QWheelEvent; 17 18 enum class DiscRegion : u8; 19 20 namespace GameDatabase { 21 enum class Trait : u32; 22 struct Entry; 23 } // namespace GameDatabase 24 25 class InterfaceSettingsWidget; 26 class BIOSSettingsWidget; 27 class GameListSettingsWidget; 28 class ConsoleSettingsWidget; 29 class EmulationSettingsWidget; 30 class MemoryCardSettingsWidget; 31 class GraphicsSettingsWidget; 32 class PostProcessingSettingsWidget; 33 class AudioSettingsWidget; 34 class AchievementSettingsWidget; 35 class FolderSettingsWidget; 36 class AdvancedSettingsWidget; 37 38 class SettingsWindow final : public QWidget 39 { 40 Q_OBJECT 41 42 public: 43 SettingsWindow(); 44 SettingsWindow(const std::string& path, const std::string& serial, DiscRegion region, 45 const GameDatabase::Entry* entry, std::unique_ptr<INISettingsInterface> sif); 46 ~SettingsWindow(); 47 48 static void openGamePropertiesDialog(const std::string& path, const std::string& title, const std::string& serial, 49 DiscRegion region); 50 static void closeGamePropertiesDialogs(); 51 52 // Helper for externally setting fields in game settings ini. 53 static bool setGameSettingsBoolForSerial(const std::string& serial, const char* section, const char* key, bool value); 54 55 int getCategoryRow() const; 56 57 ALWAYS_INLINE bool isPerGameSettings() const { return static_cast<bool>(m_sif); } 58 ALWAYS_INLINE INISettingsInterface* getSettingsInterface() const { return m_sif.get(); } 59 60 ALWAYS_INLINE InterfaceSettingsWidget* getInterfaceSettingsWidget() const { return m_interface_settings; } 61 ALWAYS_INLINE BIOSSettingsWidget* getBIOSSettingsWidget() const { return m_bios_settings; } 62 ALWAYS_INLINE ConsoleSettingsWidget* getConsoleSettingsWidget() const { return m_console_settings; } 63 ALWAYS_INLINE EmulationSettingsWidget* getEmulationSettingsWidget() const { return m_emulation_settings; } 64 ALWAYS_INLINE GameListSettingsWidget* getGameListSettingsWidget() const { return m_game_list_settings; } 65 ALWAYS_INLINE MemoryCardSettingsWidget* getMemoryCardSettingsWidget() const { return m_memory_card_settings; } 66 ALWAYS_INLINE GraphicsSettingsWidget* getGraphicsSettingsWidget() const { return m_graphics_settings; } 67 ALWAYS_INLINE AudioSettingsWidget* getAudioSettingsWidget() const { return m_audio_settings; } 68 ALWAYS_INLINE AchievementSettingsWidget* getAchievementSettingsWidget() const { return m_achievement_settings; } 69 ALWAYS_INLINE AdvancedSettingsWidget* getAdvancedSettingsWidget() const { return m_advanced_settings; } 70 ALWAYS_INLINE FolderSettingsWidget* getFolderSettingsWidget() const { return m_folder_settings; } 71 ALWAYS_INLINE PostProcessingSettingsWidget* getPostProcessingSettingsWidget() { return m_post_processing_settings; } 72 73 void registerWidgetHelp(QObject* object, QString title, QString recommended_value, QString text); 74 bool eventFilter(QObject* object, QEvent* event) override; 75 76 // Helper functions for reading effective setting values (from game -> global settings). 77 bool getEffectiveBoolValue(const char* section, const char* key, bool default_value) const; 78 int getEffectiveIntValue(const char* section, const char* key, int default_value) const; 79 float getEffectiveFloatValue(const char* section, const char* key, float default_value) const; 80 std::string getEffectiveStringValue(const char* section, const char* key, const char* default_value) const; 81 Qt::CheckState getCheckState(const char* section, const char* key, bool default_value); 82 83 // Helper functions for reading setting values for this layer (game settings or global). 84 std::optional<bool> getBoolValue(const char* section, const char* key, std::optional<bool> default_value) const; 85 std::optional<int> getIntValue(const char* section, const char* key, std::optional<int> default_value) const; 86 std::optional<float> getFloatValue(const char* section, const char* key, std::optional<float> default_value) const; 87 std::optional<std::string> getStringValue(const char* section, const char* key, 88 std::optional<const char*> default_value) const; 89 void setBoolSettingValue(const char* section, const char* key, std::optional<bool> value); 90 void setIntSettingValue(const char* section, const char* key, std::optional<int> value); 91 void setFloatSettingValue(const char* section, const char* key, std::optional<float> value); 92 void setStringSettingValue(const char* section, const char* key, std::optional<const char*> value); 93 bool containsSettingValue(const char* section, const char* key) const; 94 void removeSettingValue(const char* section, const char* key); 95 void saveAndReloadGameSettings(); 96 void reloadGameSettingsFromIni(); 97 98 bool hasGameTrait(GameDatabase::Trait trait); 99 100 Q_SIGNALS: 101 void settingsResetToDefaults(); 102 103 public Q_SLOTS: 104 void setCategory(const char* category); 105 void setCategoryRow(int index); 106 107 private Q_SLOTS: 108 void onCategoryCurrentRowChanged(int row); 109 void onRestoreDefaultsClicked(); 110 void onCopyGlobalSettingsClicked(); 111 void onClearSettingsClicked(); 112 113 protected: 114 void closeEvent(QCloseEvent* event) override; 115 void wheelEvent(QWheelEvent* event) override; 116 117 private: 118 enum : u32 119 { 120 MAX_SETTINGS_WIDGETS = 12 121 }; 122 123 void connectUi(); 124 void addPages(); 125 void reloadPages(); 126 127 void addWidget(QWidget* widget, QString title, QString icon, QString help_text); 128 bool handleWheelEvent(QWheelEvent* event); 129 130 Ui::SettingsWindow m_ui; 131 132 std::unique_ptr<INISettingsInterface> m_sif; 133 const GameDatabase::Entry* m_database_entry = nullptr; 134 135 InterfaceSettingsWidget* m_interface_settings = nullptr; 136 BIOSSettingsWidget* m_bios_settings = nullptr; 137 ConsoleSettingsWidget* m_console_settings = nullptr; 138 EmulationSettingsWidget* m_emulation_settings = nullptr; 139 GameListSettingsWidget* m_game_list_settings = nullptr; 140 MemoryCardSettingsWidget* m_memory_card_settings = nullptr; 141 GraphicsSettingsWidget* m_graphics_settings = nullptr; 142 PostProcessingSettingsWidget* m_post_processing_settings = nullptr; 143 AudioSettingsWidget* m_audio_settings = nullptr; 144 AchievementSettingsWidget* m_achievement_settings = nullptr; 145 FolderSettingsWidget* m_folder_settings = nullptr; 146 AdvancedSettingsWidget* m_advanced_settings = nullptr; 147 148 std::array<QString, MAX_SETTINGS_WIDGETS> m_category_help_text; 149 150 QObject* m_current_help_widget = nullptr; 151 QMap<QObject*, QString> m_widget_help_text_map; 152 153 std::string m_game_list_filename; 154 };