duckstation

duckstation, but archived from the revision just before upstream changed it to a proprietary software project, this version is the libre one
git clone https://git.neptards.moe/u3shit/duckstation.git
Log | Files | Refs | README | LICENSE

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 };