From 12f0f59453752181291e04c4e13453ea24a5d567 Mon Sep 17 00:00:00 2001 From: BruebachL <44814898+BruebachL@users.noreply.github.com> Date: Mon, 27 Jul 2026 11:25:39 +0200 Subject: [PATCH] [Settings] Split cache_settings monolith into multiple SettingsManager sub-classes (#7050) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [Settings] Split cache_settings into multiple files Took 9 minutes Took 4 minutes * [Settings] Fwd declare settings classes in cache_settings Took 15 minutes * Fix oracle includes. Took 8 minutes * Address comments, fix windows CI Took 8 minutes * fix copy constructor visibility Took 3 minutes * lint Took 2 minutes * Fix native format tests. Took 5 minutes * Remove test header guard Took 4 seconds * Remove tests invalid in CI environ Took 24 seconds * Adjust to rebase. Took 11 minutes * Change settings file name. Took 8 minutes --------- Co-authored-by: Lukas Brübach Co-authored-by: Lukas Brübach --- .../remote_connection_controller.cpp | 1 + .../spoiler_background_updater.cpp | 8 +- .../src/client/settings/cache_settings.cpp | 1581 +++-------------- .../src/client/settings/cache_settings.h | 1195 +------------ cockatrice/src/client/sound_engine.cpp | 20 +- .../settings_card_database_path_provider.h | 41 + .../settings_card_preference_provider.h | 4 +- cockatrice/src/game/player/player_actions.cpp | 12 +- cockatrice/src/game/zones/view_zone_logic.cpp | 5 +- .../board/abstract_card_drag_item.cpp | 15 +- .../board/abstract_card_item.cpp | 28 +- .../game_graphics/board/abstract_counter.cpp | 1 + .../src/game_graphics/board/arrow_item.cpp | 3 +- .../src/game_graphics/board/card_item.cpp | 12 +- .../src/game_graphics/deckview/deck_view.cpp | 13 +- .../deckview/deck_view_container.cpp | 8 +- .../dialogs/dlg_create_token.cpp | 5 +- cockatrice/src/game_graphics/game_scene.cpp | 5 +- cockatrice/src/game_graphics/game_view.cpp | 15 +- .../game_graphics/player/menu/card_menu.cpp | 1 + .../game_graphics/player/menu/grave_menu.cpp | 1 + .../game_graphics/player/menu/move_menu.cpp | 1 + .../game_graphics/player/menu/player_menu.cpp | 1 + .../game_graphics/player/menu/player_menu.h | 1 + .../src/game_graphics/player/menu/pt_menu.cpp | 1 + .../game_graphics/player/menu/say_menu.cpp | 1 + .../player/menu/sideboard_menu.cpp | 1 + .../game_graphics/player/menu/tally_menu.cpp | 6 +- .../player/menu/utility_menu.cpp | 1 + .../player/player_graphics_item.cpp | 13 +- .../src/game_graphics/zones/hand_zone.cpp | 11 +- .../src/game_graphics/zones/pile_zone.cpp | 16 +- .../src/game_graphics/zones/select_zone.cpp | 3 +- .../src/game_graphics/zones/table_zone.cpp | 7 +- .../game_graphics/zones/view_zone_widget.cpp | 23 +- .../card_picture_loader.cpp | 21 +- .../card_picture_loader_local.cpp | 11 +- .../card_picture_loader_worker.cpp | 33 +- .../card_picture_loader_worker_work.cpp | 7 +- .../card_picture_to_load.cpp | 4 +- cockatrice/src/interface/theme_manager.cpp | 3 +- .../additional_info/color_identity_widget.cpp | 6 +- .../additional_info/mana_symbol_widget.cpp | 10 +- .../widgets/cards/card_info_frame_widget.cpp | 5 +- .../card_info_picture_enlarged_widget.cpp | 13 +- .../cards/card_info_picture_widget.cpp | 16 +- .../deck_preview_card_picture_widget.cpp | 4 +- .../deck_editor/card_database_view.cpp | 1 + .../deck_editor_deck_dock_widget.cpp | 27 +- .../deck_editor_filter_dock_widget.cpp | 1 + ...k_editor_printing_selector_dock_widget.cpp | 6 +- .../interface/widgets/dialogs/dlg_connect.cpp | 1 + .../widgets/dialogs/dlg_create_game.cpp | 53 +- .../dialogs/dlg_default_tags_editor.cpp | 5 +- .../widgets/dialogs/dlg_edit_password.cpp | 1 + .../dialogs/dlg_forgot_password_challenge.cpp | 1 + .../dialogs/dlg_forgot_password_request.cpp | 1 + .../dialogs/dlg_forgot_password_reset.cpp | 1 + .../widgets/dialogs/dlg_load_deck.cpp | 4 +- .../dialogs/dlg_load_deck_from_clipboard.cpp | 1 + .../dialogs/dlg_local_game_options.cpp | 13 +- .../widgets/dialogs/dlg_manage_sets.cpp | 7 +- .../widgets/dialogs/dlg_register.cpp | 1 + .../widgets/dialogs/dlg_settings.cpp | 12 +- .../dialogs/dlg_startup_card_check.cpp | 3 +- .../widgets/dialogs/dlg_tip_of_the_day.cpp | 13 +- .../widgets/dialogs/dlg_view_log.cpp | 2 + .../dialogs/override_printing_warning.cpp | 3 +- .../interface/widgets/general/home_widget.cpp | 27 +- .../widgets/menus/deck_editor_menu.cpp | 1 + .../interface/widgets/menus/tearoff_menu.h | 9 +- .../printing_selector/printing_selector.cpp | 24 +- .../printing_selector_card_overlay_widget.cpp | 1 + .../printing_selector_card_sorting_widget.cpp | 9 +- .../widgets/replay/replay_manager.cpp | 3 +- .../replay/replay_quick_settings_widget.cpp | 9 +- .../widgets/replay/replay_timeline_widget.cpp | 3 +- .../widgets/server/chat_view/chat_view.cpp | 28 +- .../widgets/server/game_selector.cpp | 11 +- .../interface/widgets/server/games_model.cpp | 1 + .../widgets/server/handle_public_servers.cpp | 1 + .../server/user/user_info_connection.cpp | 1 + .../widgets/server/user/user_list_widget.cpp | 14 +- .../appearance_settings_page.cpp | 119 +- .../deck_editor_settings_page.cpp | 21 +- .../settings_page/general_settings_page.cpp | 76 +- .../settings_page/messages_settings_page.cpp | 82 +- .../settings_page/shortcut_settings_page.cpp | 5 +- .../settings_page/sound_settings_page.cpp | 27 +- .../settings_page/storage_settings_page.cpp | 40 +- .../user_interface_settings_page.cpp | 145 +- .../widgets/tabs/abstract_tab_deck_editor.cpp | 8 +- .../tabs/api/archidekt/tab_archidekt.cpp | 8 +- .../tabs/api/edhrec/tab_edhrec_main.cpp | 8 +- .../widgets/tabs/tab_deck_editor.cpp | 6 +- .../widgets/tabs/tab_deck_storage.cpp | 3 +- .../src/interface/widgets/tabs/tab_game.cpp | 15 +- .../interface/widgets/tabs/tab_message.cpp | 3 +- .../interface/widgets/tabs/tab_replays.cpp | 3 +- .../src/interface/widgets/tabs/tab_room.cpp | 12 +- .../interface/widgets/tabs/tab_supervisor.cpp | 43 +- .../tab_deck_editor_visual.cpp | 2 + .../widgets/utility/sequence_edit.cpp | 1 + ...tabase_display_filter_save_load_widget.cpp | 7 +- ...ual_database_display_set_filter_widget.cpp | 26 +- .../visual_database_display_widget.cpp | 8 +- .../visual_database_filter_display_widget.cpp | 3 +- .../visual_deck_editor_sample_hand_widget.cpp | 7 +- .../visual_deck_editor_widget.cpp | 8 +- .../deck_preview_deck_tags_display_widget.cpp | 17 +- .../deck_preview/deck_preview_tag_dialog.cpp | 8 +- .../deck_preview/deck_preview_widget.cpp | 18 +- ...ual_deck_storage_folder_display_widget.cpp | 3 +- ...ual_deck_storage_quick_settings_widget.cpp | 69 +- .../visual_deck_storage_search_widget.cpp | 3 +- .../visual_deck_storage_sort_widget.cpp | 5 +- .../visual_deck_storage_widget.cpp | 14 +- cockatrice/src/interface/window_main.cpp | 75 +- cockatrice/src/main.cpp | 12 +- libcockatrice_interfaces/CMakeLists.txt | 11 + ...nterface_cache_storage_settings_provider.h | 14 + ...nterface_cards_display_settings_provider.h | 28 + .../interface_chat_settings_provider.h | 26 + .../interface_game_settings_provider.h | 29 + .../interface_interface_settings_provider.h | 43 + .../interface_paths_settings_provider.h | 24 + .../interface_personal_settings_provider.h | 30 + .../interface_sound_settings_provider.h | 16 + .../interface_tabs_settings_provider.h | 18 + .../interface_updates_settings_provider.h | 23 + ...ce_visual_deck_storage_settings_provider.h | 37 + libcockatrice_settings/CMakeLists.txt | 24 + .../settings/cache_storage_settings.cpp | 62 + .../settings/cache_storage_settings.h | 57 + .../settings/cards_display_settings.cpp | 193 ++ .../settings/cards_display_settings.h | 68 + .../libcockatrice/settings/chat_settings.cpp | 137 ++ .../libcockatrice/settings/chat_settings.h | 52 + .../libcockatrice/settings/game_settings.cpp | 166 ++ .../libcockatrice/settings/game_settings.h | 55 + .../settings/interface_settings.cpp | 317 ++++ .../settings/interface_settings.h | 91 + .../libcockatrice/settings/paths_settings.cpp | 120 ++ .../libcockatrice/settings/paths_settings.h | 47 + .../settings/personal_settings.cpp | 173 ++ .../settings/personal_settings.h | 65 + .../settings/settings_manager.cpp | 46 +- .../libcockatrice/settings/settings_manager.h | 2 + .../settings/settings_migration.cpp | 519 ++++++ .../settings/settings_migration.h | 13 + .../libcockatrice/settings/sound_settings.cpp | 39 + .../libcockatrice/settings/sound_settings.h | 34 + .../libcockatrice/settings/tabs_settings.cpp | 76 + .../libcockatrice/settings/tabs_settings.h | 37 + .../settings/updates_settings.cpp | 104 ++ .../libcockatrice/settings/updates_settings.h | 43 + .../settings/visual_deck_storage_settings.cpp | 348 ++++ .../settings/visual_deck_storage_settings.h | 91 + oracle/src/main.cpp | 3 +- oracle/src/oraclewizard.cpp | 3 +- oracle/src/pages.cpp | 3 +- tests/CMakeLists.txt | 1 + tests/settings/CMakeLists.txt | 26 + tests/settings/settings_defaults_test.cpp | 355 ++++ tests/settings/settings_manager_test.cpp | 171 ++ tests/settings/settings_migration_test.cpp | 413 +++++ 166 files changed, 5589 insertions(+), 3066 deletions(-) create mode 100644 cockatrice/src/database/interface/settings_card_database_path_provider.h create mode 100644 libcockatrice_interfaces/libcockatrice/interfaces/interface_cache_storage_settings_provider.h create mode 100644 libcockatrice_interfaces/libcockatrice/interfaces/interface_cards_display_settings_provider.h create mode 100644 libcockatrice_interfaces/libcockatrice/interfaces/interface_chat_settings_provider.h create mode 100644 libcockatrice_interfaces/libcockatrice/interfaces/interface_game_settings_provider.h create mode 100644 libcockatrice_interfaces/libcockatrice/interfaces/interface_interface_settings_provider.h create mode 100644 libcockatrice_interfaces/libcockatrice/interfaces/interface_paths_settings_provider.h create mode 100644 libcockatrice_interfaces/libcockatrice/interfaces/interface_personal_settings_provider.h create mode 100644 libcockatrice_interfaces/libcockatrice/interfaces/interface_sound_settings_provider.h create mode 100644 libcockatrice_interfaces/libcockatrice/interfaces/interface_tabs_settings_provider.h create mode 100644 libcockatrice_interfaces/libcockatrice/interfaces/interface_updates_settings_provider.h create mode 100644 libcockatrice_interfaces/libcockatrice/interfaces/interface_visual_deck_storage_settings_provider.h create mode 100644 libcockatrice_settings/libcockatrice/settings/cache_storage_settings.cpp create mode 100644 libcockatrice_settings/libcockatrice/settings/cache_storage_settings.h create mode 100644 libcockatrice_settings/libcockatrice/settings/cards_display_settings.cpp create mode 100644 libcockatrice_settings/libcockatrice/settings/cards_display_settings.h create mode 100644 libcockatrice_settings/libcockatrice/settings/chat_settings.cpp create mode 100644 libcockatrice_settings/libcockatrice/settings/chat_settings.h create mode 100644 libcockatrice_settings/libcockatrice/settings/game_settings.cpp create mode 100644 libcockatrice_settings/libcockatrice/settings/game_settings.h create mode 100644 libcockatrice_settings/libcockatrice/settings/interface_settings.cpp create mode 100644 libcockatrice_settings/libcockatrice/settings/interface_settings.h create mode 100644 libcockatrice_settings/libcockatrice/settings/paths_settings.cpp create mode 100644 libcockatrice_settings/libcockatrice/settings/paths_settings.h create mode 100644 libcockatrice_settings/libcockatrice/settings/personal_settings.cpp create mode 100644 libcockatrice_settings/libcockatrice/settings/personal_settings.h create mode 100644 libcockatrice_settings/libcockatrice/settings/settings_migration.cpp create mode 100644 libcockatrice_settings/libcockatrice/settings/settings_migration.h create mode 100644 libcockatrice_settings/libcockatrice/settings/sound_settings.cpp create mode 100644 libcockatrice_settings/libcockatrice/settings/sound_settings.h create mode 100644 libcockatrice_settings/libcockatrice/settings/tabs_settings.cpp create mode 100644 libcockatrice_settings/libcockatrice/settings/tabs_settings.h create mode 100644 libcockatrice_settings/libcockatrice/settings/updates_settings.cpp create mode 100644 libcockatrice_settings/libcockatrice/settings/updates_settings.h create mode 100644 libcockatrice_settings/libcockatrice/settings/visual_deck_storage_settings.cpp create mode 100644 libcockatrice_settings/libcockatrice/settings/visual_deck_storage_settings.h create mode 100644 tests/settings/CMakeLists.txt create mode 100644 tests/settings/settings_defaults_test.cpp create mode 100644 tests/settings/settings_manager_test.cpp create mode 100644 tests/settings/settings_migration_test.cpp diff --git a/cockatrice/src/client/network/connection_controller/remote_connection_controller.cpp b/cockatrice/src/client/network/connection_controller/remote_connection_controller.cpp index 75cedcafc..4e425fb66 100644 --- a/cockatrice/src/client/network/connection_controller/remote_connection_controller.cpp +++ b/cockatrice/src/client/network/connection_controller/remote_connection_controller.cpp @@ -14,6 +14,7 @@ #include #include #include +#include ConnectionController::ConnectionController(QWidget *dialogParent, QObject *parent) : QObject(parent), dialogParent(dialogParent) diff --git a/cockatrice/src/client/network/update/card_spoiler/spoiler_background_updater.cpp b/cockatrice/src/client/network/update/card_spoiler/spoiler_background_updater.cpp index 7194c46e5..480ff701d 100644 --- a/cockatrice/src/client/network/update/card_spoiler/spoiler_background_updater.cpp +++ b/cockatrice/src/client/network/update/card_spoiler/spoiler_background_updater.cpp @@ -14,6 +14,8 @@ #include #include #include +#include +#include #include #define SPOILERS_STATUS_URL "https://raw.githubusercontent.com/Cockatrice/Magic-Spoiler/files/SpoilerSeasonEnabled" @@ -21,7 +23,7 @@ SpoilerBackgroundUpdater::SpoilerBackgroundUpdater(QObject *apParent) : QObject(apParent), cardUpdateProcess(nullptr) { - isSpoilerDownloadEnabled = SettingsCache::instance().getDownloadSpoilersStatus(); + isSpoilerDownloadEnabled = SettingsCache::instance().personal().getDownloadSpoilersStatus(); if (isSpoilerDownloadEnabled) { // Start the process of checking if we're in spoiler season // File exists means we're in spoiler season @@ -75,7 +77,7 @@ void SpoilerBackgroundUpdater::actDownloadFinishedSpoilersFile() bool SpoilerBackgroundUpdater::deleteSpoilerFile() { - QString fileName = SettingsCache::instance().getSpoilerCardDatabasePath(); + QString fileName = SettingsCache::instance().paths().getSpoilerCardDatabasePath(); QFileInfo fi(fileName); QDir fileDir(fi.path()); QFile file(fileName); @@ -126,7 +128,7 @@ void SpoilerBackgroundUpdater::actCheckIfSpoilerSeasonEnabled() bool SpoilerBackgroundUpdater::saveDownloadedFile(QByteArray data) { - QString fileName = SettingsCache::instance().getSpoilerCardDatabasePath(); + QString fileName = SettingsCache::instance().paths().getSpoilerCardDatabasePath(); QFileInfo fi(fileName); QDir fileDir(fi.path()); diff --git a/cockatrice/src/client/settings/cache_settings.cpp b/cockatrice/src/client/settings/cache_settings.cpp index ffbd23718..4f36bbb3b 100644 --- a/cockatrice/src/client/settings/cache_settings.cpp +++ b/cockatrice/src/client/settings/cache_settings.cpp @@ -1,20 +1,37 @@ #include "cache_settings.h" -#include "../../interface/card_picture_loader/card_picture_loader_cache_method.h" -#include "../../interface/card_picture_loader/card_picture_loader_local_schemes.h" #include "../network/update/client/release_channel.h" #include "card_counter_settings.h" +#include "shortcuts_settings.h" #include "version_string.h" -#include -#include #include #include #include #include #include #include +#include +#include #include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include Q_GLOBAL_STATIC(SettingsCache, settingsCache) @@ -52,104 +69,6 @@ QString SettingsCache::getNetworkCachePath() const return getCachePath() + "/downloaded/"; } -void SettingsCache::translateLegacySettings() -{ - if (isPortableBuild) { - return; - } - - // Layouts - QFile layoutFile(getSettingsPath() + "layouts/deckLayout.ini"); - if (layoutFile.exists()) { - if (layoutFile.copy(getSettingsPath() + "layouts.ini")) { - layoutFile.remove(); - } - } - - QStringList usedKeys; - QSettings legacySetting; - - // Sets - legacySetting.beginGroup("sets"); - QStringList setsGroups = legacySetting.childGroups(); - for (int i = 0; i < setsGroups.size(); i++) { - legacySetting.beginGroup(setsGroups.at(i)); - cardDatabase()->setEnabled(setsGroups.at(i), legacySetting.value("enabled").toBool()); - cardDatabase()->setIsKnown(setsGroups.at(i), legacySetting.value("isknown").toBool()); - cardDatabase()->setSortKey(setsGroups.at(i), legacySetting.value("sortkey").toUInt()); - legacySetting.endGroup(); - } - QStringList setsKeys = legacySetting.allKeys(); - for (int i = 0; i < setsKeys.size(); ++i) { - usedKeys.append("sets/" + setsKeys.at(i)); - } - legacySetting.endGroup(); - - // Servers - legacySetting.beginGroup("server"); - servers().setPreviousHostLogin(legacySetting.value("previoushostlogin").toInt()); - servers().setPreviousHostList(legacySetting.value("previoushosts").toStringList()); - servers().setAutoConnect(legacySetting.value("auto_connect").toInt()); - servers().setFPHostName(legacySetting.value("fphostname").toString()); - servers().setFPPort(legacySetting.value("fpport").toString()); - servers().setFPPlayerName(legacySetting.value("fpplayername").toString()); - usedKeys.append(legacySetting.allKeys()); - QStringList allKeysServer = legacySetting.allKeys(); - for (int i = 0; i < allKeysServer.size(); ++i) { - usedKeys.append("server/" + allKeysServer.at(i)); - } - legacySetting.endGroup(); - - // Messages - legacySetting.beginGroup("messages"); - QStringList allMessages = legacySetting.allKeys(); - for (int i = 0; i < allMessages.size(); ++i) { - if (allMessages.at(i) != "count") { - QString temp = allMessages.at(i); - int index = temp.remove("msg").toInt(); - messages().setMessageAt(index, legacySetting.value(allMessages.at(i)).toString()); - } - } - messages().setCount(legacySetting.value("count").toInt()); - QStringList allKeysmessages = legacySetting.allKeys(); - for (int i = 0; i < allKeysmessages.size(); ++i) { - usedKeys.append("messages/" + allKeysmessages.at(i)); - } - legacySetting.endGroup(); - - // Game filters - legacySetting.beginGroup("filter_games"); - gameFilters().setGameNameFilter(legacySetting.value("game_name_filter").toString()); - gameFilters().setHideIgnoredUserGames(legacySetting.value("hide_ignored_user_games").toBool()); - gameFilters().setMinPlayers(legacySetting.value("min_players").toInt()); - - if (legacySetting.value("max_players").toInt() > 1) { - gameFilters().setMaxPlayers(legacySetting.value("max_players").toInt()); - } else { - gameFilters().setMaxPlayers(99); // This prevents a bug where no games will show if max was not set before - } - - QStringList allFilters = legacySetting.allKeys(); - for (int i = 0; i < allFilters.size(); ++i) { - if (allFilters.at(i).startsWith("game_type")) { - gameFilters().setGameHashedTypeEnabled(allFilters.at(i), legacySetting.value(allFilters.at(i)).toBool()); - } - } - QStringList allKeysfilter_games = legacySetting.allKeys(); - for (int i = 0; i < allKeysfilter_games.size(); ++i) { - usedKeys.append("filter_games/" + allKeysfilter_games.at(i)); - } - legacySetting.endGroup(); - - QStringList allLegacyKeys = legacySetting.allKeys(); - for (int i = 0; i < allLegacyKeys.size(); ++i) { - if (usedKeys.contains(allLegacyKeys.at(i))) { - continue; - } - settings->setValue(allLegacyKeys.at(i), legacySetting.value(allLegacyKeys.at(i))); - } -} - QString SettingsCache::getSafeConfigPath(QString configEntry, QString defaultPath) const { QString tmp = settings->value(configEntry).toString(); @@ -183,11 +102,18 @@ SettingsCache::SettingsCache() qCInfo(SettingsCacheLog) << "Portable mode enabled"; } - // define a dummy context that will be used where needed - QString dummy = QT_TRANSLATE_NOOP("i18n", "English"); - QString settingsPath = getSettingsPath(); + settings = new QSettings(settingsPath + "global.ini", QSettings::IniFormat, this); + + // Migrate from legacy NativeFormat settings to per-class INI files (runs at most once) + if (!isPortableBuild) { + SettingsMigration::migrateLegacySettings(settingsPath); + } + + // Migrate settings from global.ini to per-class INI files (runs at most once) + SettingsMigration::migrateSettingsFromGlobalIni(settingsPath); + shortcutsSettings = new ShortcutsSettings(settingsPath, this); cardDatabaseSettings = new CardDatabaseSettings(settingsPath, this); serversSettings = new ServersSettings(settingsPath, this); @@ -198,1004 +124,41 @@ SettingsCache::SettingsCache() recentsSettings = new RecentsSettings(settingsPath, this); cardOverrideSettings = new CardOverrideSettings(settingsPath, this); debugSettings = new DebugSettings(settingsPath, this); - cardCounterSettings = new CardCounterSettings(settingsPath, this); - if (!QFile(settingsPath + "global.ini").exists()) { - translateLegacySettings(); - } + tabsSettings = new TabsSettings(settingsPath, this); + soundSettings = new SoundSettings(settingsPath, this); + gameSettings = new GameSettings(settingsPath, this); + chatSettings = new ChatSettings(settingsPath, this); + cacheStorageSettings = new CacheStorageSettings(settingsPath, this); + updatesSettings = new UpdatesSettings(settingsPath, this); + personalSettings = new PersonalSettings(settingsPath, this); + cardsDisplaySettings = new CardsDisplaySettings(settingsPath, this); + interfaceSettings = new InterfaceSettings(settingsPath, this); + pathsSettings = new PathsSettings(settingsPath, this); + visualDeckStorageSettings = new VisualDeckStorageSettings(settingsPath, this); + + // Forward ICardDatabasePathProvider signal from PathsSettings + connect(pathsSettings, &PathsSettings::cardDatabasePathChanged, this, + &ICardDatabasePathProvider::cardDatabasePathChanged); // updates - don't reorder them or their index in the settings won't match // append channels one by one, or msvc will add them in the wrong order. releaseChannels << new StableReleaseChannel(); releaseChannels << new BetaReleaseChannel(); - mbDownloadSpoilers = settings->value("personal/downloadspoilers", false).toBool(); - - if (settings->contains("personal/startupUpdateCheck")) { - checkUpdatesOnStartup = settings->value("personal/startupUpdateCheck", true).toBool(); - } else if (QString(VERSION_STRING).contains("custom", Qt::CaseInsensitive)) { - checkUpdatesOnStartup = false; // do not run auto updater on custom version - } else { - checkUpdatesOnStartup = true; // default to run auto updater - } - startupCardUpdateCheckPromptForUpdate = - settings->value("personal/startupCardUpdateCheckPromptForUpdate", true).toBool(); - startupCardUpdateCheckAlwaysUpdate = settings->value("personal/startupCardUpdateCheckAlwaysUpdate", false).toBool(); - cardUpdateCheckInterval = settings->value("personal/cardUpdateCheckInterval", 7).toInt(); - lastCardUpdateCheck = settings->value("personal/lastCardUpdateCheck", QDateTime::currentDateTime().date()).toDate(); - alwaysEnableNewSets = settings->value("personal/alwaysEnableNewSets", false).toBool(); - notifyAboutUpdates = settings->value("personal/updatenotification", true).toBool(); - notifyAboutNewVersion = settings->value("personal/newversionnotification", true).toBool(); - - if (settings->contains("personal/updatereleasechannel")) { - updateReleaseChannel = settings->value("personal/updatereleasechannel").toInt(); - } else if (QString(VERSION_STRING).contains("beta", Qt::CaseInsensitive)) { - // default to beta if this is a beta release - updateReleaseChannel = 1; - } else { - updateReleaseChannel = 0; // stable - } - - lang = settings->value("personal/lang").toString(); - keepalive = settings->value("personal/keepalive", 3).toInt(); - timeout = settings->value("personal/timeout", 5).toInt(); - - // tip of the day settings - showTipsOnStartup = settings->value("tipOfDay/showTips", true).toBool(); - for (const auto &tipNumber : settings->value("tipOfDay/seenTips").toList()) { - seenTips.append(tipNumber.toInt()); - } + themeName = personalSettings->getThemeName(); loadPaths(); - - themeName = settings->value("theme/name").toString(); - - homeTabBackgroundSource = settings->value("home/background", "themed").toString(); - homeTabBackgroundShuffleFrequency = settings->value("home/background/shuffleTimer", 0).toInt(); - homeTabDisplayCardName = settings->value("home/background/displayCardName", true).toBool(); - - tabVisualDeckStorageOpen = settings->value("tabs/visualDeckStorage", true).toBool(); - tabServerOpen = settings->value("tabs/server", true).toBool(); - tabAccountOpen = settings->value("tabs/account", true).toBool(); - tabDeckStorageOpen = settings->value("tabs/deckStorage", true).toBool(); - tabReplaysOpen = settings->value("tabs/replays", true).toBool(); - tabAdminOpen = settings->value("tabs/admin", true).toBool(); - tabLogOpen = settings->value("tabs/log", true).toBool(); - - // we only want to reset the cache once, then its up to the user - bool updateCache = settings->value("revert/pixmapCacheSize", false).toBool(); - if (!updateCache) { - pixmapCacheSize = PIXMAPCACHE_SIZE_DEFAULT; - settings->setValue("personal/pixmapCacheSize", pixmapCacheSize); - settings->setValue("personal/picturedownloadhq", false); - settings->setValue("revert/pixmapCacheSize", true); - } else { - pixmapCacheSize = settings->value("personal/pixmapCacheSize", PIXMAPCACHE_SIZE_DEFAULT).toInt(); - } - // sanity check - if (pixmapCacheSize < PIXMAPCACHE_SIZE_MIN || pixmapCacheSize > PIXMAPCACHE_SIZE_MAX) { - pixmapCacheSize = PIXMAPCACHE_SIZE_DEFAULT; - } - - networkCacheSize = settings->value("personal/networkCacheSize", NETWORK_CACHE_SIZE_DEFAULT).toInt(); - redirectCacheTtl = settings->value("personal/redirectCacheTtl", NETWORK_REDIRECT_CACHE_TTL_DEFAULT).toInt(); - cardPictureLoaderCacheMethod = - settings - ->value("personal/cardPictureLoaderCacheMethod", - static_cast(CardPictureLoaderCacheMethod::CacheMethod::NETWORK_CACHE)) - .toInt(); - localCardImageStorageNamingScheme = - settings - ->value("personal/localCardImageStorageNamingScheme", - static_cast(CardPictureLoaderLocalSchemes::NamingScheme::Set_Folder_Name_Set_Collector)) - .toInt(); - - picDownload = settings->value("personal/picturedownload", true).toBool(); - showStatusBar = settings->value("personal/showStatusBar", false).toBool(); - - notificationsEnabled = settings->value("interface/notificationsenabled", true).toBool(); - spectatorNotificationsEnabled = settings->value("interface/specnotificationsenabled", false).toBool(); - buddyConnectNotificationsEnabled = settings->value("interface/buddyconnectnotificationsenabled", true).toBool(); - doubleClickToPlay = settings->value("interface/doubleclicktoplay", true).toBool(); - clickPlaysAllSelected = settings->value("interface/clickPlaysAllSelected", true).toBool(); - playToStack = settings->value("interface/playtostack", true).toBool(); - doNotDeleteArrowsInSubPhases = settings->value("interface/doNotDeleteArrowsInSubPhases", true).toBool(); - startingHandSize = settings->value("interface/startinghandsize", 7).toInt(); - annotateTokens = settings->value("interface/annotatetokens", false).toBool(); - knownMissingFeatures = settings->value("interface/knownmissingfeatures", "").toString(); - useTearOffMenus = settings->value("interface/usetearoffmenus", true).toBool(); - cardViewInitialRowsMax = settings->value("interface/cardViewInitialRowsMax", 14).toInt(); - cardViewExpandedRowsMax = settings->value("interface/cardViewExpandedRowsMax", 20).toInt(); - closeEmptyCardView = settings->value("interface/closeEmptyCardView", true).toBool(); - focusCardViewSearchBar = settings->value("interface/focusCardViewSearchBar", true).toBool(); - keepGameChatFocus = settings->value("interface/keepGameChatFocus", false).toBool(); - - showDragSelectionCount = settings->value("interface/showlassoselectioncount", true).toBool(); - showTotalSelectionCount = settings->value("interface/showpersistentselectioncount", true).toBool(); - tallyType = settings->value("interface/tallyType", 0).toInt(); - - showShortcuts = settings->value("menu/showshortcuts", true).toBool(); - showGameSelectorFilterToolbar = settings->value("menu/showgameselectorfiltertoolbar", true).toBool(); - displayCardNames = settings->value("cards/displaycardnames", true).toBool(); - roundCardCorners = settings->value("cards/roundcardcorners", true).toBool(); - overrideAllCardArtWithPersonalPreference = - settings->value("cards/overrideallcardartwithpersonalpreference", false).toBool(); - bumpSetsWithCardsInDeckToTop = settings->value("cards/bumpsetswithcardsindecktotop", true).toBool(); - printingSelectorSortOrder = settings->value("cards/printingselectorsortorder", 1).toInt(); - printingSelectorCardSize = settings->value("cards/printingselectorcardsize", 100).toInt(); - includeRebalancedCards = settings->value("cards/includerebalancedcards", true).toBool(); - printingSelectorNavigationButtonsVisible = - settings->value("cards/printingselectornavigationbuttonsvisible", true).toBool(); - deckEditorBannerCardComboBoxVisible = - settings->value("interface/deckeditorbannercardcomboboxvisible", true).toBool(); - deckEditorTagsWidgetVisible = settings->value("interface/deckeditortagswidgetvisible", true).toBool(); - visualDeckStorageCardSize = settings->value("interface/visualdeckstoragecardsize", 100).toInt(); - visualDeckStorageSortingOrder = settings->value("interface/visualdeckstoragesortingorder", 0).toInt(); - visualDeckStorageShowFolders = settings->value("interface/visualdeckstorageshowfolders", true).toBool(); - visualDeckStorageShowTagFilter = settings->value("interface/visualdeckstorageshowtagfilter", true).toBool(); - visualDeckStorageDefaultTagsList = - settings->value("interface/visualdeckstoragedefaulttagslist", defaultTags).toStringList(); - visualDeckStorageSearchFolderNames = settings->value("interface/visualdeckstoragesearchfoldernames", true).toBool(); - visualDeckStorageShowColorIdentity = settings->value("interface/visualdeckstorageshowcoloridentity", true).toBool(); - visualDeckStorageShowBannerCardComboBox = - settings->value("interface/visualdeckstorageshowbannercardcombobox", true).toBool(); - visualDeckStorageShowTagsOnDeckPreviews = - settings->value("interface/visualdeckstorageshowtagsondeckpreviews", true).toBool(); - visualDeckStorageDrawUnusedColorIdentities = - settings->value("interface/visualdeckstoragedrawunusedcoloridentities", true).toBool(); - visualDeckStorageUnusedColorIdentitiesOpacity = - settings->value("interface/visualdeckstorageunusedcoloridentitiesopacity", 15).toInt(); - visualDeckStorageTooltipType = settings->value("interface/visualdeckstoragetooltiptype", 0).toInt(); - visualDeckStoragePromptForConversion = - settings->value("interface/visualdeckstoragepromptforconversion", true).toBool(); - visualDeckStorageAlwaysConvert = settings->value("interface/visualdeckstoragealwaysconvert", false).toBool(); - visualDeckStorageInGame = settings->value("interface/visualdeckstorageingame", true).toBool(); - visualDeckStorageSelectionAnimation = - settings->value("interface/visualdeckstorageselectionanimation", true).toBool(); - defaultDeckEditorType = settings->value("interface/defaultDeckEditorType", 1).toInt(); - visualDatabaseDisplayFilterToMostRecentSetsEnabled = - settings->value("interface/visualdatabasedisplayfiltertomostrecentsetsenabled", false).toBool(); - visualDatabaseDisplayFilterToMostRecentSetsAmount = - settings->value("interface/visualdatabasedisplayfiltertomostrecentsetsamount", 10).toInt(); - visualDeckEditorSampleHandSize = settings->value("interface/visualdeckeditorsamplehandsize", 7).toInt(); - visualDeckEditorCardSize = settings->value("interface/visualdeckeditorcardsize", 100).toInt(); - visualDatabaseDisplayCardSize = settings->value("interface/visualdatabasedisplaycardsize", 100).toInt(); - edhrecCardSize = settings->value("interface/edhreccardsize", 100).toInt(); - archidektPreviewSize = settings->value("interface/archidektpreviewsize", 100).toInt(); - - horizontalHand = settings->value("hand/horizontal", true).toBool(); - invertVerticalCoordinate = settings->value("table/invert_vertical", false).toBool(); - minPlayersForMultiColumnLayout = settings->value("interface/min_players_multicolumn", 4).toInt(); - tapAnimation = settings->value("cards/tapanimation", true).toBool(); - autoRotateSidewaysLayoutCards = settings->value("cards/autorotatesidewayslayoutcards", true).toBool(); - - openDeckInNewTab = settings->value("editor/openDeckInNewTab", false).toBool(); - rewindBufferingMs = settings->value("replay/rewindBufferingMs", 200).toInt(); - fastForwardSpeed = settings->value("replay/fastForwardSpeed", 10).toReal(); - styleUserList = settings->value("appearance/styleUserList", true).toBool(); - chatMention = settings->value("chat/mention", true).toBool(); - chatMentionCompleter = settings->value("chat/mentioncompleter", true).toBool(); - chatMentionForeground = settings->value("chat/mentionforeground", true).toBool(); - chatHighlightForeground = settings->value("chat/highlightforeground", true).toBool(); - chatMentionColor = settings->value("chat/mentioncolor", "A6120D").toString(); - chatHighlightColor = settings->value("chat/highlightcolor", "A6120D").toString(); - - zoneViewGroupByIndex = settings->value("zoneview/groupby", 1).toInt(); - zoneViewSortByIndex = settings->value("zoneview/sortby", 1).toInt(); - zoneViewPileView = settings->value("zoneview/pileview", true).toBool(); - - soundEnabled = settings->value("sound/enabled", false).toBool(); - soundThemeName = settings->value("sound/theme").toString(); - - maxFontSize = settings->value("game/maxfontsize", DEFAULT_FONT_SIZE).toInt(); - - ignoreUnregisteredUsers = settings->value("chat/ignore_unregistered", false).toBool(); - ignoreUnregisteredUserMessages = settings->value("chat/ignore_unregistered_messages", false).toBool(); - ignoreNonBuddyUserMessages = settings->value("chat/ignore_nonbuddy_messages", false).toBool(); - - scaleCards = settings->value("cards/scaleCards", true).toBool(); - verticalCardOverlapPercent = settings->value("cards/verticalCardOverlapPercent", 33).toInt(); - showMessagePopups = settings->value("chat/showmessagepopups", true).toBool(); - showMentionPopups = settings->value("chat/showmentionpopups", true).toBool(); - roomHistory = settings->value("chat/roomhistory", true).toBool(); - - leftJustified = settings->value("interface/leftjustified", false).toBool(); - - masterVolume = settings->value("sound/mastervolume", 100).toInt(); - - cardInfoViewMode = settings->value("cards/cardinfoviewmode", 0).toInt(); - highlightWords = settings->value("personal/highlightWords", QString()).toString(); - gameDescription = settings->value("game/gamedescription", "").toString(); - maxPlayers = settings->value("game/maxplayers", 2).toInt(); - gameTypes = settings->value("game/gametypes", "").toString(); - onlyBuddies = settings->value("game/onlybuddies", false).toBool(); - onlyRegistered = settings->value("game/onlyregistered", true).toBool(); - spectatorsAllowed = settings->value("game/spectatorsallowed", true).toBool(); - spectatorsNeedPassword = settings->value("game/spectatorsneedpassword", false).toBool(); - spectatorsCanTalk = settings->value("game/spectatorscantalk", false).toBool(); - spectatorsCanSeeEverything = settings->value("game/spectatorscanseeeverything", false).toBool(); - createGameAsSpectator = settings->value("game/creategameasspectator", false).toBool(); - defaultStartingLifeTotal = settings->value("game/defaultstartinglifetotal", 20).toInt(); - shareDecklistsOnLoad = settings->value("game/sharedecklistsonload", false).toBool(); - rememberGameSettings = settings->value("game/remembergamesettings", true).toBool(); - - // Local game settings use "localgameoptions/" prefix to keep them separate - // from server game settings which use "game/" prefix - localGameRememberSettings = settings->value("localgameoptions/remembersettings", false).toBool(); - localGameMaxPlayers = settings->value("localgameoptions/maxplayers", 1).toInt(); - localGameStartingLifeTotal = settings->value("localgameoptions/startinglifetotal", 20).toInt(); - - clientID = settings->value("personal/clientid", CLIENT_INFO_NOT_SET).toString(); - clientVersion = settings->value("personal/clientversion", CLIENT_INFO_NOT_SET).toString(); -} - -void SettingsCache::setUseTearOffMenus(bool _useTearOffMenus) -{ - useTearOffMenus = _useTearOffMenus; - settings->setValue("interface/usetearoffmenus", useTearOffMenus); - emit useTearOffMenusChanged(useTearOffMenus); -} - -void SettingsCache::setCardViewInitialRowsMax(int _cardViewInitialRowsMax) -{ - cardViewInitialRowsMax = _cardViewInitialRowsMax; - settings->setValue("interface/cardViewInitialRowsMax", cardViewInitialRowsMax); -} - -void SettingsCache::setCardViewExpandedRowsMax(int value) -{ - cardViewExpandedRowsMax = value; - settings->setValue("interface/cardViewExpandedRowsMax", cardViewExpandedRowsMax); -} - -void SettingsCache::setCloseEmptyCardView(QT_STATE_CHANGED_T value) -{ - closeEmptyCardView = value; - settings->setValue("interface/closeEmptyCardView", closeEmptyCardView); -} - -void SettingsCache::setFocusCardViewSearchBar(QT_STATE_CHANGED_T value) -{ - focusCardViewSearchBar = value; - settings->setValue("interface/focusCardViewSearchBar", focusCardViewSearchBar); -} - -void SettingsCache::setKeepGameChatFocus(QT_STATE_CHANGED_T value) -{ - keepGameChatFocus = value; - settings->setValue("interface/keepGameChatFocus", keepGameChatFocus); - emit keepGameChatFocusChanged(keepGameChatFocus); -} - -void SettingsCache::setKnownMissingFeatures(const QString &_knownMissingFeatures) -{ - knownMissingFeatures = _knownMissingFeatures; - settings->setValue("interface/knownmissingfeatures", knownMissingFeatures); -} - -void SettingsCache::setCardInfoViewMode(const int _viewMode) -{ - cardInfoViewMode = _viewMode; - settings->setValue("cards/cardinfoviewmode", cardInfoViewMode); -} - -void SettingsCache::setHighlightWords(const QString &_highlightWords) -{ - highlightWords = _highlightWords; - settings->setValue("personal/highlightWords", highlightWords); -} - -void SettingsCache::setMasterVolume(int _masterVolume) -{ - masterVolume = _masterVolume; - settings->setValue("sound/mastervolume", masterVolume); - emit masterVolumeChanged(masterVolume); -} - -void SettingsCache::setLeftJustified(const QT_STATE_CHANGED_T _leftJustified) -{ - leftJustified = (bool)_leftJustified; - settings->setValue("interface/leftjustified", leftJustified); - emit handJustificationChanged(); -} - -void SettingsCache::setCardScaling(const QT_STATE_CHANGED_T _scaleCards) -{ - scaleCards = (bool)_scaleCards; - settings->setValue("cards/scaleCards", scaleCards); -} - -void SettingsCache::setStackCardOverlapPercent(const int _verticalCardOverlapPercent) -{ - verticalCardOverlapPercent = _verticalCardOverlapPercent; - settings->setValue("cards/verticalCardOverlapPercent", verticalCardOverlapPercent); -} - -void SettingsCache::setShowMessagePopups(const QT_STATE_CHANGED_T _showMessagePopups) -{ - showMessagePopups = (bool)_showMessagePopups; - settings->setValue("chat/showmessagepopups", showMessagePopups); -} - -void SettingsCache::setShowMentionPopups(const QT_STATE_CHANGED_T _showMentionPopus) -{ - showMentionPopups = (bool)_showMentionPopus; - settings->setValue("chat/showmentionpopups", showMentionPopups); -} - -void SettingsCache::setRoomHistory(const QT_STATE_CHANGED_T _roomHistory) -{ - roomHistory = (bool)_roomHistory; - settings->setValue("chat/roomhistory", roomHistory); -} - -void SettingsCache::setLang(const QString &_lang) -{ - lang = _lang; - settings->setValue("personal/lang", lang); - emit langChanged(); -} - -void SettingsCache::setShowTipsOnStartup(bool _showTipsOnStartup) -{ - showTipsOnStartup = _showTipsOnStartup; - settings->setValue("tipOfDay/showTips", showTipsOnStartup); -} - -void SettingsCache::setSeenTips(const QList &_seenTips) -{ - seenTips = _seenTips; - QList storedTipList; - for (auto tipNumber : seenTips) { - storedTipList.append(tipNumber); - } - settings->setValue("tipOfDay/seenTips", storedTipList); -} - -void SettingsCache::setDeckPath(const QString &_deckPath) -{ - deckPath = _deckPath; - settings->setValue("paths/decks", deckPath); -} - -void SettingsCache::setFiltersPath(const QString &_filtersPath) -{ - filtersPath = _filtersPath; - settings->setValue("paths/filters", filtersPath); -} - -void SettingsCache::setReplaysPath(const QString &_replaysPath) -{ - replaysPath = _replaysPath; - settings->setValue("paths/replays", replaysPath); -} - -void SettingsCache::setThemesPath(const QString &_themesPath) -{ - themesPath = _themesPath; - settings->setValue("paths/themes", themesPath); - emit themeChanged(); -} - -void SettingsCache::setCustomCardDatabasePath(const QString &_customCardDatabasePath) -{ - customCardDatabasePath = _customCardDatabasePath; - settings->setValue("paths/customsets", customCardDatabasePath); - emit cardDatabasePathChanged(); -} - -void SettingsCache::setPicsPath(const QString &_picsPath) -{ - picsPath = _picsPath; - settings->setValue("paths/pics", picsPath); - // get a new value for customPicsPath, currently derived from picsPath - if (picsPath.endsWith("/")) { - customPicsPath = getSafeConfigPath("paths/custompics", picsPath + "CUSTOM/"); - } else { - customPicsPath = getSafeConfigPath("paths/custompics", picsPath + "/CUSTOM/"); - } - emit picsPathChanged(); -} - -void SettingsCache::setCardDatabasePath(const QString &_cardDatabasePath) -{ - cardDatabasePath = _cardDatabasePath; - settings->setValue("paths/carddatabase", cardDatabasePath); - emit cardDatabasePathChanged(); -} - -void SettingsCache::setSpoilerDatabasePath(const QString &_spoilerDatabasePath) -{ - spoilerDatabasePath = _spoilerDatabasePath; - settings->setValue("paths/spoilerdatabase", spoilerDatabasePath); - emit cardDatabasePathChanged(); -} - -void SettingsCache::setTokenDatabasePath(const QString &_tokenDatabasePath) -{ - tokenDatabasePath = _tokenDatabasePath; - settings->setValue("paths/tokendatabase", tokenDatabasePath); - emit cardDatabasePathChanged(); } void SettingsCache::setThemeName(const QString &_themeName) { themeName = _themeName; - settings->setValue("theme/name", themeName); + personalSettings->setThemeName(themeName); emit themeChanged(); } -void SettingsCache::setHomeTabBackgroundSource(const QString &_backgroundSource) -{ - homeTabBackgroundSource = _backgroundSource; - settings->setValue("home/background", homeTabBackgroundSource); - emit homeTabBackgroundSourceChanged(); -} - -void SettingsCache::setHomeTabBackgroundShuffleFrequency(int _frequency) -{ - homeTabBackgroundShuffleFrequency = _frequency; - settings->setValue("home/background/shuffleTimer", homeTabBackgroundShuffleFrequency); - emit homeTabBackgroundShuffleFrequencyChanged(); -} - -void SettingsCache::setHomeTabDisplayCardName(QT_STATE_CHANGED_T _displayCardName) -{ - homeTabDisplayCardName = static_cast(_displayCardName); - settings->setValue("home/background/displayCardName", homeTabDisplayCardName); - emit homeTabDisplayCardNameChanged(); -} - -void SettingsCache::setTabVisualDeckStorageOpen(bool value) -{ - tabVisualDeckStorageOpen = value; - settings->setValue("tabs/visualDeckStorage", tabVisualDeckStorageOpen); -} - -void SettingsCache::setTabServerOpen(bool value) -{ - tabServerOpen = value; - settings->setValue("tabs/server", tabServerOpen); -} - -void SettingsCache::setTabAccountOpen(bool value) -{ - tabAccountOpen = value; - settings->setValue("tabs/account", tabAccountOpen); -} - -void SettingsCache::setTabDeckStorageOpen(bool value) -{ - tabDeckStorageOpen = value; - settings->setValue("tabs/deckStorage", tabDeckStorageOpen); -} - -void SettingsCache::setTabReplaysOpen(bool value) -{ - tabReplaysOpen = value; - settings->setValue("tabs/replays", tabReplaysOpen); -} - -void SettingsCache::setTabAdminOpen(bool value) -{ - tabAdminOpen = value; - settings->setValue("tabs/admin", tabAdminOpen); -} - -void SettingsCache::setTabLogOpen(bool value) -{ - tabLogOpen = value; - settings->setValue("tabs/log", tabLogOpen); -} - -void SettingsCache::setPicDownload(QT_STATE_CHANGED_T _picDownload) -{ - picDownload = static_cast(_picDownload); - settings->setValue("personal/picturedownload", picDownload); - emit picDownloadChanged(); -} - -void SettingsCache::setShowStatusBar(bool value) -{ - showStatusBar = value; - settings->setValue("personal/showStatusBar", showStatusBar); - emit showStatusBarChanged(value); -} - -void SettingsCache::setNotificationsEnabled(QT_STATE_CHANGED_T _notificationsEnabled) -{ - notificationsEnabled = static_cast(_notificationsEnabled); - settings->setValue("interface/notificationsenabled", notificationsEnabled); -} - -void SettingsCache::setSpectatorNotificationsEnabled(QT_STATE_CHANGED_T _spectatorNotificationsEnabled) -{ - spectatorNotificationsEnabled = static_cast(_spectatorNotificationsEnabled); - settings->setValue("interface/specnotificationsenabled", spectatorNotificationsEnabled); -} - -void SettingsCache::setBuddyConnectNotificationsEnabled(QT_STATE_CHANGED_T _buddyConnectNotificationsEnabled) -{ - buddyConnectNotificationsEnabled = static_cast(_buddyConnectNotificationsEnabled); - settings->setValue("interface/buddyconnectnotificationsenabled", buddyConnectNotificationsEnabled); -} - -void SettingsCache::setDoubleClickToPlay(QT_STATE_CHANGED_T _doubleClickToPlay) -{ - doubleClickToPlay = static_cast(_doubleClickToPlay); - settings->setValue("interface/doubleclicktoplay", doubleClickToPlay); -} - -void SettingsCache::setClickPlaysAllSelected(QT_STATE_CHANGED_T _clickPlaysAllSelected) -{ - clickPlaysAllSelected = static_cast(_clickPlaysAllSelected); - settings->setValue("interface/clickPlaysAllSelected", clickPlaysAllSelected); -} - -void SettingsCache::setPlayToStack(QT_STATE_CHANGED_T _playToStack) -{ - playToStack = static_cast(_playToStack); - settings->setValue("interface/playtostack", playToStack); -} - -void SettingsCache::setDoNotDeleteArrowsInSubPhases(QT_STATE_CHANGED_T _doNotDeleteArrowsInSubPhases) -{ - doNotDeleteArrowsInSubPhases = static_cast(_doNotDeleteArrowsInSubPhases); - settings->setValue("interface/doNotDeleteArrowsInSubPhases", doNotDeleteArrowsInSubPhases); -} - -void SettingsCache::setStartingHandSize(int _startingHandSize) -{ - startingHandSize = _startingHandSize; - settings->setValue("interface/startinghandsize", startingHandSize); -} - -void SettingsCache::setAnnotateTokens(QT_STATE_CHANGED_T _annotateTokens) -{ - annotateTokens = static_cast(_annotateTokens); - settings->setValue("interface/annotatetokens", annotateTokens); -} - -void SettingsCache::setShowShortcuts(QT_STATE_CHANGED_T _showShortcuts) -{ - showShortcuts = static_cast(_showShortcuts); - settings->setValue("menu/showshortcuts", showShortcuts); -} - -void SettingsCache::setShowGameSelectorFilterToolbar(QT_STATE_CHANGED_T _showGameSelectorFilterToolbar) -{ - showGameSelectorFilterToolbar = static_cast(_showGameSelectorFilterToolbar); - settings->setValue("menu/showgameselectorfiltertoolbar", showGameSelectorFilterToolbar); - emit showGameSelectorFilterToolbarChanged(showGameSelectorFilterToolbar); -} - -void SettingsCache::setDisplayCardNames(QT_STATE_CHANGED_T _displayCardNames) -{ - displayCardNames = static_cast(_displayCardNames); - settings->setValue("cards/displaycardnames", displayCardNames); - emit displayCardNamesChanged(); -} - -void SettingsCache::setOverrideAllCardArtWithPersonalPreference(QT_STATE_CHANGED_T _overrideAllCardArt) -{ - overrideAllCardArtWithPersonalPreference = static_cast(_overrideAllCardArt); - settings->setValue("cards/overrideallcardartwithpersonalpreference", overrideAllCardArtWithPersonalPreference); - emit overrideAllCardArtWithPersonalPreferenceChanged(overrideAllCardArtWithPersonalPreference); -} - -void SettingsCache::setBumpSetsWithCardsInDeckToTop(QT_STATE_CHANGED_T _bumpSetsWithCardsInDeckToTop) -{ - bumpSetsWithCardsInDeckToTop = static_cast(_bumpSetsWithCardsInDeckToTop); - settings->setValue("cards/bumpsetswithcardsindecktotop", bumpSetsWithCardsInDeckToTop); - emit bumpSetsWithCardsInDeckToTopChanged(); -} - -void SettingsCache::setPrintingSelectorSortOrder(int _printingSelectorSortOrder) -{ - printingSelectorSortOrder = _printingSelectorSortOrder; - settings->setValue("cards/printingselectorsortorder", printingSelectorSortOrder); - emit printingSelectorSortOrderChanged(); -} - -void SettingsCache::setPrintingSelectorCardSize(int _printingSelectorCardSize) -{ - printingSelectorCardSize = _printingSelectorCardSize; - settings->setValue("cards/printingselectorcardsize", printingSelectorCardSize); - emit printingSelectorCardSizeChanged(); -} - -void SettingsCache::setIncludeRebalancedCards(bool _includeRebalancedCards) -{ - if (includeRebalancedCards == _includeRebalancedCards) { - return; - } - - includeRebalancedCards = _includeRebalancedCards; - settings->setValue("cards/includerebalancedcards", includeRebalancedCards); - emit includeRebalancedCardsChanged(includeRebalancedCards); -} - -void SettingsCache::setPrintingSelectorNavigationButtonsVisible(QT_STATE_CHANGED_T _navigationButtonsVisible) -{ - printingSelectorNavigationButtonsVisible = _navigationButtonsVisible; - settings->setValue("cards/printingselectornavigationbuttonsvisible", printingSelectorNavigationButtonsVisible); - emit printingSelectorNavigationButtonsVisibleChanged(); -} - -void SettingsCache::setDeckEditorBannerCardComboBoxVisible(QT_STATE_CHANGED_T _deckEditorBannerCardComboBoxVisible) -{ - deckEditorBannerCardComboBoxVisible = _deckEditorBannerCardComboBoxVisible; - settings->setValue("interface/deckeditorbannercardcomboboxvisible", deckEditorBannerCardComboBoxVisible); - emit deckEditorBannerCardComboBoxVisibleChanged(deckEditorBannerCardComboBoxVisible); -} - -void SettingsCache::setDeckEditorTagsWidgetVisible(QT_STATE_CHANGED_T _deckEditorTagsWidgetVisible) -{ - deckEditorTagsWidgetVisible = _deckEditorTagsWidgetVisible; - settings->setValue("interface/deckeditortagswidgetvisible", deckEditorTagsWidgetVisible); - emit deckEditorTagsWidgetVisibleChanged(deckEditorTagsWidgetVisible); -} - -void SettingsCache::setVisualDeckStorageSortingOrder(int _visualDeckStorageSortingOrder) -{ - visualDeckStorageSortingOrder = _visualDeckStorageSortingOrder; - settings->setValue("interface/visualdeckstoragesortingorder", visualDeckStorageSortingOrder); -} - -void SettingsCache::setVisualDeckStorageShowFolders(QT_STATE_CHANGED_T value) -{ - visualDeckStorageShowFolders = value; - settings->setValue("interface/visualdeckstorageshowfolders", visualDeckStorageShowFolders); -} - -void SettingsCache::setVisualDeckStorageShowTagFilter(QT_STATE_CHANGED_T _showTags) -{ - visualDeckStorageShowTagFilter = _showTags; - settings->setValue("interface/visualdeckstorageshowtagfilter", visualDeckStorageShowTagFilter); - emit visualDeckStorageShowTagFilterChanged(visualDeckStorageShowTagFilter); -} - -void SettingsCache::setVisualDeckStorageDefaultTagsList(QStringList _defaultTagsList) -{ - visualDeckStorageDefaultTagsList = _defaultTagsList; - settings->setValue("interface/visualdeckstoragedefaulttagslist", visualDeckStorageDefaultTagsList); - emit visualDeckStorageDefaultTagsListChanged(); -} - -void SettingsCache::setVisualDeckStorageSearchFolderNames(QT_STATE_CHANGED_T value) -{ - visualDeckStorageSearchFolderNames = value; - settings->setValue("interface/visualdeckstoragesearchfoldernames", visualDeckStorageSearchFolderNames); -} - -void SettingsCache::setVisualDeckStorageShowColorIdentity(QT_STATE_CHANGED_T value) -{ - visualDeckStorageShowColorIdentity = value; - settings->setValue("interface/visualdeckstorageshowcoloridentity", visualDeckStorageShowColorIdentity); - emit visualDeckStorageShowColorIdentityChanged(visualDeckStorageShowColorIdentity); -} - -void SettingsCache::setVisualDeckStorageShowBannerCardComboBox(QT_STATE_CHANGED_T _showBannerCardComboBox) -{ - visualDeckStorageShowBannerCardComboBox = _showBannerCardComboBox; - settings->setValue("interface/visualdeckstorageshowbannercardcombobox", visualDeckStorageShowBannerCardComboBox); - emit visualDeckStorageShowBannerCardComboBoxChanged(visualDeckStorageShowBannerCardComboBox); -} - -void SettingsCache::setVisualDeckStorageShowTagsOnDeckPreviews(QT_STATE_CHANGED_T _showTags) -{ - visualDeckStorageShowTagsOnDeckPreviews = _showTags; - settings->setValue("interface/visualdeckstorageshowtagsondeckpreviews", visualDeckStorageShowTagsOnDeckPreviews); - emit visualDeckStorageShowTagsOnDeckPreviewsChanged(visualDeckStorageShowTagsOnDeckPreviews); -} - -void SettingsCache::setVisualDeckStorageCardSize(int _visualDeckStorageCardSize) -{ - visualDeckStorageCardSize = _visualDeckStorageCardSize; - settings->setValue("interface/visualdeckstoragecardsize", visualDeckStorageCardSize); - emit visualDeckStorageCardSizeChanged(); -} - -void SettingsCache::setVisualDeckStorageDrawUnusedColorIdentities( - QT_STATE_CHANGED_T _visualDeckStorageDrawUnusedColorIdentities) -{ - visualDeckStorageDrawUnusedColorIdentities = _visualDeckStorageDrawUnusedColorIdentities; - settings->setValue("interface/visualdeckstoragedrawunusedcoloridentities", - visualDeckStorageDrawUnusedColorIdentities); - emit visualDeckStorageDrawUnusedColorIdentitiesChanged(visualDeckStorageDrawUnusedColorIdentities); -} - -void SettingsCache::setVisualDeckStorageUnusedColorIdentitiesOpacity(int _visualDeckStorageUnusedColorIdentitiesOpacity) -{ - visualDeckStorageUnusedColorIdentitiesOpacity = _visualDeckStorageUnusedColorIdentitiesOpacity; - settings->setValue("interface/visualdeckstorageunusedcoloridentitiesopacity", - visualDeckStorageUnusedColorIdentitiesOpacity); - emit visualDeckStorageUnusedColorIdentitiesOpacityChanged(visualDeckStorageUnusedColorIdentitiesOpacity); -} - -void SettingsCache::setVisualDeckStorageTooltipType(int value) -{ - visualDeckStorageTooltipType = value; - settings->setValue("interface/visualdeckstoragetooltiptype", visualDeckStorageTooltipType); -} - -void SettingsCache::setVisualDeckStoragePromptForConversion(bool _visualDeckStoragePromptForConversion) -{ - visualDeckStoragePromptForConversion = _visualDeckStoragePromptForConversion; - settings->setValue("interface/visualdeckstoragepromptforconversion", visualDeckStoragePromptForConversion); -} - -void SettingsCache::setVisualDeckStorageAlwaysConvert(bool _visualDeckStorageAlwaysConvert) -{ - visualDeckStorageAlwaysConvert = _visualDeckStorageAlwaysConvert; - settings->setValue("interface/visualdeckstoragealwaysconvert", visualDeckStorageAlwaysConvert); -} - -void SettingsCache::setVisualDeckStorageInGame(QT_STATE_CHANGED_T value) -{ - visualDeckStorageInGame = value; - settings->setValue("interface/visualdeckstorageingame", visualDeckStorageInGame); - emit visualDeckStorageInGameChanged(visualDeckStorageInGame); -} - -void SettingsCache::setVisualDeckStorageSelectionAnimation(QT_STATE_CHANGED_T value) -{ - visualDeckStorageSelectionAnimation = value; - settings->setValue("interface/visualdeckstorageselectionanimation", visualDeckStorageSelectionAnimation); - emit visualDeckStorageSelectionAnimationChanged(visualDeckStorageSelectionAnimation); -} - -void SettingsCache::setVisualDeckEditorCardSize(int _visualDeckEditorCardSize) -{ - visualDeckEditorCardSize = _visualDeckEditorCardSize; - settings->setValue("interface/visualdeckeditorcardsize", visualDeckEditorCardSize); - emit visualDeckEditorCardSizeChanged(); -} - -void SettingsCache::setVisualDatabaseDisplayCardSize(int _visualDatabaseDisplayCardSize) -{ - visualDatabaseDisplayCardSize = _visualDatabaseDisplayCardSize; - settings->setValue("interface/visualdatabasedisplaycardsize", visualDatabaseDisplayCardSize); - emit visualDatabaseDisplayCardSizeChanged(); -} - -void SettingsCache::setEDHRecCardSize(int _edhrecCardSize) -{ - edhrecCardSize = _edhrecCardSize; - settings->setValue("interface/edhreccardsize", edhrecCardSize); - emit edhRecCardSizeChanged(); -} - -void SettingsCache::setArchidektPreviewCardSize(int _archidektPreviewCardSize) -{ - archidektPreviewSize = _archidektPreviewCardSize; - settings->setValue("interface/archidektpreviewsize", archidektPreviewSize); - emit archidektPreviewSizeChanged(); -} - -void SettingsCache::setDefaultDeckEditorType(int value) -{ - defaultDeckEditorType = value; - settings->setValue("interface/defaultDeckEditorType", defaultDeckEditorType); -} - -void SettingsCache::setVisualDatabaseDisplayFilterToMostRecentSetsEnabled(QT_STATE_CHANGED_T _enabled) -{ - visualDatabaseDisplayFilterToMostRecentSetsEnabled = _enabled; - settings->setValue("interface/visualdatabasedisplayfiltertomostrecentsetsenabled", - visualDatabaseDisplayFilterToMostRecentSetsEnabled); - emit visualDatabaseDisplayFilterToMostRecentSetsEnabledChanged(visualDatabaseDisplayFilterToMostRecentSetsEnabled); -} - -void SettingsCache::setVisualDatabaseDisplayFilterToMostRecentSetsAmount(int _amount) -{ - visualDatabaseDisplayFilterToMostRecentSetsAmount = _amount; - settings->setValue("interface/visualdatabasedisplayfiltertomostrecentsetsamount", - visualDatabaseDisplayFilterToMostRecentSetsAmount); - emit visualDatabaseDisplayFilterToMostRecentSetsAmountChanged(visualDatabaseDisplayFilterToMostRecentSetsAmount); -} - -void SettingsCache::setVisualDeckEditorSampleHandSize(int _amount) -{ - visualDeckEditorSampleHandSize = _amount; - settings->setValue("interface/visualdeckeditorsamplehandsize", visualDeckEditorSampleHandSize); - emit visualDeckEditorSampleHandSizeAmountChanged(visualDeckEditorSampleHandSize); -} - -void SettingsCache::setHorizontalHand(QT_STATE_CHANGED_T _horizontalHand) -{ - horizontalHand = static_cast(_horizontalHand); - settings->setValue("hand/horizontal", horizontalHand); - emit horizontalHandChanged(); -} - -void SettingsCache::setInvertVerticalCoordinate(QT_STATE_CHANGED_T _invertVerticalCoordinate) -{ - invertVerticalCoordinate = static_cast(_invertVerticalCoordinate); - settings->setValue("table/invert_vertical", invertVerticalCoordinate); - emit invertVerticalCoordinateChanged(); -} - -void SettingsCache::setMinPlayersForMultiColumnLayout(int _minPlayersForMultiColumnLayout) -{ - minPlayersForMultiColumnLayout = _minPlayersForMultiColumnLayout; - settings->setValue("interface/min_players_multicolumn", minPlayersForMultiColumnLayout); - emit minPlayersForMultiColumnLayoutChanged(); -} - -void SettingsCache::setTapAnimation(QT_STATE_CHANGED_T _tapAnimation) -{ - tapAnimation = static_cast(_tapAnimation); - settings->setValue("cards/tapanimation", tapAnimation); -} - -void SettingsCache::setAutoRotateSidewaysLayoutCards(QT_STATE_CHANGED_T _autoRotateSidewaysLayoutCards) -{ - autoRotateSidewaysLayoutCards = static_cast(_autoRotateSidewaysLayoutCards); - settings->setValue("cards/autorotatesidewayslayoutcards", autoRotateSidewaysLayoutCards); -} - -void SettingsCache::setOpenDeckInNewTab(QT_STATE_CHANGED_T _openDeckInNewTab) -{ - openDeckInNewTab = static_cast(_openDeckInNewTab); - settings->setValue("editor/openDeckInNewTab", openDeckInNewTab); -} - -void SettingsCache::setRewindBufferingMs(int _rewindBufferingMs) -{ - rewindBufferingMs = _rewindBufferingMs; - settings->setValue("replay/rewindBufferingMs", rewindBufferingMs); -} - -void SettingsCache::setFastForwardSpeed(qreal _value) -{ - fastForwardSpeed = _value; - settings->setValue("replay/fastForwardSpeed", fastForwardSpeed); -} - -void SettingsCache::setStyleUserList(QT_STATE_CHANGED_T _styleUserList) -{ - styleUserList = static_cast(_styleUserList); - settings->setValue("appearance/styleUserList", styleUserList); - emit styleUserListChanged(); -} - -void SettingsCache::setChatMention(QT_STATE_CHANGED_T _chatMention) -{ - chatMention = static_cast(_chatMention); - settings->setValue("chat/mention", chatMention); -} - -void SettingsCache::setChatMentionCompleter(const QT_STATE_CHANGED_T _enableMentionCompleter) -{ - chatMentionCompleter = (bool)_enableMentionCompleter; - settings->setValue("chat/mentioncompleter", chatMentionCompleter); - emit chatMentionCompleterChanged(); -} - -void SettingsCache::setChatMentionForeground(QT_STATE_CHANGED_T _chatMentionForeground) -{ - chatMentionForeground = static_cast(_chatMentionForeground); - settings->setValue("chat/mentionforeground", chatMentionForeground); -} - -void SettingsCache::setChatHighlightForeground(QT_STATE_CHANGED_T _chatHighlightForeground) -{ - chatHighlightForeground = static_cast(_chatHighlightForeground); - settings->setValue("chat/highlightforeground", chatHighlightForeground); -} - -void SettingsCache::setChatMentionColor(const QString &_chatMentionColor) -{ - chatMentionColor = _chatMentionColor; - settings->setValue("chat/mentioncolor", chatMentionColor); -} - -void SettingsCache::setChatHighlightColor(const QString &_chatHighlightColor) -{ - chatHighlightColor = _chatHighlightColor; - settings->setValue("chat/highlightcolor", chatHighlightColor); -} - -void SettingsCache::setZoneViewGroupByIndex(int _zoneViewGroupByIndex) -{ - zoneViewGroupByIndex = _zoneViewGroupByIndex; - settings->setValue("zoneview/groupby", zoneViewGroupByIndex); -} - -void SettingsCache::setZoneViewSortByIndex(int _zoneViewSortByIndex) -{ - zoneViewSortByIndex = _zoneViewSortByIndex; - settings->setValue("zoneview/sortby", zoneViewSortByIndex); -} - -void SettingsCache::setZoneViewPileView(QT_STATE_CHANGED_T _zoneViewPileView) -{ - zoneViewPileView = static_cast(_zoneViewPileView); - settings->setValue("zoneview/pileview", zoneViewPileView); -} - -void SettingsCache::setSoundEnabled(QT_STATE_CHANGED_T _soundEnabled) -{ - soundEnabled = static_cast(_soundEnabled); - settings->setValue("sound/enabled", soundEnabled); - emit soundEnabledChanged(); -} - -void SettingsCache::setSoundThemeName(const QString &_soundThemeName) -{ - soundThemeName = _soundThemeName; - settings->setValue("sound/theme", soundThemeName); - emit soundThemeChanged(); -} - -void SettingsCache::setIgnoreUnregisteredUsers(QT_STATE_CHANGED_T _ignoreUnregisteredUsers) -{ - ignoreUnregisteredUsers = static_cast(_ignoreUnregisteredUsers); - settings->setValue("chat/ignore_unregistered", ignoreUnregisteredUsers); -} - -void SettingsCache::setIgnoreUnregisteredUserMessages(QT_STATE_CHANGED_T _ignoreUnregisteredUserMessages) -{ - ignoreUnregisteredUserMessages = static_cast(_ignoreUnregisteredUserMessages); - settings->setValue("chat/ignore_unregistered_messages", ignoreUnregisteredUserMessages); -} - -void SettingsCache::setIgnoreNonBuddyUserMessages(QT_STATE_CHANGED_T _ignoreNonBuddyUserMessages) -{ - ignoreNonBuddyUserMessages = static_cast(_ignoreNonBuddyUserMessages); - settings->setValue("chat/ignore_nonbuddy_messages", ignoreNonBuddyUserMessages); -} - -void SettingsCache::setPixmapCacheSize(const int _pixmapCacheSize) -{ - pixmapCacheSize = _pixmapCacheSize; - settings->setValue("personal/pixmapCacheSize", pixmapCacheSize); - emit pixmapCacheSizeChanged(pixmapCacheSize); -} - -void SettingsCache::setCardImageCacheMethod(const CardPictureLoaderCacheMethod::CacheMethod _cardImageCachingMethod) -{ - cardPictureLoaderCacheMethod = static_cast(_cardImageCachingMethod); - settings->setValue("personal/cardPictureLoaderCacheMethod", cardPictureLoaderCacheMethod); - emit cardPictureLoaderCacheMethodChanged(cardPictureLoaderCacheMethod); -} - -void SettingsCache::setNetworkCacheSizeInMB(const int _networkCacheSize) -{ - networkCacheSize = _networkCacheSize; - settings->setValue("personal/networkCacheSize", networkCacheSize); - emit networkCacheSizeChanged(networkCacheSize); -} - -void SettingsCache::setNetworkRedirectCacheTtl(const int _redirectCacheTtl) -{ - redirectCacheTtl = _redirectCacheTtl; - settings->setValue("personal/redirectCacheSize", redirectCacheTtl); - emit redirectCacheTtlChanged(redirectCacheTtl); -} - -void SettingsCache::setLocalCardImageStorageNamingScheme( - const CardPictureLoaderLocalSchemes::NamingScheme _localCardImageStorageNamingScheme) -{ - localCardImageStorageNamingScheme = static_cast(_localCardImageStorageNamingScheme); - settings->setValue("personal/localCardImageStorageNamingScheme", localCardImageStorageNamingScheme); - emit localCardImageStorageNamingSchemeChanged(localCardImageStorageNamingScheme); -} - -void SettingsCache::setClientID(const QString &_clientID) -{ - clientID = _clientID; - settings->setValue("personal/clientid", clientID); -} - -void SettingsCache::setClientVersion(const QString &_clientVersion) -{ - clientVersion = _clientVersion; - settings->setValue("personal/clientversion", clientVersion); -} - QStringList SettingsCache::getCountries() const { static const QStringList countries = { @@ -1217,241 +180,249 @@ QStringList SettingsCache::getCountries() const return countries; } -void SettingsCache::setGameDescription(const QString _gameDescription) -{ - gameDescription = _gameDescription; - settings->setValue("game/gamedescription", gameDescription); -} - -void SettingsCache::setMaxPlayers(const int _maxPlayers) -{ - maxPlayers = _maxPlayers; - settings->setValue("game/maxplayers", maxPlayers); -} - -void SettingsCache::setGameTypes(const QString _gameTypes) -{ - gameTypes = _gameTypes; - settings->setValue("game/gametypes", gameTypes); -} - -void SettingsCache::setOnlyBuddies(const bool _onlyBuddies) -{ - onlyBuddies = _onlyBuddies; - settings->setValue("game/onlybuddies", onlyBuddies); -} - -void SettingsCache::setOnlyRegistered(const bool _onlyRegistered) -{ - onlyRegistered = _onlyRegistered; - settings->setValue("game/onlyregistered", onlyRegistered); -} - -void SettingsCache::setSpectatorsAllowed(const bool _spectatorsAllowed) -{ - spectatorsAllowed = _spectatorsAllowed; - settings->setValue("game/spectatorsallowed", spectatorsAllowed); -} - -void SettingsCache::setSpectatorsNeedPassword(const bool _spectatorsNeedPassword) -{ - spectatorsNeedPassword = _spectatorsNeedPassword; - settings->setValue("game/spectatorsneedpassword", spectatorsNeedPassword); -} - -void SettingsCache::setSpectatorsCanTalk(const bool _spectatorsCanTalk) -{ - spectatorsCanTalk = _spectatorsCanTalk; - settings->setValue("game/spectatorscantalk", spectatorsCanTalk); -} - -void SettingsCache::setSpectatorsCanSeeEverything(const bool _spectatorsCanSeeEverything) -{ - spectatorsCanSeeEverything = _spectatorsCanSeeEverything; - settings->setValue("game/spectatorscanseeeverything", spectatorsCanSeeEverything); -} - -void SettingsCache::setCreateGameAsSpectator(const bool _createGameAsSpectator) -{ - createGameAsSpectator = _createGameAsSpectator; - settings->setValue("game/creategameasspectator", createGameAsSpectator); -} - -void SettingsCache::setDefaultStartingLifeTotal(const int _defaultStartingLifeTotal) -{ - defaultStartingLifeTotal = _defaultStartingLifeTotal; - settings->setValue("game/defaultstartinglifetotal", defaultStartingLifeTotal); -} - -void SettingsCache::setShareDecklistsOnLoad(const bool _shareDecklistsOnLoad) -{ - shareDecklistsOnLoad = _shareDecklistsOnLoad; - settings->setValue("game/sharedecklistsonload", shareDecklistsOnLoad); -} - -void SettingsCache::setCheckUpdatesOnStartup(QT_STATE_CHANGED_T value) -{ - checkUpdatesOnStartup = static_cast(value); - settings->setValue("personal/startupUpdateCheck", checkUpdatesOnStartup); -} - -void SettingsCache::setStartupCardUpdateCheckPromptForUpdate(bool value) -{ - startupCardUpdateCheckPromptForUpdate = value; - settings->setValue("personal/startupCardUpdateCheckPromptForUpdate", startupCardUpdateCheckPromptForUpdate); -} - -void SettingsCache::setStartupCardUpdateCheckAlwaysUpdate(bool value) -{ - startupCardUpdateCheckAlwaysUpdate = value; - settings->setValue("personal/startupCardUpdateCheckAlwaysUpdate", startupCardUpdateCheckAlwaysUpdate); -} - -void SettingsCache::setCardUpdateCheckInterval(int value) -{ - cardUpdateCheckInterval = value; - settings->setValue("personal/cardUpdateCheckInterval", cardUpdateCheckInterval); -} - -void SettingsCache::setLastCardUpdateCheck(QDate value) -{ - lastCardUpdateCheck = value; - settings->setValue("personal/lastCardUpdateCheck", lastCardUpdateCheck); -} - -void SettingsCache::setAlwaysEnableNewSets(bool value) -{ - alwaysEnableNewSets = value; - settings->setValue("personal/alwaysEnableNewSets", alwaysEnableNewSets); -} - -void SettingsCache::setRememberGameSettings(const bool _rememberGameSettings) -{ - rememberGameSettings = _rememberGameSettings; - settings->setValue("game/remembergamesettings", rememberGameSettings); -} - -void SettingsCache::setLocalGameRememberSettings(bool value) -{ - localGameRememberSettings = value; - settings->setValue("localgameoptions/remembersettings", value); -} - -void SettingsCache::setLocalGameMaxPlayers(int value) -{ - localGameMaxPlayers = value; - settings->setValue("localgameoptions/maxplayers", value); -} - -void SettingsCache::setLocalGameStartingLifeTotal(int value) -{ - localGameStartingLifeTotal = value; - settings->setValue("localgameoptions/startinglifetotal", value); -} - -void SettingsCache::setNotifyAboutUpdate(QT_STATE_CHANGED_T _notifyaboutupdate) -{ - notifyAboutUpdates = static_cast(_notifyaboutupdate); - settings->setValue("personal/updatenotification", notifyAboutUpdates); -} - -void SettingsCache::setNotifyAboutNewVersion(QT_STATE_CHANGED_T _notifyaboutnewversion) -{ - notifyAboutNewVersion = static_cast(_notifyaboutnewversion); - settings->setValue("personal/newversionnotification", notifyAboutNewVersion); -} - -void SettingsCache::setDownloadSpoilerStatus(bool _spoilerStatus) -{ - mbDownloadSpoilers = _spoilerStatus; - settings->setValue("personal/downloadspoilers", mbDownloadSpoilers); - emit downloadSpoilerStatusChanged(); -} - -void SettingsCache::setUpdateReleaseChannelIndex(int value) -{ - updateReleaseChannel = value; - settings->setValue("personal/updatereleasechannel", updateReleaseChannel); -} - -void SettingsCache::setMaxFontSize(int _max) -{ - maxFontSize = _max; - settings->setValue("game/maxfontsize", maxFontSize); -} - -void SettingsCache::setRoundCardCorners(bool _roundCardCorners) -{ - if (_roundCardCorners == roundCardCorners) { - return; - } - - roundCardCorners = _roundCardCorners; - settings->setValue("cards/roundcardcorners", _roundCardCorners); - emit roundCardCornersChanged(roundCardCorners); -} - -void SettingsCache::setShowDragSelectionCount(QT_STATE_CHANGED_T _showDragSelectionCount) -{ - showDragSelectionCount = static_cast(_showDragSelectionCount); - settings->setValue("interface/showlassoselectioncount", showDragSelectionCount); -} - -void SettingsCache::setShowTotalSelectionCount(QT_STATE_CHANGED_T _showTotalSelectionCount) -{ - showTotalSelectionCount = static_cast(_showTotalSelectionCount); - settings->setValue("interface/showpersistentselectioncount", showTotalSelectionCount); -} - -void SettingsCache::setTallyType(int value) -{ - if (tallyType == value) { - return; - } - - tallyType = value; - settings->setValue("interface/tallyType", value); - emit tallyTypeChanged(value); -} - void SettingsCache::loadPaths() { QString dataPath = getDataPath(); - deckPath = getSafeConfigPath("paths/decks", dataPath + "/decks/"); - filtersPath = getSafeConfigPath("paths/filters", dataPath + "/filters/"); - replaysPath = getSafeConfigPath("paths/replays", dataPath + "/replays/"); - themesPath = getSafeConfigPath("paths/themes", dataPath + "/themes/"); - picsPath = getSafeConfigPath("paths/pics", dataPath + "/pics/"); - redirectCachePath = getSafeConfigPath("paths/redirects", getCachePath() + "/redirects/"); - // this has never been exposed as an user-configurable setting - if (picsPath.endsWith("/")) { - customPicsPath = getSafeConfigPath("paths/custompics", picsPath + "CUSTOM/"); - } else { - customPicsPath = getSafeConfigPath("paths/custompics", picsPath + "/CUSTOM/"); - } - customCardDatabasePath = getSafeConfigPath("paths/customsets", dataPath + "/customsets/"); + QSettings pathsIni(getSettingsPath() + "paths.ini", QSettings::IniFormat); - cardDatabasePath = getSafeConfigFilePath("paths/carddatabase", dataPath + "/cards.xml"); - tokenDatabasePath = getSafeConfigFilePath("paths/tokendatabase", dataPath + "/tokens.xml"); - spoilerDatabasePath = getSafeConfigFilePath("paths/spoilerdatabase", dataPath + "/spoiler.xml"); + auto computePath = [&](const QString &key, const QString &defaultPath) -> QString { + QString val = pathsIni.value("paths/" + key).toString(); + if (val.isEmpty() || !QDir(val).exists()) { + if (!QDir().mkpath(defaultPath)) { + qCInfo(SettingsCacheLog) << "[SettingsCache] Could not create folder:" << defaultPath; + } + val = defaultPath; + pathsIni.setValue("paths/" + key, val); + } + return val; + }; + + auto computeFilePath = [&](const QString &key, const QString &defaultPath) -> QString { + QString val = pathsIni.value("paths/" + key).toString(); + if (!QFile::exists(val) || val.isEmpty()) { + val = defaultPath; + pathsIni.setValue("paths/" + key, val); + } + return val; + }; + + computePath("decks", dataPath + "/decks/"); + computePath("filters", dataPath + "/filters/"); + computePath("replays", dataPath + "/replays/"); + computePath("themes", dataPath + "/themes/"); + computePath("pics", dataPath + "/pics/"); + computePath("redirects", getCachePath() + "/redirects/"); + + // customPicsPath derived from picsPath + QString picsPath = pathsIni.value("paths/pics").toString(); + if (picsPath.endsWith("/")) { + computePath("custompics", picsPath + "CUSTOM/"); + } else { + computePath("custompics", picsPath + "/CUSTOM/"); + } + + computePath("customsets", dataPath + "/customsets/"); + computeFilePath("carddatabase", dataPath + "/cards.xml"); + computeFilePath("tokendatabase", dataPath + "/tokens.xml"); + computeFilePath("spoilerdatabase", dataPath + "/spoiler.xml"); } void SettingsCache::resetPaths() { - QStringList databasePaths{customCardDatabasePath, cardDatabasePath, spoilerDatabasePath, tokenDatabasePath}; - QString picsPath_ = picsPath; - settings->remove("paths"); // removes all keys in paths/* + QStringList databasePaths{pathsSettings->getCustomCardDatabasePath(), pathsSettings->getCardDatabasePath(), + pathsSettings->getSpoilerCardDatabasePath(), pathsSettings->getTokenDatabasePath()}; + QString picsPath_ = pathsSettings->getPicsPath(); + + QSettings pathsIni(getSettingsPath() + "paths.ini", QSettings::IniFormat); + pathsIni.remove("paths"); + loadPaths(); - if (databasePaths != - QStringList{customCardDatabasePath, cardDatabasePath, spoilerDatabasePath, tokenDatabasePath}) { + + if (databasePaths != QStringList{pathsSettings->getCustomCardDatabasePath(), pathsSettings->getCardDatabasePath(), + pathsSettings->getSpoilerCardDatabasePath(), + pathsSettings->getTokenDatabasePath()}) { emit cardDatabasePathChanged(); } - if (picsPath_ != picsPath) { - emit picsPathChanged(); + if (picsPath_ != pathsSettings->getPicsPath()) { + emit pathsSettings->picsPathChanged(); } } +// ICardDatabasePathProvider - delegate to pathsSettings +QString SettingsCache::getCustomCardDatabasePath() const +{ + return pathsSettings->getCustomCardDatabasePath(); +} + +QString SettingsCache::getCardDatabasePath() const +{ + return pathsSettings->getCardDatabasePath(); +} + +QString SettingsCache::getSpoilerCardDatabasePath() const +{ + return pathsSettings->getSpoilerCardDatabasePath(); +} + +QString SettingsCache::getTokenDatabasePath() const +{ + return pathsSettings->getTokenDatabasePath(); +} + +// INetworkSettingsProvider - delegate to sub-objects +int SettingsCache::getKeepAlive() const +{ + return personalSettings->getKeepAlive(); +} + +int SettingsCache::getTimeOut() const +{ + return personalSettings->getTimeOut(); +} + +bool SettingsCache::getNotifyAboutUpdates() const +{ + return updatesSettings->getNotifyAboutUpdates(); +} + +void SettingsCache::setKnownMissingFeatures(const QString &_knownMissingFeatures) +{ + interfaceSettings->setKnownMissingFeatures(_knownMissingFeatures); +} + +QString SettingsCache::getKnownMissingFeatures() +{ + return interfaceSettings->getKnownMissingFeatures(); +} + +QString SettingsCache::getClientID() +{ + return personalSettings->getClientID(); +} + +// Release channels +ReleaseChannel *SettingsCache::getUpdateReleaseChannel() const +{ + return releaseChannels.at(qMax(0, updatesSettings->getUpdateReleaseChannelIndex())); +} + +QList SettingsCache::getUpdateReleaseChannels() const +{ + return releaseChannels; +} + +int SettingsCache::getUpdateReleaseChannelIndex() const +{ + return updatesSettings->getUpdateReleaseChannelIndex(); +} + +// Sub-settings accessors +ShortcutsSettings &SettingsCache::shortcuts() const +{ + return *shortcutsSettings; +} + +CardDatabaseSettings &SettingsCache::cardDatabase() const +{ + return *cardDatabaseSettings; +} + +ServersSettings &SettingsCache::servers() const +{ + return *serversSettings; +} + +MessageSettings &SettingsCache::messages() const +{ + return *messageSettings; +} + +GameFiltersSettings &SettingsCache::gameFilters() const +{ + return *gameFiltersSettings; +} + +LayoutsSettings &SettingsCache::layouts() const +{ + return *layoutsSettings; +} + +DownloadSettings &SettingsCache::downloads() const +{ + return *downloadSettings; +} + +RecentsSettings &SettingsCache::recents() const +{ + return *recentsSettings; +} + +CardOverrideSettings &SettingsCache::cardOverrides() const +{ + return *cardOverrideSettings; +} + +DebugSettings &SettingsCache::debug() const +{ + return *debugSettings; +} + CardCounterSettings &SettingsCache::cardCounters() const { return *cardCounterSettings; } + +TabsSettings &SettingsCache::tabs() const +{ + return *tabsSettings; +} + +SoundSettings &SettingsCache::sound() const +{ + return *soundSettings; +} + +GameSettings &SettingsCache::game() const +{ + return *gameSettings; +} + +ChatSettings &SettingsCache::chat() const +{ + return *chatSettings; +} + +CacheStorageSettings &SettingsCache::cacheStorage() const +{ + return *cacheStorageSettings; +} + +UpdatesSettings &SettingsCache::updates() const +{ + return *updatesSettings; +} + +PersonalSettings &SettingsCache::personal() const +{ + return *personalSettings; +} + +CardsDisplaySettings &SettingsCache::cardsDisplay() const +{ + return *cardsDisplaySettings; +} + +InterfaceSettings &SettingsCache::interface() const +{ + return *interfaceSettings; +} + +PathsSettings &SettingsCache::paths() const +{ + return *pathsSettings; +} + +VisualDeckStorageSettings &SettingsCache::visualDeckStorage() const +{ + return *visualDeckStorageSettings; +} diff --git a/cockatrice/src/client/settings/cache_settings.h b/cockatrice/src/client/settings/cache_settings.h index 90b8c92e7..f9cce4cfe 100644 --- a/cockatrice/src/client/settings/cache_settings.h +++ b/cockatrice/src/client/settings/cache_settings.h @@ -7,197 +7,51 @@ #ifndef SETTINGSCACHE_H #define SETTINGSCACHE_H -#include "../../interface/card_picture_loader/card_picture_loader_cache_method.h" -#include "../../interface/card_picture_loader/card_picture_loader_local_schemes.h" -#include "shortcuts_settings.h" - -#include #include -#include #include #include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include #include inline Q_LOGGING_CATEGORY(SettingsCacheLog, "settings_cache"); class ReleaseChannel; -// In MB (Increments of 64) -#define PIXMAPCACHE_SIZE_DEFAULT 2048 -#define PIXMAPCACHE_SIZE_MIN 64 -#define PIXMAPCACHE_SIZE_MAX 4096 - -// In MB -constexpr int NETWORK_CACHE_SIZE_DEFAULT = 1024 * 4; // 4 GB -constexpr int NETWORK_CACHE_SIZE_MIN = 1; // 1 MB -constexpr int NETWORK_CACHE_SIZE_MAX = 1024 * 1024; // 1 TB - -// In Days -#define NETWORK_REDIRECT_CACHE_TTL_DEFAULT 30 -#define NETWORK_REDIRECT_CACHE_TTL_MIN 1 -#define NETWORK_REDIRECT_CACHE_TTL_MAX 90 - #define DEFAULT_LANG_NAME "English" #define CLIENT_INFO_NOT_SET "notset" #define DEFAULT_FONT_SIZE 12 -inline QStringList defaultTags = { - // Strategies - "🏃️ Aggro", - "🧙‍️ Control", - "⚔️ Midrange", - "🌀 Combo", - "🪓 Mill", - "🔒 Stax", - "🗺️ Landfall", - "🛡️ Pillowfort", - "🌱 Ramp", - "⚡ Storm", - "💀 Aristocrats", - "☠️ Reanimator", - "👹 Sacrifice", - "🔥 Burn", - "🌟 Lifegain", - "🔮 Spellslinger", - "👥 Tokens", - "🎭 Blink", - "⏳ Time Manipulation", - "🌍 Domain", - "💫 Proliferate", - "📜 Saga", - "🎲 Chaos", - "🪄 Auras", - "🔫 Pingers", - - // Themes - "👑 Monarch", - "🚀 Vehicles", - "💉 Infect", - "🩸 Madness", - "🌀 Morph", - - // Card Types - "⚔️ Creature", - "💎 Artifact", - "🌔 Enchantment", - "📖 Sorcery", - "⚡ Instant", - "🌌 Planeswalker", - "🌏 Land", - "🪄 Aura", - - // Kindred Types - "🐉 Kindred", - "🧙 Humans", - "⚔️ Soldiers", - "🛡️ Knights", - "🎻 Bards", - "🧝 Elves", - "🌲 Dryads", - "😇 Angels", - "🎩 Wizards", - "🧛 Vampires", - "🦴 Skeletons", - "💀 Zombies", - "👹 Demons", - "👾 Eldrazi", - "🐉 Dragons", - "🐠 Merfolk", - "🦁 Cats", - "🐺 Wolves", - "🐺 Werewolves", - "🦇 Bats", - "🐀 Rats", - "🦅 Birds", - "🦗 Insects", - "🍄 Fungus", - "🐚 Sea Creatures", - "🐗 Boars", - "🦊 Foxes", - "🦄 Unicorns", - "🐘 Elephants", - "🐻 Bears", - "🦏 Rhinos", - "🦂 Scorpions", -}; - -class QSettings; +class CacheStorageSettings; class CardCounterSettings; +class CardDatabaseSettings; +class CardOverrideSettings; +class CardsDisplaySettings; +class ChatSettings; +class DebugSettings; +class DownloadSettings; +class GameFiltersSettings; +class GameSettings; +class InterfaceSettings; +class LayoutsSettings; +class MessageSettings; +class PathsSettings; +class PersonalSettings; +class RecentsSettings; +class ServersSettings; +class ShortcutsSettings; +class SoundSettings; +class TabsSettings; +class UpdatesSettings; +class VisualDeckStorageSettings; +class QSettings; class SettingsCache : public ICardDatabasePathProvider, public INetworkSettingsProvider { Q_OBJECT signals: - void langChanged(); - void picsPathChanged(); void themeChanged(); - void homeTabBackgroundSourceChanged(); - void homeTabBackgroundShuffleFrequencyChanged(); - void homeTabDisplayCardNameChanged(); - void picDownloadChanged(); - void showStatusBarChanged(bool state); - void showGameSelectorFilterToolbarChanged(bool state); - void displayCardNamesChanged(); - void overrideAllCardArtWithPersonalPreferenceChanged(bool _overrideAllCardArtWithPersonalPreference); - void bumpSetsWithCardsInDeckToTopChanged(); - void printingSelectorSortOrderChanged(); - void printingSelectorCardSizeChanged(); - void includeRebalancedCardsChanged(bool _includeRebalancedCards); - void printingSelectorNavigationButtonsVisibleChanged(); - void deckEditorBannerCardComboBoxVisibleChanged(bool _visible); - void deckEditorTagsWidgetVisibleChanged(bool _visible); - void visualDeckStorageShowTagFilterChanged(bool _visible); - void visualDeckStorageDefaultTagsListChanged(); - void visualDeckStorageShowColorIdentityChanged(bool _visible); - void visualDeckStorageShowBannerCardComboBoxChanged(bool _visible); - void visualDeckStorageShowTagsOnDeckPreviewsChanged(bool _visible); - void visualDeckStorageCardSizeChanged(); - void visualDeckStorageDrawUnusedColorIdentitiesChanged(bool _visible); - void visualDeckStorageUnusedColorIdentitiesOpacityChanged(bool value); - void visualDeckStorageInGameChanged(bool enabled); - void visualDeckStorageSelectionAnimationChanged(bool enabled); - void visualDatabaseDisplayFilterToMostRecentSetsEnabledChanged(bool enabled); - void visualDatabaseDisplayFilterToMostRecentSetsAmountChanged(int amount); - void visualDeckEditorSampleHandSizeAmountChanged(int amount); - void visualDeckEditorCardSizeChanged(); - void visualDatabaseDisplayCardSizeChanged(); - void edhRecCardSizeChanged(); - void archidektPreviewSizeChanged(); - void horizontalHandChanged(); - void handJustificationChanged(); - void invertVerticalCoordinateChanged(); - void minPlayersForMultiColumnLayoutChanged(); - void soundEnabledChanged(); - void soundThemeChanged(); - void ignoreUnregisteredUsersChanged(); - void ignoreUnregisteredUserMessagesChanged(); - void ignoreNonBuddyUserMessagesChanged(); - void pixmapCacheSizeChanged(int newSizeInMBs); - void networkCacheSizeChanged(int newSizeInMBs); - void redirectCacheTtlChanged(int newTtl); - void cardPictureLoaderCacheMethodChanged(int cardPictureLoaderCacheMethod); - void localCardImageStorageNamingSchemeChanged(int localCardImageStorageNamingScheme); - void masterVolumeChanged(int value); - void styleUserListChanged(); - void chatMentionCompleterChanged(); - void downloadSpoilerTimeIndexChanged(); - void downloadSpoilerStatusChanged(); - void useTearOffMenusChanged(bool state); - void roundCardCornersChanged(bool roundCardCorners); - void keepGameChatFocusChanged(bool value); - void tallyTypeChanged(int type); private: QSettings *settings; @@ -212,152 +66,26 @@ private: CardOverrideSettings *cardOverrideSettings; DebugSettings *debugSettings; CardCounterSettings *cardCounterSettings; + TabsSettings *tabsSettings; + SoundSettings *soundSettings; + GameSettings *gameSettings; + ChatSettings *chatSettings; + CacheStorageSettings *cacheStorageSettings; + UpdatesSettings *updatesSettings; + PersonalSettings *personalSettings; + CardsDisplaySettings *cardsDisplaySettings; + InterfaceSettings *interfaceSettings; + PathsSettings *pathsSettings; + VisualDeckStorageSettings *visualDeckStorageSettings; - QString lang; - QString deckPath, filtersPath, replaysPath, picsPath, redirectCachePath, customPicsPath, cardDatabasePath, - customCardDatabasePath, themesPath, spoilerDatabasePath, tokenDatabasePath, themeName, homeTabBackgroundSource; - bool tabVisualDeckStorageOpen, tabServerOpen, tabAccountOpen, tabDeckStorageOpen, tabReplaysOpen, tabAdminOpen, - tabLogOpen; - bool checkUpdatesOnStartup; - bool startupCardUpdateCheckPromptForUpdate; - bool startupCardUpdateCheckAlwaysUpdate; - bool checkCardUpdatesOnStartup; - int cardUpdateCheckInterval; - QDate lastCardUpdateCheck; - bool alwaysEnableNewSets; - bool notifyAboutUpdates; - bool notifyAboutNewVersion; - bool showTipsOnStartup; - QList seenTips; - int homeTabBackgroundShuffleFrequency; - bool homeTabDisplayCardName; - bool mbDownloadSpoilers; - int updateReleaseChannel; - int maxFontSize; - bool picDownload; - bool notificationsEnabled; - bool spectatorNotificationsEnabled; - bool buddyConnectNotificationsEnabled; - bool doubleClickToPlay; - bool clickPlaysAllSelected; - bool playToStack; - bool doNotDeleteArrowsInSubPhases; - int startingHandSize; - bool annotateTokens; - bool showShortcuts; - bool showGameSelectorFilterToolbar; - bool displayCardNames; - bool overrideAllCardArtWithPersonalPreference; - bool bumpSetsWithCardsInDeckToTop; - int printingSelectorSortOrder; - int printingSelectorCardSize; - bool includeRebalancedCards; - bool printingSelectorNavigationButtonsVisible; - bool deckEditorBannerCardComboBoxVisible; - bool deckEditorTagsWidgetVisible; - int visualDeckStorageSortingOrder; - bool visualDeckStorageShowFolders; - bool visualDeckStorageShowColorIdentity; - bool visualDeckStorageShowBannerCardComboBox; - bool visualDeckStorageShowTagsOnDeckPreviews; - bool visualDeckStorageShowTagFilter; - QStringList visualDeckStorageDefaultTagsList; - bool visualDeckStorageSearchFolderNames; - int visualDeckStorageCardSize; - int visualDeckEditorCardSize; - int visualDatabaseDisplayCardSize; - int edhrecCardSize; - int archidektPreviewSize; - bool visualDeckStorageDrawUnusedColorIdentities; - int visualDeckStorageUnusedColorIdentitiesOpacity; - int visualDeckStorageTooltipType; - bool visualDeckStoragePromptForConversion; - bool visualDeckStorageAlwaysConvert; - bool visualDeckStorageInGame; - bool visualDeckStorageSelectionAnimation; - int defaultDeckEditorType; - bool visualDatabaseDisplayFilterToMostRecentSetsEnabled; - int visualDatabaseDisplayFilterToMostRecentSetsAmount; - int visualDeckEditorSampleHandSize; - bool horizontalHand; - bool invertVerticalCoordinate; - int minPlayersForMultiColumnLayout; - bool tapAnimation; - bool autoRotateSidewaysLayoutCards; - bool openDeckInNewTab; - int rewindBufferingMs; - qreal fastForwardSpeed; - bool styleUserList; - bool chatMention; - bool chatMentionCompleter; - QString chatMentionColor; - QString chatHighlightColor; - bool chatMentionForeground; - bool chatHighlightForeground; - int zoneViewSortByIndex, zoneViewGroupByIndex; - bool zoneViewPileView; - bool soundEnabled; - QString soundThemeName; - bool ignoreUnregisteredUsers; - bool ignoreUnregisteredUserMessages; - bool ignoreNonBuddyUserMessages; - QString picUrl; - QString picUrlFallback; - QString clientID; - QString clientVersion; - QString knownMissingFeatures; - bool useTearOffMenus; - int cardViewInitialRowsMax; - int cardViewExpandedRowsMax; - bool closeEmptyCardView; - bool focusCardViewSearchBar; - bool keepGameChatFocus; - int pixmapCacheSize; - int networkCacheSize; - int redirectCacheTtl; - int cardPictureLoaderCacheMethod; - int localCardImageStorageNamingScheme; - bool scaleCards; - int verticalCardOverlapPercent; - bool showMessagePopups; - bool showMentionPopups; - bool roomHistory; - bool leftJustified; - int masterVolume; - int cardInfoViewMode; - QString highlightWords; - QString gameDescription; - int maxPlayers; - QString gameTypes; - bool onlyBuddies; - bool onlyRegistered; - bool spectatorsAllowed; - bool spectatorsNeedPassword; - bool spectatorsCanTalk; - bool spectatorsCanSeeEverything; - bool createGameAsSpectator; - int defaultStartingLifeTotal; - bool shareDecklistsOnLoad; - int keepalive; - int timeout; - void translateLegacySettings(); - [[nodiscard]] QString getSafeConfigPath(QString configEntry, QString defaultPath) const; - [[nodiscard]] QString getSafeConfigFilePath(QString configEntry, QString defaultPath) const; - void loadPaths(); - bool rememberGameSettings; - - // Local game settings (separate from server game settings in game/*) - bool localGameRememberSettings; - int localGameMaxPlayers; - int localGameStartingLifeTotal; + QString themeName; QList releaseChannels; bool isPortableBuild; - bool roundCardCorners; - bool showStatusBar; - bool showDragSelectionCount; - bool showTotalSelectionCount; - int tallyType; + + [[nodiscard]] QString getSafeConfigPath(QString configEntry, QString defaultPath) const; + [[nodiscard]] QString getSafeConfigFilePath(QString configEntry, QString defaultPath) const; + void loadPaths(); public: SettingsCache(); @@ -365,829 +93,64 @@ public: QString getSettingsPath(); [[nodiscard]] QString getCachePath() const; [[nodiscard]] QString getNetworkCachePath() const; - [[nodiscard]] QString getLang() const - { - return lang; - } - [[nodiscard]] QString getDeckPath() const - { - return deckPath; - } - [[nodiscard]] QString getFiltersPath() const - { - return filtersPath; - } - [[nodiscard]] QString getReplaysPath() const - { - return replaysPath; - } - [[nodiscard]] QString getThemesPath() const - { - return themesPath; - } - [[nodiscard]] QString getPicsPath() const - { - return picsPath; - } - [[nodiscard]] QString getRedirectCachePath() const - { - return redirectCachePath; - } - [[nodiscard]] QString getCustomPicsPath() const - { - return customPicsPath; - } - [[nodiscard]] QString getCustomCardDatabasePath() const override - { - return customCardDatabasePath; - } - [[nodiscard]] QString getCardDatabasePath() const override - { - return cardDatabasePath; - } - [[nodiscard]] QString getSpoilerCardDatabasePath() const override - { - return spoilerDatabasePath; - } - [[nodiscard]] QString getTokenDatabasePath() const override - { - return tokenDatabasePath; - } + + // ICardDatabasePathProvider - delegate to pathsSettings + [[nodiscard]] QString getCustomCardDatabasePath() const override; + [[nodiscard]] QString getCardDatabasePath() const override; + [[nodiscard]] QString getSpoilerCardDatabasePath() const override; + [[nodiscard]] QString getTokenDatabasePath() const override; + + // INetworkSettingsProvider - delegate to sub-objects + [[nodiscard]] int getKeepAlive() const override; + [[nodiscard]] int getTimeOut() const override; + [[nodiscard]] bool getNotifyAboutUpdates() const override; + void setKnownMissingFeatures(const QString &_knownMissingFeatures) override; + [[nodiscard]] QString getKnownMissingFeatures() override; + QString getClientID() override; + [[nodiscard]] QString getThemeName() const { return themeName; } - [[nodiscard]] QString getHomeTabBackgroundSource() const - { - return homeTabBackgroundSource; - } - [[nodiscard]] int getHomeTabBackgroundShuffleFrequency() const - { - return homeTabBackgroundShuffleFrequency; - } - [[nodiscard]] bool getHomeTabDisplayCardName() const - { - return homeTabDisplayCardName; - } - [[nodiscard]] bool getTabVisualDeckStorageOpen() const - { - return tabVisualDeckStorageOpen; - } - [[nodiscard]] bool getTabServerOpen() const - { - return tabServerOpen; - } - [[nodiscard]] bool getTabAccountOpen() const - { - return tabAccountOpen; - } - [[nodiscard]] bool getTabDeckStorageOpen() const - { - return tabDeckStorageOpen; - } - [[nodiscard]] bool getTabReplaysOpen() const - { - return tabReplaysOpen; - } - [[nodiscard]] bool getTabAdminOpen() const - { - return tabAdminOpen; - } - [[nodiscard]] bool getTabLogOpen() const - { - return tabLogOpen; - } - [[nodiscard]] QString getChatMentionColor() const - { - return chatMentionColor; - } - [[nodiscard]] QString getChatHighlightColor() const - { - return chatHighlightColor; - } - [[nodiscard]] bool getPicDownload() const - { - return picDownload; - } - [[nodiscard]] bool getShowStatusBar() const - { - return showStatusBar; - } - [[nodiscard]] bool getShowDragSelectionCount() const - { - return showDragSelectionCount; - } - [[nodiscard]] bool getShowTotalSelectionCount() const - { - return showTotalSelectionCount; - } - [[nodiscard]] int getTallyType() const - { - return tallyType; - } - [[nodiscard]] bool getNotificationsEnabled() const - { - return notificationsEnabled; - } - [[nodiscard]] bool getSpectatorNotificationsEnabled() const - { - return spectatorNotificationsEnabled; - } - [[nodiscard]] bool getBuddyConnectNotificationsEnabled() const - { - return buddyConnectNotificationsEnabled; - } - [[nodiscard]] bool getCheckUpdatesOnStartup() const - { - return checkUpdatesOnStartup; - } - bool getStartupCardUpdateCheckPromptForUpdate() - { - return startupCardUpdateCheckPromptForUpdate; - } - bool getStartupCardUpdateCheckAlwaysUpdate() - { - return startupCardUpdateCheckAlwaysUpdate; - } - [[nodiscard]] int getCardUpdateCheckInterval() const - { - return cardUpdateCheckInterval; - } - [[nodiscard]] QDate getLastCardUpdateCheck() const - { - return lastCardUpdateCheck; - } - [[nodiscard]] bool getCardUpdateCheckRequired() const - { - return getLastCardUpdateCheck().daysTo(QDateTime::currentDateTime().date()) >= getCardUpdateCheckInterval() && - getLastCardUpdateCheck() != QDateTime::currentDateTime().date(); - } - [[nodiscard]] bool getAlwaysEnableNewSets() const - { - return alwaysEnableNewSets; - } - [[nodiscard]] bool getNotifyAboutUpdates() const override - { - return notifyAboutUpdates; - } - [[nodiscard]] bool getNotifyAboutNewVersion() const - { - return notifyAboutNewVersion; - } - [[nodiscard]] bool getShowTipsOnStartup() const - { - return showTipsOnStartup; - } - [[nodiscard]] QList getSeenTips() const - { - return seenTips; - } - [[nodiscard]] int getUpdateReleaseChannelIndex() const - { - return updateReleaseChannel; - } - [[nodiscard]] ReleaseChannel *getUpdateReleaseChannel() const - { - return releaseChannels.at(qMax(0, updateReleaseChannel)); - } - [[nodiscard]] QList getUpdateReleaseChannels() const - { - return releaseChannels; - } - [[nodiscard]] bool getDoubleClickToPlay() const - { - return doubleClickToPlay; - } - [[nodiscard]] bool getClickPlaysAllSelected() const - { - return clickPlaysAllSelected; - } - [[nodiscard]] bool getPlayToStack() const - { - return playToStack; - } - [[nodiscard]] bool getDoNotDeleteArrowsInSubPhases() const - { - return doNotDeleteArrowsInSubPhases; - } - [[nodiscard]] int getStartingHandSize() const - { - return startingHandSize; - } - [[nodiscard]] bool getAnnotateTokens() const - { - return annotateTokens; - } - [[nodiscard]] bool getShowShortcuts() const - { - return showShortcuts; - } - [[nodiscard]] bool getShowGameSelectorFilterToolbar() const - { - return showGameSelectorFilterToolbar; - } - [[nodiscard]] bool getDisplayCardNames() const - { - return displayCardNames; - } - [[nodiscard]] bool getOverrideAllCardArtWithPersonalPreference() const - { - return overrideAllCardArtWithPersonalPreference; - } - [[nodiscard]] bool getBumpSetsWithCardsInDeckToTop() const - { - return bumpSetsWithCardsInDeckToTop; - } - [[nodiscard]] int getPrintingSelectorSortOrder() const - { - return printingSelectorSortOrder; - } - [[nodiscard]] int getPrintingSelectorCardSize() const - { - return printingSelectorCardSize; - } - [[nodiscard]] bool getIncludeRebalancedCards() const - { - return includeRebalancedCards; - } - [[nodiscard]] bool getPrintingSelectorNavigationButtonsVisible() const - { - return printingSelectorNavigationButtonsVisible; - } - [[nodiscard]] bool getDeckEditorBannerCardComboBoxVisible() const - { - return deckEditorBannerCardComboBoxVisible; - } - [[nodiscard]] bool getDeckEditorTagsWidgetVisible() const - { - return deckEditorTagsWidgetVisible; - } - [[nodiscard]] int getVisualDeckStorageSortingOrder() const - { - return visualDeckStorageSortingOrder; - } - [[nodiscard]] bool getVisualDeckStorageShowFolders() const - { - return visualDeckStorageShowFolders; - } - [[nodiscard]] bool getVisualDeckStorageShowTagFilter() const - { - return visualDeckStorageShowTagFilter; - } - [[nodiscard]] QStringList getVisualDeckStorageDefaultTagsList() const - { - return visualDeckStorageDefaultTagsList; - } - [[nodiscard]] bool getVisualDeckStorageSearchFolderNames() const - { - return visualDeckStorageSearchFolderNames; - } - [[nodiscard]] bool getVisualDeckStorageShowColorIdentity() const - { - return visualDeckStorageShowColorIdentity; - } - [[nodiscard]] bool getVisualDeckStorageShowBannerCardComboBox() const - { - return visualDeckStorageShowBannerCardComboBox; - } - [[nodiscard]] bool getVisualDeckStorageShowTagsOnDeckPreviews() const - { - return visualDeckStorageShowTagsOnDeckPreviews; - } - [[nodiscard]] int getVisualDeckStorageCardSize() const - { - return visualDeckStorageCardSize; - } - [[nodiscard]] bool getVisualDeckStorageDrawUnusedColorIdentities() const - { - return visualDeckStorageDrawUnusedColorIdentities; - } - [[nodiscard]] int getVisualDeckStorageUnusedColorIdentitiesOpacity() const - { - return visualDeckStorageUnusedColorIdentitiesOpacity; - } - [[nodiscard]] int getVisualDeckStorageTooltipType() const - { - return visualDeckStorageTooltipType; - } - [[nodiscard]] bool getVisualDeckStoragePromptForConversion() const - { - return visualDeckStoragePromptForConversion; - } - [[nodiscard]] bool getVisualDeckStorageAlwaysConvert() const - { - return visualDeckStorageAlwaysConvert; - } - [[nodiscard]] bool getVisualDeckStorageInGame() const - { - return visualDeckStorageInGame; - } - [[nodiscard]] bool getVisualDeckStorageSelectionAnimation() const - { - return visualDeckStorageSelectionAnimation; - } - [[nodiscard]] int getVisualDeckEditorCardSize() const - { - return visualDeckEditorCardSize; - } - [[nodiscard]] int getVisualDatabaseDisplayCardSize() const - { - return visualDatabaseDisplayCardSize; - } - [[nodiscard]] int getEDHRecCardSize() const - { - return edhrecCardSize; - } - [[nodiscard]] int getArchidektPreviewSize() const - { - return archidektPreviewSize; - } - [[nodiscard]] int getDefaultDeckEditorType() const - { - return defaultDeckEditorType; - } - [[nodiscard]] bool getVisualDatabaseDisplayFilterToMostRecentSetsEnabled() const - { - return visualDatabaseDisplayFilterToMostRecentSetsEnabled; - } - [[nodiscard]] int getVisualDatabaseDisplayFilterToMostRecentSetsAmount() const - { - return visualDatabaseDisplayFilterToMostRecentSetsAmount; - } - [[nodiscard]] int getVisualDeckEditorSampleHandSize() const - { - return visualDeckEditorSampleHandSize; - } - [[nodiscard]] bool getHorizontalHand() const - { - return horizontalHand; - } - [[nodiscard]] bool getInvertVerticalCoordinate() const - { - return invertVerticalCoordinate; - } - [[nodiscard]] int getMinPlayersForMultiColumnLayout() const - { - return minPlayersForMultiColumnLayout; - } - [[nodiscard]] bool getTapAnimation() const - { - return tapAnimation; - } - [[nodiscard]] bool getAutoRotateSidewaysLayoutCards() const - { - return autoRotateSidewaysLayoutCards; - } - [[nodiscard]] bool getOpenDeckInNewTab() const - { - return openDeckInNewTab; - } - [[nodiscard]] int getRewindBufferingMs() const - { - return rewindBufferingMs; - } - [[nodiscard]] qreal getFastForwardSpeed() const - { - return fastForwardSpeed; - } - [[nodiscard]] bool getStyleUserList() const - { - return styleUserList; - } - [[nodiscard]] bool getChatMention() const - { - return chatMention; - } - [[nodiscard]] bool getChatMentionCompleter() const - { - return chatMentionCompleter; - } - [[nodiscard]] bool getChatMentionForeground() const - { - return chatMentionForeground; - } - [[nodiscard]] bool getChatHighlightForeground() const - { - return chatHighlightForeground; - } - /** - * Currently selected index for the `Group by X` QComboBox - */ - [[nodiscard]] int getZoneViewGroupByIndex() const - { - return zoneViewGroupByIndex; - } - /** - * Currently selected index for the `Sort by X` QComboBox - */ - [[nodiscard]] int getZoneViewSortByIndex() const - { - return zoneViewSortByIndex; - } - /** - Returns if the view should be sorted into pile view. - @return zoneViewPileView if the view should be sorted into pile view. - */ - [[nodiscard]] bool getZoneViewPileView() const - { - return zoneViewPileView; - } - [[nodiscard]] bool getSoundEnabled() const - { - return soundEnabled; - } - [[nodiscard]] QString getSoundThemeName() const - { - return soundThemeName; - } - [[nodiscard]] bool getIgnoreUnregisteredUsers() const - { - return ignoreUnregisteredUsers; - } - [[nodiscard]] bool getIgnoreUnregisteredUserMessages() const - { - return ignoreUnregisteredUserMessages; - } - [[nodiscard]] bool getIgnoreNonBuddyUserMessages() const - { - return ignoreNonBuddyUserMessages; - } - [[nodiscard]] int getPixmapCacheSize() const - { - return pixmapCacheSize; - } - [[nodiscard]] CardPictureLoaderCacheMethod::CacheMethod getCardPictureLoaderCacheMethod() const - { - return static_cast(cardPictureLoaderCacheMethod); - } - [[nodiscard]] int getNetworkCacheSizeInMB() const - { - return networkCacheSize; - } - [[nodiscard]] int getRedirectCacheTtl() const - { - return redirectCacheTtl; - } - [[nodiscard]] CardPictureLoaderLocalSchemes::NamingScheme getLocalCardImageStorageNamingScheme() const - { - return static_cast(localCardImageStorageNamingScheme); - } - [[nodiscard]] bool getScaleCards() const - { - return scaleCards; - } - [[nodiscard]] int getStackCardOverlapPercent() const - { - return verticalCardOverlapPercent; - } - [[nodiscard]] bool getShowMessagePopup() const - { - return showMessagePopups; - } - [[nodiscard]] bool getShowMentionPopup() const - { - return showMentionPopups; - } - [[nodiscard]] bool getRoomHistory() const - { - return roomHistory; - } - [[nodiscard]] bool getLeftJustified() const - { - return leftJustified; - } - [[nodiscard]] int getMasterVolume() const - { - return masterVolume; - } - [[nodiscard]] int getCardInfoViewMode() const - { - return cardInfoViewMode; - } + [[nodiscard]] ReleaseChannel *getUpdateReleaseChannel() const; + [[nodiscard]] QList getUpdateReleaseChannels() const; + [[nodiscard]] int getUpdateReleaseChannelIndex() const; + [[nodiscard]] QStringList getCountries() const; - [[nodiscard]] QString getHighlightWords() const - { - return highlightWords; - } - [[nodiscard]] QString getGameDescription() const - { - return gameDescription; - } - [[nodiscard]] int getMaxPlayers() const - { - return maxPlayers; - } - [[nodiscard]] QString getGameTypes() const - { - return gameTypes; - } - [[nodiscard]] bool getOnlyBuddies() const - { - return onlyBuddies; - } - [[nodiscard]] bool getOnlyRegistered() const - { - return onlyRegistered; - } - [[nodiscard]] bool getSpectatorsAllowed() const - { - return spectatorsAllowed; - } - [[nodiscard]] bool getSpectatorsNeedPassword() const - { - return spectatorsNeedPassword; - } - [[nodiscard]] bool getSpectatorsCanTalk() const - { - return spectatorsCanTalk; - } - [[nodiscard]] bool getSpectatorsCanSeeEverything() const - { - return spectatorsCanSeeEverything; - } - [[nodiscard]] int getDefaultStartingLifeTotal() const - { - return defaultStartingLifeTotal; - } - [[nodiscard]] bool getShareDecklistsOnLoad() const - { - return shareDecklistsOnLoad; - } - [[nodiscard]] bool getCreateGameAsSpectator() const - { - return createGameAsSpectator; - } - [[nodiscard]] bool getRememberGameSettings() const - { - return rememberGameSettings; - } - [[nodiscard]] bool getLocalGameRememberSettings() const - { - return localGameRememberSettings; - } - [[nodiscard]] int getLocalGameMaxPlayers() const - { - return localGameMaxPlayers; - } - [[nodiscard]] int getLocalGameStartingLifeTotal() const - { - return localGameStartingLifeTotal; - } - [[nodiscard]] int getKeepAlive() const override - { - return keepalive; - } - [[nodiscard]] int getTimeOut() const override - { - return timeout; - } - [[nodiscard]] int getMaxFontSize() const - { - return maxFontSize; - } - void setClientID(const QString &clientID); - void setClientVersion(const QString &clientVersion); - void setKnownMissingFeatures(const QString &_knownMissingFeatures) override; - void setUseTearOffMenus(bool _useTearOffMenus); - void setCardViewInitialRowsMax(int _cardViewInitialRowsMax); - void setCardViewExpandedRowsMax(int value); - void setCloseEmptyCardView(QT_STATE_CHANGED_T value); - void setFocusCardViewSearchBar(QT_STATE_CHANGED_T value); - void setKeepGameChatFocus(QT_STATE_CHANGED_T value); - QString getClientID() override - { - return clientID; - } - QString getClientVersion() - { - return clientVersion; - } - QString getKnownMissingFeatures() override - { - return knownMissingFeatures; - } - bool getUseTearOffMenus() - { - return useTearOffMenus; - } - [[nodiscard]] int getCardViewInitialRowsMax() const - { - return cardViewInitialRowsMax; - } - [[nodiscard]] int getCardViewExpandedRowsMax() const - { - return cardViewExpandedRowsMax; - } - [[nodiscard]] bool getCloseEmptyCardView() const - { - return closeEmptyCardView; - } - [[nodiscard]] bool getFocusCardViewSearchBar() const - { - return focusCardViewSearchBar; - } - [[nodiscard]] bool getKeepGameChatFocus() const - { - return keepGameChatFocus; - } - [[nodiscard]] ShortcutsSettings &shortcuts() const - { - return *shortcutsSettings; - } - [[nodiscard]] CardDatabaseSettings *cardDatabase() const - { - return cardDatabaseSettings; - } - [[nodiscard]] ServersSettings &servers() const - { - return *serversSettings; - } - [[nodiscard]] MessageSettings &messages() const - { - return *messageSettings; - } - [[nodiscard]] GameFiltersSettings &gameFilters() const - { - return *gameFiltersSettings; - } - [[nodiscard]] LayoutsSettings &layouts() const - { - return *layoutsSettings; - } - [[nodiscard]] DownloadSettings &downloads() const - { - return *downloadSettings; - } - [[nodiscard]] RecentsSettings &recents() const - { - return *recentsSettings; - } - [[nodiscard]] CardOverrideSettings &cardOverrides() const - { - return *cardOverrideSettings; - } - [[nodiscard]] DebugSettings &debug() const - { - return *debugSettings; - } + + [[nodiscard]] ShortcutsSettings &shortcuts() const; + [[nodiscard]] CardDatabaseSettings &cardDatabase() const; + [[nodiscard]] ServersSettings &servers() const; + [[nodiscard]] MessageSettings &messages() const; + [[nodiscard]] GameFiltersSettings &gameFilters() const; + [[nodiscard]] LayoutsSettings &layouts() const; + [[nodiscard]] DownloadSettings &downloads() const; + [[nodiscard]] RecentsSettings &recents() const; + [[nodiscard]] CardOverrideSettings &cardOverrides() const; + [[nodiscard]] DebugSettings &debug() const; [[nodiscard]] CardCounterSettings &cardCounters() const; + [[nodiscard]] TabsSettings &tabs() const; + [[nodiscard]] SoundSettings &sound() const; + [[nodiscard]] GameSettings &game() const; + [[nodiscard]] ChatSettings &chat() const; + [[nodiscard]] CacheStorageSettings &cacheStorage() const; + [[nodiscard]] UpdatesSettings &updates() const; + [[nodiscard]] PersonalSettings &personal() const; + [[nodiscard]] CardsDisplaySettings &cardsDisplay() const; + [[nodiscard]] InterfaceSettings &interface() const; + [[nodiscard]] PathsSettings &paths() const; + [[nodiscard]] VisualDeckStorageSettings &visualDeckStorage() const; [[nodiscard]] bool getIsPortableBuild() const { return isPortableBuild; } - [[nodiscard]] bool getDownloadSpoilersStatus() const - { - return mbDownloadSpoilers; - } - [[nodiscard]] bool getRoundCardCorners() const - { - return roundCardCorners; - } static SettingsCache &instance(); void resetPaths(); public slots: - void setDownloadSpoilerStatus(bool _spoilerStatus); - - void setLang(const QString &_lang); - void setShowTipsOnStartup(bool _showTipsOnStartup); - void setSeenTips(const QList &_seenTips); - void setDeckPath(const QString &_deckPath); - void setFiltersPath(const QString &_filtersPath); - void setReplaysPath(const QString &_replaysPath); - void setThemesPath(const QString &_themesPath); - void setCustomCardDatabasePath(const QString &_customCardDatabasePath); - void setPicsPath(const QString &_picsPath); - void setCardDatabasePath(const QString &_cardDatabasePath); - void setSpoilerDatabasePath(const QString &_spoilerDatabasePath); - void setTokenDatabasePath(const QString &_tokenDatabasePath); void setThemeName(const QString &_themeName); - void setHomeTabBackgroundSource(const QString &_backgroundSource); - void setHomeTabBackgroundShuffleFrequency(int _frequency); - void setHomeTabDisplayCardName(QT_STATE_CHANGED_T _displayCardName); - void setTabVisualDeckStorageOpen(bool value); - void setTabServerOpen(bool value); - void setTabAccountOpen(bool value); - void setTabDeckStorageOpen(bool value); - void setTabReplaysOpen(bool value); - void setTabAdminOpen(bool value); - void setTabLogOpen(bool value); - void setChatMentionColor(const QString &_chatMentionColor); - void setChatHighlightColor(const QString &_chatHighlightColor); - void setPicDownload(QT_STATE_CHANGED_T _picDownload); - void setShowStatusBar(bool value); - void setNotificationsEnabled(QT_STATE_CHANGED_T _notificationsEnabled); - void setSpectatorNotificationsEnabled(QT_STATE_CHANGED_T _spectatorNotificationsEnabled); - void setBuddyConnectNotificationsEnabled(QT_STATE_CHANGED_T _buddyConnectNotificationsEnabled); - void setDoubleClickToPlay(QT_STATE_CHANGED_T _doubleClickToPlay); - void setClickPlaysAllSelected(QT_STATE_CHANGED_T _clickPlaysAllSelected); - void setPlayToStack(QT_STATE_CHANGED_T _playToStack); - void setDoNotDeleteArrowsInSubPhases(QT_STATE_CHANGED_T _doNotDeleteArrowsInSubPhases); - void setStartingHandSize(int _startingHandSize); - void setAnnotateTokens(QT_STATE_CHANGED_T _annotateTokens); - void setShowShortcuts(QT_STATE_CHANGED_T _showShortcuts); - void setShowGameSelectorFilterToolbar(QT_STATE_CHANGED_T _showGameSelectorFilterToolbar); - void setDisplayCardNames(QT_STATE_CHANGED_T _displayCardNames); - void setOverrideAllCardArtWithPersonalPreference(QT_STATE_CHANGED_T _overrideAllCardArt); - void setBumpSetsWithCardsInDeckToTop(QT_STATE_CHANGED_T _bumpSetsWithCardsInDeckToTop); - void setPrintingSelectorSortOrder(int _printingSelectorSortOrder); - void setPrintingSelectorCardSize(int _printingSelectorCardSize); - void setIncludeRebalancedCards(bool _includeRebalancedCards); - void setPrintingSelectorNavigationButtonsVisible(QT_STATE_CHANGED_T _navigationButtonsVisible); - void setDeckEditorBannerCardComboBoxVisible(QT_STATE_CHANGED_T _deckEditorBannerCardComboBoxVisible); - void setDeckEditorTagsWidgetVisible(QT_STATE_CHANGED_T _deckEditorTagsWidgetVisible); - void setVisualDeckStorageSortingOrder(int _visualDeckStorageSortingOrder); - void setVisualDeckStorageShowFolders(QT_STATE_CHANGED_T value); - void setVisualDeckStorageShowTagFilter(QT_STATE_CHANGED_T _showTags); - void setVisualDeckStorageDefaultTagsList(QStringList _defaultTagsList); - void setVisualDeckStorageSearchFolderNames(QT_STATE_CHANGED_T value); - void setVisualDeckStorageShowColorIdentity(QT_STATE_CHANGED_T value); - void setVisualDeckStorageShowBannerCardComboBox(QT_STATE_CHANGED_T _showBannerCardComboBox); - void setVisualDeckStorageShowTagsOnDeckPreviews(QT_STATE_CHANGED_T _showTags); - void setVisualDeckStorageCardSize(int _visualDeckStorageCardSize); - void setVisualDeckStorageDrawUnusedColorIdentities(QT_STATE_CHANGED_T _visualDeckStorageDrawUnusedColorIdentities); - void setVisualDeckStorageUnusedColorIdentitiesOpacity(int _visualDeckStorageUnusedColorIdentitiesOpacity); - void setVisualDeckStorageTooltipType(int value); - void setVisualDeckStoragePromptForConversion(bool _visualDeckStoragePromptForConversion); - void setVisualDeckStorageAlwaysConvert(bool _visualDeckStorageAlwaysConvert); - void setVisualDeckStorageInGame(QT_STATE_CHANGED_T value); - void setVisualDeckStorageSelectionAnimation(QT_STATE_CHANGED_T value); - void setVisualDeckEditorCardSize(int _visualDeckEditorCardSize); - void setVisualDatabaseDisplayCardSize(int _visualDatabaseDisplayCardSize); - void setEDHRecCardSize(int _EDHRecCardSize); - void setArchidektPreviewCardSize(int _archidektPreviewCardSize); - void setDefaultDeckEditorType(int value); - void setVisualDatabaseDisplayFilterToMostRecentSetsEnabled(QT_STATE_CHANGED_T _enabled); - void setVisualDatabaseDisplayFilterToMostRecentSetsAmount(int _amount); - void setVisualDeckEditorSampleHandSize(int _amount); - void setHorizontalHand(QT_STATE_CHANGED_T _horizontalHand); - void setInvertVerticalCoordinate(QT_STATE_CHANGED_T _invertVerticalCoordinate); - void setMinPlayersForMultiColumnLayout(int _minPlayersForMultiColumnLayout); - void setTapAnimation(QT_STATE_CHANGED_T _tapAnimation); - void setAutoRotateSidewaysLayoutCards(QT_STATE_CHANGED_T _autoRotateSidewaysLayoutCards); - void setOpenDeckInNewTab(QT_STATE_CHANGED_T _openDeckInNewTab); - void setRewindBufferingMs(int _rewindBufferingMs); - void setFastForwardSpeed(qreal _value); - void setStyleUserList(QT_STATE_CHANGED_T _styleUserList); - void setChatMention(QT_STATE_CHANGED_T _chatMention); - void setChatMentionCompleter(QT_STATE_CHANGED_T _chatMentionCompleter); - void setChatMentionForeground(QT_STATE_CHANGED_T _chatMentionForeground); - void setChatHighlightForeground(QT_STATE_CHANGED_T _chatHighlightForeground); - void setZoneViewGroupByIndex(const int _zoneViewGroupByIndex); - void setZoneViewSortByIndex(const int _zoneViewSortByIndex); - void setZoneViewPileView(QT_STATE_CHANGED_T _zoneViewPileView); - void setSoundEnabled(QT_STATE_CHANGED_T _soundEnabled); - void setSoundThemeName(const QString &_soundThemeName); - void setIgnoreUnregisteredUsers(QT_STATE_CHANGED_T _ignoreUnregisteredUsers); - void setIgnoreUnregisteredUserMessages(QT_STATE_CHANGED_T _ignoreUnregisteredUserMessages); - void setIgnoreNonBuddyUserMessages(QT_STATE_CHANGED_T _ignoreNonBuddyUserMessages); - void setPixmapCacheSize(const int _pixmapCacheSize); - void setCardImageCacheMethod(CardPictureLoaderCacheMethod::CacheMethod _cardImageCachingMethod); - void setNetworkCacheSizeInMB(const int _networkCacheSize); - void setNetworkRedirectCacheTtl(const int _redirectCacheTtl); - void setLocalCardImageStorageNamingScheme( - const CardPictureLoaderLocalSchemes::NamingScheme _localCardImageStorageNamingScheme); - void setCardScaling(const QT_STATE_CHANGED_T _scaleCards); - void setStackCardOverlapPercent(const int _verticalCardOverlapPercent); - void setShowMessagePopups(const QT_STATE_CHANGED_T _showMessagePopups); - void setShowMentionPopups(const QT_STATE_CHANGED_T _showMentionPopups); - void setRoomHistory(const QT_STATE_CHANGED_T _roomHistory); - void setLeftJustified(const QT_STATE_CHANGED_T _leftJustified); - void setMasterVolume(const int _masterVolume); - void setCardInfoViewMode(const int _viewMode); - void setHighlightWords(const QString &_highlightWords); - void setGameDescription(const QString _gameDescription); - void setMaxPlayers(const int _maxPlayers); - void setGameTypes(const QString _gameTypes); - void setOnlyBuddies(const bool _onlyBuddies); - void setOnlyRegistered(const bool _onlyRegistered); - void setSpectatorsAllowed(const bool _spectatorsAllowed); - void setSpectatorsNeedPassword(const bool _spectatorsNeedPassword); - void setSpectatorsCanTalk(const bool _spectatorsCanTalk); - void setSpectatorsCanSeeEverything(const bool _spectatorsCanSeeEverything); - void setCreateGameAsSpectator(const bool _createGameAsSpectator); - void setDefaultStartingLifeTotal(const int _defaultStartingLifeTotal); - void setShareDecklistsOnLoad(const bool _shareDecklistsOnLoad); - void setRememberGameSettings(const bool _rememberGameSettings); - void setLocalGameRememberSettings(bool value); - void setLocalGameMaxPlayers(int value); - void setLocalGameStartingLifeTotal(int value); - void setCheckUpdatesOnStartup(QT_STATE_CHANGED_T value); - void setStartupCardUpdateCheckPromptForUpdate(bool value); - void setStartupCardUpdateCheckAlwaysUpdate(bool value); - void setCardUpdateCheckInterval(int value); - void setLastCardUpdateCheck(QDate value); - void setAlwaysEnableNewSets(bool value); - void setNotifyAboutUpdate(QT_STATE_CHANGED_T _notifyaboutupdate); - void setNotifyAboutNewVersion(QT_STATE_CHANGED_T _notifyaboutnewversion); - void setUpdateReleaseChannelIndex(int value); - void setMaxFontSize(int _max); - void setRoundCardCorners(bool _roundCardCorners); - void setShowDragSelectionCount(QT_STATE_CHANGED_T _showDragSelectionCount); - void setShowTotalSelectionCount(QT_STATE_CHANGED_T _showTotalSelectionCount); - void setTallyType(int value); }; #endif diff --git a/cockatrice/src/client/sound_engine.cpp b/cockatrice/src/client/sound_engine.cpp index e592b5ea0..8d09341be 100644 --- a/cockatrice/src/client/sound_engine.cpp +++ b/cockatrice/src/client/sound_engine.cpp @@ -6,7 +6,9 @@ #include #if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) +#include #include +#include #endif #define DEFAULT_THEME_NAME "Default" @@ -15,8 +17,10 @@ SoundEngine::SoundEngine(QObject *parent) : QObject(parent), audioOutput(nullptr), player(nullptr) { ensureThemeDirectoryExists(); - connect(&SettingsCache::instance(), &SettingsCache::soundThemeChanged, this, &SoundEngine::themeChangedSlot); - connect(&SettingsCache::instance(), &SettingsCache::soundEnabledChanged, this, &SoundEngine::soundEnabledChanged); + connect(&SettingsCache::instance().sound(), &SoundSettings::soundThemeChanged, this, + &SoundEngine::themeChangedSlot); + connect(&SettingsCache::instance().sound(), &SoundSettings::soundEnabledChanged, this, + &SoundEngine::soundEnabledChanged); soundEnabledChanged(); themeChangedSlot(); @@ -36,7 +40,7 @@ SoundEngine::~SoundEngine() void SoundEngine::soundEnabledChanged() { - if (SettingsCache::instance().getSoundEnabled()) { + if (SettingsCache::instance().sound().getSoundEnabled()) { qCInfo(SoundEngineLog) << "SoundEngine: enabling sound with" << audioData.size() << "sounds"; if (!player) { player = new QMediaPlayer; @@ -70,7 +74,7 @@ void SoundEngine::playSound(const QString &fileName) } player->stop(); - int volumeSliderValue = SettingsCache::instance().getMasterVolume(); + int volumeSliderValue = SettingsCache::instance().sound().getMasterVolume(); #if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) player->audioOutput()->setVolume(qreal(volumeSliderValue) / 100); player->setSource(QUrl::fromLocalFile(audioData[fileName])); @@ -88,10 +92,10 @@ void SoundEngine::testSound() void SoundEngine::ensureThemeDirectoryExists() { - if (SettingsCache::instance().getSoundThemeName().isEmpty() || - !getAvailableThemes().contains(SettingsCache::instance().getSoundThemeName())) { + if (SettingsCache::instance().sound().getSoundThemeName().isEmpty() || + !getAvailableThemes().contains(SettingsCache::instance().sound().getSoundThemeName())) { qCInfo(SoundEngineLog) << "Sounds theme name not set, setting default value"; - SettingsCache::instance().setSoundThemeName(DEFAULT_THEME_NAME); + SettingsCache::instance().sound().setSoundThemeName(DEFAULT_THEME_NAME); } } @@ -132,7 +136,7 @@ QStringMap &SoundEngine::getAvailableThemes() void SoundEngine::themeChangedSlot() { - QString themeName = SettingsCache::instance().getSoundThemeName(); + QString themeName = SettingsCache::instance().sound().getSoundThemeName(); qCInfo(SoundEngineLog) << "Sound theme changed:" << themeName; QDir dir = getAvailableThemes().value(themeName); diff --git a/cockatrice/src/database/interface/settings_card_database_path_provider.h b/cockatrice/src/database/interface/settings_card_database_path_provider.h new file mode 100644 index 000000000..1c7d02460 --- /dev/null +++ b/cockatrice/src/database/interface/settings_card_database_path_provider.h @@ -0,0 +1,41 @@ +#ifndef SETTINGS_CARD_DATABASE_PATH_PROVIDER_H +#define SETTINGS_CARD_DATABASE_PATH_PROVIDER_H + +#include "../../client/settings/cache_settings.h" + +#include +#include + +class SettingsCardDatabasePathProvider : public ICardDatabasePathProvider +{ + Q_OBJECT + +public: + explicit SettingsCardDatabasePathProvider(QObject *parent = nullptr) : ICardDatabasePathProvider(parent) + { + connect(&SettingsCache::instance().paths(), &PathsSettings::cardDatabasePathChanged, this, + &ICardDatabasePathProvider::cardDatabasePathChanged); + } + + [[nodiscard]] QString getCardDatabasePath() const override + { + return SettingsCache::instance().paths().getCardDatabasePath(); + } + + [[nodiscard]] QString getCustomCardDatabasePath() const override + { + return SettingsCache::instance().paths().getCustomCardDatabasePath(); + } + + [[nodiscard]] QString getTokenDatabasePath() const override + { + return SettingsCache::instance().paths().getTokenDatabasePath(); + } + + [[nodiscard]] virtual QString getSpoilerCardDatabasePath() const override + { + return SettingsCache::instance().paths().getSpoilerCardDatabasePath(); + } +}; + +#endif // SETTINGS_CARD_DATABASE_PATH_PROVIDER_H diff --git a/cockatrice/src/database/interface/settings_card_preference_provider.h b/cockatrice/src/database/interface/settings_card_preference_provider.h index 6c31b9d6d..64502e3a7 100644 --- a/cockatrice/src/database/interface/settings_card_preference_provider.h +++ b/cockatrice/src/database/interface/settings_card_preference_provider.h @@ -3,6 +3,8 @@ #include "../../client/settings/cache_settings.h" #include +#include +#include class SettingsCardPreferenceProvider : public ICardPreferenceProvider { @@ -14,7 +16,7 @@ public: [[nodiscard]] bool getIncludeRebalancedCards() const override { - return SettingsCache::instance().getIncludeRebalancedCards(); + return SettingsCache::instance().cardsDisplay().getIncludeRebalancedCards(); } }; diff --git a/cockatrice/src/game/player/player_actions.cpp b/cockatrice/src/game/player/player_actions.cpp index df9eb8a1d..504c1de89 100644 --- a/cockatrice/src/game/player/player_actions.cpp +++ b/cockatrice/src/game/player/player_actions.cpp @@ -27,6 +27,8 @@ #include #include #include +#include +#include #include #include #include @@ -67,7 +69,7 @@ void PlayerActions::playCard(CardItem *card, bool faceDown) const CardInfo &info = exactCard.getInfo(); int tableRow = info.getUiAttributes().tableRow; - bool playToStack = SettingsCache::instance().getPlayToStack(); + bool playToStack = SettingsCache::instance().interface().getPlayToStack(); QString currentZone = card->getZone()->getName(); if (!faceDown && currentZone == ZoneNames::STACK && tableRow == 3) { cmd.set_target_zone(ZoneNames::GRAVE); @@ -310,7 +312,7 @@ void PlayerActions::actDrawCard() void PlayerActions::actRequestMulliganDialog() { - int startSize = SettingsCache::instance().getStartingHandSize(); + int startSize = SettingsCache::instance().interface().getStartingHandSize(); int handSize = player->getHandZone()->getCards().size(); int deckSize = player->getDeckZone()->getCards().size() + handSize; @@ -326,7 +328,7 @@ void PlayerActions::actMulligan(int number) } doMulligan(number); - SettingsCache::instance().setStartingHandSize(number); + SettingsCache::instance().interface().setStartingHandSize(number); } void PlayerActions::actMulliganSameSize() @@ -933,7 +935,7 @@ void PlayerActions::setLastTokenInfo(CardInfoPtr cardInfo) lastTokenInfo = {.name = cardInfo->getName(), .color = cardInfo->getColors().isEmpty() ? QString() : cardInfo->getColors().left(1).toLower(), .pt = cardInfo->getPowTough(), - .annotation = SettingsCache::instance().getAnnotateTokens() ? cardInfo->getText() : "", + .annotation = SettingsCache::instance().interface().getAnnotateTokens() ? cardInfo->getText() : "", .destroy = true, .providerId = SettingsCache::instance().cardOverrides().getCardPreferenceOverride(cardInfo->getName())}; @@ -1169,7 +1171,7 @@ void PlayerActions::createCard(const CardItem *sourceCard, } cmd.set_pt(cardInfo->getPowTough().toStdString()); - if (SettingsCache::instance().getAnnotateTokens()) { + if (SettingsCache::instance().interface().getAnnotateTokens()) { cmd.set_annotation(cardInfo->getText().toStdString()); } else { cmd.set_annotation(""); diff --git a/cockatrice/src/game/zones/view_zone_logic.cpp b/cockatrice/src/game/zones/view_zone_logic.cpp index 8782a1762..60fe39bb2 100644 --- a/cockatrice/src/game/zones/view_zone_logic.cpp +++ b/cockatrice/src/game/zones/view_zone_logic.cpp @@ -3,6 +3,7 @@ #include "../../client/settings/cache_settings.h" #include "../../game_graphics/board/card_item.h" +#include /** * @param _player the player that the cards are revealed to. * @param _origZone the zone the cards were revealed from. @@ -57,7 +58,7 @@ bool ZoneViewZoneLogic::prepareAddCard(int x) // autoclose check is done both here and in removeCard - if (cards.isEmpty() && !doInsert && SettingsCache::instance().getCloseEmptyCardView()) { + if (cards.isEmpty() && !doInsert && SettingsCache::instance().interface().getCloseEmptyCardView()) { emit closeView(); } @@ -144,7 +145,7 @@ void ZoneViewZoneLogic::removeCard(int position, bool toNewZone) // card gets dragged within the view. // Another autoclose check is done in prepareAddCard so that the view autocloses if the last card was moved to an // unrevealed portion of the same zone. - if (cards.isEmpty() && SettingsCache::instance().getCloseEmptyCardView() && toNewZone) { + if (cards.isEmpty() && SettingsCache::instance().interface().getCloseEmptyCardView() && toNewZone) { emit closeView(); return; } diff --git a/cockatrice/src/game_graphics/board/abstract_card_drag_item.cpp b/cockatrice/src/game_graphics/board/abstract_card_drag_item.cpp index 026efd60d..2f43591ac 100644 --- a/cockatrice/src/game_graphics/board/abstract_card_drag_item.cpp +++ b/cockatrice/src/game_graphics/board/abstract_card_drag_item.cpp @@ -7,6 +7,7 @@ #include #include #include +#include const QColor GHOST_MASK = QColor(255, 255, 255, 50); @@ -34,12 +35,13 @@ AbstractCardDragItem::AbstractCardDragItem(AbstractCardItem *_item, setCacheMode(DeviceCoordinateCache); - connect(&SettingsCache::instance(), &SettingsCache::roundCardCornersChanged, this, [this](bool _roundCardCorners) { - Q_UNUSED(_roundCardCorners); + connect(&SettingsCache::instance().cardsDisplay(), &CardsDisplaySettings::roundCardCornersChanged, this, + [this](bool _roundCardCorners) { + Q_UNUSED(_roundCardCorners); - prepareGeometryChange(); - update(); - }); + prepareGeometryChange(); + update(); + }); connect(item, &QObject::destroyed, this, &AbstractCardDragItem::deleteLater); } @@ -47,7 +49,8 @@ AbstractCardDragItem::AbstractCardDragItem(AbstractCardItem *_item, QPainterPath AbstractCardDragItem::shape() const { QPainterPath shape; - qreal cardCornerRadius = SettingsCache::instance().getRoundCardCorners() ? 0.05 * CardDimensions::WIDTH_F : 0.0; + qreal cardCornerRadius = + SettingsCache::instance().cardsDisplay().getRoundCardCorners() ? 0.05 * CardDimensions::WIDTH_F : 0.0; shape.addRoundedRect(boundingRect(), cardCornerRadius, cardCornerRadius); return shape; } diff --git a/cockatrice/src/game_graphics/board/abstract_card_item.cpp b/cockatrice/src/game_graphics/board/abstract_card_item.cpp index 86b3e27c8..a9e0167d4 100644 --- a/cockatrice/src/game_graphics/board/abstract_card_item.cpp +++ b/cockatrice/src/game_graphics/board/abstract_card_item.cpp @@ -12,6 +12,9 @@ #include #include #include +#include +#include +#include AbstractCardItem::AbstractCardItem(QGraphicsItem *parent, const CardRef &cardRef, PlayerLogic *_owner, int _id) : ArrowTarget(_owner, parent), id(_id), cardRef(cardRef), tapped(false), facedown(false), tapAngle(0), @@ -21,15 +24,17 @@ AbstractCardItem::AbstractCardItem(QGraphicsItem *parent, const CardRef &cardRef setFlag(ItemIsSelectable); setCacheMode(DeviceCoordinateCache); - connect(&SettingsCache::instance(), &SettingsCache::displayCardNamesChanged, this, [this] { update(); }); + connect(&SettingsCache::instance().cardsDisplay(), &CardsDisplaySettings::displayCardNamesChanged, this, + [this] { update(); }); refreshCardInfo(); - connect(&SettingsCache::instance(), &SettingsCache::roundCardCornersChanged, this, [this](bool _roundCardCorners) { - Q_UNUSED(_roundCardCorners); + connect(&SettingsCache::instance().cardsDisplay(), &CardsDisplaySettings::roundCardCornersChanged, this, + [this](bool _roundCardCorners) { + Q_UNUSED(_roundCardCorners); - prepareGeometryChange(); - update(); - }); + prepareGeometryChange(); + update(); + }); } AbstractCardItem::~AbstractCardItem() @@ -45,7 +50,8 @@ QRectF AbstractCardItem::boundingRect() const QPainterPath AbstractCardItem::shape() const { QPainterPath shape; - qreal cardCornerRadius = SettingsCache::instance().getRoundCardCorners() ? 0.05 * CardDimensions::WIDTH_F : 0.0; + qreal cardCornerRadius = + SettingsCache::instance().cardsDisplay().getRoundCardCorners() ? 0.05 * CardDimensions::WIDTH_F : 0.0; shape.addRoundedRect(boundingRect(), cardCornerRadius, cardCornerRadius); return shape; } @@ -101,7 +107,7 @@ QSizeF AbstractCardItem::getTranslatedSize(QPainter *painter) const void AbstractCardItem::transformPainter(QPainter *painter, const QSizeF &translatedSize, int angle) { - const int MAX_FONT_SIZE = SettingsCache::instance().getMaxFontSize(); + const int MAX_FONT_SIZE = SettingsCache::instance().personal().getMaxFontSize(); const int fontSize = std::max(9, MAX_FONT_SIZE); QRectF totalBoundingRect = painter->combinedTransform().mapRect(boundingRect()); @@ -151,7 +157,7 @@ void AbstractCardItem::paintPicture(QPainter *painter, const QSizeF &translatedS painter->drawPath(shape()); } - if (translatedPixmap.isNull() || SettingsCache::instance().getDisplayCardNames() || facedown) { + if (translatedPixmap.isNull() || SettingsCache::instance().cardsDisplay().getDisplayCardNames() || facedown) { painter->save(); transformPainter(painter, translatedSize, angle); painter->setPen(Qt::white); @@ -234,7 +240,7 @@ void AbstractCardItem::setHovered(bool _hovered) isHovered = _hovered; setZValue(_hovered ? ZValues::HOVERED_CARD : realZValue); - setScale(_hovered && SettingsCache::instance().getScaleCards() ? 1.1 : 1); + setScale(_hovered && SettingsCache::instance().cardsDisplay().getScaleCards() ? 1.1 : 1); setTransformOriginPoint(_hovered ? CardDimensions::WIDTH_HALF_F : 0, _hovered ? CardDimensions::HEIGHT_HALF_F : 0); update(); } @@ -287,7 +293,7 @@ void AbstractCardItem::setTapped(bool _tapped, bool canAnimate) } tapped = _tapped; - if (SettingsCache::instance().getTapAnimation() && canAnimate) { + if (SettingsCache::instance().cardsDisplay().getTapAnimation() && canAnimate) { static_cast(scene())->registerAnimationItem(this); } else { tapAngle = tapped ? 90 : 0; diff --git a/cockatrice/src/game_graphics/board/abstract_counter.cpp b/cockatrice/src/game_graphics/board/abstract_counter.cpp index 219dd456e..a20fb1b3c 100644 --- a/cockatrice/src/game_graphics/board/abstract_counter.cpp +++ b/cockatrice/src/game_graphics/board/abstract_counter.cpp @@ -1,6 +1,7 @@ #include "abstract_counter.h" #include "../../client/settings/cache_settings.h" +#include "../../client/settings/shortcuts_settings.h" #include "../../game/player/player_actions.h" #include "../../game/player/player_logic.h" #include "../../game_graphics/board/translate_counter_name.h" diff --git a/cockatrice/src/game_graphics/board/arrow_item.cpp b/cockatrice/src/game_graphics/board/arrow_item.cpp index af6a6bf36..c40827361 100644 --- a/cockatrice/src/game_graphics/board/arrow_item.cpp +++ b/cockatrice/src/game_graphics/board/arrow_item.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include #include @@ -261,7 +262,7 @@ void ArrowDragItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) if (startZone->getName() == ZoneNames::HAND) { startCard->playCard(false); CardInfoPtr ci = startCard->getCard().getCardPtr(); - bool playToStack = SettingsCache::instance().getPlayToStack(); + bool playToStack = SettingsCache::instance().interface().getPlayToStack(); if (ci && ((!playToStack && ci->getUiAttributes().tableRow == 3) || (playToStack && ci->getUiAttributes().tableRow != 0 && startCard->getZone()->getName() != ZoneNames::STACK))) { diff --git a/cockatrice/src/game_graphics/board/card_item.cpp b/cockatrice/src/game_graphics/board/card_item.cpp index cabe988c2..63e298886 100644 --- a/cockatrice/src/game_graphics/board/card_item.cpp +++ b/cockatrice/src/game_graphics/board/card_item.cpp @@ -1,6 +1,7 @@ #include "card_item.h" #include "../../client/settings/cache_settings.h" +#include "../../client/settings/card_counter_settings.h" #include "../../game/phase.h" #include "../../game/player/player_actions.h" #include "../../game/player/player_logic.h" @@ -19,6 +20,7 @@ #include #include #include +#include CardItem::CardItem(PlayerLogic *_owner, QGraphicsItem *parent, @@ -279,7 +281,7 @@ void CardItem::drawArrow(const QColor &arrowColor) auto *game = owner->getGame(); PlayerLogic *arrowOwner = game->getPlayerManager()->getActiveLocalPlayer(game->getGameState()->getActivePlayer()); int phase = 0; // 0 means to not set the phase - if (SettingsCache::instance().getDoNotDeleteArrowsInSubPhases()) { + if (SettingsCache::instance().interface().getDoNotDeleteArrowsInSubPhases()) { int currentPhase = game->getGameState()->getCurrentPhase(); phase = Phases::getLastSubphase(currentPhase) + 1; } @@ -398,7 +400,7 @@ void CardItem::playCard(bool faceDown) if (tz) { emit tz->toggleTapped(); } else { - if (SettingsCache::instance().getClickPlaysAllSelected()) { + if (SettingsCache::instance().interface().getClickPlaysAllSelected()) { if (faceDown) { emit playSelectedFaceDown(this); } else { @@ -462,7 +464,7 @@ static bool isUnwritableRevealZone(CardZoneLogic *zone) void CardItem::handleClickedToPlay(bool shiftHeld) { if (isUnwritableRevealZone(state->getZone())) { - if (SettingsCache::instance().getClickPlaysAllSelected()) { + if (SettingsCache::instance().interface().getClickPlaysAllSelected()) { emit hideSelected(this); } else { state->getZone()->removeCard(this); @@ -479,7 +481,7 @@ void CardItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) return; } if ((event->modifiers() != Qt::AltModifier) && (event->button() == Qt::LeftButton) && - (!SettingsCache::instance().getDoubleClickToPlay())) { + (!SettingsCache::instance().interface().getDoubleClickToPlay())) { handleClickedToPlay(event->modifiers().testFlag(Qt::ShiftModifier)); } if (owner != nullptr) { @@ -491,7 +493,7 @@ void CardItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) void CardItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) { if ((event->modifiers() != Qt::AltModifier) && (event->buttons() == Qt::LeftButton) && - (SettingsCache::instance().getDoubleClickToPlay())) { + (SettingsCache::instance().interface().getDoubleClickToPlay())) { handleClickedToPlay(event->modifiers().testFlag(Qt::ShiftModifier)); } event->accept(); diff --git a/cockatrice/src/game_graphics/deckview/deck_view.cpp b/cockatrice/src/game_graphics/deckview/deck_view.cpp index a5d0fa3bc..1278737a0 100644 --- a/cockatrice/src/game_graphics/deckview/deck_view.cpp +++ b/cockatrice/src/game_graphics/deckview/deck_view.cpp @@ -11,6 +11,7 @@ #include #include #include +#include DeckViewCardDragItem::DeckViewCardDragItem(DeckViewCard *_item, const QPointF &_hotSpot, @@ -77,11 +78,12 @@ DeckViewCard::DeckViewCard(QGraphicsItem *parent, const CardRef &cardRef, const { setAcceptHoverEvents(true); - connect(&SettingsCache::instance(), &SettingsCache::roundCardCornersChanged, this, [this](bool _roundCardCorners) { - Q_UNUSED(_roundCardCorners); + connect(&SettingsCache::instance().cardsDisplay(), &CardsDisplaySettings::roundCardCornersChanged, this, + [this](bool _roundCardCorners) { + Q_UNUSED(_roundCardCorners); - update(); - }); + update(); + }); } DeckViewCard::~DeckViewCard() @@ -99,7 +101,8 @@ void DeckViewCard::paint(QPainter *painter, const QStyleOptionGraphicsItem *opti pen.setJoinStyle(Qt::MiterJoin); pen.setColor(originZone == DECK_ZONE_MAIN ? Qt::green : Qt::red); painter->setPen(pen); - qreal cardRadius = SettingsCache::instance().getRoundCardCorners() ? 0.05 * (CardDimensions::WIDTH_F - 3) : 0.0; + qreal cardRadius = + SettingsCache::instance().cardsDisplay().getRoundCardCorners() ? 0.05 * (CardDimensions::WIDTH_F - 3) : 0.0; painter->drawRoundedRect(QRectF(1.5, 1.5, CardDimensions::WIDTH_F - 3, CardDimensions::HEIGHT_F - 3), cardRadius, cardRadius); painter->restore(); diff --git a/cockatrice/src/game_graphics/deckview/deck_view_container.cpp b/cockatrice/src/game_graphics/deckview/deck_view_container.cpp index d476a5012..69941040f 100644 --- a/cockatrice/src/game_graphics/deckview/deck_view_container.cpp +++ b/cockatrice/src/game_graphics/deckview/deck_view_container.cpp @@ -1,6 +1,7 @@ #include "deck_view_container.h" #include "../../client/settings/cache_settings.h" +#include "../../client/settings/shortcuts_settings.h" #include "../../interface/card_picture_loader/card_picture_loader.h" #include "../../interface/deck_loader/deck_loader.h" #include "../../interface/widgets/dialogs/dlg_load_deck.h" @@ -19,6 +20,7 @@ #include #include #include +#include #include ToggleButton::ToggleButton(QWidget *parent) : QPushButton(parent), state(false) @@ -95,8 +97,8 @@ DeckViewContainer::DeckViewContainer(int _playerId, TabGame *parent) &DeckViewContainer::refreshShortcuts); refreshShortcuts(); - connect(&SettingsCache::instance(), &SettingsCache::visualDeckStorageInGameChanged, this, - &DeckViewContainer::setVisualDeckStorageExists); + connect(&SettingsCache::instance().visualDeckStorage(), &VisualDeckStorageSettings::visualDeckStorageInGameChanged, + this, &DeckViewContainer::setVisualDeckStorageExists); switchToDeckSelectView(); } @@ -138,7 +140,7 @@ static void setVisibility(QPushButton *button, bool visible) void DeckViewContainer::switchToDeckSelectView() { - if (SettingsCache::instance().getVisualDeckStorageInGame()) { + if (SettingsCache::instance().visualDeckStorage().getVisualDeckStorageInGame()) { deckView->setHidden(true); tryCreateVisualDeckStorageWidget(); diff --git a/cockatrice/src/game_graphics/dialogs/dlg_create_token.cpp b/cockatrice/src/game_graphics/dialogs/dlg_create_token.cpp index 1a9dc59b2..e53069025 100644 --- a/cockatrice/src/game_graphics/dialogs/dlg_create_token.cpp +++ b/cockatrice/src/game_graphics/dialogs/dlg_create_token.cpp @@ -20,6 +20,9 @@ #include #include #include +#include +#include +#include #include DlgCreateToken::DlgCreateToken(const QStringList &_predefinedTokens, QWidget *parent) @@ -186,7 +189,7 @@ void DlgCreateToken::tokenSelectionChanged(const QModelIndex ¤t, const QMo const QChar cardColor = cardInfo->getColorChar(); colorEdit->setCurrentIndex(colorEdit->findData(cardColor, Qt::UserRole, Qt::MatchFixedString)); ptEdit->setText(cardInfo->getPowTough()); - if (SettingsCache::instance().getAnnotateTokens()) { + if (SettingsCache::instance().interface().getAnnotateTokens()) { annotationEdit->setText(cardInfo->getText()); } } else { diff --git a/cockatrice/src/game_graphics/game_scene.cpp b/cockatrice/src/game_graphics/game_scene.cpp index b9816a602..d0a4f6798 100644 --- a/cockatrice/src/game_graphics/game_scene.cpp +++ b/cockatrice/src/game_graphics/game_scene.cpp @@ -19,6 +19,7 @@ #include #include #include +#include #include #include @@ -36,7 +37,7 @@ GameScene::GameScene(PhasesToolbar *_phasesToolbar, QObject *parent) { animationTimer = new QBasicTimer; addItem(phasesToolbar); - connect(&SettingsCache::instance(), &SettingsCache::minPlayersForMultiColumnLayoutChanged, this, + connect(&SettingsCache::instance().interface(), &InterfaceSettings::minPlayersForMultiColumnLayoutChanged, this, &GameScene::rearrange); rearrange(); @@ -324,7 +325,7 @@ QList GameScene::rotatePlayers(const QList &active int GameScene::determineColumnCount(int playerCount) { - return playerCount < SettingsCache::instance().getMinPlayersForMultiColumnLayout() ? 1 : 2; + return playerCount < SettingsCache::instance().interface().getMinPlayersForMultiColumnLayout() ? 1 : 2; } /** diff --git a/cockatrice/src/game_graphics/game_view.cpp b/cockatrice/src/game_graphics/game_view.cpp index fcbc64de5..bda5ea76d 100644 --- a/cockatrice/src/game_graphics/game_view.cpp +++ b/cockatrice/src/game_graphics/game_view.cpp @@ -1,6 +1,7 @@ #include "game_view.h" #include "../client/settings/cache_settings.h" +#include "../client/settings/shortcuts_settings.h" #include "game_scene.h" #include @@ -9,6 +10,7 @@ #include #include #include +#include #include // QRubberBand calls raise() in showEvent() and changeEvent() to stay on top of siblings. @@ -45,11 +47,12 @@ GameView::GameView(GameScene *scene, QWidget *parent) : QGraphicsView(scene, par connect(scene, &GameScene::sigResizeRubberBand, this, &GameView::resizeRubberBand); connect(scene, &GameScene::sigStopRubberBand, this, &GameView::stopRubberBand); connect(scene, &QGraphicsScene::selectionChanged, this, [this]() { updateTotalSelectionCount(); }); - connect(&SettingsCache::instance(), &SettingsCache::tallyTypeChanged, this, + connect(&SettingsCache::instance().interface(), &InterfaceSettings::tallyTypeChanged, this, [this] { updateTotalSelectionCount(); }); - setFocusDisabled(SettingsCache::instance().getKeepGameChatFocus()); - connect(&SettingsCache::instance(), &SettingsCache::keepGameChatFocusChanged, this, &GameView::setFocusDisabled); + setFocusDisabled(SettingsCache::instance().interface().getKeepGameChatFocus()); + connect(&SettingsCache::instance().interface(), &InterfaceSettings::keepGameChatFocusChanged, this, + &GameView::setFocusDisabled); aCloseMostRecentZoneView = new QAction(this); @@ -127,7 +130,7 @@ void GameView::resizeRubberBand(const QPointF &cursorPoint, int selectedCount) QRect rect = QRect(mapFromScene(selectionOrigin), cursor).normalized(); rubberBand->setGeometry(rect); - if (!SettingsCache::instance().getShowDragSelectionCount()) { + if (!SettingsCache::instance().interface().getShowDragSelectionCount()) { dragCountLabel->hide(); return; } @@ -236,7 +239,7 @@ void GameView::updateTotalSelectionCount(const QSize &viewSize) int count = scene()->selectedItems().count(); - if (!SettingsCache::instance().getShowTotalSelectionCount() || count <= 1) { + if (!SettingsCache::instance().interface().getShowTotalSelectionCount() || count <= 1) { totalCountLabel->hide(); } else { totalCountLabel->setText(QString::number(count)); @@ -248,7 +251,7 @@ void GameView::updateTotalSelectionCount(const QSize &viewSize) totalCountLabel->show(); } - TallyType tallyType = Tally::intToType(SettingsCache::instance().getTallyType()); + TallyType tallyType = Tally::intToType(SettingsCache::instance().interface().getTallyType()); GameScene *gameScene = static_cast(scene()); QList entries = Tally::compute(gameScene->selectedCards(), tallyType); diff --git a/cockatrice/src/game_graphics/player/menu/card_menu.cpp b/cockatrice/src/game_graphics/player/menu/card_menu.cpp index aa94c3be7..75ca1b28b 100644 --- a/cockatrice/src/game_graphics/player/menu/card_menu.cpp +++ b/cockatrice/src/game_graphics/player/menu/card_menu.cpp @@ -1,6 +1,7 @@ #include "card_menu.h" #include "../../../client/settings/card_counter_settings.h" +#include "../../../client/settings/shortcuts_settings.h" #include "../../../interface/widgets/tabs/tab_game.h" #include "../../board/card_item.h" #include "../../game/player/player_actions.h" diff --git a/cockatrice/src/game_graphics/player/menu/grave_menu.cpp b/cockatrice/src/game_graphics/player/menu/grave_menu.cpp index 698481f7a..6d9364579 100644 --- a/cockatrice/src/game_graphics/player/menu/grave_menu.cpp +++ b/cockatrice/src/game_graphics/player/menu/grave_menu.cpp @@ -1,5 +1,6 @@ #include "grave_menu.h" +#include "../../../client/settings/shortcuts_settings.h" #include "../../game/abstract_game.h" #include "../../game/player/player_actions.h" #include "../../game/player/player_logic.h" diff --git a/cockatrice/src/game_graphics/player/menu/move_menu.cpp b/cockatrice/src/game_graphics/player/menu/move_menu.cpp index 5b7209a9f..632e0ddda 100644 --- a/cockatrice/src/game_graphics/player/menu/move_menu.cpp +++ b/cockatrice/src/game_graphics/player/menu/move_menu.cpp @@ -1,5 +1,6 @@ #include "move_menu.h" +#include "../../../client/settings/shortcuts_settings.h" #include "../../game/player/player_actions.h" #include "../../game/player/player_logic.h" #include "../card_menu_action_type.h" diff --git a/cockatrice/src/game_graphics/player/menu/player_menu.cpp b/cockatrice/src/game_graphics/player/menu/player_menu.cpp index c7d321c81..7c90211df 100644 --- a/cockatrice/src/game_graphics/player/menu/player_menu.cpp +++ b/cockatrice/src/game_graphics/player/menu/player_menu.cpp @@ -1,5 +1,6 @@ #include "player_menu.h" +#include "../../../client/settings/shortcuts_settings.h" #include "../../../game_graphics/zones/hand_zone.h" #include "../../../game_graphics/zones/pile_zone.h" #include "../../../game_graphics/zones/table_zone.h" diff --git a/cockatrice/src/game_graphics/player/menu/player_menu.h b/cockatrice/src/game_graphics/player/menu/player_menu.h index ec43df374..a6e89fab0 100644 --- a/cockatrice/src/game_graphics/player/menu/player_menu.h +++ b/cockatrice/src/game_graphics/player/menu/player_menu.h @@ -21,6 +21,7 @@ #include #include #include +#include class CardItem; class CardMenu; diff --git a/cockatrice/src/game_graphics/player/menu/pt_menu.cpp b/cockatrice/src/game_graphics/player/menu/pt_menu.cpp index a01be9424..152461c18 100644 --- a/cockatrice/src/game_graphics/player/menu/pt_menu.cpp +++ b/cockatrice/src/game_graphics/player/menu/pt_menu.cpp @@ -1,5 +1,6 @@ #include "pt_menu.h" +#include "../../../client/settings/shortcuts_settings.h" #include "../../game/player/player_actions.h" #include "../../game/player/player_logic.h" #include "../player_graphics_item.h" diff --git a/cockatrice/src/game_graphics/player/menu/say_menu.cpp b/cockatrice/src/game_graphics/player/menu/say_menu.cpp index 336b70f0d..e7b0b3826 100644 --- a/cockatrice/src/game_graphics/player/menu/say_menu.cpp +++ b/cockatrice/src/game_graphics/player/menu/say_menu.cpp @@ -5,6 +5,7 @@ #include "../../game/player/player_logic.h" #include "../player_graphics_item.h" +#include SayMenu::SayMenu(PlayerGraphicsItem *_player) : player(_player) { connect(&SettingsCache::instance().messages(), &MessageSettings::messageMacrosChanged, this, &SayMenu::initSayMenu); diff --git a/cockatrice/src/game_graphics/player/menu/sideboard_menu.cpp b/cockatrice/src/game_graphics/player/menu/sideboard_menu.cpp index 0dd7894d2..6753f743e 100644 --- a/cockatrice/src/game_graphics/player/menu/sideboard_menu.cpp +++ b/cockatrice/src/game_graphics/player/menu/sideboard_menu.cpp @@ -1,5 +1,6 @@ #include "sideboard_menu.h" +#include "../../../client/settings/shortcuts_settings.h" #include "../../game/player/player_actions.h" #include "../../game/player/player_logic.h" #include "../player_graphics_item.h" diff --git a/cockatrice/src/game_graphics/player/menu/tally_menu.cpp b/cockatrice/src/game_graphics/player/menu/tally_menu.cpp index 2aa91e977..b8616c75a 100644 --- a/cockatrice/src/game_graphics/player/menu/tally_menu.cpp +++ b/cockatrice/src/game_graphics/player/menu/tally_menu.cpp @@ -21,14 +21,14 @@ TallyMenu::TallyMenu() QAction *TallyMenu::createTallyAction(TallyType tallyType) { - TallyType currentType = Tally::intToType(SettingsCache::instance().getTallyType()); + TallyType currentType = Tally::intToType(SettingsCache::instance().interface().getTallyType()); QAction *action = new QAction(this); action->setCheckable(true); action->setChecked(tallyType == currentType); - connect(action, &QAction::triggered, &SettingsCache::instance(), - [tallyType] { SettingsCache::instance().setTallyType(static_cast(tallyType)); }); + connect(action, &QAction::triggered, &SettingsCache::instance().interface(), + [tallyType] { SettingsCache::instance().interface().setTallyType(static_cast(tallyType)); }); actionGroup->addAction(action); diff --git a/cockatrice/src/game_graphics/player/menu/utility_menu.cpp b/cockatrice/src/game_graphics/player/menu/utility_menu.cpp index 61a822b21..a7ea38d9a 100644 --- a/cockatrice/src/game_graphics/player/menu/utility_menu.cpp +++ b/cockatrice/src/game_graphics/player/menu/utility_menu.cpp @@ -1,5 +1,6 @@ #include "utility_menu.h" +#include "../../../client/settings/shortcuts_settings.h" #include "../../../interface/deck_loader/deck_loader.h" #include "../../game/player/player_actions.h" #include "../../game/player/player_logic.h" diff --git a/cockatrice/src/game_graphics/player/player_graphics_item.cpp b/cockatrice/src/game_graphics/player/player_graphics_item.cpp index e0194abda..20f6128f4 100644 --- a/cockatrice/src/game_graphics/player/player_graphics_item.cpp +++ b/cockatrice/src/game_graphics/player/player_graphics_item.cpp @@ -13,12 +13,13 @@ #include "player_dialogs.h" #include +#include PlayerGraphicsItem::PlayerGraphicsItem(PlayerLogic *_player) : player(_player) { - connect(&SettingsCache::instance(), &SettingsCache::horizontalHandChanged, this, + connect(&SettingsCache::instance().interface(), &InterfaceSettings::horizontalHandChanged, this, &PlayerGraphicsItem::rearrangeZones); - connect(&SettingsCache::instance(), &SettingsCache::handJustificationChanged, this, + connect(&SettingsCache::instance().interface(), &InterfaceSettings::handJustificationChanged, this, &PlayerGraphicsItem::rearrangeZones); connect(player, &PlayerLogic::rearrangeCounters, this, &PlayerGraphicsItem::rearrangeCounters); connect(player, &PlayerLogic::activeChanged, this, &PlayerGraphicsItem::onPlayerActiveChanged); @@ -148,7 +149,7 @@ qreal PlayerGraphicsItem::getMinimumWidth() const { qreal result = tableZoneGraphicsItem->getMinimumWidth() + CardDimensions::HEIGHT_F + 15 + counterAreaWidth + stackZoneGraphicsItem->boundingRect().width(); - if (!SettingsCache::instance().getHorizontalHand()) { + if (!SettingsCache::instance().interface().getHorizontalHand()) { result += handZoneGraphicsItem->boundingRect().width(); } return result; @@ -165,7 +166,7 @@ void PlayerGraphicsItem::processSceneSizeChange(int newPlayerWidth) // Extend table (and hand, if horizontal) to accommodate the new player width. qreal tableWidth = newPlayerWidth - CardDimensions::HEIGHT_F - 15 - counterAreaWidth - stackZoneGraphicsItem->boundingRect().width(); - if (!SettingsCache::instance().getHorizontalHand()) { + if (!SettingsCache::instance().interface().getHorizontalHand()) { tableWidth -= handZoneGraphicsItem->boundingRect().width(); } @@ -233,7 +234,7 @@ void PlayerGraphicsItem::rearrangeCounters() void PlayerGraphicsItem::rearrangeZones() { auto base = QPointF(CardDimensions::HEIGHT_F + counterAreaWidth + 15, 0); - if (SettingsCache::instance().getHorizontalHand()) { + if (SettingsCache::instance().interface().getHorizontalHand()) { if (mirrored) { if (player->getHandZone()->contentsKnown()) { handVisible = true; @@ -284,7 +285,7 @@ void PlayerGraphicsItem::updateBoundingRect() { prepareGeometryChange(); qreal width = CardDimensions::HEIGHT_F + 15 + counterAreaWidth + stackZoneGraphicsItem->boundingRect().width(); - if (SettingsCache::instance().getHorizontalHand()) { + if (SettingsCache::instance().interface().getHorizontalHand()) { qreal handHeight = handVisible ? handZoneGraphicsItem->boundingRect().height() : 0; bRect = QRectF(0, 0, width + tableZoneGraphicsItem->boundingRect().width(), tableZoneGraphicsItem->boundingRect().height() + handHeight); diff --git a/cockatrice/src/game_graphics/zones/hand_zone.cpp b/cockatrice/src/game_graphics/zones/hand_zone.cpp index 5885e3630..8d0a28fc6 100644 --- a/cockatrice/src/game_graphics/zones/hand_zone.cpp +++ b/cockatrice/src/game_graphics/zones/hand_zone.cpp @@ -9,6 +9,7 @@ #include #include +#include HandZone::HandZone(HandZoneLogic *_logic, int _zoneHeight, QGraphicsItem *parent) : SelectZone(_logic, parent), zoneHeight(_zoneHeight) @@ -33,7 +34,7 @@ void HandZone::handleDropEvent(const QList &dragItems, QPoint point = dropPoint + scenePos().toPoint(); int x = -1; - if (SettingsCache::instance().getHorizontalHand()) { + if (SettingsCache::instance().interface().getHorizontalHand()) { for (x = 0; x < getLogic()->getCards().size(); x++) { if (point.x() < static_cast(getLogic()->getCards().at(x))->scenePos().x()) { break; @@ -60,7 +61,7 @@ void HandZone::handleDropEvent(const QList &dragItems, QRectF HandZone::boundingRect() const { - if (SettingsCache::instance().getHorizontalHand()) { + if (SettingsCache::instance().interface().getHorizontalHand()) { return QRectF(0, 0, width, CardDimensions::HEIGHT_F + 10); } else { return QRectF(0, 0, CardDimensions::WIDTH_F * 1.5, zoneHeight); @@ -77,8 +78,8 @@ void HandZone::reorganizeCards() { if (!getLogic()->getCards().isEmpty()) { const int cardCount = getLogic()->getCards().size(); - if (SettingsCache::instance().getHorizontalHand()) { - bool leftJustified = SettingsCache::instance().getLeftJustified(); + if (SettingsCache::instance().interface().getHorizontalHand()) { + bool leftJustified = SettingsCache::instance().interface().getLeftJustified(); qreal cardWidth = getLogic()->getCards().at(0)->boundingRect().width(); const int xPadding = leftJustified ? cardWidth * 1.4 : 5; qreal totalWidth = @@ -126,7 +127,7 @@ void HandZone::sortHand(const QList &options) void HandZone::setWidth(qreal _width) { - if (SettingsCache::instance().getHorizontalHand()) { + if (SettingsCache::instance().interface().getHorizontalHand()) { prepareGeometryChange(); width = _width; reorganizeCards(); diff --git a/cockatrice/src/game_graphics/zones/pile_zone.cpp b/cockatrice/src/game_graphics/zones/pile_zone.cpp index 7bb0e695a..abdf262f4 100644 --- a/cockatrice/src/game_graphics/zones/pile_zone.cpp +++ b/cockatrice/src/game_graphics/zones/pile_zone.cpp @@ -1,5 +1,6 @@ #include "pile_zone.h" +#include "../../client/settings/cache_settings.h" #include "../../game/player/player_actions.h" #include "../../game/player/player_logic.h" #include "../../game/zones/pile_zone_logic.h" @@ -11,6 +12,7 @@ #include #include #include +#include PileZone::PileZone(PileZoneLogic *_logic, QGraphicsItem *parent) : CardZone(_logic, parent) { @@ -23,12 +25,13 @@ PileZone::PileZone(PileZoneLogic *_logic, QGraphicsItem *parent) : CardZone(_log .rotate(90) .translate(-CardDimensions::WIDTH_HALF_F, -CardDimensions::HEIGHT_HALF_F)); - connect(&SettingsCache::instance(), &SettingsCache::roundCardCornersChanged, this, [this](bool _roundCardCorners) { - Q_UNUSED(_roundCardCorners); + connect(&SettingsCache::instance().cardsDisplay(), &CardsDisplaySettings::roundCardCornersChanged, this, + [this](bool _roundCardCorners) { + Q_UNUSED(_roundCardCorners); - prepareGeometryChange(); - update(); - }); + prepareGeometryChange(); + update(); + }); } QRectF PileZone::boundingRect() const @@ -39,7 +42,8 @@ QRectF PileZone::boundingRect() const QPainterPath PileZone::shape() const { QPainterPath shape; - qreal cardCornerRadius = SettingsCache::instance().getRoundCardCorners() ? 0.05 * CardDimensions::WIDTH_F : 0.0; + qreal cardCornerRadius = + SettingsCache::instance().cardsDisplay().getRoundCardCorners() ? 0.05 * CardDimensions::WIDTH_F : 0.0; shape.addRoundedRect(boundingRect(), cardCornerRadius, cardCornerRadius); return shape; } diff --git a/cockatrice/src/game_graphics/zones/select_zone.cpp b/cockatrice/src/game_graphics/zones/select_zone.cpp index f2e720686..46d93c127 100644 --- a/cockatrice/src/game_graphics/zones/select_zone.cpp +++ b/cockatrice/src/game_graphics/zones/select_zone.cpp @@ -7,10 +7,11 @@ #include #include #include +#include static qreal stackingOffset(qreal cardHeight) { - const qreal overlapPercent = SettingsCache::instance().getStackCardOverlapPercent(); + const qreal overlapPercent = SettingsCache::instance().cardsDisplay().getStackCardOverlapPercent(); return cardHeight * (100.0 - overlapPercent) / 100.0; } diff --git a/cockatrice/src/game_graphics/zones/table_zone.cpp b/cockatrice/src/game_graphics/zones/table_zone.cpp index e886f62e9..21138854e 100644 --- a/cockatrice/src/game_graphics/zones/table_zone.cpp +++ b/cockatrice/src/game_graphics/zones/table_zone.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include const QColor TableZone::BACKGROUND_COLOR = QColor(100, 100, 100); @@ -28,7 +29,7 @@ TableZone::TableZone(TableZoneLogic *_logic, bool _mirrored, QGraphicsItem *pare connect(_logic, &TableZoneLogic::contentSizeChanged, this, &TableZone::resizeToContents); connect(_logic, &TableZoneLogic::toggleTapped, this, &TableZone::toggleTapped); connect(themeManager, &ThemeManager::themeChanged, this, &TableZone::updateBg); - connect(&SettingsCache::instance(), &SettingsCache::invertVerticalCoordinateChanged, this, + connect(&SettingsCache::instance().interface(), &InterfaceSettings::invertVerticalCoordinateChanged, this, &TableZone::reorganizeCards); updateBg(); @@ -59,8 +60,8 @@ void TableZone::setMirrored(bool isMirrored) bool TableZone::isInverted() const { - return ((mirrored && !SettingsCache::instance().getInvertVerticalCoordinate()) || - (!mirrored && SettingsCache::instance().getInvertVerticalCoordinate())); + return ((mirrored && !SettingsCache::instance().interface().getInvertVerticalCoordinate()) || + (!mirrored && SettingsCache::instance().interface().getInvertVerticalCoordinate())); } void TableZone::paint(QPainter *painter, const QStyleOptionGraphicsItem * /*option*/, QWidget * /*widget*/) diff --git a/cockatrice/src/game_graphics/zones/view_zone_widget.cpp b/cockatrice/src/game_graphics/zones/view_zone_widget.cpp index 14537a826..90f7dbca5 100644 --- a/cockatrice/src/game_graphics/zones/view_zone_widget.cpp +++ b/cockatrice/src/game_graphics/zones/view_zone_widget.cpp @@ -21,6 +21,7 @@ #include #include #include +#include namespace { @@ -65,7 +66,7 @@ ZoneViewWidget::ZoneViewWidget(PlayerLogic *_player, connect(help, &QAction::triggered, this, [this] { createSearchSyntaxHelpWindow(&searchEdit); }); - if (SettingsCache::instance().getFocusCardViewSearchBar()) { + if (SettingsCache::instance().interface().getFocusCardViewSearchBar()) { this->setActive(true); searchEdit.setFocus(); } @@ -76,8 +77,8 @@ ZoneViewWidget::ZoneViewWidget(PlayerLogic *_player, vbox->addItem(searchEditProxy); // hide search bar if chat autofocus setting is enabled, since typing into it will no longer work anyway - searchEditProxy->setVisible(!SettingsCache::instance().getKeepGameChatFocus()); - connect(&SettingsCache::instance(), &SettingsCache::keepGameChatFocusChanged, searchEditProxy, + searchEditProxy->setVisible(!SettingsCache::instance().interface().getKeepGameChatFocus()); + connect(&SettingsCache::instance().interface(), &InterfaceSettings::keepGameChatFocusChanged, searchEditProxy, [searchEditProxy](bool keepFocus) { searchEditProxy->setVisible(!keepFocus); }); // top row @@ -158,9 +159,9 @@ ZoneViewWidget::ZoneViewWidget(PlayerLogic *_player, connect(&sortBySelector, static_cast(&QComboBox::currentIndexChanged), this, &ZoneViewWidget::processSortBy); connect(&pileViewCheckBox, &QCheckBox::QT_STATE_CHANGED, this, &ZoneViewWidget::processSetPileView); - groupBySelector.setCurrentIndex(SettingsCache::instance().getZoneViewGroupByIndex()); - sortBySelector.setCurrentIndex(SettingsCache::instance().getZoneViewSortByIndex()); - pileViewCheckBox.setChecked(SettingsCache::instance().getZoneViewPileView()); + groupBySelector.setCurrentIndex(SettingsCache::instance().interface().getZoneViewGroupByIndex()); + sortBySelector.setCurrentIndex(SettingsCache::instance().interface().getZoneViewSortByIndex()); + pileViewCheckBox.setChecked(SettingsCache::instance().interface().getZoneViewPileView()); if (CardList::NoSort == static_cast(groupBySelector.currentData().toInt())) { pileViewCheckBox.setEnabled(false); @@ -190,7 +191,7 @@ ZoneViewWidget::ZoneViewWidget(PlayerLogic *_player, void ZoneViewWidget::processGroupBy(int index) { auto option = static_cast(groupBySelector.itemData(index).toInt()); - SettingsCache::instance().setZoneViewGroupByIndex(index); + SettingsCache::instance().interface().setZoneViewGroupByIndex(index); zone->setGroupBy(option); // disable pile view checkbox if we're not grouping by anything @@ -214,13 +215,13 @@ void ZoneViewWidget::processSortBy(int index) return; } - SettingsCache::instance().setZoneViewSortByIndex(index); + SettingsCache::instance().interface().setZoneViewSortByIndex(index); zone->setSortBy(option); } void ZoneViewWidget::processSetPileView(QT_STATE_CHANGED_T value) { - SettingsCache::instance().setZoneViewPileView(value); + SettingsCache::instance().interface().setZoneViewPileView(value); zone->setPileView(value); } @@ -477,7 +478,7 @@ static qreal rowsToHeight(int rows) **/ static qreal calcMaxInitialHeight() { - return rowsToHeight(SettingsCache::instance().getCardViewInitialRowsMax()); + return rowsToHeight(SettingsCache::instance().interface().getCardViewInitialRowsMax()); } /** @@ -559,7 +560,7 @@ void ZoneViewWidget::initStyleOption(QStyleOption *option) const void ZoneViewWidget::expandWindow() { qreal maxInitialHeight = calcMaxInitialHeight(); - qreal maxExpandedHeight = rowsToHeight(SettingsCache::instance().getCardViewExpandedRowsMax()); + qreal maxExpandedHeight = rowsToHeight(SettingsCache::instance().interface().getCardViewExpandedRowsMax()); qreal height = rect().height() - extraHeight - 10; qreal maxHeight = maximumHeight() - extraHeight - 10; diff --git a/cockatrice/src/interface/card_picture_loader/card_picture_loader.cpp b/cockatrice/src/interface/card_picture_loader/card_picture_loader.cpp index bd427a6c8..bf5c84276 100644 --- a/cockatrice/src/interface/card_picture_loader/card_picture_loader.cpp +++ b/cockatrice/src/interface/card_picture_loader/card_picture_loader.cpp @@ -1,6 +1,8 @@ #include "card_picture_loader.h" #include "../../client/settings/cache_settings.h" +#include "card_picture_loader_cache_method.h" +#include "card_picture_loader_local_schemes.h" #include #include @@ -16,6 +18,9 @@ #include #include #include +#include +#include +#include #include // never cache more than 300 cards at once for a single deck @@ -24,8 +29,9 @@ CardPictureLoader::CardPictureLoader() : QObject(nullptr) { worker = new CardPictureLoaderWorker; - connect(&SettingsCache::instance(), &SettingsCache::picsPathChanged, this, &CardPictureLoader::picsPathChanged); - connect(&SettingsCache::instance(), &SettingsCache::picDownloadChanged, this, + connect(&SettingsCache::instance().paths(), &PathsSettings::picsPathChanged, this, + &CardPictureLoader::picsPathChanged); + connect(&SettingsCache::instance().personal(), &PersonalSettings::picDownloadChanged, this, &CardPictureLoader::picDownloadChanged); qRegisterMetaType(); @@ -169,7 +175,8 @@ void CardPictureLoader::imageLoaded(const ExactCard &card, const QImage &image) QPixmapCache::insert(card.getPixmapCacheKey(), finalPixmap); - if (SettingsCache::instance().getCardPictureLoaderCacheMethod() == + if (static_cast( + SettingsCache::instance().cacheStorage().getCardPictureLoaderCacheMethod()) == CardPictureLoaderCacheMethod::CacheMethod::FILESYSTEM_CACHE) { saveCardImageToLocalStorage(card, finalPixmap); } @@ -189,9 +196,9 @@ void CardPictureLoader::saveCardImageToLocalStorage(const ExactCard &card, const return; } - const QString picsRoot = SettingsCache::instance().getPicsPath(); - CardPictureLoaderLocalSchemes::NamingScheme scheme = - SettingsCache::instance().getLocalCardImageStorageNamingScheme(); + const QString picsRoot = SettingsCache::instance().paths().getPicsPath(); + CardPictureLoaderLocalSchemes::NamingScheme scheme = static_cast( + SettingsCache::instance().cacheStorage().getLocalCardImageStorageNamingScheme()); QString pattern; @@ -306,7 +313,7 @@ void CardPictureLoader::picsPathChanged() bool CardPictureLoader::hasCustomArt() { - auto picsPath = SettingsCache::instance().getPicsPath(); + auto picsPath = SettingsCache::instance().paths().getPicsPath(); QDirIterator it(picsPath, QDir::Dirs | QDir::NoDotAndDotDot); // Check if there is at least one non-directory file in the pics path, other diff --git a/cockatrice/src/interface/card_picture_loader/card_picture_loader_local.cpp b/cockatrice/src/interface/card_picture_loader/card_picture_loader_local.cpp index bb10d1c42..39621839a 100644 --- a/cockatrice/src/interface/card_picture_loader/card_picture_loader_local.cpp +++ b/cockatrice/src/interface/card_picture_loader/card_picture_loader_local.cpp @@ -7,15 +7,16 @@ #include #include #include +#include static constexpr int REFRESH_INTERVAL_MS = 10 * 1000; CardPictureLoaderLocal::CardPictureLoaderLocal(QObject *parent) - : QObject(parent), picsPath(SettingsCache::instance().getPicsPath()), - customPicsPath(SettingsCache::instance().getCustomPicsPath()) + : QObject(parent), picsPath(SettingsCache::instance().paths().getPicsPath()), + customPicsPath(SettingsCache::instance().paths().getCustomPicsPath()) { // Hook up signals to settings - connect(&SettingsCache::instance(), &SettingsCache::picsPathChanged, this, + connect(&SettingsCache::instance().paths(), &PathsSettings::picsPathChanged, this, &CardPictureLoaderLocal::picsPathChanged); refreshIndex(); @@ -127,6 +128,6 @@ QImage CardPictureLoaderLocal::tryLoadCardImageFromDisk(const QString &setName, void CardPictureLoaderLocal::picsPathChanged() { - picsPath = SettingsCache::instance().getPicsPath(); - customPicsPath = SettingsCache::instance().getCustomPicsPath(); + picsPath = SettingsCache::instance().paths().getPicsPath(); + customPicsPath = SettingsCache::instance().paths().getCustomPicsPath(); } diff --git a/cockatrice/src/interface/card_picture_loader/card_picture_loader_worker.cpp b/cockatrice/src/interface/card_picture_loader/card_picture_loader_worker.cpp index 2f51ba986..3724c184d 100644 --- a/cockatrice/src/interface/card_picture_loader/card_picture_loader_worker.cpp +++ b/cockatrice/src/interface/card_picture_loader/card_picture_loader_worker.cpp @@ -1,6 +1,7 @@ #include "card_picture_loader_worker.h" #include "../../client/settings/cache_settings.h" +#include "card_picture_loader_cache_method.h" #include "card_picture_loader_local.h" #include "card_picture_loader_worker_work.h" @@ -9,13 +10,17 @@ #include #include #include +#include +#include +#include #include #include static constexpr int MAX_REQUESTS_PER_SEC = 10; CardPictureLoaderWorker::CardPictureLoaderWorker() - : QObject(nullptr), picDownload(SettingsCache::instance().getPicDownload()), requestQuota(MAX_REQUESTS_PER_SEC) + : QObject(nullptr), picDownload(SettingsCache::instance().personal().getPicDownload()), + requestQuota(MAX_REQUESTS_PER_SEC) { networkManager = new QNetworkAccessManager(this); // We need a timeout to ensure requests don't hang indefinitely in case of @@ -25,13 +30,14 @@ CardPictureLoaderWorker::CardPictureLoaderWorker() cache = new QNetworkDiskCache(this); cache->setCacheDirectory(SettingsCache::instance().getNetworkCachePath()); cache->setMaximumCacheSize(1024L * 1024L * - static_cast(SettingsCache::instance().getNetworkCacheSizeInMB())); + static_cast(SettingsCache::instance().cacheStorage().getNetworkCacheSizeInMB())); - connect(&SettingsCache::instance(), &SettingsCache::networkCacheSizeChanged, cache, [this](int newSizeInMB) { - if (cache) { - cache->setMaximumCacheSize(1024L * 1024L * static_cast(newSizeInMB)); - } - }); + connect(&SettingsCache::instance().cacheStorage(), &CacheStorageSettings::networkCacheSizeChanged, cache, + [this](int newSizeInMB) { + if (cache) { + cache->setMaximumCacheSize(1024L * 1024L * static_cast(newSizeInMB)); + } + }); networkManager->setCache(cache); @@ -39,7 +45,7 @@ CardPictureLoaderWorker::CardPictureLoaderWorker() // We can't use NoLessSafeRedirectPolicy because it is not applied with AlwaysCache networkManager->setRedirectPolicy(QNetworkRequest::ManualRedirectPolicy); - cacheFilePath = SettingsCache::instance().getRedirectCachePath() + REDIRECT_CACHE_FILENAME; + cacheFilePath = SettingsCache::instance().paths().getRedirectCachePath() + REDIRECT_CACHE_FILENAME; loadRedirectCache(); cleanStaleEntries(); @@ -72,7 +78,8 @@ void CardPictureLoaderWorker::queueRequest(const QUrl &url, CardPictureLoaderWor queueRequest(cachedRedirect, worker); return; } - if (SettingsCache::instance().getCardPictureLoaderCacheMethod() == + if (static_cast( + SettingsCache::instance().cacheStorage().getCardPictureLoaderCacheMethod()) == CardPictureLoaderCacheMethod::CacheMethod::NETWORK_CACHE && cache->metaData(url).isValid()) { // If we hit a cached url, we get to make the request for free, since it won't contribute towards the @@ -98,8 +105,10 @@ QNetworkReply *CardPictureLoaderWorker::makeRequest(const QUrl &url, CardPicture req.setHeader(QNetworkRequest::UserAgentHeader, QString("Cockatrice %1").arg(VERSION_STRING)); req.setRawHeader("Accept", "image/avif,image/webp,image/apng,image/,/*;q=0.8"); - bool useNetworkCache = !picDownload && SettingsCache::instance().getCardPictureLoaderCacheMethod() == - CardPictureLoaderCacheMethod::CacheMethod::NETWORK_CACHE; + bool useNetworkCache = + !picDownload && static_cast( + SettingsCache::instance().cacheStorage().getCardPictureLoaderCacheMethod()) == + CardPictureLoaderCacheMethod::CacheMethod::NETWORK_CACHE; req.setAttribute(QNetworkRequest::CacheLoadControlAttribute, useNetworkCache ? QNetworkRequest::AlwaysCache : QNetworkRequest::AlwaysNetwork); @@ -229,7 +238,7 @@ void CardPictureLoaderWorker::cleanStaleEntries() auto it = redirectCache.begin(); while (it != redirectCache.end()) { - if (it.value().second.addDays(SettingsCache::instance().getRedirectCacheTtl()) < now) { + if (it.value().second.addDays(SettingsCache::instance().cacheStorage().getRedirectCacheTtl()) < now) { it = redirectCache.erase(it); // Remove stale entry } else { ++it; diff --git a/cockatrice/src/interface/card_picture_loader/card_picture_loader_worker_work.cpp b/cockatrice/src/interface/card_picture_loader/card_picture_loader_worker_work.cpp index 6bd57c3d5..ebaf11fff 100644 --- a/cockatrice/src/interface/card_picture_loader/card_picture_loader_worker_work.cpp +++ b/cockatrice/src/interface/card_picture_loader/card_picture_loader_worker_work.cpp @@ -10,6 +10,7 @@ #include #include #include +#include // Card back returned by gatherer when card is not found static const QStringList MD5_BLACKLIST = { @@ -19,7 +20,7 @@ static const QStringList MD5_BLACKLIST = { CardPictureLoaderWorkerWork::CardPictureLoaderWorkerWork(const CardPictureLoaderWorker *worker, const ExactCard &toLoad) : QObject(nullptr), cardToDownload(CardPictureToLoad(toLoad)), - picDownload(SettingsCache::instance().getPicDownload()) + picDownload(SettingsCache::instance().personal().getPicDownload()) { // Hook up signals to the orchestrator connect(this, &CardPictureLoaderWorkerWork::requestImageDownload, worker, &CardPictureLoaderWorker::queueRequest); @@ -31,7 +32,7 @@ CardPictureLoaderWorkerWork::CardPictureLoaderWorkerWork(const CardPictureLoader &CardPictureLoaderWorker::imageRequestSucceeded); // Hook up signals to settings - connect(&SettingsCache::instance(), SIGNAL(picDownloadChanged()), this, SLOT(picDownloadChanged())); + connect(&SettingsCache::instance().personal(), SIGNAL(picDownloadChanged()), this, SLOT(picDownloadChanged())); startNextPicDownload(); } @@ -210,5 +211,5 @@ void CardPictureLoaderWorkerWork::concludeImageLoad(const QImage &image) void CardPictureLoaderWorkerWork::picDownloadChanged() { - picDownload = SettingsCache::instance().getPicDownload(); + picDownload = SettingsCache::instance().personal().getPicDownload(); } diff --git a/cockatrice/src/interface/card_picture_loader/card_picture_to_load.cpp b/cockatrice/src/interface/card_picture_loader/card_picture_to_load.cpp index 63846e5fd..33e4aabdb 100644 --- a/cockatrice/src/interface/card_picture_loader/card_picture_to_load.cpp +++ b/cockatrice/src/interface/card_picture_loader/card_picture_to_load.cpp @@ -9,6 +9,8 @@ #include #include #include +#include +#include CardPictureToLoad::CardPictureToLoad(const ExactCard &_card) : card(_card), urlTemplates(SettingsCache::instance().downloads().getAllURLs()) @@ -34,7 +36,7 @@ QList CardPictureToLoad::extractSetsSorted(const ExactCard &card) std::sort(sortedSets.begin(), sortedSets.end(), SetPriorityComparator()); // If the user hasn't disabled arts other than their personal preference... - if (!SettingsCache::instance().getOverrideAllCardArtWithPersonalPreference()) { + if (!SettingsCache::instance().cardsDisplay().getOverrideAllCardArtWithPersonalPreference()) { // If the pixmapCacheKey corresponds to a specific set, we have to try to load it first. qsizetype setIndex = sortedSets.indexOf(card.getPrinting().getSet()); if (setIndex > 0) { // we don't need to move the set if it's already first diff --git a/cockatrice/src/interface/theme_manager.cpp b/cockatrice/src/interface/theme_manager.cpp index c6e2cf902..518a97bc6 100644 --- a/cockatrice/src/interface/theme_manager.cpp +++ b/cockatrice/src/interface/theme_manager.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #define NONE_THEME_NAME "Default" #define FUSION_THEME_NAME "Fusion" @@ -162,7 +163,7 @@ QStringMap &ThemeManager::getAvailableThemes() availableThemes.clear(); // load themes from user profile dir - dir.setPath(SettingsCache::instance().getThemesPath()); + dir.setPath(SettingsCache::instance().paths().getThemesPath()); // add default value availableThemes.insert(NONE_THEME_NAME, dir.absoluteFilePath("Default")); diff --git a/cockatrice/src/interface/widgets/cards/additional_info/color_identity_widget.cpp b/cockatrice/src/interface/widgets/cards/additional_info/color_identity_widget.cpp index 1c38214bd..3f0f30a27 100644 --- a/cockatrice/src/interface/widgets/cards/additional_info/color_identity_widget.cpp +++ b/cockatrice/src/interface/widgets/cards/additional_info/color_identity_widget.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include ColorIdentityWidget::ColorIdentityWidget(QWidget *parent, const QString &_colorIdentity) @@ -21,7 +22,8 @@ ColorIdentityWidget::ColorIdentityWidget(QWidget *parent, const QString &_colorI populateManaSymbolWidgets(); - connect(&SettingsCache::instance(), &SettingsCache::visualDeckStorageDrawUnusedColorIdentitiesChanged, this, + connect(&SettingsCache::instance().visualDeckStorage(), + &VisualDeckStorageSettings::visualDeckStorageDrawUnusedColorIdentitiesChanged, this, &ColorIdentityWidget::toggleUnusedVisibility); } @@ -40,7 +42,7 @@ void ColorIdentityWidget::populateManaSymbolWidgets() QtUtils::clearLayoutRec(layout); // populate mana symbols - if (SettingsCache::instance().getVisualDeckStorageDrawUnusedColorIdentities()) { + if (SettingsCache::instance().visualDeckStorage().getVisualDeckStorageDrawUnusedColorIdentities()) { for (const QString symbol : fullColorIdentity) { auto *manaSymbol = new ManaSymbolWidget(this, symbol, symbols.contains(symbol)); layout->addWidget(manaSymbol); diff --git a/cockatrice/src/interface/widgets/cards/additional_info/mana_symbol_widget.cpp b/cockatrice/src/interface/widgets/cards/additional_info/mana_symbol_widget.cpp index 07cc382ad..51247da7a 100644 --- a/cockatrice/src/interface/widgets/cards/additional_info/mana_symbol_widget.cpp +++ b/cockatrice/src/interface/widgets/cards/additional_info/mana_symbol_widget.cpp @@ -3,6 +3,7 @@ #include "../../../../client/settings/cache_settings.h" #include +#include ManaSymbolWidget::ManaSymbolWidget(QWidget *parent, QString _symbol, bool _isActive, bool _mayBeToggled) : QLabel(parent), symbol(_symbol), isActive(_isActive), mayBeToggled(_mayBeToggled) @@ -16,7 +17,8 @@ ManaSymbolWidget::ManaSymbolWidget(QWidget *parent, QString _symbol, bool _isAct setGraphicsEffect(opacityEffect); updateOpacity(); - connect(&SettingsCache::instance(), &SettingsCache::visualDeckStorageUnusedColorIdentitiesOpacityChanged, this, + connect(&SettingsCache::instance().visualDeckStorage(), + &VisualDeckStorageSettings::visualDeckStorageUnusedColorIdentitiesOpacityChanged, this, &ManaSymbolWidget::updateOpacity); } @@ -42,7 +44,11 @@ void ManaSymbolWidget::updateOpacity() opacity = isActive ? 1.0 : 0.5; } else { // It's just for display, they can do whatever they want. - opacity = isActive ? 1.0 : SettingsCache::instance().getVisualDeckStorageUnusedColorIdentitiesOpacity() / 100.0; + opacity = + isActive + ? 1.0 + : SettingsCache::instance().visualDeckStorage().getVisualDeckStorageUnusedColorIdentitiesOpacity() / + 100.0; } opacityEffect->setOpacity(opacity); } diff --git a/cockatrice/src/interface/widgets/cards/card_info_frame_widget.cpp b/cockatrice/src/interface/widgets/cards/card_info_frame_widget.cpp index 2e7c62461..fcccf445a 100644 --- a/cockatrice/src/interface/widgets/cards/card_info_frame_widget.cpp +++ b/cockatrice/src/interface/widgets/cards/card_info_frame_widget.cpp @@ -10,6 +10,7 @@ #include #include #include +#include CardInfoFrameWidget::CardInfoFrameWidget(QWidget *parent) : QTabWidget(parent), viewTransformationButton(nullptr), cardTextOnly(false) @@ -60,7 +61,7 @@ CardInfoFrameWidget::CardInfoFrameWidget(QWidget *parent) tab3Layout->addWidget(splitter); tab3->setLayout(tab3Layout); - setViewMode(SettingsCache::instance().getCardInfoViewMode()); + setViewMode(SettingsCache::instance().cardsDisplay().getCardInfoViewMode()); } void CardInfoFrameWidget::retranslateUi() @@ -127,7 +128,7 @@ void CardInfoFrameWidget::setViewMode(int mode) refreshLayout(); - SettingsCache::instance().setCardInfoViewMode(mode); + SettingsCache::instance().cardsDisplay().setCardInfoViewMode(mode); } static bool hasTransformation(const CardInfo &info) diff --git a/cockatrice/src/interface/widgets/cards/card_info_picture_enlarged_widget.cpp b/cockatrice/src/interface/widgets/cards/card_info_picture_enlarged_widget.cpp index 185bb20d1..f442fe425 100644 --- a/cockatrice/src/interface/widgets/cards/card_info_picture_enlarged_widget.cpp +++ b/cockatrice/src/interface/widgets/cards/card_info_picture_enlarged_widget.cpp @@ -5,6 +5,7 @@ #include #include +#include /** * @brief Constructs a CardPictureEnlargedWidget. @@ -17,11 +18,12 @@ CardInfoPictureEnlargedWidget::CardInfoPictureEnlargedWidget(QWidget *parent) : setWindowFlags(Qt::ToolTip); // Keeps this widget on top of everything setAttribute(Qt::WA_TranslucentBackground); - connect(&SettingsCache::instance(), &SettingsCache::roundCardCornersChanged, this, [this](bool _roundCardCorners) { - Q_UNUSED(_roundCardCorners); + connect(&SettingsCache::instance().cardsDisplay(), &CardsDisplaySettings::roundCardCornersChanged, this, + [this](bool _roundCardCorners) { + Q_UNUSED(_roundCardCorners); - update(); - }); + update(); + }); } /** @@ -99,7 +101,8 @@ void CardInfoPictureEnlargedWidget::paintEvent(QPaintEvent *event) QPoint topLeft{(width() - scaledLogicalSize.width()) / 2, (height() - scaledLogicalSize.height()) / 2}; // Rounded corner radius based on logical width - qreal radius = SettingsCache::instance().getRoundCardCorners() ? 0.05 * scaledLogicalSize.width() : 0.0; + qreal radius = + SettingsCache::instance().cardsDisplay().getRoundCardCorners() ? 0.05 * scaledLogicalSize.width() : 0.0; QStylePainter painter(this); // Fill the background with transparent color to ensure rounded corners are rendered properly diff --git a/cockatrice/src/interface/widgets/cards/card_info_picture_widget.cpp b/cockatrice/src/interface/widgets/cards/card_info_picture_widget.cpp index 3bfd9ce7d..af778889b 100644 --- a/cockatrice/src/interface/widgets/cards/card_info_picture_widget.cpp +++ b/cockatrice/src/interface/widgets/cards/card_info_picture_widget.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include static constexpr qreal MTG_CARD_ASPECT_RATIO = 1.396; @@ -66,11 +67,12 @@ CardInfoPictureWidget::CardInfoPictureWidget(QWidget *parent, const bool _hoverT animation->setStartValue(originalPos); animation->setEndValue(originalPos - QPoint(0, ANIMATION_OFFSET)); - connect(&SettingsCache::instance(), &SettingsCache::roundCardCornersChanged, this, [this](bool _roundCardCorners) { - Q_UNUSED(_roundCardCorners); + connect(&SettingsCache::instance().cardsDisplay(), &CardsDisplaySettings::roundCardCornersChanged, this, + [this](bool _roundCardCorners) { + Q_UNUSED(_roundCardCorners); - update(); - }); + update(); + }); } /** @@ -190,7 +192,7 @@ void CardInfoPictureWidget::paintEvent(QPaintEvent *event) } QPixmap transformedPixmap = resizedPixmap; // Default pixmap - if (SettingsCache::instance().getAutoRotateSidewaysLayoutCards()) { + if (SettingsCache::instance().cardsDisplay().getAutoRotateSidewaysLayoutCards()) { if (exactCard.getInfo().getUiAttributes().landscapeOrientation) { // Rotate pixmap 90 degrees to the left QTransform transform; @@ -220,7 +222,9 @@ void CardInfoPictureWidget::paintEvent(QPaintEvent *event) // Compute rounded corner radius // Ensure consistent rounding - qreal radius = SettingsCache::instance().getRoundCardCorners() ? 0.05 * static_cast(targetRect.width()) : 0.; + qreal radius = SettingsCache::instance().cardsDisplay().getRoundCardCorners() + ? 0.05 * static_cast(targetRect.width()) + : 0.; // Draw the pixmap with rounded corners QStylePainter painter(this); diff --git a/cockatrice/src/interface/widgets/cards/deck_preview_card_picture_widget.cpp b/cockatrice/src/interface/widgets/cards/deck_preview_card_picture_widget.cpp index b27fe274f..1614836fc 100644 --- a/cockatrice/src/interface/widgets/cards/deck_preview_card_picture_widget.cpp +++ b/cockatrice/src/interface/widgets/cards/deck_preview_card_picture_widget.cpp @@ -8,6 +8,7 @@ #include #include #include +#include /** * @brief Constructs a CardPictureWithTextOverlay widget. @@ -38,7 +39,8 @@ DeckPreviewCardPictureWidget::DeckPreviewCardPictureWidget(QWidget *parent, singleClickTimer = new QTimer(this); singleClickTimer->setSingleShot(true); connect(singleClickTimer, &QTimer::timeout, this, [this]() { emit imageClicked(lastMouseEvent, this); }); - connect(&SettingsCache::instance(), &SettingsCache::visualDeckStorageSelectionAnimationChanged, this, + connect(&SettingsCache::instance().visualDeckStorage(), + &VisualDeckStorageSettings::visualDeckStorageSelectionAnimationChanged, this, &CardInfoPictureWidget::setRaiseOnEnterEnabled); } diff --git a/cockatrice/src/interface/widgets/deck_editor/card_database_view.cpp b/cockatrice/src/interface/widgets/deck_editor/card_database_view.cpp index a1c29e241..7c782b074 100644 --- a/cockatrice/src/interface/widgets/deck_editor/card_database_view.cpp +++ b/cockatrice/src/interface/widgets/deck_editor/card_database_view.cpp @@ -11,6 +11,7 @@ #include #include #include +#include static bool canBeCommander(const CardInfo &cardInfo) { diff --git a/cockatrice/src/interface/widgets/deck_editor/deck_editor_deck_dock_widget.cpp b/cockatrice/src/interface/widgets/deck_editor/deck_editor_deck_dock_widget.cpp index f61a01168..9c52f535f 100644 --- a/cockatrice/src/interface/widgets/deck_editor/deck_editor_deck_dock_widget.cpp +++ b/cockatrice/src/interface/widgets/deck_editor/deck_editor_deck_dock_widget.cpp @@ -1,6 +1,7 @@ #include "deck_editor_deck_dock_widget.h" #include "../../../client/settings/cache_settings.h" +#include "../../../client/settings/shortcuts_settings.h" #include "deck_list_style_proxy.h" #include "deck_state_manager.h" @@ -11,6 +12,8 @@ #include #include #include +#include +#include #include static int findRestoreIndex(const CardRef &wanted, const QComboBox *combo) @@ -108,18 +111,20 @@ void DeckEditorDeckDockWidget::createDeckDock() showBannerCardCheckBox = new QCheckBox(); showBannerCardCheckBox->setObjectName("showBannerCardCheckBox"); - showBannerCardCheckBox->setChecked(SettingsCache::instance().getDeckEditorBannerCardComboBoxVisible()); - connect(showBannerCardCheckBox, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance(), - &SettingsCache::setDeckEditorBannerCardComboBoxVisible); - connect(&SettingsCache::instance(), &SettingsCache::deckEditorBannerCardComboBoxVisibleChanged, this, + showBannerCardCheckBox->setChecked( + SettingsCache::instance().cardsDisplay().getDeckEditorBannerCardComboBoxVisible()); + connect(showBannerCardCheckBox, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance().cardsDisplay(), + &CardsDisplaySettings::setDeckEditorBannerCardComboBoxVisible); + connect(&SettingsCache::instance().cardsDisplay(), + &CardsDisplaySettings::deckEditorBannerCardComboBoxVisibleChanged, this, &DeckEditorDeckDockWidget::updateShowBannerCardComboBox); showTagsWidgetCheckBox = new QCheckBox(); showTagsWidgetCheckBox->setObjectName("showTagsWidgetCheckBox"); - showTagsWidgetCheckBox->setChecked(SettingsCache::instance().getDeckEditorTagsWidgetVisible()); - connect(showTagsWidgetCheckBox, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance(), - &SettingsCache::setDeckEditorTagsWidgetVisible); - connect(&SettingsCache::instance(), &SettingsCache::deckEditorTagsWidgetVisibleChanged, this, + showTagsWidgetCheckBox->setChecked(SettingsCache::instance().cardsDisplay().getDeckEditorTagsWidgetVisible()); + connect(showTagsWidgetCheckBox, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance().cardsDisplay(), + &CardsDisplaySettings::setDeckEditorTagsWidgetVisible); + connect(&SettingsCache::instance().cardsDisplay(), &CardsDisplaySettings::deckEditorTagsWidgetVisibleChanged, this, &DeckEditorDeckDockWidget::updateShowTagsWidget); quickSettingsWidget->addSettingsWidget(showBannerCardCheckBox); @@ -151,7 +156,7 @@ void DeckEditorDeckDockWidget::createDeckDock() bannerCardLabel = new QLabel(); bannerCardLabel->setObjectName("bannerCardLabel"); bannerCardLabel->setText(tr("Banner Card")); - bannerCardLabel->setHidden(!SettingsCache::instance().getDeckEditorBannerCardComboBoxVisible()); + bannerCardLabel->setHidden(!SettingsCache::instance().cardsDisplay().getDeckEditorBannerCardComboBoxVisible()); bannerCardComboBox = new QComboBox(this); connect(getModel(), &DeckListModel::cardNodesChanged, this, [this]() { // Delay the update to avoid race conditions @@ -162,10 +167,10 @@ void DeckEditorDeckDockWidget::createDeckDock() connect(bannerCardComboBox, QOverload::of(&QComboBox::currentIndexChanged), this, &DeckEditorDeckDockWidget::writeBannerCard); - bannerCardComboBox->setHidden(!SettingsCache::instance().getDeckEditorBannerCardComboBoxVisible()); + bannerCardComboBox->setHidden(!SettingsCache::instance().cardsDisplay().getDeckEditorBannerCardComboBoxVisible()); deckTagsDisplayWidget = new DeckPreviewDeckTagsDisplayWidget(this, {}); - deckTagsDisplayWidget->setHidden(!SettingsCache::instance().getDeckEditorTagsWidgetVisible()); + deckTagsDisplayWidget->setHidden(!SettingsCache::instance().cardsDisplay().getDeckEditorTagsWidgetVisible()); connect(deckTagsDisplayWidget, &DeckPreviewDeckTagsDisplayWidget::tagsChanged, deckStateManager, &DeckStateManager::setTags); diff --git a/cockatrice/src/interface/widgets/deck_editor/deck_editor_filter_dock_widget.cpp b/cockatrice/src/interface/widgets/deck_editor/deck_editor_filter_dock_widget.cpp index 6b18db82e..2d4fb60e8 100644 --- a/cockatrice/src/interface/widgets/deck_editor/deck_editor_filter_dock_widget.cpp +++ b/cockatrice/src/interface/widgets/deck_editor/deck_editor_filter_dock_widget.cpp @@ -1,6 +1,7 @@ #include "deck_editor_filter_dock_widget.h" #include "../../../client/settings/cache_settings.h" +#include "../../../client/settings/shortcuts_settings.h" #include "../../../filters/filter_builder.h" #include "../../../filters/filter_tree_model.h" diff --git a/cockatrice/src/interface/widgets/deck_editor/deck_editor_printing_selector_dock_widget.cpp b/cockatrice/src/interface/widgets/deck_editor/deck_editor_printing_selector_dock_widget.cpp index a91601f2e..06d8d1de7 100644 --- a/cockatrice/src/interface/widgets/deck_editor/deck_editor_printing_selector_dock_widget.cpp +++ b/cockatrice/src/interface/widgets/deck_editor/deck_editor_printing_selector_dock_widget.cpp @@ -5,6 +5,7 @@ #include "printing_disabled_info_widget.h" #include +#include DeckEditorPrintingSelectorDockWidget::DeckEditorPrintingSelectorDockWidget(AbstractTabDeckEditor *parent) : QDockWidget(parent), deckEditor(parent) @@ -18,8 +19,9 @@ DeckEditorPrintingSelectorDockWidget::DeckEditorPrintingSelectorDockWidget(Abstr createPrintingSelectorDock(); printingDisabledInfoWidget = new PrintingDisabledInfoWidget(this); - setVisibleWidget(SettingsCache::instance().getOverrideAllCardArtWithPersonalPreference()); - connect(&SettingsCache::instance(), &SettingsCache::overrideAllCardArtWithPersonalPreferenceChanged, this, + setVisibleWidget(SettingsCache::instance().cardsDisplay().getOverrideAllCardArtWithPersonalPreference()); + connect(&SettingsCache::instance().cardsDisplay(), + &CardsDisplaySettings::overrideAllCardArtWithPersonalPreferenceChanged, this, &DeckEditorPrintingSelectorDockWidget::setVisibleWidget); retranslateUi(); diff --git a/cockatrice/src/interface/widgets/dialogs/dlg_connect.cpp b/cockatrice/src/interface/widgets/dialogs/dlg_connect.cpp index 2a7fc6c06..f1e7a8ba1 100644 --- a/cockatrice/src/interface/widgets/dialogs/dlg_connect.cpp +++ b/cockatrice/src/interface/widgets/dialogs/dlg_connect.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include DlgConnect::DlgConnect(QWidget *parent) : QDialog(parent) diff --git a/cockatrice/src/interface/widgets/dialogs/dlg_create_game.cpp b/cockatrice/src/interface/widgets/dialogs/dlg_create_game.cpp index f892801f1..2b1e9e8c2 100644 --- a/cockatrice/src/interface/widgets/dialogs/dlg_create_game.cpp +++ b/cockatrice/src/interface/widgets/dialogs/dlg_create_game.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #include void DlgCreateGame::sharedCtor() @@ -49,7 +50,7 @@ void DlgCreateGame::sharedCtor() auto *gameTypeRadioButton = new QRadioButton(gameTypeIterator.value(), this); gameTypeLayout->addWidget(gameTypeRadioButton); gameTypeCheckBoxes.insert(gameTypeIterator.key(), gameTypeRadioButton); - bool isChecked = SettingsCache::instance().getGameTypes().contains(gameTypeIterator.value() + ", "); + bool isChecked = SettingsCache::instance().game().getGameTypes().contains(gameTypeIterator.value() + ", "); gameTypeCheckBoxes[gameTypeIterator.key()]->setChecked(isChecked); } auto *gameTypeGroupBox = new QGroupBox(tr("Game type")); @@ -154,23 +155,23 @@ DlgCreateGame::DlgCreateGame(TabRoom *_room, const QMap &_gameType { sharedCtor(); - rememberGameSettings->setChecked(SettingsCache::instance().getRememberGameSettings()); - descriptionEdit->setText(SettingsCache::instance().getGameDescription()); - maxPlayersEdit->setValue(SettingsCache::instance().getMaxPlayers()); + rememberGameSettings->setChecked(SettingsCache::instance().game().getRememberGameSettings()); + descriptionEdit->setText(SettingsCache::instance().game().getGameDescription()); + maxPlayersEdit->setValue(SettingsCache::instance().game().getMaxPlayers()); if (room && room->getUserInfo()->user_level() & ServerInfo_User::IsRegistered) { - onlyBuddiesCheckBox->setChecked(SettingsCache::instance().getOnlyBuddies()); - onlyRegisteredCheckBox->setChecked(SettingsCache::instance().getOnlyRegistered()); + onlyBuddiesCheckBox->setChecked(SettingsCache::instance().game().getOnlyBuddies()); + onlyRegisteredCheckBox->setChecked(SettingsCache::instance().game().getOnlyRegistered()); } else { onlyBuddiesCheckBox->setEnabled(false); onlyRegisteredCheckBox->setEnabled(false); } - spectatorsAllowedCheckBox->setChecked(SettingsCache::instance().getSpectatorsAllowed()); - spectatorsNeedPasswordCheckBox->setChecked(SettingsCache::instance().getSpectatorsNeedPassword()); - spectatorsCanTalkCheckBox->setChecked(SettingsCache::instance().getSpectatorsCanTalk()); - spectatorsSeeEverythingCheckBox->setChecked(SettingsCache::instance().getSpectatorsCanSeeEverything()); - createGameAsSpectatorCheckBox->setChecked(SettingsCache::instance().getCreateGameAsSpectator()); - startingLifeTotalEdit->setValue(SettingsCache::instance().getDefaultStartingLifeTotal()); - shareDecklistsOnLoadCheckBox->setChecked(SettingsCache::instance().getShareDecklistsOnLoad()); + spectatorsAllowedCheckBox->setChecked(SettingsCache::instance().game().getSpectatorsAllowed()); + spectatorsNeedPasswordCheckBox->setChecked(SettingsCache::instance().game().getSpectatorsNeedPassword()); + spectatorsCanTalkCheckBox->setChecked(SettingsCache::instance().game().getSpectatorsCanTalk()); + spectatorsSeeEverythingCheckBox->setChecked(SettingsCache::instance().game().getSpectatorsCanSeeEverything()); + createGameAsSpectatorCheckBox->setChecked(SettingsCache::instance().game().getCreateGameAsSpectator()); + startingLifeTotalEdit->setValue(SettingsCache::instance().game().getDefaultStartingLifeTotal()); + shareDecklistsOnLoadCheckBox->setChecked(SettingsCache::instance().game().getShareDecklistsOnLoad()); if (!rememberGameSettings->isChecked()) { actReset(); @@ -291,20 +292,20 @@ void DlgCreateGame::actOK() } } - SettingsCache::instance().setRememberGameSettings(rememberGameSettings->isChecked()); + SettingsCache::instance().game().setRememberGameSettings(rememberGameSettings->isChecked()); if (rememberGameSettings->isChecked()) { - SettingsCache::instance().setGameDescription(descriptionEdit->text()); - SettingsCache::instance().setMaxPlayers(maxPlayersEdit->value()); - SettingsCache::instance().setOnlyBuddies(onlyBuddiesCheckBox->isChecked()); - SettingsCache::instance().setOnlyRegistered(onlyRegisteredCheckBox->isChecked()); - SettingsCache::instance().setSpectatorsAllowed(spectatorsAllowedCheckBox->isChecked()); - SettingsCache::instance().setSpectatorsNeedPassword(spectatorsNeedPasswordCheckBox->isChecked()); - SettingsCache::instance().setSpectatorsCanTalk(spectatorsCanTalkCheckBox->isChecked()); - SettingsCache::instance().setSpectatorsCanSeeEverything(spectatorsSeeEverythingCheckBox->isChecked()); - SettingsCache::instance().setCreateGameAsSpectator(createGameAsSpectatorCheckBox->isChecked()); - SettingsCache::instance().setDefaultStartingLifeTotal(startingLifeTotalEdit->value()); - SettingsCache::instance().setShareDecklistsOnLoad(shareDecklistsOnLoadCheckBox->isChecked()); - SettingsCache::instance().setGameTypes(_gameTypes); + SettingsCache::instance().game().setGameDescription(descriptionEdit->text()); + SettingsCache::instance().game().setMaxPlayers(maxPlayersEdit->value()); + SettingsCache::instance().game().setOnlyBuddies(onlyBuddiesCheckBox->isChecked()); + SettingsCache::instance().game().setOnlyRegistered(onlyRegisteredCheckBox->isChecked()); + SettingsCache::instance().game().setSpectatorsAllowed(spectatorsAllowedCheckBox->isChecked()); + SettingsCache::instance().game().setSpectatorsNeedPassword(spectatorsNeedPasswordCheckBox->isChecked()); + SettingsCache::instance().game().setSpectatorsCanTalk(spectatorsCanTalkCheckBox->isChecked()); + SettingsCache::instance().game().setSpectatorsCanSeeEverything(spectatorsSeeEverythingCheckBox->isChecked()); + SettingsCache::instance().game().setCreateGameAsSpectator(createGameAsSpectatorCheckBox->isChecked()); + SettingsCache::instance().game().setDefaultStartingLifeTotal(startingLifeTotalEdit->value()); + SettingsCache::instance().game().setShareDecklistsOnLoad(shareDecklistsOnLoadCheckBox->isChecked()); + SettingsCache::instance().game().setGameTypes(_gameTypes); } PendingCommand *pend = room->prepareRoomCommand(cmd); connect(pend, &PendingCommand::finished, this, &DlgCreateGame::checkResponse); diff --git a/cockatrice/src/interface/widgets/dialogs/dlg_default_tags_editor.cpp b/cockatrice/src/interface/widgets/dialogs/dlg_default_tags_editor.cpp index 2d6ee7909..e9c73b025 100644 --- a/cockatrice/src/interface/widgets/dialogs/dlg_default_tags_editor.cpp +++ b/cockatrice/src/interface/widgets/dialogs/dlg_default_tags_editor.cpp @@ -5,6 +5,7 @@ #include #include #include +#include DlgDefaultTagsEditor::DlgDefaultTagsEditor(QWidget *parent) : QDialog(parent) { @@ -54,7 +55,7 @@ void DlgDefaultTagsEditor::retranslateUi() void DlgDefaultTagsEditor::loadStringList() { listWidget->clear(); - QStringList tags = SettingsCache::instance().getVisualDeckStorageDefaultTagsList(); + QStringList tags = SettingsCache::instance().visualDeckStorage().getVisualDeckStorageDefaultTagsList(); for (const QString &tag : tags) { auto *item = new QListWidgetItem(); // Create item but don't insert yet @@ -147,6 +148,6 @@ void DlgDefaultTagsEditor::confirmChanges() updatedList.append(lineEdit->text()); } } - SettingsCache::instance().setVisualDeckStorageDefaultTagsList(updatedList); + SettingsCache::instance().visualDeckStorage().setVisualDeckStorageDefaultTagsList(updatedList); accept(); // Close dialog and confirm changes } diff --git a/cockatrice/src/interface/widgets/dialogs/dlg_edit_password.cpp b/cockatrice/src/interface/widgets/dialogs/dlg_edit_password.cpp index 63181b44f..4310c03fc 100644 --- a/cockatrice/src/interface/widgets/dialogs/dlg_edit_password.cpp +++ b/cockatrice/src/interface/widgets/dialogs/dlg_edit_password.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include DlgEditPassword::DlgEditPassword(QWidget *parent) : QDialog(parent) diff --git a/cockatrice/src/interface/widgets/dialogs/dlg_forgot_password_challenge.cpp b/cockatrice/src/interface/widgets/dialogs/dlg_forgot_password_challenge.cpp index 14c3cda47..c21955373 100644 --- a/cockatrice/src/interface/widgets/dialogs/dlg_forgot_password_challenge.cpp +++ b/cockatrice/src/interface/widgets/dialogs/dlg_forgot_password_challenge.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include DlgForgotPasswordChallenge::DlgForgotPasswordChallenge(QWidget *parent) : QDialog(parent) diff --git a/cockatrice/src/interface/widgets/dialogs/dlg_forgot_password_request.cpp b/cockatrice/src/interface/widgets/dialogs/dlg_forgot_password_request.cpp index fc934d082..4ee0c9c88 100644 --- a/cockatrice/src/interface/widgets/dialogs/dlg_forgot_password_request.cpp +++ b/cockatrice/src/interface/widgets/dialogs/dlg_forgot_password_request.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include DlgForgotPasswordRequest::DlgForgotPasswordRequest(QWidget *parent) : QDialog(parent) diff --git a/cockatrice/src/interface/widgets/dialogs/dlg_forgot_password_reset.cpp b/cockatrice/src/interface/widgets/dialogs/dlg_forgot_password_reset.cpp index d30887988..2800d5c0c 100644 --- a/cockatrice/src/interface/widgets/dialogs/dlg_forgot_password_reset.cpp +++ b/cockatrice/src/interface/widgets/dialogs/dlg_forgot_password_reset.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include DlgForgotPasswordReset::DlgForgotPasswordReset(QWidget *parent) : QDialog(parent) diff --git a/cockatrice/src/interface/widgets/dialogs/dlg_load_deck.cpp b/cockatrice/src/interface/widgets/dialogs/dlg_load_deck.cpp index b87800909..626ebed50 100644 --- a/cockatrice/src/interface/widgets/dialogs/dlg_load_deck.cpp +++ b/cockatrice/src/interface/widgets/dialogs/dlg_load_deck.cpp @@ -3,11 +3,13 @@ #include "../../../client/settings/cache_settings.h" #include "../../deck_loader/deck_loader.h" +#include +#include DlgLoadDeck::DlgLoadDeck(QWidget *parent) : QFileDialog(parent, tr("Load Deck")) { QString startingDir = SettingsCache::instance().recents().getLatestDeckDirPath(); if (startingDir.isEmpty()) { - startingDir = SettingsCache::instance().getDeckPath(); + startingDir = SettingsCache::instance().paths().getDeckPath(); } setDirectory(startingDir); diff --git a/cockatrice/src/interface/widgets/dialogs/dlg_load_deck_from_clipboard.cpp b/cockatrice/src/interface/widgets/dialogs/dlg_load_deck_from_clipboard.cpp index 9ceb35d78..267b80a2c 100644 --- a/cockatrice/src/interface/widgets/dialogs/dlg_load_deck_from_clipboard.cpp +++ b/cockatrice/src/interface/widgets/dialogs/dlg_load_deck_from_clipboard.cpp @@ -1,6 +1,7 @@ #include "dlg_load_deck_from_clipboard.h" #include "../../../client/settings/cache_settings.h" +#include "../../../client/settings/shortcuts_settings.h" #include "../../deck_loader/card_node_function.h" #include "../../deck_loader/deck_loader.h" #include "dlg_settings.h" diff --git a/cockatrice/src/interface/widgets/dialogs/dlg_local_game_options.cpp b/cockatrice/src/interface/widgets/dialogs/dlg_local_game_options.cpp index d2d291556..eca0ec658 100644 --- a/cockatrice/src/interface/widgets/dialogs/dlg_local_game_options.cpp +++ b/cockatrice/src/interface/widgets/dialogs/dlg_local_game_options.cpp @@ -9,6 +9,7 @@ #include #include #include +#include DlgLocalGameOptions::DlgLocalGameOptions(QWidget *parent) : QDialog(parent) { @@ -53,10 +54,10 @@ DlgLocalGameOptions::DlgLocalGameOptions(QWidget *parent) : QDialog(parent) mainLayout->addWidget(buttonBox); setLayout(mainLayout); - rememberSettingsCheckBox->setChecked(SettingsCache::instance().getLocalGameRememberSettings()); + rememberSettingsCheckBox->setChecked(SettingsCache::instance().game().getLocalGameRememberSettings()); if (rememberSettingsCheckBox->isChecked()) { - numberPlayersEdit->setValue(SettingsCache::instance().getLocalGameMaxPlayers()); - startingLifeTotalEdit->setValue(SettingsCache::instance().getLocalGameStartingLifeTotal()); + numberPlayersEdit->setValue(SettingsCache::instance().game().getLocalGameMaxPlayers()); + startingLifeTotalEdit->setValue(SettingsCache::instance().game().getLocalGameStartingLifeTotal()); } setWindowTitle(tr("Local game options")); @@ -67,10 +68,10 @@ DlgLocalGameOptions::DlgLocalGameOptions(QWidget *parent) : QDialog(parent) void DlgLocalGameOptions::actOK() { - SettingsCache::instance().setLocalGameRememberSettings(rememberSettingsCheckBox->isChecked()); + SettingsCache::instance().game().setLocalGameRememberSettings(rememberSettingsCheckBox->isChecked()); if (rememberSettingsCheckBox->isChecked()) { - SettingsCache::instance().setLocalGameMaxPlayers(numberPlayersEdit->value()); - SettingsCache::instance().setLocalGameStartingLifeTotal(startingLifeTotalEdit->value()); + SettingsCache::instance().game().setLocalGameMaxPlayers(numberPlayersEdit->value()); + SettingsCache::instance().game().setLocalGameStartingLifeTotal(startingLifeTotalEdit->value()); } accept(); diff --git a/cockatrice/src/interface/widgets/dialogs/dlg_manage_sets.cpp b/cockatrice/src/interface/widgets/dialogs/dlg_manage_sets.cpp index b17a9306f..7c107eb2f 100644 --- a/cockatrice/src/interface/widgets/dialogs/dlg_manage_sets.cpp +++ b/cockatrice/src/interface/widgets/dialogs/dlg_manage_sets.cpp @@ -20,6 +20,9 @@ #include #include #include +#include +#include +#include WndSets::WndSets(QWidget *parent) : QMainWindow(parent) { @@ -153,7 +156,7 @@ WndSets::WndSets(QWidget *parent) : QMainWindow(parent) sortWarning->setLayout(sortWarningLayout); sortWarning->setVisible(false); - includeRebalancedCards = SettingsCache::instance().getIncludeRebalancedCards(); + includeRebalancedCards = SettingsCache::instance().cardsDisplay().getIncludeRebalancedCards(); QCheckBox *includeRebalancedCardsCheckBox = new QCheckBox(tr("Include cards rebalanced for Alchemy [requires restart]")); includeRebalancedCardsCheckBox->setChecked(includeRebalancedCards); @@ -253,7 +256,7 @@ void WndSets::includeRebalancedCardsChanged(bool _includeRebalancedCards) void WndSets::actSave() { model->save(CardDatabaseManager::getInstance()); - SettingsCache::instance().setIncludeRebalancedCards(includeRebalancedCards); + SettingsCache::instance().cardsDisplay().setIncludeRebalancedCards(includeRebalancedCards); CardPictureLoader::clearPixmapCache(); const auto reloadOk1 = QtConcurrent::run([] { CardDatabaseManager::getInstance()->reloadCardDatabasesAndNotify(); diff --git a/cockatrice/src/interface/widgets/dialogs/dlg_register.cpp b/cockatrice/src/interface/widgets/dialogs/dlg_register.cpp index 942782403..fce99a1a7 100644 --- a/cockatrice/src/interface/widgets/dialogs/dlg_register.cpp +++ b/cockatrice/src/interface/widgets/dialogs/dlg_register.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include DlgRegister::DlgRegister(QWidget *parent) : QDialog(parent) diff --git a/cockatrice/src/interface/widgets/dialogs/dlg_settings.cpp b/cockatrice/src/interface/widgets/dialogs/dlg_settings.cpp index ff42596ea..279e10c28 100644 --- a/cockatrice/src/interface/widgets/dialogs/dlg_settings.cpp +++ b/cockatrice/src/interface/widgets/dialogs/dlg_settings.cpp @@ -24,6 +24,8 @@ #include #include #include +#include +#include static QScrollArea *makeScrollable(QWidget *widget) { @@ -43,7 +45,7 @@ DlgSettings::DlgSettings(QWidget *parent) : QDialog(parent) auto rec = QGuiApplication::primaryScreen()->availableGeometry(); this->setMinimumSize(qMin(700, rec.width()), qMin(700, rec.height())); - connect(&SettingsCache::instance(), &SettingsCache::langChanged, this, &DlgSettings::updateLanguage); + connect(&SettingsCache::instance().personal(), &PersonalSettings::langChanged, this, &DlgSettings::updateLanguage); contentsWidget = new QListWidget; contentsWidget->setViewMode(QListView::IconMode); @@ -79,7 +81,7 @@ DlgSettings::DlgSettings(QWidget *parent) : QDialog(parent) mainLayout->addWidget(buttonBox); setLayout(mainLayout); - connect(&SettingsCache::instance(), &SettingsCache::langChanged, this, &DlgSettings::retranslateUi); + connect(&SettingsCache::instance().personal(), &PersonalSettings::langChanged, this, &DlgSettings::retranslateUi); retranslateUi(); adjustSize(); @@ -205,7 +207,8 @@ void DlgSettings::closeEvent(QCloseEvent *event) } } - if (!QDir(SettingsCache::instance().getDeckPath()).exists() || SettingsCache::instance().getDeckPath().isEmpty()) { + if (!QDir(SettingsCache::instance().paths().getDeckPath()).exists() || + SettingsCache::instance().paths().getDeckPath().isEmpty()) { //! \todo Prompt to create the deck directory. if (QMessageBox::critical( this, tr("Error"), @@ -216,7 +219,8 @@ void DlgSettings::closeEvent(QCloseEvent *event) } } - if (!QDir(SettingsCache::instance().getPicsPath()).exists() || SettingsCache::instance().getPicsPath().isEmpty()) { + if (!QDir(SettingsCache::instance().paths().getPicsPath()).exists() || + SettingsCache::instance().paths().getPicsPath().isEmpty()) { //! \todo Prompt to create the pictures directory. if (QMessageBox::critical(this, tr("Error"), tr("The path to your card pictures directory is invalid. Would you like to go back " diff --git a/cockatrice/src/interface/widgets/dialogs/dlg_startup_card_check.cpp b/cockatrice/src/interface/widgets/dialogs/dlg_startup_card_check.cpp index ac1922a9d..4322beb8c 100644 --- a/cockatrice/src/interface/widgets/dialogs/dlg_startup_card_check.cpp +++ b/cockatrice/src/interface/widgets/dialogs/dlg_startup_card_check.cpp @@ -3,6 +3,7 @@ #include "../../../client/settings/cache_settings.h" #include +#include DlgStartupCardCheck::DlgStartupCardCheck(QWidget *parent) : QDialog(parent) { @@ -10,7 +11,7 @@ DlgStartupCardCheck::DlgStartupCardCheck(QWidget *parent) : QDialog(parent) layout = new QVBoxLayout(this); - QDate lastCheckDate = SettingsCache::instance().getLastCardUpdateCheck(); + QDate lastCheckDate = SettingsCache::instance().updates().getLastCardUpdateCheck(); int daysAgo = lastCheckDate.daysTo(QDate::currentDate()); instructionLabel = new QLabel( diff --git a/cockatrice/src/interface/widgets/dialogs/dlg_tip_of_the_day.cpp b/cockatrice/src/interface/widgets/dialogs/dlg_tip_of_the_day.cpp index 59330e27e..3d3619bf0 100644 --- a/cockatrice/src/interface/widgets/dialogs/dlg_tip_of_the_day.cpp +++ b/cockatrice/src/interface/widgets/dialogs/dlg_tip_of_the_day.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #define MIN_TIP_IMAGE_HEIGHT 200 #define MIN_TIP_IMAGE_WIDTH 200 @@ -41,7 +42,7 @@ DlgTipOfTheDay::DlgTipOfTheDay(QWidget *parent) : QDialog(parent) tipNumber = new QLabel(); tipNumber->setAlignment(Qt::AlignCenter); - QList seenTips = SettingsCache::instance().getSeenTips(); + QList seenTips = SettingsCache::instance().personal().getSeenTips(); newTipsAvailable = false; currentTip = 0; for (int i = 0; i < tipDatabase->rowCount(); i++) { @@ -73,9 +74,9 @@ DlgTipOfTheDay::DlgTipOfTheDay(QWidget *parent) : QDialog(parent) connect(previousButton, &QPushButton::clicked, this, &DlgTipOfTheDay::previousClicked); showTipsOnStartupCheck = new QCheckBox("Show tips on startup"); - showTipsOnStartupCheck->setChecked(SettingsCache::instance().getShowTipsOnStartup()); - connect(showTipsOnStartupCheck, &QCheckBox::clicked, &SettingsCache::instance(), - &SettingsCache::setShowTipsOnStartup); + showTipsOnStartupCheck->setChecked(SettingsCache::instance().personal().getShowTipsOnStartup()); + connect(showTipsOnStartupCheck, &QCheckBox::clicked, &SettingsCache::instance().personal(), + &PersonalSettings::setShowTipsOnStartup); buttonBar = new QHBoxLayout(); buttonBar->addWidget(showTipsOnStartupCheck); buttonBar->addWidget(tipNumber); @@ -130,10 +131,10 @@ void DlgTipOfTheDay::updateTip(int tipId) } // Store tip id as seen - QList seenTips = SettingsCache::instance().getSeenTips(); + QList seenTips = SettingsCache::instance().personal().getSeenTips(); if (!seenTips.contains(tipId)) { seenTips.append(tipId); - SettingsCache::instance().setSeenTips(seenTips); + SettingsCache::instance().personal().setSeenTips(seenTips); } TipOfTheDay tip = tipDatabase->getTip(tipId); diff --git a/cockatrice/src/interface/widgets/dialogs/dlg_view_log.cpp b/cockatrice/src/interface/widgets/dialogs/dlg_view_log.cpp index 4eb054647..957e039c0 100644 --- a/cockatrice/src/interface/widgets/dialogs/dlg_view_log.cpp +++ b/cockatrice/src/interface/widgets/dialogs/dlg_view_log.cpp @@ -3,11 +3,13 @@ #include "../../../client/settings/cache_settings.h" #include "../../logger.h" +#include #include #include #include #include #include +#include DlgViewLog::DlgViewLog(QWidget *parent) : QDialog(parent) { diff --git a/cockatrice/src/interface/widgets/dialogs/override_printing_warning.cpp b/cockatrice/src/interface/widgets/dialogs/override_printing_warning.cpp index d7699fbe4..33d102f5e 100644 --- a/cockatrice/src/interface/widgets/dialogs/override_printing_warning.cpp +++ b/cockatrice/src/interface/widgets/dialogs/override_printing_warning.cpp @@ -3,6 +3,7 @@ #include "../../card_picture_loader/card_picture_loader.h" #include "../../client/settings/cache_settings.h" +#include bool OverridePrintingWarning::execMessageBox(QWidget *parent, bool enable) { QString message; @@ -27,7 +28,7 @@ bool OverridePrintingWarning::execMessageBox(QWidget *parent, bool enable) QMessageBox::question(parent, QObject::tr("Confirm Change"), message, QMessageBox::Yes | QMessageBox::No); if (result == QMessageBox::Yes) { - SettingsCache::instance().setOverrideAllCardArtWithPersonalPreference(static_cast(enable)); + SettingsCache::instance().cardsDisplay().setOverrideAllCardArtWithPersonalPreference(enable); // Caches are now invalid. CardPictureLoader::clearPixmapCache(); CardPictureLoader::clearNetworkCache(); diff --git a/cockatrice/src/interface/widgets/general/home_widget.cpp b/cockatrice/src/interface/widgets/general/home_widget.cpp index e1687f997..e873f5f3e 100644 --- a/cockatrice/src/interface/widgets/general/home_widget.cpp +++ b/cockatrice/src/interface/widgets/general/home_widget.cpp @@ -14,6 +14,8 @@ #include #include #include +#include +#include HomeWidget::HomeWidget(QWidget *parent, TabSupervisor *_tabSupervisor) : QWidget(parent), tabSupervisor(_tabSupervisor), background("theme:backgrounds/home"), overlay("theme:cockatrice") @@ -41,12 +43,13 @@ HomeWidget::HomeWidget(QWidget *parent, TabSupervisor *_tabSupervisor) updateConnectButton(tabSupervisor->getClient()->getStatus()); connect(tabSupervisor->getClient(), &RemoteClient::statusChanged, this, &HomeWidget::updateConnectButton); - connect(&SettingsCache::instance(), &SettingsCache::homeTabBackgroundSourceChanged, this, + connect(&SettingsCache::instance().personal(), &PersonalSettings::homeTabBackgroundSourceChanged, this, &HomeWidget::initializeBackgroundFromSource); - connect(&SettingsCache::instance(), &SettingsCache::homeTabBackgroundShuffleFrequencyChanged, this, + connect(&SettingsCache::instance().personal(), &PersonalSettings::homeTabBackgroundShuffleFrequencyChanged, this, &HomeWidget::onBackgroundShuffleFrequencyChanged); // Lambda is cleaner to read than overloading this - connect(&SettingsCache::instance(), &SettingsCache::homeTabDisplayCardNameChanged, this, [this] { repaint(); }); + connect(&SettingsCache::instance().personal(), &PersonalSettings::homeTabDisplayCardNameChanged, this, + [this] { repaint(); }); connect(&SettingsCache::instance(), &SettingsCache::themeChanged, this, &HomeWidget::initializeBackgroundFromSource); connect(&SettingsCache::instance(), &SettingsCache::themeChanged, this, @@ -61,7 +64,8 @@ void HomeWidget::initializeBackgroundFromSource() return; } - auto backgroundSourceType = BackgroundSources::fromId(SettingsCache::instance().getHomeTabBackgroundSource()); + auto backgroundSourceType = + BackgroundSources::fromId(SettingsCache::instance().personal().getHomeTabBackgroundSource()); switch (backgroundSourceType) { case BackgroundSources::Theme: @@ -88,7 +92,7 @@ void HomeWidget::initializeBackgroundFromSource() void HomeWidget::loadBackgroundSourceDeck() { std::optional deckOpt = DeckLoader::loadFromFile( - SettingsCache::instance().getDeckPath() + "background.cod", DeckFileFormat::Cockatrice, false); + SettingsCache::instance().paths().getDeckPath() + "background.cod", DeckFileFormat::Cockatrice, false); backgroundSourceDeck = deckOpt.has_value() ? deckOpt.value().deckList : DeckList(); } @@ -108,7 +112,8 @@ void HomeWidget::setRandomCard(ExactCard &newCard) void HomeWidget::updateRandomCard() { - auto backgroundSourceType = BackgroundSources::fromId(SettingsCache::instance().getHomeTabBackgroundSource()); + auto backgroundSourceType = + BackgroundSources::fromId(SettingsCache::instance().personal().getHomeTabBackgroundSource()); ExactCard newCard; @@ -151,8 +156,8 @@ void HomeWidget::updateRandomCard() void HomeWidget::onBackgroundShuffleFrequencyChanged() { cardChangeTimer->stop(); - if (SettingsCache::instance().getHomeTabBackgroundShuffleFrequency() > 0) { - cardChangeTimer->start(SettingsCache::instance().getHomeTabBackgroundShuffleFrequency() * 1000); + if (SettingsCache::instance().personal().getHomeTabBackgroundShuffleFrequency() > 0) { + cardChangeTimer->start(SettingsCache::instance().personal().getHomeTabBackgroundShuffleFrequency() * 1000); } } @@ -260,8 +265,8 @@ void HomeWidget::updateConnectButton(const ClientStatus status) QPair HomeWidget::extractDominantColors(const QPixmap &pixmap) { - if (themeManager->isBuiltInTheme() && - SettingsCache::instance().getHomeTabBackgroundSource() == BackgroundSources::toId(BackgroundSources::Theme)) { + if (themeManager->isBuiltInTheme() && SettingsCache::instance().personal().getHomeTabBackgroundSource() == + BackgroundSources::toId(BackgroundSources::Theme)) { return QPair(QColor::fromRgb(20, 140, 60), QColor::fromRgb(120, 200, 80)); } @@ -347,7 +352,7 @@ void HomeWidget::paintEvent(QPaintEvent *event) } } - if (!cardName.isEmpty() && SettingsCache::instance().getHomeTabDisplayCardName()) { + if (!cardName.isEmpty() && SettingsCache::instance().personal().getHomeTabDisplayCardName()) { QFont font = painter.font(); font.setPointSize(14); font.setBold(true); diff --git a/cockatrice/src/interface/widgets/menus/deck_editor_menu.cpp b/cockatrice/src/interface/widgets/menus/deck_editor_menu.cpp index d6df694df..f057680be 100644 --- a/cockatrice/src/interface/widgets/menus/deck_editor_menu.cpp +++ b/cockatrice/src/interface/widgets/menus/deck_editor_menu.cpp @@ -4,6 +4,7 @@ #include "../../../client/settings/shortcuts_settings.h" #include "../tabs/abstract_tab_deck_editor.h" +#include DeckEditorMenu::DeckEditorMenu(AbstractTabDeckEditor *parent) : QMenu(parent), deckEditor(parent) { aNewDeck = new QAction(QString(), this); diff --git a/cockatrice/src/interface/widgets/menus/tearoff_menu.h b/cockatrice/src/interface/widgets/menus/tearoff_menu.h index ef1dfbcb3..26dcd1f6c 100644 --- a/cockatrice/src/interface/widgets/menus/tearoff_menu.h +++ b/cockatrice/src/interface/widgets/menus/tearoff_menu.h @@ -9,22 +9,23 @@ #include "../../../client/settings/cache_settings.h" #include +#include class TearOffMenu : public QMenu { public: explicit TearOffMenu(const QString &title, QWidget *parent = nullptr) : QMenu(title, parent) { - connect(&SettingsCache::instance(), &SettingsCache::useTearOffMenusChanged, this, + connect(&SettingsCache::instance().interface(), &InterfaceSettings::useTearOffMenusChanged, this, [this](const bool state) { setTearOffEnabled(state); }); - setTearOffEnabled(SettingsCache::instance().getUseTearOffMenus()); + setTearOffEnabled(SettingsCache::instance().interface().getUseTearOffMenus()); } explicit TearOffMenu(QWidget *parent = nullptr) : QMenu(parent) { - connect(&SettingsCache::instance(), &SettingsCache::useTearOffMenusChanged, this, + connect(&SettingsCache::instance().interface(), &InterfaceSettings::useTearOffMenusChanged, this, [this](const bool state) { setTearOffEnabled(state); }); - setTearOffEnabled(SettingsCache::instance().getUseTearOffMenus()); + setTearOffEnabled(SettingsCache::instance().interface().getUseTearOffMenus()); } TearOffMenu *addTearOffMenu(const QString &title) diff --git a/cockatrice/src/interface/widgets/printing_selector/printing_selector.cpp b/cockatrice/src/interface/widgets/printing_selector/printing_selector.cpp index 76a416587..0c3bbbe00 100644 --- a/cockatrice/src/interface/widgets/printing_selector/printing_selector.cpp +++ b/cockatrice/src/interface/widgets/printing_selector/printing_selector.cpp @@ -12,6 +12,8 @@ #include #include +#include +#include /** * @brief Constructs a PrintingSelector widget to display and manage card printings. @@ -45,16 +47,17 @@ PrintingSelector::PrintingSelector(QWidget *parent, AbstractTabDeckEditor *_deck // Create the checkbox for navigation buttons visibility navigationCheckBox = new QCheckBox(this); - navigationCheckBox->setChecked(SettingsCache::instance().getPrintingSelectorNavigationButtonsVisible()); + navigationCheckBox->setChecked( + SettingsCache::instance().cardsDisplay().getPrintingSelectorNavigationButtonsVisible()); connect(navigationCheckBox, &QCheckBox::QT_STATE_CHANGED, this, &PrintingSelector::toggleVisibilityNavigationButtons); - connect(navigationCheckBox, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance(), - &SettingsCache::setPrintingSelectorNavigationButtonsVisible); + connect(navigationCheckBox, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance().cardsDisplay(), + &CardsDisplaySettings::setPrintingSelectorNavigationButtonsVisible); - cardSizeWidget = - new CardSizeWidget(displayOptionsWidget, flowWidget, SettingsCache::instance().getPrintingSelectorCardSize()); - connect(cardSizeWidget, &CardSizeWidget::cardSizeSettingUpdated, &SettingsCache::instance(), - &SettingsCache::setPrintingSelectorCardSize); + cardSizeWidget = new CardSizeWidget(displayOptionsWidget, flowWidget, + SettingsCache::instance().cardsDisplay().getPrintingSelectorCardSize()); + connect(cardSizeWidget, &CardSizeWidget::cardSizeSettingUpdated, &SettingsCache::instance().cardsDisplay(), + &CardsDisplaySettings::setPrintingSelectorCardSize); displayOptionsWidget->addSettingsWidget(sortToolBar); displayOptionsWidget->addSettingsWidget(navigationCheckBox); @@ -81,7 +84,8 @@ PrintingSelector::PrintingSelector(QWidget *parent, AbstractTabDeckEditor *_deck flowWidget->setVisible(false); cardSelectionBar = new PrintingSelectorCardSelectionWidget(this, deckStateManager); - cardSelectionBar->setVisible(SettingsCache::instance().getPrintingSelectorNavigationButtonsVisible()); + cardSelectionBar->setVisible( + SettingsCache::instance().cardsDisplay().getPrintingSelectorNavigationButtonsVisible()); layout->addWidget(cardSelectionBar); // Connect deck model data change signal to update display @@ -98,7 +102,7 @@ void PrintingSelector::retranslateUi() void PrintingSelector::printingsInDeckChanged() { - if (SettingsCache::instance().getBumpSetsWithCardsInDeckToTop()) { + if (SettingsCache::instance().cardsDisplay().getBumpSetsWithCardsInDeckToTop()) { // Delay the update to avoid race conditions QTimer::singleShot(100, this, &PrintingSelector::updateDisplay); } @@ -211,7 +215,7 @@ void PrintingSelector::getAllSetsForCurrentCard() sortToolBar->filterSets(sortedPrintings, searchBar->getSearchText().trimmed().toLower()); QList printingsToUse; - if (SettingsCache::instance().getBumpSetsWithCardsInDeckToTop()) { + if (SettingsCache::instance().cardsDisplay().getBumpSetsWithCardsInDeckToTop()) { printingsToUse = sortToolBar->prependPrintingsInDeck(filteredPrintings, selectedCard, deckStateManager->getModel()); } else { diff --git a/cockatrice/src/interface/widgets/printing_selector/printing_selector_card_overlay_widget.cpp b/cockatrice/src/interface/widgets/printing_selector/printing_selector_card_overlay_widget.cpp index dd5f6dd7f..2d8cf278c 100644 --- a/cockatrice/src/interface/widgets/printing_selector/printing_selector_card_overlay_widget.cpp +++ b/cockatrice/src/interface/widgets/printing_selector/printing_selector_card_overlay_widget.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include /** diff --git a/cockatrice/src/interface/widgets/printing_selector/printing_selector_card_sorting_widget.cpp b/cockatrice/src/interface/widgets/printing_selector/printing_selector_card_sorting_widget.cpp index c04d6bbf1..f4a05cfc7 100644 --- a/cockatrice/src/interface/widgets/printing_selector/printing_selector_card_sorting_widget.cpp +++ b/cockatrice/src/interface/widgets/printing_selector/printing_selector_card_sorting_widget.cpp @@ -3,6 +3,9 @@ #include "../../../client/settings/cache_settings.h" #include +#include +#include +#include const QString PrintingSelectorCardSortingWidget::SORT_OPTIONS_ALPHABETICAL = tr("Alphabetical"); const QString PrintingSelectorCardSortingWidget::SORT_OPTIONS_PREFERENCE = tr("Preference"); @@ -26,7 +29,7 @@ PrintingSelectorCardSortingWidget::PrintingSelectorCardSortingWidget(PrintingSel sortOptionsSelector = new QComboBox(this); sortOptionsSelector->setFocusPolicy(Qt::StrongFocus); sortOptionsSelector->addItems(SORT_OPTIONS); - sortOptionsSelector->setCurrentIndex(SettingsCache::instance().getPrintingSelectorSortOrder()); + sortOptionsSelector->setCurrentIndex(SettingsCache::instance().cardsDisplay().getPrintingSelectorSortOrder()); connect(sortOptionsSelector, &QComboBox::currentTextChanged, this, &PrintingSelectorCardSortingWidget::updateSortSetting); connect(sortOptionsSelector, &QComboBox::currentTextChanged, parent, &PrintingSelector::updateDisplay); @@ -62,7 +65,7 @@ void PrintingSelectorCardSortingWidget::updateSortOrder() */ void PrintingSelectorCardSortingWidget::updateSortSetting() { - SettingsCache::instance().setPrintingSelectorSortOrder(sortOptionsSelector->currentIndex()); + SettingsCache::instance().cardsDisplay().setPrintingSelectorSortOrder(sortOptionsSelector->currentIndex()); } /** @@ -90,7 +93,7 @@ QList PrintingSelectorCardSortingWidget::sortSets(const SetToPrint } if (sortedSets.empty()) { - sortedSets << CardSet::newInstance(SettingsCache::instance().cardDatabase(), "", "", "", QDate()); + sortedSets << CardSet::newInstance(&SettingsCache::instance().cardDatabase(), "", "", "", QDate()); } if (sortOptionsSelector->currentText() == SORT_OPTIONS_PREFERENCE) { diff --git a/cockatrice/src/interface/widgets/replay/replay_manager.cpp b/cockatrice/src/interface/widgets/replay/replay_manager.cpp index 0344b9f86..4719d10aa 100644 --- a/cockatrice/src/interface/widgets/replay/replay_manager.cpp +++ b/cockatrice/src/interface/widgets/replay/replay_manager.cpp @@ -1,5 +1,6 @@ #include "replay_manager.h" +#include "../../../client/settings/shortcuts_settings.h" #include "../interface/widgets/tabs/tab_game.h" #include "replay_quick_settings_widget.h" @@ -124,7 +125,7 @@ void ReplayManager::replayPlayButtonToggled(bool checked) void ReplayManager::updateTimeScaleFactor(bool isFastForward) { - qreal factor = isFastForward ? SettingsCache::instance().getFastForwardSpeed() : 1.0; + qreal factor = isFastForward ? SettingsCache::instance().interface().getFastForwardSpeed() : 1.0; timelineWidget->setTimeScaleFactor(factor); } diff --git a/cockatrice/src/interface/widgets/replay/replay_quick_settings_widget.cpp b/cockatrice/src/interface/widgets/replay/replay_quick_settings_widget.cpp index 8ecd74312..446427e26 100644 --- a/cockatrice/src/interface/widgets/replay/replay_quick_settings_widget.cpp +++ b/cockatrice/src/interface/widgets/replay/replay_quick_settings_widget.cpp @@ -5,6 +5,8 @@ #include #include #include +#include +#include ReplayQuickSettingsWidget::ReplayQuickSettingsWidget(QWidget *parent) : SettingsButtonWidget(parent) { @@ -12,7 +14,7 @@ ReplayQuickSettingsWidget::ReplayQuickSettingsWidget(QWidget *parent) : Settings fastForwardSpeedBox.setMinimum(1); fastForwardSpeedBox.setMaximum(99.9); fastForwardSpeedBox.setDecimals(1); - fastForwardSpeedBox.setValue(SettingsCache::instance().getFastForwardSpeed()); + fastForwardSpeedBox.setValue(SettingsCache::instance().interface().getFastForwardSpeed()); connect(&fastForwardSpeedBox, qOverload(&QDoubleSpinBox::valueChanged), this, &ReplayQuickSettingsWidget::actUpdateFastForwardSpeed); @@ -25,7 +27,8 @@ ReplayQuickSettingsWidget::ReplayQuickSettingsWidget(QWidget *parent) : Settings this->addSettingsWidget(widget); - connect(&SettingsCache::instance(), &SettingsCache::langChanged, this, &ReplayQuickSettingsWidget::retranslateUi); + connect(&SettingsCache::instance().personal(), &PersonalSettings::langChanged, this, + &ReplayQuickSettingsWidget::retranslateUi); retranslateUi(); } @@ -37,6 +40,6 @@ void ReplayQuickSettingsWidget::retranslateUi() void ReplayQuickSettingsWidget::actUpdateFastForwardSpeed(qreal value) { - SettingsCache::instance().setFastForwardSpeed(value); + SettingsCache::instance().interface().setFastForwardSpeed(value); emit fastForwardSpeedChanged(value); } diff --git a/cockatrice/src/interface/widgets/replay/replay_timeline_widget.cpp b/cockatrice/src/interface/widgets/replay/replay_timeline_widget.cpp index f1b6de1fd..9c699d300 100644 --- a/cockatrice/src/interface/widgets/replay/replay_timeline_widget.cpp +++ b/cockatrice/src/interface/widgets/replay/replay_timeline_widget.cpp @@ -5,6 +5,7 @@ #include #include #include +#include ReplayTimelineWidget::ReplayTimelineWidget(QWidget *parent) : QWidget(parent), maxBinValue(1), maxTime(1), timeScaleFactor(1.0), currentVisualTime(0), currentProcessedTime(0), @@ -117,7 +118,7 @@ void ReplayTimelineWidget::handleBackwardsSkip(bool doRewindBuffering) // The rewind only happens once the timer runs out. // If another backwards skip happens, the timer will just get reset instead of rewinding. rewindBufferingTimer->stop(); - rewindBufferingTimer->start(SettingsCache::instance().getRewindBufferingMs()); + rewindBufferingTimer->start(SettingsCache::instance().interface().getRewindBufferingMs()); } else { // otherwise, process the rewind immediately processRewind(); diff --git a/cockatrice/src/interface/widgets/server/chat_view/chat_view.cpp b/cockatrice/src/interface/widgets/server/chat_view/chat_view.cpp index ccbbe9246..43bd0aa0a 100644 --- a/cockatrice/src/interface/widgets/server/chat_view/chat_view.cpp +++ b/cockatrice/src/interface/widgets/server/chat_view/chat_view.cpp @@ -14,6 +14,7 @@ #include #include #include +#include const QColor DEFAULT_MENTION_COLOR = QColor(194, 31, 47); @@ -292,8 +293,8 @@ void ChatView::appendMessage(QString message, } cursor.setCharFormat(defaultFormat); - bool mentionEnabled = SettingsCache::instance().getChatMention(); - highlightedWords = SettingsCache::instance().getHighlightWords().split(' ', Qt::SkipEmptyParts); + bool mentionEnabled = SettingsCache::instance().chat().getChatMention(); + highlightedWords = SettingsCache::instance().chat().getHighlightWords().split(' ', Qt::SkipEmptyParts); // parse the message while (message.size()) { @@ -395,8 +396,9 @@ void ChatView::checkMention(QTextCursor &cursor, QString &message, const QString // You have received a valid mention!! soundEngine->playSound("chat_mention"); mentionFormat.setBackground(QBrush(getCustomMentionColor())); - mentionFormat.setForeground(SettingsCache::instance().getChatMentionForeground() ? QBrush(Qt::white) - : QBrush(Qt::black)); + mentionFormat.setForeground(SettingsCache::instance().chat().getChatMentionForeground() + ? QBrush(Qt::white) + : QBrush(Qt::black)); cursor.insertText(mention, mentionFormat); message = message.mid(mention.size()); showSystemPopup(userName); @@ -417,8 +419,8 @@ void ChatView::checkMention(QTextCursor &cursor, QString &message, const QString // Moderator Sending Global Message soundEngine->playSound("all_mention"); mentionFormat.setBackground(QBrush(getCustomMentionColor())); - mentionFormat.setForeground(SettingsCache::instance().getChatMentionForeground() ? QBrush(Qt::white) - : QBrush(Qt::black)); + mentionFormat.setForeground( + SettingsCache::instance().chat().getChatMentionForeground() ? QBrush(Qt::white) : QBrush(Qt::black)); cursor.insertText("@" + fullMentionUpToSpaceOrEnd, mentionFormat); message = message.mid(fullMentionUpToSpaceOrEnd.size() + 1); showSystemPopup(userName); @@ -465,8 +467,8 @@ void ChatView::checkWord(QTextCursor &cursor, QString &message) if (fullWordUpToSpaceOrEnd.compare(word, Qt::CaseInsensitive) == 0) { // You have received a valid mention of custom word!! highlightFormat.setBackground(QBrush(getCustomHighlightColor())); - highlightFormat.setForeground(SettingsCache::instance().getChatHighlightForeground() ? QBrush(Qt::white) - : QBrush(Qt::black)); + highlightFormat.setForeground( + SettingsCache::instance().chat().getChatHighlightForeground() ? QBrush(Qt::white) : QBrush(Qt::black)); cursor.insertText(fullWordUpToSpaceOrEnd, highlightFormat); cursor.insertText(rest, defaultFormat); QApplication::alert(this); @@ -522,7 +524,7 @@ void ChatView::actMessageClicked() void ChatView::showSystemPopup(const QString &userName) { QApplication::alert(this); - if (SettingsCache::instance().getShowMentionPopup()) { + if (SettingsCache::instance().chat().getShowMentionPopup()) { emit showMentionPopup(userName); } } @@ -530,10 +532,10 @@ void ChatView::showSystemPopup(const QString &userName) QColor ChatView::getCustomMentionColor() { #if (QT_VERSION >= QT_VERSION_CHECK(6, 4, 0)) - QColor customColor = QColor::fromString("#" + SettingsCache::instance().getChatMentionColor()); + QColor customColor = QColor::fromString("#" + SettingsCache::instance().chat().getChatMentionColor()); #else QColor customColor; - customColor.setNamedColor("#" + SettingsCache::instance().getChatMentionColor()); + customColor.setNamedColor("#" + SettingsCache::instance().chat().getChatMentionColor()); #endif return customColor.isValid() ? customColor : DEFAULT_MENTION_COLOR; } @@ -541,10 +543,10 @@ QColor ChatView::getCustomMentionColor() QColor ChatView::getCustomHighlightColor() { #if (QT_VERSION >= QT_VERSION_CHECK(6, 4, 0)) - QColor customColor = QColor::fromString("#" + SettingsCache::instance().getChatMentionColor()); + QColor customColor = QColor::fromString("#" + SettingsCache::instance().chat().getChatMentionColor()); #else QColor customColor; - customColor.setNamedColor("#" + SettingsCache::instance().getChatMentionColor()); + customColor.setNamedColor("#" + SettingsCache::instance().chat().getChatMentionColor()); #endif return customColor.isValid() ? customColor : DEFAULT_MENTION_COLOR; } diff --git a/cockatrice/src/interface/widgets/server/game_selector.cpp b/cockatrice/src/interface/widgets/server/game_selector.cpp index 9a41ca6ce..e9fa3c3cf 100644 --- a/cockatrice/src/interface/widgets/server/game_selector.cpp +++ b/cockatrice/src/interface/widgets/server/game_selector.cpp @@ -21,6 +21,7 @@ #include #include #include +#include GameSelector::GameSelector(AbstractClient *_client, TabSupervisor *_tabSupervisor, @@ -78,11 +79,13 @@ GameSelector::GameSelector(AbstractClient *_client, if (showFilters && restoresettings) { quickFilterToolBar = new GameSelectorQuickFilterToolBar(this, tabSupervisor, gameListProxyModel, gameTypeMap); quickFilterToolBar->setVisible(showFilters && restoresettings && - SettingsCache::instance().getShowGameSelectorFilterToolbar()); + SettingsCache::instance().cardsDisplay().getShowGameSelectorFilterToolbar()); - connect(&SettingsCache::instance(), &SettingsCache::showGameSelectorFilterToolbarChanged, this, [this] { - quickFilterToolBar->setVisible(SettingsCache::instance().getShowGameSelectorFilterToolbar()); - }); + connect(&SettingsCache::instance().cardsDisplay(), &CardsDisplaySettings::showGameSelectorFilterToolbarChanged, + this, [this] { + quickFilterToolBar->setVisible( + SettingsCache::instance().cardsDisplay().getShowGameSelectorFilterToolbar()); + }); } else { quickFilterToolBar = nullptr; } diff --git a/cockatrice/src/interface/widgets/server/games_model.cpp b/cockatrice/src/interface/widgets/server/games_model.cpp index 1d30aa7ac..8e623d392 100644 --- a/cockatrice/src/interface/widgets/server/games_model.cpp +++ b/cockatrice/src/interface/widgets/server/games_model.cpp @@ -10,6 +10,7 @@ #include #include #include +#include enum GameListColumn { diff --git a/cockatrice/src/interface/widgets/server/handle_public_servers.cpp b/cockatrice/src/interface/widgets/server/handle_public_servers.cpp index 8ebb70e83..f5d682c36 100644 --- a/cockatrice/src/interface/widgets/server/handle_public_servers.cpp +++ b/cockatrice/src/interface/widgets/server/handle_public_servers.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #define PUBLIC_SERVERS_JSON "https://cockatrice.github.io/public-servers.json" diff --git a/cockatrice/src/interface/widgets/server/user/user_info_connection.cpp b/cockatrice/src/interface/widgets/server/user/user_info_connection.cpp index 919bc2707..f934960f8 100644 --- a/cockatrice/src/interface/widgets/server/user/user_info_connection.cpp +++ b/cockatrice/src/interface/widgets/server/user/user_info_connection.cpp @@ -3,6 +3,7 @@ #include "../../../../client/settings/cache_settings.h" #include +#include #include UserConnection_Information::UserConnection_Information() = default; diff --git a/cockatrice/src/interface/widgets/server/user/user_list_widget.cpp b/cockatrice/src/interface/widgets/server/user/user_list_widget.cpp index 09480b1a1..aaefe7cbf 100644 --- a/cockatrice/src/interface/widgets/server/user/user_list_widget.cpp +++ b/cockatrice/src/interface/widgets/server/user/user_list_widget.cpp @@ -30,6 +30,7 @@ #include #include #include +#include #include BanDialog::BanDialog(const ServerInfo_User &info, QWidget *parent) : QDialog(parent) @@ -352,7 +353,7 @@ bool UserListItemDelegate::editorEvent(QEvent *event, QSize UserListItemDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const { - if (!SettingsCache::instance().getStyleUserList()) { + if (!SettingsCache::instance().interface().getStyleUserList()) { return QStyledItemDelegate::sizeHint(option, index); } return UserListPainter::sizeHint(); @@ -360,7 +361,7 @@ QSize UserListItemDelegate::sizeHint(const QStyleOptionViewItem &option, const Q void UserListItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { - if (!SettingsCache::instance().getStyleUserList()) { + if (!SettingsCache::instance().interface().getStyleUserList()) { QStyledItemDelegate::paint(painter, option, index); return; } @@ -524,7 +525,7 @@ UserListWidget::UserListWidget(TabSupervisor *_tabSupervisor, // Pin on item click connect(userTree, &QTreeWidget::itemClicked, this, [this](QTreeWidgetItem *item, int) { - if (!SettingsCache::instance().getStyleUserList()) { + if (!SettingsCache::instance().interface().getStyleUserList()) { return; } const QString name = static_cast(item)->getUserInfo().name().c_str(); @@ -556,7 +557,8 @@ UserListWidget::UserListWidget(TabSupervisor *_tabSupervisor, connect(cardArtProvider, &UserCardArtProvider::cardArtUpdated, this, [this](const QString &) { userTree->viewport()->update(); }); - connect(&SettingsCache::instance(), &SettingsCache::styleUserListChanged, this, &UserListWidget::applyDisplayMode); + connect(&SettingsCache::instance().interface(), &InterfaceSettings::styleUserListChanged, this, + &UserListWidget::applyDisplayMode); applyDisplayMode(); QVBoxLayout *vbox = new QVBoxLayout; @@ -661,7 +663,7 @@ void UserListWidget::hideEvent(QHideEvent *e) void UserListWidget::applyDisplayMode() { - const bool styled = SettingsCache::instance().getStyleUserList(); + const bool styled = SettingsCache::instance().interface().getStyleUserList(); if (styled) { userTree->header()->setSectionResizeMode(0, QHeaderView::Stretch); @@ -720,7 +722,7 @@ bool UserListWidget::eventFilter(QObject *obj, QEvent *event) { if (obj == userTree->viewport()) { if (event->type() == QEvent::MouseMove) { - if (!SettingsCache::instance().getStyleUserList()) { + if (!SettingsCache::instance().interface().getStyleUserList()) { return QGroupBox::eventFilter(obj, event); } auto *me = static_cast(event); diff --git a/cockatrice/src/interface/widgets/settings_page/appearance_settings_page.cpp b/cockatrice/src/interface/widgets/settings_page/appearance_settings_page.cpp index 17ca9380d..0441c0d03 100644 --- a/cockatrice/src/interface/widgets/settings_page/appearance_settings_page.cpp +++ b/cockatrice/src/interface/widgets/settings_page/appearance_settings_page.cpp @@ -1,18 +1,24 @@ #include "appearance_settings_page.h" #include "../../../client/settings/cache_settings.h" +#include "../../../client/settings/card_counter_settings.h" #include "../../client/settings/card_counter_settings.h" #include "../../palette_editor/palette_editor_dialog.h" #include "../dialogs/override_printing_warning.h" #include "../interface/theme_manager.h" #include "../interface/widgets/general/background_sources.h" +#include #include #include #include #include #include #include +#include +#include +#include +#include AppearanceSettingsPage::AppearanceSettingsPage() { @@ -98,7 +104,7 @@ AppearanceSettingsPage::AppearanceSettingsPage() homeTabBackgroundSourceBox.addItem(QObject::tr(entry.trKey), QVariant::fromValue(entry.type)); } - QString homeTabBackgroundSource = SettingsCache::instance().getHomeTabBackgroundSource(); + QString homeTabBackgroundSource = SettingsCache::instance().personal().getHomeTabBackgroundSource(); int homeTabBackgroundSourceId = homeTabBackgroundSourceBox.findData(BackgroundSources::fromId(homeTabBackgroundSource)); if (homeTabBackgroundSourceId != -1) { @@ -107,19 +113,20 @@ AppearanceSettingsPage::AppearanceSettingsPage() connect(&homeTabBackgroundSourceBox, QOverload::of(&QComboBox::currentIndexChanged), this, [this]() { auto type = homeTabBackgroundSourceBox.currentData().value(); - SettingsCache::instance().setHomeTabBackgroundSource(BackgroundSources::toId(type)); + SettingsCache::instance().personal().setHomeTabBackgroundSource(BackgroundSources::toId(type)); updateHomeTabSettingsVisibility(); }); homeTabBackgroundShuffleFrequencySpinBox.setRange(0, 3600); homeTabBackgroundShuffleFrequencySpinBox.setSuffix(tr(" seconds")); - homeTabBackgroundShuffleFrequencySpinBox.setValue(SettingsCache::instance().getHomeTabBackgroundShuffleFrequency()); - connect(&homeTabBackgroundShuffleFrequencySpinBox, qOverload(&QSpinBox::valueChanged), - &SettingsCache::instance(), &SettingsCache::setHomeTabBackgroundShuffleFrequency); + homeTabBackgroundShuffleFrequencySpinBox.setValue( + SettingsCache::instance().personal().getHomeTabBackgroundShuffleFrequency()); + connect(&homeTabBackgroundShuffleFrequencySpinBox, qOverload(&QSpinBox::valueChanged), &settings.personal(), + &PersonalSettings::setHomeTabBackgroundShuffleFrequency); - homeTabDisplayCardNameCheckBox.setChecked(settings.getHomeTabDisplayCardName()); - connect(&homeTabDisplayCardNameCheckBox, &QCheckBox::QT_STATE_CHANGED, &settings, - &SettingsCache::setHomeTabDisplayCardName); + homeTabDisplayCardNameCheckBox.setChecked(settings.personal().getHomeTabDisplayCardName()); + connect(&homeTabDisplayCardNameCheckBox, &QCheckBox::QT_STATE_CHANGED, &settings.personal(), + &PersonalSettings::setHomeTabDisplayCardName); updateHomeTabSettingsVisibility(); @@ -133,8 +140,9 @@ AppearanceSettingsPage::AppearanceSettingsPage() homeTabGroupBox = new QGroupBox; homeTabGroupBox->setLayout(homeTabGrid); - styleUserListCheckBox.setChecked(settings.getStyleUserList()); - connect(&styleUserListCheckBox, &QCheckBox::QT_STATE_CHANGED, &settings, &SettingsCache::setStyleUserList); + styleUserListCheckBox.setChecked(settings.interface().getStyleUserList()); + connect(&styleUserListCheckBox, &QCheckBox::QT_STATE_CHANGED, &settings.interface(), + &InterfaceSettings::setStyleUserList); auto stylingTabGrid = new QGridLayout; stylingTabGrid->addWidget(&styleUserListCheckBox, 0, 0, 1, 2); @@ -143,12 +151,12 @@ AppearanceSettingsPage::AppearanceSettingsPage() stylingGroupBox->setLayout(stylingTabGrid); // Menu settings - showShortcutsCheckBox.setChecked(settings.getShowShortcuts()); + showShortcutsCheckBox.setChecked(settings.cardsDisplay().getShowShortcuts()); connect(&showShortcutsCheckBox, &QCheckBox::QT_STATE_CHANGED, this, &AppearanceSettingsPage::showShortcutsChanged); - showGameSelectorFilterToolbarCheckBox.setChecked(settings.getShowGameSelectorFilterToolbar()); - connect(&showGameSelectorFilterToolbarCheckBox, &QCheckBox::QT_STATE_CHANGED, &settings, - &SettingsCache::setShowGameSelectorFilterToolbar); + showGameSelectorFilterToolbarCheckBox.setChecked(settings.cardsDisplay().getShowGameSelectorFilterToolbar()); + connect(&showGameSelectorFilterToolbarCheckBox, &QCheckBox::QT_STATE_CHANGED, &settings.cardsDisplay(), + &CardsDisplaySettings::setShowGameSelectorFilterToolbar); auto *menuGrid = new QGridLayout; menuGrid->addWidget(&showShortcutsCheckBox, 0, 0); @@ -158,13 +166,14 @@ AppearanceSettingsPage::AppearanceSettingsPage() menuGroupBox->setLayout(menuGrid); // Printings settings - overrideAllCardArtWithPersonalPreferenceCheckBox.setChecked(settings.getOverrideAllCardArtWithPersonalPreference()); + overrideAllCardArtWithPersonalPreferenceCheckBox.setChecked( + settings.cardsDisplay().getOverrideAllCardArtWithPersonalPreference()); connect(&overrideAllCardArtWithPersonalPreferenceCheckBox, &QCheckBox::QT_STATE_CHANGED, this, &AppearanceSettingsPage::overrideAllCardArtWithPersonalPreferenceToggled); - bumpSetsWithCardsInDeckToTopCheckBox.setChecked(settings.getBumpSetsWithCardsInDeckToTop()); - connect(&bumpSetsWithCardsInDeckToTopCheckBox, &QCheckBox::QT_STATE_CHANGED, &settings, - &SettingsCache::setBumpSetsWithCardsInDeckToTop); + bumpSetsWithCardsInDeckToTopCheckBox.setChecked(settings.cardsDisplay().getBumpSetsWithCardsInDeckToTop()); + connect(&bumpSetsWithCardsInDeckToTopCheckBox, &QCheckBox::QT_STATE_CHANGED, &settings.cardsDisplay(), + &CardsDisplaySettings::setBumpSetsWithCardsInDeckToTop); auto *printingsGrid = new QGridLayout; printingsGrid->addWidget(&overrideAllCardArtWithPersonalPreferenceCheckBox, 0, 0, 1, 2); @@ -174,22 +183,25 @@ AppearanceSettingsPage::AppearanceSettingsPage() printingsGroupBox->setLayout(printingsGrid); // Card rendering - displayCardNamesCheckBox.setChecked(settings.getDisplayCardNames()); - connect(&displayCardNamesCheckBox, &QCheckBox::QT_STATE_CHANGED, &settings, &SettingsCache::setDisplayCardNames); + displayCardNamesCheckBox.setChecked(settings.cardsDisplay().getDisplayCardNames()); + connect(&displayCardNamesCheckBox, &QCheckBox::QT_STATE_CHANGED, &settings.cardsDisplay(), + &CardsDisplaySettings::setDisplayCardNames); - autoRotateSidewaysLayoutCardsCheckBox.setChecked(settings.getAutoRotateSidewaysLayoutCards()); - connect(&autoRotateSidewaysLayoutCardsCheckBox, &QCheckBox::QT_STATE_CHANGED, &settings, - &SettingsCache::setAutoRotateSidewaysLayoutCards); + autoRotateSidewaysLayoutCardsCheckBox.setChecked(settings.cardsDisplay().getAutoRotateSidewaysLayoutCards()); + connect(&autoRotateSidewaysLayoutCardsCheckBox, &QCheckBox::QT_STATE_CHANGED, &settings.cardsDisplay(), + &CardsDisplaySettings::setAutoRotateSidewaysLayoutCards); - cardScalingCheckBox.setChecked(settings.getScaleCards()); - connect(&cardScalingCheckBox, &QCheckBox::QT_STATE_CHANGED, &settings, &SettingsCache::setCardScaling); + cardScalingCheckBox.setChecked(settings.cardsDisplay().getScaleCards()); + connect(&cardScalingCheckBox, &QCheckBox::QT_STATE_CHANGED, &settings.cardsDisplay(), + &CardsDisplaySettings::setCardScaling); - roundCardCornersCheckBox.setChecked(settings.getRoundCardCorners()); - connect(&roundCardCornersCheckBox, &QAbstractButton::toggled, &settings, &SettingsCache::setRoundCardCorners); + roundCardCornersCheckBox.setChecked(settings.cardsDisplay().getRoundCardCorners()); + connect(&roundCardCornersCheckBox, &QAbstractButton::toggled, &settings.cardsDisplay(), + &CardsDisplaySettings::setRoundCardCorners); - connect(&maxFontSizeForCardsEdit, qOverload(&QSpinBox::valueChanged), &settings, - &SettingsCache::setMaxFontSize); - maxFontSizeForCardsEdit.setValue(settings.getMaxFontSize()); + connect(&maxFontSizeForCardsEdit, qOverload(&QSpinBox::valueChanged), &settings.personal(), + &PersonalSettings::setMaxFontSize); + maxFontSizeForCardsEdit.setValue(settings.personal().getMaxFontSize()); maxFontSizeForCardsLabel.setBuddy(&maxFontSizeForCardsEdit); maxFontSizeForCardsEdit.setMinimum(9); maxFontSizeForCardsEdit.setMaximum(100); @@ -206,18 +218,18 @@ AppearanceSettingsPage::AppearanceSettingsPage() cardsGroupBox->setLayout(cardsGrid); // Card layout - verticalCardOverlapPercentBox.setValue(settings.getStackCardOverlapPercent()); + verticalCardOverlapPercentBox.setValue(settings.cardsDisplay().getStackCardOverlapPercent()); verticalCardOverlapPercentBox.setRange(0, 80); - connect(&verticalCardOverlapPercentBox, qOverload(&QSpinBox::valueChanged), &settings, - &SettingsCache::setStackCardOverlapPercent); + connect(&verticalCardOverlapPercentBox, qOverload(&QSpinBox::valueChanged), &settings.cardsDisplay(), + &CardsDisplaySettings::setStackCardOverlapPercent); cardViewInitialRowsMaxBox.setRange(1, 999); - cardViewInitialRowsMaxBox.setValue(SettingsCache::instance().getCardViewInitialRowsMax()); + cardViewInitialRowsMaxBox.setValue(SettingsCache::instance().interface().getCardViewInitialRowsMax()); connect(&cardViewInitialRowsMaxBox, qOverload(&QSpinBox::valueChanged), this, &AppearanceSettingsPage::cardViewInitialRowsMaxChanged); cardViewExpandedRowsMaxBox.setRange(1, 999); - cardViewExpandedRowsMaxBox.setValue(SettingsCache::instance().getCardViewExpandedRowsMax()); + cardViewExpandedRowsMaxBox.setValue(SettingsCache::instance().interface().getCardViewExpandedRowsMax()); connect(&cardViewExpandedRowsMaxBox, qOverload(&QSpinBox::valueChanged), this, &AppearanceSettingsPage::cardViewExpandedRowsMaxChanged); @@ -279,11 +291,13 @@ AppearanceSettingsPage::AppearanceSettingsPage() cardCountersGroupBox->setLayout(cardCountersLayout); // Hand layout - horizontalHandCheckBox.setChecked(settings.getHorizontalHand()); - connect(&horizontalHandCheckBox, &QCheckBox::QT_STATE_CHANGED, &settings, &SettingsCache::setHorizontalHand); + horizontalHandCheckBox.setChecked(settings.interface().getHorizontalHand()); + connect(&horizontalHandCheckBox, &QCheckBox::QT_STATE_CHANGED, &settings.interface(), + &InterfaceSettings::setHorizontalHand); - leftJustifiedHandCheckBox.setChecked(settings.getLeftJustified()); - connect(&leftJustifiedHandCheckBox, &QCheckBox::QT_STATE_CHANGED, &settings, &SettingsCache::setLeftJustified); + leftJustifiedHandCheckBox.setChecked(settings.interface().getLeftJustified()); + connect(&leftJustifiedHandCheckBox, &QCheckBox::QT_STATE_CHANGED, &settings.interface(), + &InterfaceSettings::setLeftJustified); auto *handGrid = new QGridLayout; handGrid->addWidget(&horizontalHandCheckBox, 0, 0, 1, 2); @@ -293,14 +307,14 @@ AppearanceSettingsPage::AppearanceSettingsPage() handGroupBox->setLayout(handGrid); // table grid layout - invertVerticalCoordinateCheckBox.setChecked(settings.getInvertVerticalCoordinate()); - connect(&invertVerticalCoordinateCheckBox, &QCheckBox::QT_STATE_CHANGED, &settings, - &SettingsCache::setInvertVerticalCoordinate); + invertVerticalCoordinateCheckBox.setChecked(settings.interface().getInvertVerticalCoordinate()); + connect(&invertVerticalCoordinateCheckBox, &QCheckBox::QT_STATE_CHANGED, &settings.interface(), + &InterfaceSettings::setInvertVerticalCoordinate); minPlayersForMultiColumnLayoutEdit.setMinimum(2); - minPlayersForMultiColumnLayoutEdit.setValue(settings.getMinPlayersForMultiColumnLayout()); - connect(&minPlayersForMultiColumnLayoutEdit, qOverload(&QSpinBox::valueChanged), &settings, - &SettingsCache::setMinPlayersForMultiColumnLayout); + minPlayersForMultiColumnLayoutEdit.setValue(settings.interface().getMinPlayersForMultiColumnLayout()); + connect(&minPlayersForMultiColumnLayoutEdit, qOverload(&QSpinBox::valueChanged), &settings.interface(), + &InterfaceSettings::setMinPlayersForMultiColumnLayout); minPlayersForMultiColumnLayoutLabel.setBuddy(&minPlayersForMultiColumnLayoutEdit); auto *tableGrid = new QGridLayout; @@ -327,7 +341,8 @@ AppearanceSettingsPage::AppearanceSettingsPage() setLayout(mainLayout); - connect(&SettingsCache::instance(), &SettingsCache::langChanged, this, &AppearanceSettingsPage::retranslateUi); + connect(&SettingsCache::instance().personal(), &PersonalSettings::langChanged, this, + &AppearanceSettingsPage::retranslateUi); retranslateUi(); } @@ -341,7 +356,7 @@ void AppearanceSettingsPage::themeBoxChanged(int index) void AppearanceSettingsPage::openThemeLocation() { - QString dir = SettingsCache::instance().getThemesPath(); + QString dir = SettingsCache::instance().paths().getThemesPath(); QDir dirDir = dir; dirDir.cdUp(); // open if dir exists, create if parent dir does exist @@ -360,8 +375,8 @@ void AppearanceSettingsPage::editPalette() void AppearanceSettingsPage::updateHomeTabSettingsVisibility() { - bool visible = - SettingsCache::instance().getHomeTabBackgroundSource() != BackgroundSources::toId(BackgroundSources::Theme); + bool visible = SettingsCache::instance().personal().getHomeTabBackgroundSource() != + BackgroundSources::toId(BackgroundSources::Theme); homeTabBackgroundShuffleFrequencyLabel.setVisible(visible); homeTabBackgroundShuffleFrequencySpinBox.setVisible(visible); @@ -370,7 +385,7 @@ void AppearanceSettingsPage::updateHomeTabSettingsVisibility() void AppearanceSettingsPage::showShortcutsChanged(QT_STATE_CHANGED_T value) { - SettingsCache::instance().setShowShortcuts(value); + SettingsCache::instance().cardsDisplay().setShowShortcuts(value); qApp->setAttribute(Qt::AA_DontShowShortcutsInContextMenus, value == 0); // 0 = unchecked } @@ -397,7 +412,7 @@ void AppearanceSettingsPage::overrideAllCardArtWithPersonalPreferenceToggled(QT_ */ void AppearanceSettingsPage::cardViewInitialRowsMaxChanged(int value) { - SettingsCache::instance().setCardViewInitialRowsMax(value); + SettingsCache::instance().interface().setCardViewInitialRowsMax(value); if (cardViewExpandedRowsMaxBox.value() < value) { cardViewExpandedRowsMaxBox.setValue(value); } @@ -410,7 +425,7 @@ void AppearanceSettingsPage::cardViewInitialRowsMaxChanged(int value) */ void AppearanceSettingsPage::cardViewExpandedRowsMaxChanged(int value) { - SettingsCache::instance().setCardViewExpandedRowsMax(value); + SettingsCache::instance().interface().setCardViewExpandedRowsMax(value); if (cardViewInitialRowsMaxBox.value() > value) { cardViewInitialRowsMaxBox.setValue(value); } diff --git a/cockatrice/src/interface/widgets/settings_page/deck_editor_settings_page.cpp b/cockatrice/src/interface/widgets/settings_page/deck_editor_settings_page.cpp index b7d699ebc..bb0a1096c 100644 --- a/cockatrice/src/interface/widgets/settings_page/deck_editor_settings_page.cpp +++ b/cockatrice/src/interface/widgets/settings_page/deck_editor_settings_page.cpp @@ -10,12 +10,16 @@ #include #include #include +#include +#include +#include +#include DeckEditorSettingsPage::DeckEditorSettingsPage() { - picDownloadCheckBox.setChecked(SettingsCache::instance().getPicDownload()); - connect(&picDownloadCheckBox, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance(), - &SettingsCache::setPicDownload); + picDownloadCheckBox.setChecked(SettingsCache::instance().personal().getPicDownload()); + connect(&picDownloadCheckBox, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance().personal(), + &PersonalSettings::setPicDownload); urlLinkLabel.setTextInteractionFlags(Qt::LinksAccessibleByMouse); urlLinkLabel.setOpenExternalLinks(true); @@ -25,7 +29,7 @@ DeckEditorSettingsPage::DeckEditorSettingsPage() auto *lpGeneralGrid = new QGridLayout; auto *lpSpoilerGrid = new QGridLayout; - mcDownloadSpoilersCheckBox.setChecked(SettingsCache::instance().getDownloadSpoilersStatus()); + mcDownloadSpoilersCheckBox.setChecked(SettingsCache::instance().personal().getDownloadSpoilersStatus()); mpSpoilerSavePathLineEdit = new QLineEdit(SettingsCache::instance().getSpoilerCardDatabasePath()); mpSpoilerSavePathLineEdit->setReadOnly(true); @@ -87,8 +91,8 @@ DeckEditorSettingsPage::DeckEditorSettingsPage() lpSpoilerGrid->addWidget(&infoOnSpoilersLabel, 3, 0, 1, 3, Qt::AlignTop); // On a change to the checkbox, hide/un-hide the other fields - connect(&mcDownloadSpoilersCheckBox, &QCheckBox::toggled, &SettingsCache::instance(), - &SettingsCache::setDownloadSpoilerStatus); + connect(&mcDownloadSpoilersCheckBox, &QCheckBox::toggled, &SettingsCache::instance().personal(), + &PersonalSettings::setDownloadSpoilerStatus); connect(&mcDownloadSpoilersCheckBox, &QCheckBox::toggled, this, &DeckEditorSettingsPage::setSpoilersEnabled); mpGeneralGroupBox = new QGroupBox; @@ -103,7 +107,8 @@ DeckEditorSettingsPage::DeckEditorSettingsPage() setLayout(lpMainLayout); - connect(&SettingsCache::instance(), &SettingsCache::langChanged, this, &DeckEditorSettingsPage::retranslateUi); + connect(&SettingsCache::instance().personal(), &PersonalSettings::langChanged, this, + &DeckEditorSettingsPage::retranslateUi); retranslateUi(); } @@ -203,7 +208,7 @@ void DeckEditorSettingsPage::spoilerPathButtonClicked() } mpSpoilerSavePathLineEdit->setText(lsPath + "/spoiler.xml"); - SettingsCache::instance().setSpoilerDatabasePath(lsPath + "/spoiler.xml"); + SettingsCache::instance().paths().setSpoilerDatabasePath(lsPath + "/spoiler.xml"); } void DeckEditorSettingsPage::setSpoilersEnabled(bool anInput) diff --git a/cockatrice/src/interface/widgets/settings_page/general_settings_page.cpp b/cockatrice/src/interface/widgets/settings_page/general_settings_page.cpp index 9faf67578..91c4943e1 100644 --- a/cockatrice/src/interface/widgets/settings_page/general_settings_page.cpp +++ b/cockatrice/src/interface/widgets/settings_page/general_settings_page.cpp @@ -9,6 +9,10 @@ #include #include #include +#include +#include +#include +#include enum startupCardUpdateCheckBehaviorIndex { @@ -50,17 +54,18 @@ GeneralSettingsPage::GeneralSettingsPage() // version settings SettingsCache &settings = SettingsCache::instance(); - startupUpdateCheckCheckBox.setChecked(settings.getCheckUpdatesOnStartup()); + startupUpdateCheckCheckBox.setChecked(settings.updates().getCheckUpdatesOnStartup()); - connect(&startupUpdateCheckCheckBox, &QCheckBox::QT_STATE_CHANGED, &settings, - &SettingsCache::setCheckUpdatesOnStartup); + connect(&startupUpdateCheckCheckBox, &QCheckBox::QT_STATE_CHANGED, &settings.updates(), + &UpdatesSettings::setCheckUpdatesOnStartup); updateNotificationCheckBox.setChecked(settings.getNotifyAboutUpdates()); - connect(&updateNotificationCheckBox, &QCheckBox::QT_STATE_CHANGED, &settings, &SettingsCache::setNotifyAboutUpdate); + connect(&updateNotificationCheckBox, &QCheckBox::QT_STATE_CHANGED, &settings.updates(), + &UpdatesSettings::setNotifyAboutUpdates); - connect(&newVersionOracleCheckBox, &QCheckBox::QT_STATE_CHANGED, &settings, - &SettingsCache::setNotifyAboutNewVersion); + connect(&newVersionOracleCheckBox, &QCheckBox::QT_STATE_CHANGED, &settings.updates(), + &UpdatesSettings::setNotifyAboutNewVersion); auto *versionGrid = new QGridLayout; versionGrid->addWidget(&updateReleaseChannelLabel, 0, 0); @@ -76,9 +81,9 @@ GeneralSettingsPage::GeneralSettingsPage() startupCardUpdateCheckBehaviorSelector.addItem(""); // these will be set in retranslateUI startupCardUpdateCheckBehaviorSelector.addItem(""); startupCardUpdateCheckBehaviorSelector.addItem(""); - if (SettingsCache::instance().getStartupCardUpdateCheckPromptForUpdate()) { + if (SettingsCache::instance().updates().getStartupCardUpdateCheckPromptForUpdate()) { startupCardUpdateCheckBehaviorSelector.setCurrentIndex(startupCardUpdateCheckBehaviorIndexPrompt); - } else if (SettingsCache::instance().getStartupCardUpdateCheckAlwaysUpdate()) { + } else if (SettingsCache::instance().updates().getStartupCardUpdateCheckAlwaysUpdate()) { startupCardUpdateCheckBehaviorSelector.setCurrentIndex(startupCardUpdateCheckBehaviorIndexAlways); } else { startupCardUpdateCheckBehaviorSelector.setCurrentIndex(startupCardUpdateCheckBehaviorIndexNone); @@ -86,20 +91,20 @@ GeneralSettingsPage::GeneralSettingsPage() connect(&startupCardUpdateCheckBehaviorSelector, QOverload::of(&QComboBox::currentIndexChanged), this, [](int index) { - SettingsCache::instance().setStartupCardUpdateCheckPromptForUpdate( + SettingsCache::instance().updates().setStartupCardUpdateCheckPromptForUpdate( index == startupCardUpdateCheckBehaviorIndexPrompt); - SettingsCache::instance().setStartupCardUpdateCheckAlwaysUpdate( + SettingsCache::instance().updates().setStartupCardUpdateCheckAlwaysUpdate( index == startupCardUpdateCheckBehaviorIndexAlways); }); cardUpdateCheckIntervalSpinBox.setMinimum(1); cardUpdateCheckIntervalSpinBox.setMaximum(30); - cardUpdateCheckIntervalSpinBox.setValue(settings.getCardUpdateCheckInterval()); + cardUpdateCheckIntervalSpinBox.setValue(settings.updates().getCardUpdateCheckInterval()); - connect(&cardUpdateCheckIntervalSpinBox, qOverload(&QSpinBox::valueChanged), &settings, - &SettingsCache::setCardUpdateCheckInterval); + connect(&cardUpdateCheckIntervalSpinBox, qOverload(&QSpinBox::valueChanged), &settings.updates(), + &UpdatesSettings::setCardUpdateCheckInterval); - newVersionOracleCheckBox.setChecked(settings.getNotifyAboutNewVersion()); + newVersionOracleCheckBox.setChecked(settings.updates().getNotifyAboutNewVersion()); auto *cardDatabaseGrid = new QGridLayout; cardDatabaseGrid->addWidget(&startupCardUpdateCheckBehaviorLabel, 0, 0); @@ -112,9 +117,9 @@ GeneralSettingsPage::GeneralSettingsPage() cardDatabaseGroupBox->setLayout(cardDatabaseGrid); // startup settings - showTipsOnStartup.setChecked(settings.getShowTipsOnStartup()); + showTipsOnStartup.setChecked(settings.personal().getShowTipsOnStartup()); - connect(&showTipsOnStartup, &QCheckBox::clicked, &settings, &SettingsCache::setShowTipsOnStartup); + connect(&showTipsOnStartup, &QCheckBox::clicked, &settings.personal(), &PersonalSettings::setShowTipsOnStartup); auto *startupGrid = new QGridLayout; startupGrid->addWidget(&showTipsOnStartup, 0, 0, 1, 2); @@ -123,22 +128,22 @@ GeneralSettingsPage::GeneralSettingsPage() startupGroupBox->setLayout(startupGrid); // paths settings - deckPathEdit = new QLineEdit(settings.getDeckPath()); + deckPathEdit = new QLineEdit(settings.paths().getDeckPath()); deckPathEdit->setReadOnly(true); auto *deckPathButton = new QPushButton("..."); connect(deckPathButton, &QPushButton::clicked, this, &GeneralSettingsPage::deckPathButtonClicked); - filtersPathEdit = new QLineEdit(settings.getFiltersPath()); + filtersPathEdit = new QLineEdit(settings.paths().getFiltersPath()); filtersPathEdit->setReadOnly(true); auto *filtersPathButton = new QPushButton("..."); connect(filtersPathButton, &QPushButton::clicked, this, &GeneralSettingsPage::filtersPathButtonClicked); - replaysPathEdit = new QLineEdit(settings.getReplaysPath()); + replaysPathEdit = new QLineEdit(settings.paths().getReplaysPath()); replaysPathEdit->setReadOnly(true); auto *replaysPathButton = new QPushButton("..."); connect(replaysPathButton, &QPushButton::clicked, this, &GeneralSettingsPage::replaysPathButtonClicked); - picsPathEdit = new QLineEdit(settings.getPicsPath()); + picsPathEdit = new QLineEdit(settings.paths().getPicsPath()); picsPathEdit->setReadOnly(true); auto *picsPathButton = new QPushButton("..."); connect(picsPathButton, &QPushButton::clicked, this, &GeneralSettingsPage::picsPathButtonClicked); @@ -224,13 +229,14 @@ GeneralSettingsPage::GeneralSettingsPage() GeneralSettingsPage::retranslateUi(); // connect the ReleaseChannel combo box only after the entries are inserted in retranslateUi - connect(&updateReleaseChannelBox, qOverload(&QComboBox::currentIndexChanged), &settings, - &SettingsCache::setUpdateReleaseChannelIndex); + connect(&updateReleaseChannelBox, qOverload(&QComboBox::currentIndexChanged), &settings.updates(), + &UpdatesSettings::setUpdateReleaseChannelIndex); updateReleaseChannelBox.setCurrentIndex(settings.getUpdateReleaseChannelIndex()); setLayout(mainLayout); - connect(&SettingsCache::instance(), &SettingsCache::langChanged, this, &GeneralSettingsPage::retranslateUi); + connect(&SettingsCache::instance().personal(), &PersonalSettings::langChanged, this, + &GeneralSettingsPage::retranslateUi); retranslateUi(); } @@ -264,7 +270,7 @@ void GeneralSettingsPage::deckPathButtonClicked() } deckPathEdit->setText(path); - SettingsCache::instance().setDeckPath(path); + SettingsCache::instance().paths().setDeckPath(path); } void GeneralSettingsPage::filtersPathButtonClicked() @@ -275,7 +281,7 @@ void GeneralSettingsPage::filtersPathButtonClicked() } filtersPathEdit->setText(path); - SettingsCache::instance().setFiltersPath(path); + SettingsCache::instance().paths().setFiltersPath(path); } void GeneralSettingsPage::replaysPathButtonClicked() @@ -286,7 +292,7 @@ void GeneralSettingsPage::replaysPathButtonClicked() } replaysPathEdit->setText(path); - SettingsCache::instance().setReplaysPath(path); + SettingsCache::instance().paths().setReplaysPath(path); } void GeneralSettingsPage::picsPathButtonClicked() @@ -297,7 +303,7 @@ void GeneralSettingsPage::picsPathButtonClicked() } picsPathEdit->setText(path); - SettingsCache::instance().setPicsPath(path); + SettingsCache::instance().paths().setPicsPath(path); } void GeneralSettingsPage::cardDatabasePathButtonClicked() @@ -308,7 +314,7 @@ void GeneralSettingsPage::cardDatabasePathButtonClicked() } cardDatabasePathEdit->setText(path); - SettingsCache::instance().setCardDatabasePath(path); + SettingsCache::instance().paths().setCardDatabasePath(path); } void GeneralSettingsPage::customCardDatabaseButtonClicked() @@ -319,7 +325,7 @@ void GeneralSettingsPage::customCardDatabaseButtonClicked() } customCardDatabasePathEdit->setText(path); - SettingsCache::instance().setCustomCardDatabasePath(path); + SettingsCache::instance().paths().setCustomCardDatabasePath(path); } void GeneralSettingsPage::tokenDatabasePathButtonClicked() @@ -330,16 +336,16 @@ void GeneralSettingsPage::tokenDatabasePathButtonClicked() } tokenDatabasePathEdit->setText(path); - SettingsCache::instance().setTokenDatabasePath(path); + SettingsCache::instance().paths().setTokenDatabasePath(path); } void GeneralSettingsPage::resetAllPathsClicked() { SettingsCache &settings = SettingsCache::instance(); settings.resetPaths(); - deckPathEdit->setText(settings.getDeckPath()); - replaysPathEdit->setText(settings.getReplaysPath()); - picsPathEdit->setText(settings.getPicsPath()); + deckPathEdit->setText(settings.paths().getDeckPath()); + replaysPathEdit->setText(settings.paths().getReplaysPath()); + picsPathEdit->setText(settings.paths().getPicsPath()); cardDatabasePathEdit->setText(settings.getCardDatabasePath()); customCardDatabasePathEdit->setText(settings.getCustomCardDatabasePath()); tokenDatabasePathEdit->setText(settings.getTokenDatabasePath()); @@ -348,7 +354,7 @@ void GeneralSettingsPage::resetAllPathsClicked() void GeneralSettingsPage::languageBoxChanged(int index) { - SettingsCache::instance().setLang(languageBox.itemData(index).toString()); + SettingsCache::instance().personal().setLang(languageBox.itemData(index).toString()); } void GeneralSettingsPage::retranslateUi() @@ -391,7 +397,7 @@ void GeneralSettingsPage::retranslateUi() const auto &settings = SettingsCache::instance(); - QDate lastCheckDate = settings.getLastCardUpdateCheck(); + QDate lastCheckDate = settings.updates().getLastCardUpdateCheck(); int daysAgo = lastCheckDate.daysTo(QDate::currentDate()); lastCardUpdateCheckDateLabel.setText( diff --git a/cockatrice/src/interface/widgets/settings_page/messages_settings_page.cpp b/cockatrice/src/interface/widgets/settings_page/messages_settings_page.cpp index 831cb442c..e9878434b 100644 --- a/cockatrice/src/interface/widgets/settings_page/messages_settings_page.cpp +++ b/cockatrice/src/interface/widgets/settings_page/messages_settings_page.cpp @@ -6,58 +6,63 @@ #include #include #include +#include +#include +#include #include MessagesSettingsPage::MessagesSettingsPage() { - chatMentionCheckBox.setChecked(SettingsCache::instance().getChatMention()); - connect(&chatMentionCheckBox, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance(), - &SettingsCache::setChatMention); + chatMentionCheckBox.setChecked(SettingsCache::instance().chat().getChatMention()); + connect(&chatMentionCheckBox, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance().chat(), + &ChatSettings::setChatMention); - chatMentionCompleterCheckbox.setChecked(SettingsCache::instance().getChatMentionCompleter()); - connect(&chatMentionCompleterCheckbox, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance(), - &SettingsCache::setChatMentionCompleter); + chatMentionCompleterCheckbox.setChecked(SettingsCache::instance().chat().getChatMentionCompleter()); + connect(&chatMentionCompleterCheckbox, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance().chat(), + &ChatSettings::setChatMentionCompleter); explainMessagesLabel.setTextInteractionFlags(Qt::LinksAccessibleByMouse); explainMessagesLabel.setOpenExternalLinks(true); - ignoreUnregUsersMainChat.setChecked(SettingsCache::instance().getIgnoreUnregisteredUsers()); - ignoreUnregUserMessages.setChecked(SettingsCache::instance().getIgnoreUnregisteredUserMessages()); - ignoreNonBuddyUserMessages.setChecked(SettingsCache::instance().getIgnoreNonBuddyUserMessages()); + ignoreUnregUsersMainChat.setChecked(SettingsCache::instance().chat().getIgnoreUnregisteredUsers()); + ignoreUnregUserMessages.setChecked(SettingsCache::instance().chat().getIgnoreUnregisteredUserMessages()); + ignoreNonBuddyUserMessages.setChecked(SettingsCache::instance().chat().getIgnoreNonBuddyUserMessages()); - connect(&ignoreUnregUsersMainChat, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance(), - &SettingsCache::setIgnoreUnregisteredUsers); - connect(&ignoreUnregUserMessages, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance(), - &SettingsCache::setIgnoreUnregisteredUserMessages); - connect(&ignoreNonBuddyUserMessages, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance(), - &SettingsCache::setIgnoreNonBuddyUserMessages); + connect(&ignoreUnregUsersMainChat, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance().chat(), + &ChatSettings::setIgnoreUnregisteredUsers); + connect(&ignoreUnregUserMessages, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance().chat(), + &ChatSettings::setIgnoreUnregisteredUserMessages); + connect(&ignoreNonBuddyUserMessages, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance().chat(), + &ChatSettings::setIgnoreNonBuddyUserMessages); - invertMentionForeground.setChecked(SettingsCache::instance().getChatMentionForeground()); + invertMentionForeground.setChecked(SettingsCache::instance().chat().getChatMentionForeground()); connect(&invertMentionForeground, &QCheckBox::QT_STATE_CHANGED, this, &MessagesSettingsPage::updateTextColor); - invertHighlightForeground.setChecked(SettingsCache::instance().getChatHighlightForeground()); + invertHighlightForeground.setChecked(SettingsCache::instance().chat().getChatHighlightForeground()); connect(&invertHighlightForeground, &QCheckBox::QT_STATE_CHANGED, this, &MessagesSettingsPage::updateTextHighlightColor); mentionColor = new QLineEdit(); - mentionColor->setText(SettingsCache::instance().getChatMentionColor()); + mentionColor->setText(SettingsCache::instance().chat().getChatMentionColor()); updateMentionPreview(); connect(mentionColor, &QLineEdit::textChanged, this, &MessagesSettingsPage::updateColor); - messagePopups.setChecked(SettingsCache::instance().getShowMessagePopup()); - connect(&messagePopups, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance(), - &SettingsCache::setShowMessagePopups); + messagePopups.setChecked(SettingsCache::instance().chat().getShowMessagePopup()); + connect(&messagePopups, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance().chat(), + &ChatSettings::setShowMessagePopups); - mentionPopups.setChecked(SettingsCache::instance().getShowMentionPopup()); - connect(&mentionPopups, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance(), - &SettingsCache::setShowMentionPopups); + mentionPopups.setChecked(SettingsCache::instance().chat().getShowMentionPopup()); + connect(&mentionPopups, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance().chat(), + &ChatSettings::setShowMentionPopups); - roomHistory.setChecked(SettingsCache::instance().getRoomHistory()); - connect(&roomHistory, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance(), &SettingsCache::setRoomHistory); + roomHistory.setChecked(SettingsCache::instance().chat().getRoomHistory()); + connect(&roomHistory, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance().chat(), + &ChatSettings::setRoomHistory); customAlertString = new QLineEdit(); - customAlertString->setText(SettingsCache::instance().getHighlightWords()); - connect(customAlertString, &QLineEdit::textChanged, &SettingsCache::instance(), &SettingsCache::setHighlightWords); + customAlertString->setText(SettingsCache::instance().chat().getHighlightWords()); + connect(customAlertString, &QLineEdit::textChanged, &SettingsCache::instance().chat(), + &ChatSettings::setHighlightWords); auto *chatGrid = new QGridLayout; chatGrid->addWidget(&chatMentionCheckBox, 0, 0); @@ -75,7 +80,7 @@ MessagesSettingsPage::MessagesSettingsPage() chatGroupBox->setLayout(chatGrid); highlightColor = new QLineEdit(); - highlightColor->setText(SettingsCache::instance().getChatHighlightColor()); + highlightColor->setText(SettingsCache::instance().chat().getChatHighlightColor()); updateHighlightPreview(); connect(highlightColor, &QLineEdit::textChanged, this, &MessagesSettingsPage::updateHighlightColor); @@ -132,7 +137,8 @@ MessagesSettingsPage::MessagesSettingsPage() setLayout(mainLayout); - connect(&SettingsCache::instance(), &SettingsCache::langChanged, this, &MessagesSettingsPage::retranslateUi); + connect(&SettingsCache::instance().personal(), &PersonalSettings::langChanged, this, + &MessagesSettingsPage::retranslateUi); retranslateUi(); } @@ -145,7 +151,7 @@ void MessagesSettingsPage::updateColor(const QString &value) colorToSet.setNamedColor("#" + value); #endif if (colorToSet.isValid()) { - SettingsCache::instance().setChatMentionColor(value); + SettingsCache::instance().chat().setChatMentionColor(value); updateMentionPreview(); } } @@ -159,35 +165,35 @@ void MessagesSettingsPage::updateHighlightColor(const QString &value) colorToSet.setNamedColor("#" + value); #endif if (colorToSet.isValid()) { - SettingsCache::instance().setChatHighlightColor(value); + SettingsCache::instance().chat().setChatHighlightColor(value); updateHighlightPreview(); } } void MessagesSettingsPage::updateTextColor(QT_STATE_CHANGED_T value) { - SettingsCache::instance().setChatMentionForeground(value); + SettingsCache::instance().chat().setChatMentionForeground(value); updateMentionPreview(); } void MessagesSettingsPage::updateTextHighlightColor(QT_STATE_CHANGED_T value) { - SettingsCache::instance().setChatHighlightForeground(value); + SettingsCache::instance().chat().setChatHighlightForeground(value); updateHighlightPreview(); } void MessagesSettingsPage::updateMentionPreview() { mentionColor->setStyleSheet( - "QLineEdit{background:#" + SettingsCache::instance().getChatMentionColor() + - ";color: " + (SettingsCache::instance().getChatMentionForeground() ? "white" : "black") + ";}"); + "QLineEdit{background:#" + SettingsCache::instance().chat().getChatMentionColor() + + ";color: " + (SettingsCache::instance().chat().getChatMentionForeground() ? "white" : "black") + ";}"); } void MessagesSettingsPage::updateHighlightPreview() { highlightColor->setStyleSheet( - "QLineEdit{background:#" + SettingsCache::instance().getChatHighlightColor() + - ";color: " + (SettingsCache::instance().getChatHighlightForeground() ? "white" : "black") + ";}"); + "QLineEdit{background:#" + SettingsCache::instance().chat().getChatHighlightColor() + + ";color: " + (SettingsCache::instance().chat().getChatHighlightForeground() ? "white" : "black") + ";}"); } void MessagesSettingsPage::storeSettings() diff --git a/cockatrice/src/interface/widgets/settings_page/shortcut_settings_page.cpp b/cockatrice/src/interface/widgets/settings_page/shortcut_settings_page.cpp index e7a04ef79..e3b9994ea 100644 --- a/cockatrice/src/interface/widgets/settings_page/shortcut_settings_page.cpp +++ b/cockatrice/src/interface/widgets/settings_page/shortcut_settings_page.cpp @@ -2,11 +2,13 @@ #include "../../../client/settings/cache_settings.h" #include "../../../client/settings/shortcut_treeview.h" +#include "../../../client/settings/shortcuts_settings.h" #include "../interface/widgets/utility/custom_line_edit.h" #include "../interface/widgets/utility/sequence_edit.h" #include #include +#include ShortcutSettingsPage::ShortcutSettingsPage() { @@ -78,7 +80,8 @@ ShortcutSettingsPage::ShortcutSettingsPage() connect(shortcutsTable, &ShortcutTreeView::currentItemChanged, this, &ShortcutSettingsPage::currentItemChanged); - connect(&SettingsCache::instance(), &SettingsCache::langChanged, this, &ShortcutSettingsPage::retranslateUi); + connect(&SettingsCache::instance().personal(), &PersonalSettings::langChanged, this, + &ShortcutSettingsPage::retranslateUi); retranslateUi(); } diff --git a/cockatrice/src/interface/widgets/settings_page/sound_settings_page.cpp b/cockatrice/src/interface/widgets/settings_page/sound_settings_page.cpp index e7e92ea15..2bd776671 100644 --- a/cockatrice/src/interface/widgets/settings_page/sound_settings_page.cpp +++ b/cockatrice/src/interface/widgets/settings_page/sound_settings_page.cpp @@ -4,14 +4,17 @@ #include "../client/sound_engine.h" #include +#include +#include +#include SoundSettingsPage::SoundSettingsPage() { - soundEnabledCheckBox.setChecked(SettingsCache::instance().getSoundEnabled()); - connect(&soundEnabledCheckBox, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance(), - &SettingsCache::setSoundEnabled); + soundEnabledCheckBox.setChecked(SettingsCache::instance().sound().getSoundEnabled()); + connect(&soundEnabledCheckBox, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance().sound(), + &SoundSettings::setSoundEnabled); - QString themeName = SettingsCache::instance().getSoundThemeName(); + QString themeName = SettingsCache::instance().sound().getSoundThemeName(); QStringList themeDirs = soundEngine->getAvailableThemes().keys(); for (int i = 0; i < themeDirs.size(); i++) { @@ -27,17 +30,18 @@ SoundSettingsPage::SoundSettingsPage() masterVolumeSlider = new QSlider(Qt::Horizontal); masterVolumeSlider->setMinimum(0); masterVolumeSlider->setMaximum(100); - masterVolumeSlider->setValue(SettingsCache::instance().getMasterVolume()); - masterVolumeSlider->setToolTip(QString::number(SettingsCache::instance().getMasterVolume())); - connect(&SettingsCache::instance(), &SettingsCache::masterVolumeChanged, this, + masterVolumeSlider->setValue(SettingsCache::instance().sound().getMasterVolume()); + masterVolumeSlider->setToolTip(QString::number(SettingsCache::instance().sound().getMasterVolume())); + connect(&SettingsCache::instance().sound(), &SoundSettings::masterVolumeChanged, this, &SoundSettingsPage::masterVolumeChanged); connect(masterVolumeSlider, &QSlider::sliderReleased, soundEngine, &SoundEngine::testSound); - connect(masterVolumeSlider, &QSlider::valueChanged, &SettingsCache::instance(), &SettingsCache::setMasterVolume); + connect(masterVolumeSlider, &QSlider::valueChanged, &SettingsCache::instance().sound(), + &SoundSettings::setMasterVolume); masterVolumeSpinBox = new QSpinBox(); masterVolumeSpinBox->setMinimum(0); masterVolumeSpinBox->setMaximum(100); - masterVolumeSpinBox->setValue(SettingsCache::instance().getMasterVolume()); + masterVolumeSpinBox->setValue(SettingsCache::instance().sound().getMasterVolume()); connect(masterVolumeSlider, &QSlider::valueChanged, masterVolumeSpinBox, &QSpinBox::setValue); connect(masterVolumeSpinBox, qOverload(&QSpinBox::valueChanged), masterVolumeSlider, &QSlider::setValue); @@ -59,7 +63,8 @@ SoundSettingsPage::SoundSettingsPage() setLayout(mainLayout); - connect(&SettingsCache::instance(), &SettingsCache::langChanged, this, &SoundSettingsPage::retranslateUi); + connect(&SettingsCache::instance().personal(), &PersonalSettings::langChanged, this, + &SoundSettingsPage::retranslateUi); retranslateUi(); } @@ -67,7 +72,7 @@ void SoundSettingsPage::themeBoxChanged(int index) { QStringList themeDirs = soundEngine->getAvailableThemes().keys(); if (index >= 0 && index < themeDirs.count()) { - SettingsCache::instance().setSoundThemeName(themeDirs.at(index)); + SettingsCache::instance().sound().setSoundThemeName(themeDirs.at(index)); } } diff --git a/cockatrice/src/interface/widgets/settings_page/storage_settings_page.cpp b/cockatrice/src/interface/widgets/settings_page/storage_settings_page.cpp index c9d3c7789..17838e501 100644 --- a/cockatrice/src/interface/widgets/settings_page/storage_settings_page.cpp +++ b/cockatrice/src/interface/widgets/settings_page/storage_settings_page.cpp @@ -1,11 +1,16 @@ #include "storage_settings_page.h" #include "../../../client/settings/cache_settings.h" +#include "../../card_picture_loader/card_picture_loader_cache_method.h" +#include "../../card_picture_loader/card_picture_loader_local_schemes.h" #include "../interface/card_picture_loader/card_picture_loader.h" #include #include #include +#include +#include +#include StorageSettingsPage::StorageSettingsPage() { @@ -27,7 +32,7 @@ StorageSettingsPage::StorageSettingsPage() // 2047 is the max value to avoid overflowing of QPixmapCache::setCacheLimit(int size) pixmapCacheEdit.setMaximum(PIXMAPCACHE_SIZE_MAX); pixmapCacheEdit.setSingleStep(64); - pixmapCacheEdit.setValue(SettingsCache::instance().getPixmapCacheSize()); + pixmapCacheEdit.setValue(SettingsCache::instance().cacheStorage().getPixmapCacheSize()); pixmapCacheEdit.setSuffix(" MB"); // Caching method @@ -37,7 +42,8 @@ StorageSettingsPage::StorageSettingsPage() cardPictureLoaderCacheMethodComboBox->addItem(method.displayName, static_cast(method.id)); } - int currentCacheMethod = static_cast(SettingsCache::instance().getCardPictureLoaderCacheMethod()); + int currentCacheMethod = + static_cast(SettingsCache::instance().cacheStorage().getCardPictureLoaderCacheMethod()); int currentIndex = cardPictureLoaderCacheMethodComboBox->findData(currentCacheMethod); if (currentIndex >= 0) { @@ -60,7 +66,7 @@ StorageSettingsPage::StorageSettingsPage() mpNetworkCacheGroupBox->setEnabled(useNetworkCache); mpImageBackupGroupBox->setEnabled(!useNetworkCache); - SettingsCache::instance().setCardImageCacheMethod(cacheMethod); + SettingsCache::instance().cacheStorage().setCardImageCacheMethod(static_cast(cacheMethod)); }); // Network Cache @@ -68,13 +74,13 @@ StorageSettingsPage::StorageSettingsPage() networkCacheEdit.setMinimum(NETWORK_CACHE_SIZE_MIN); networkCacheEdit.setMaximum(NETWORK_CACHE_SIZE_MAX); networkCacheEdit.setSingleStep(1); - networkCacheEdit.setValue(SettingsCache::instance().getNetworkCacheSizeInMB()); + networkCacheEdit.setValue(SettingsCache::instance().cacheStorage().getNetworkCacheSizeInMB()); networkCacheEdit.setSuffix(" MB"); networkRedirectCacheTtlEdit.setMinimum(NETWORK_REDIRECT_CACHE_TTL_MIN); networkRedirectCacheTtlEdit.setMaximum(NETWORK_REDIRECT_CACHE_TTL_MAX); networkRedirectCacheTtlEdit.setSingleStep(1); - networkRedirectCacheTtlEdit.setValue(SettingsCache::instance().getRedirectCacheTtl()); + networkRedirectCacheTtlEdit.setValue(SettingsCache::instance().cacheStorage().getRedirectCacheTtl()); // Image Backup localCardImageStorageNamingSchemeComboBox = new QComboBox; @@ -82,7 +88,7 @@ StorageSettingsPage::StorageSettingsPage() localCardImageStorageNamingSchemeComboBox->addItem(scheme.displayName, static_cast(scheme.id)); } - int current = static_cast(SettingsCache::instance().getLocalCardImageStorageNamingScheme()); + int current = static_cast(SettingsCache::instance().cacheStorage().getLocalCardImageStorageNamingScheme()); int index = localCardImageStorageNamingSchemeComboBox->findData(current); if (index >= 0) { @@ -93,7 +99,7 @@ StorageSettingsPage::StorageSettingsPage() [this](int index) { auto scheme = static_cast( localCardImageStorageNamingSchemeComboBox->itemData(index).toInt()); - SettingsCache::instance().setLocalCardImageStorageNamingScheme(scheme); + SettingsCache::instance().cacheStorage().setLocalCardImageStorageNamingScheme(static_cast(scheme)); }); connect(&clearBackupsButton, &QPushButton::clicked, this, &StorageSettingsPage::clearImageBackupsButtonClicked); @@ -132,12 +138,12 @@ StorageSettingsPage::StorageSettingsPage() lpPixmapCacheGrid->addWidget(&pixmapCacheExplainerLabel, 0, 0); lpPixmapCacheGrid->addLayout(pixmapCacheLayout, 1, 0); - connect(&pixmapCacheEdit, qOverload(&QSpinBox::valueChanged), &SettingsCache::instance(), - &SettingsCache::setPixmapCacheSize); - connect(&networkCacheEdit, qOverload(&QSpinBox::valueChanged), &SettingsCache::instance(), - &SettingsCache::setNetworkCacheSizeInMB); - connect(&networkRedirectCacheTtlEdit, qOverload(&QSpinBox::valueChanged), &SettingsCache::instance(), - &SettingsCache::setNetworkRedirectCacheTtl); + connect(&pixmapCacheEdit, qOverload(&QSpinBox::valueChanged), &SettingsCache::instance().cacheStorage(), + &CacheStorageSettings::setPixmapCacheSize); + connect(&networkCacheEdit, qOverload(&QSpinBox::valueChanged), &SettingsCache::instance().cacheStorage(), + &CacheStorageSettings::setNetworkCacheSizeInMB); + connect(&networkRedirectCacheTtlEdit, qOverload(&QSpinBox::valueChanged), + &SettingsCache::instance().cacheStorage(), &CacheStorageSettings::setNetworkRedirectCacheTtl); mpCacheMethodGroupBox = new QGroupBox; mpCacheMethodGroupBox->setLayout(cacheMethodLayout); @@ -161,13 +167,15 @@ StorageSettingsPage::StorageSettingsPage() setLayout(lpMainLayout); - bool useNetworkCache = SettingsCache::instance().getCardPictureLoaderCacheMethod() == + bool useNetworkCache = static_cast( + SettingsCache::instance().cacheStorage().getCardPictureLoaderCacheMethod()) == CardPictureLoaderCacheMethod::CacheMethod::NETWORK_CACHE; mpNetworkCacheGroupBox->setEnabled(useNetworkCache); mpImageBackupGroupBox->setEnabled(!useNetworkCache); - connect(&SettingsCache::instance(), &SettingsCache::langChanged, this, &StorageSettingsPage::retranslateUi); + connect(&SettingsCache::instance().personal(), &PersonalSettings::langChanged, this, + &StorageSettingsPage::retranslateUi); retranslateUi(); } @@ -180,7 +188,7 @@ void StorageSettingsPage::clearDownloadedPicsButtonClicked() void StorageSettingsPage::clearImageBackupsButtonClicked() { - QString picsPath = SettingsCache::instance().getPicsPath() + "/downloadedPics"; + QString picsPath = SettingsCache::instance().paths().getPicsPath() + "/downloadedPics"; QDir dir(picsPath); bool success = dir.removeRecursively(); diff --git a/cockatrice/src/interface/widgets/settings_page/user_interface_settings_page.cpp b/cockatrice/src/interface/widgets/settings_page/user_interface_settings_page.cpp index 8576934c1..fa27ec198 100644 --- a/cockatrice/src/interface/widgets/settings_page/user_interface_settings_page.cpp +++ b/cockatrice/src/interface/widgets/settings_page/user_interface_settings_page.cpp @@ -4,6 +4,10 @@ #include "../interface/widgets/tabs/tab_supervisor.h" #include +#include +#include +#include +#include enum visualDeckStoragePromptForConversionIndex { @@ -15,66 +19,71 @@ enum visualDeckStoragePromptForConversionIndex UserInterfaceSettingsPage::UserInterfaceSettingsPage() { // general settings and notification settings - notificationsEnabledCheckBox.setChecked(SettingsCache::instance().getNotificationsEnabled()); - connect(¬ificationsEnabledCheckBox, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance(), - &SettingsCache::setNotificationsEnabled); + notificationsEnabledCheckBox.setChecked(SettingsCache::instance().interface().getNotificationsEnabled()); + connect(¬ificationsEnabledCheckBox, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance().interface(), + &InterfaceSettings::setNotificationsEnabled); connect(¬ificationsEnabledCheckBox, &QCheckBox::QT_STATE_CHANGED, this, &UserInterfaceSettingsPage::setNotificationEnabled); - specNotificationsEnabledCheckBox.setChecked(SettingsCache::instance().getSpectatorNotificationsEnabled()); - specNotificationsEnabledCheckBox.setEnabled(SettingsCache::instance().getNotificationsEnabled()); - connect(&specNotificationsEnabledCheckBox, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance(), - &SettingsCache::setSpectatorNotificationsEnabled); + specNotificationsEnabledCheckBox.setChecked( + SettingsCache::instance().interface().getSpectatorNotificationsEnabled()); + specNotificationsEnabledCheckBox.setEnabled(SettingsCache::instance().interface().getNotificationsEnabled()); + connect(&specNotificationsEnabledCheckBox, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance().interface(), + &InterfaceSettings::setSpectatorNotificationsEnabled); buddyConnectNotificationsEnabledCheckBox.setChecked( - SettingsCache::instance().getBuddyConnectNotificationsEnabled()); - buddyConnectNotificationsEnabledCheckBox.setEnabled(SettingsCache::instance().getNotificationsEnabled()); - connect(&buddyConnectNotificationsEnabledCheckBox, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance(), - &SettingsCache::setBuddyConnectNotificationsEnabled); + SettingsCache::instance().interface().getBuddyConnectNotificationsEnabled()); + buddyConnectNotificationsEnabledCheckBox.setEnabled( + SettingsCache::instance().interface().getNotificationsEnabled()); + connect(&buddyConnectNotificationsEnabledCheckBox, &QCheckBox::QT_STATE_CHANGED, + &SettingsCache::instance().interface(), &InterfaceSettings::setBuddyConnectNotificationsEnabled); - doubleClickToPlayCheckBox.setChecked(SettingsCache::instance().getDoubleClickToPlay()); - connect(&doubleClickToPlayCheckBox, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance(), - &SettingsCache::setDoubleClickToPlay); + doubleClickToPlayCheckBox.setChecked(SettingsCache::instance().interface().getDoubleClickToPlay()); + connect(&doubleClickToPlayCheckBox, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance().interface(), + &InterfaceSettings::setDoubleClickToPlay); - clickPlaysAllSelectedCheckBox.setChecked(SettingsCache::instance().getClickPlaysAllSelected()); - connect(&clickPlaysAllSelectedCheckBox, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance(), - &SettingsCache::setClickPlaysAllSelected); + clickPlaysAllSelectedCheckBox.setChecked(SettingsCache::instance().interface().getClickPlaysAllSelected()); + connect(&clickPlaysAllSelectedCheckBox, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance().interface(), + &InterfaceSettings::setClickPlaysAllSelected); - playToStackCheckBox.setChecked(SettingsCache::instance().getPlayToStack()); - connect(&playToStackCheckBox, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance(), - &SettingsCache::setPlayToStack); + playToStackCheckBox.setChecked(SettingsCache::instance().interface().getPlayToStack()); + connect(&playToStackCheckBox, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance().interface(), + &InterfaceSettings::setPlayToStack); - doNotDeleteArrowsInSubPhasesCheckBox.setChecked(SettingsCache::instance().getDoNotDeleteArrowsInSubPhases()); - connect(&doNotDeleteArrowsInSubPhasesCheckBox, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance(), - &SettingsCache::setDoNotDeleteArrowsInSubPhases); + doNotDeleteArrowsInSubPhasesCheckBox.setChecked( + SettingsCache::instance().interface().getDoNotDeleteArrowsInSubPhases()); + connect(&doNotDeleteArrowsInSubPhasesCheckBox, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance().interface(), + &InterfaceSettings::setDoNotDeleteArrowsInSubPhases); - closeEmptyCardViewCheckBox.setChecked(SettingsCache::instance().getCloseEmptyCardView()); - connect(&closeEmptyCardViewCheckBox, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance(), - &SettingsCache::setCloseEmptyCardView); + closeEmptyCardViewCheckBox.setChecked(SettingsCache::instance().interface().getCloseEmptyCardView()); + connect(&closeEmptyCardViewCheckBox, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance().interface(), + &InterfaceSettings::setCloseEmptyCardView); - focusCardViewSearchBarCheckBox.setChecked(SettingsCache::instance().getFocusCardViewSearchBar()); - connect(&focusCardViewSearchBarCheckBox, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance(), - &SettingsCache::setFocusCardViewSearchBar); + focusCardViewSearchBarCheckBox.setChecked(SettingsCache::instance().interface().getFocusCardViewSearchBar()); + connect(&focusCardViewSearchBarCheckBox, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance().interface(), + &InterfaceSettings::setFocusCardViewSearchBar); - annotateTokensCheckBox.setChecked(SettingsCache::instance().getAnnotateTokens()); - connect(&annotateTokensCheckBox, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance(), - &SettingsCache::setAnnotateTokens); + annotateTokensCheckBox.setChecked(SettingsCache::instance().interface().getAnnotateTokens()); + connect(&annotateTokensCheckBox, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance().interface(), + &InterfaceSettings::setAnnotateTokens); - showDragSelectionCountCheckBox.setChecked(SettingsCache::instance().getShowDragSelectionCount()); - connect(&showDragSelectionCountCheckBox, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance(), - &SettingsCache::setShowDragSelectionCount); + showDragSelectionCountCheckBox.setChecked(SettingsCache::instance().interface().getShowDragSelectionCount()); + connect(&showDragSelectionCountCheckBox, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance().interface(), + &InterfaceSettings::setShowDragSelectionCount); - showTotalSelectionCountCheckBox.setChecked(SettingsCache::instance().getShowTotalSelectionCount()); - connect(&showTotalSelectionCountCheckBox, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance(), - &SettingsCache::setShowTotalSelectionCount); + showTotalSelectionCountCheckBox.setChecked(SettingsCache::instance().interface().getShowTotalSelectionCount()); + connect(&showTotalSelectionCountCheckBox, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance().interface(), + &InterfaceSettings::setShowTotalSelectionCount); - useTearOffMenusCheckBox.setChecked(SettingsCache::instance().getUseTearOffMenus()); - connect(&useTearOffMenusCheckBox, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance(), - [](const QT_STATE_CHANGED_T state) { SettingsCache::instance().setUseTearOffMenus(state == Qt::Checked); }); + useTearOffMenusCheckBox.setChecked(SettingsCache::instance().interface().getUseTearOffMenus()); + connect(&useTearOffMenusCheckBox, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance().interface(), + [](const QT_STATE_CHANGED_T state) { + SettingsCache::instance().interface().setUseTearOffMenus(state == Qt::Checked); + }); - keepGameChatFocusCheckBox.setChecked(SettingsCache::instance().getKeepGameChatFocus()); - connect(&keepGameChatFocusCheckBox, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance(), - &SettingsCache::setKeepGameChatFocus); + keepGameChatFocusCheckBox.setChecked(SettingsCache::instance().interface().getKeepGameChatFocus()); + connect(&keepGameChatFocusCheckBox, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance().interface(), + &InterfaceSettings::setKeepGameChatFocus); auto *generalGrid = new QGridLayout; generalGrid->addWidget(&doubleClickToPlayCheckBox, 0, 0); @@ -101,9 +110,9 @@ UserInterfaceSettingsPage::UserInterfaceSettingsPage() notificationsGroupBox->setLayout(notificationsGrid); // animation settings - tapAnimationCheckBox.setChecked(SettingsCache::instance().getTapAnimation()); - connect(&tapAnimationCheckBox, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance(), - &SettingsCache::setTapAnimation); + tapAnimationCheckBox.setChecked(SettingsCache::instance().cardsDisplay().getTapAnimation()); + connect(&tapAnimationCheckBox, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance().cardsDisplay(), + &CardsDisplaySettings::setTapAnimation); auto *animationGrid = new QGridLayout; animationGrid->addWidget(&tapAnimationCheckBox, 0, 0); @@ -112,42 +121,45 @@ UserInterfaceSettingsPage::UserInterfaceSettingsPage() animationGroupBox->setLayout(animationGrid); // deck editor settings - openDeckInNewTabCheckBox.setChecked(SettingsCache::instance().getOpenDeckInNewTab()); - connect(&openDeckInNewTabCheckBox, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance(), - &SettingsCache::setOpenDeckInNewTab); + openDeckInNewTabCheckBox.setChecked(SettingsCache::instance().interface().getOpenDeckInNewTab()); + connect(&openDeckInNewTabCheckBox, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance().interface(), + &InterfaceSettings::setOpenDeckInNewTab); - visualDeckStorageInGameCheckBox.setChecked(SettingsCache::instance().getVisualDeckStorageInGame()); - connect(&visualDeckStorageInGameCheckBox, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance(), - &SettingsCache::setVisualDeckStorageInGame); + visualDeckStorageInGameCheckBox.setChecked( + SettingsCache::instance().visualDeckStorage().getVisualDeckStorageInGame()); + connect(&visualDeckStorageInGameCheckBox, &QCheckBox::QT_STATE_CHANGED, + &SettingsCache::instance().visualDeckStorage(), &VisualDeckStorageSettings::setVisualDeckStorageInGame); visualDeckStorageSelectionAnimationCheckBox.setChecked( - SettingsCache::instance().getVisualDeckStorageSelectionAnimation()); - connect(&visualDeckStorageSelectionAnimationCheckBox, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance(), - &SettingsCache::setVisualDeckStorageSelectionAnimation); + SettingsCache::instance().visualDeckStorage().getVisualDeckStorageSelectionAnimation()); + connect(&visualDeckStorageSelectionAnimationCheckBox, &QCheckBox::QT_STATE_CHANGED, + &SettingsCache::instance().visualDeckStorage(), + &VisualDeckStorageSettings::setVisualDeckStorageSelectionAnimation); visualDeckStoragePromptForConversionSelector.addItem(""); // these will be set in retranslateUI visualDeckStoragePromptForConversionSelector.addItem(""); visualDeckStoragePromptForConversionSelector.addItem(""); - if (SettingsCache::instance().getVisualDeckStoragePromptForConversion()) { + if (SettingsCache::instance().visualDeckStorage().getVisualDeckStoragePromptForConversion()) { visualDeckStoragePromptForConversionSelector.setCurrentIndex(visualDeckStoragePromptForConversionIndexPrompt); - } else if (SettingsCache::instance().getVisualDeckStorageAlwaysConvert()) { + } else if (SettingsCache::instance().visualDeckStorage().getVisualDeckStorageAlwaysConvert()) { visualDeckStoragePromptForConversionSelector.setCurrentIndex(visualDeckStoragePromptForConversionIndexAlways); } else { visualDeckStoragePromptForConversionSelector.setCurrentIndex(visualDeckStoragePromptForConversionIndexNone); } connect(&visualDeckStoragePromptForConversionSelector, QOverload::of(&QComboBox::currentIndexChanged), this, [](int index) { - SettingsCache::instance().setVisualDeckStoragePromptForConversion( + SettingsCache::instance().visualDeckStorage().setVisualDeckStoragePromptForConversion( index == visualDeckStoragePromptForConversionIndexPrompt); - SettingsCache::instance().setVisualDeckStorageAlwaysConvert( + SettingsCache::instance().visualDeckStorage().setVisualDeckStorageAlwaysConvert( index == visualDeckStoragePromptForConversionIndexAlways); }); defaultDeckEditorTypeSelector.addItem(""); // these will be set in retranslateUI defaultDeckEditorTypeSelector.addItem(""); - defaultDeckEditorTypeSelector.setCurrentIndex(SettingsCache::instance().getDefaultDeckEditorType()); + defaultDeckEditorTypeSelector.setCurrentIndex( + SettingsCache::instance().visualDeckStorage().getDefaultDeckEditorType()); connect(&defaultDeckEditorTypeSelector, QOverload::of(&QComboBox::currentIndexChanged), - &SettingsCache::instance(), &SettingsCache::setDefaultDeckEditorType); + &SettingsCache::instance().visualDeckStorage(), &VisualDeckStorageSettings::setDefaultDeckEditorType); auto *deckEditorGrid = new QGridLayout; deckEditorGrid->addWidget(&openDeckInNewTabCheckBox, 0, 0); @@ -163,9 +175,9 @@ UserInterfaceSettingsPage::UserInterfaceSettingsPage() // replay settings rewindBufferingMsBox.setRange(0, 9999); - rewindBufferingMsBox.setValue(SettingsCache::instance().getRewindBufferingMs()); - connect(&rewindBufferingMsBox, qOverload(&QSpinBox::valueChanged), &SettingsCache::instance(), - &SettingsCache::setRewindBufferingMs); + rewindBufferingMsBox.setValue(SettingsCache::instance().interface().getRewindBufferingMs()); + connect(&rewindBufferingMsBox, qOverload(&QSpinBox::valueChanged), &SettingsCache::instance().interface(), + &InterfaceSettings::setRewindBufferingMs); auto *replayGrid = new QGridLayout; replayGrid->addWidget(&rewindBufferingMsLabel, 0, 0, 1, 1); @@ -185,7 +197,8 @@ UserInterfaceSettingsPage::UserInterfaceSettingsPage() setLayout(mainLayout); - connect(&SettingsCache::instance(), &SettingsCache::langChanged, this, &UserInterfaceSettingsPage::retranslateUi); + connect(&SettingsCache::instance().personal(), &PersonalSettings::langChanged, this, + &UserInterfaceSettingsPage::retranslateUi); retranslateUi(); } diff --git a/cockatrice/src/interface/widgets/tabs/abstract_tab_deck_editor.cpp b/cockatrice/src/interface/widgets/tabs/abstract_tab_deck_editor.cpp index 4bb8ffca4..565cc3341 100644 --- a/cockatrice/src/interface/widgets/tabs/abstract_tab_deck_editor.cpp +++ b/cockatrice/src/interface/widgets/tabs/abstract_tab_deck_editor.cpp @@ -10,6 +10,7 @@ #include "abstract_tab_deck_editor.h" #include "../../../client/settings/cache_settings.h" +#include "../../../client/settings/shortcuts_settings.h" #include "../client/network/interfaces/deck_stats_interface.h" #include "../client/network/interfaces/tapped_out_interface.h" #include "../deck_editor/deck_state_manager.h" @@ -43,6 +44,9 @@ #include #include #include +#include +#include +#include #include /** @@ -199,7 +203,7 @@ void AbstractTabDeckEditor::cleanDeckAndResetModified() */ AbstractTabDeckEditor::DeckOpenLocation AbstractTabDeckEditor::confirmOpen(const bool openInSameTabIfBlank) { - if (SettingsCache::instance().getOpenDeckInNewTab()) { + if (SettingsCache::instance().interface().getOpenDeckInNewTab()) { if (openInSameTabIfBlank && deckStateManager->isBlankNewDeck()) { return SAME_TAB; } else { @@ -350,7 +354,7 @@ bool AbstractTabDeckEditor::actSaveDeckAs() DeckList deckList = deckStateManager->getDeckList(); QFileDialog dialog(this, tr("Save deck")); - dialog.setDirectory(SettingsCache::instance().getDeckPath()); + dialog.setDirectory(SettingsCache::instance().paths().getDeckPath()); dialog.setAcceptMode(QFileDialog::AcceptSave); dialog.setDefaultSuffix("cod"); dialog.setNameFilters(DeckLoader::FILE_NAME_FILTERS); diff --git a/cockatrice/src/interface/widgets/tabs/api/archidekt/tab_archidekt.cpp b/cockatrice/src/interface/widgets/tabs/api/archidekt/tab_archidekt.cpp index 6b30fe00c..b9b946a25 100644 --- a/cockatrice/src/interface/widgets/tabs/api/archidekt/tab_archidekt.cpp +++ b/cockatrice/src/interface/widgets/tabs/api/archidekt/tab_archidekt.cpp @@ -27,6 +27,7 @@ #include #include #include +#include #include TabArchidekt::TabArchidekt(TabSupervisor *_tabSupervisor) @@ -131,7 +132,8 @@ void TabArchidekt::initializeUi() // Settings settingsButton = new SettingsButtonWidget(primaryToolbar); - cardSizeSlider = new CardSizeWidget(primaryToolbar, nullptr, SettingsCache::instance().getArchidektPreviewSize()); + cardSizeSlider = new CardSizeWidget(primaryToolbar, nullptr, + SettingsCache::instance().visualDeckStorage().getArchidektPreviewSize()); settingsButton->addSettingsWidget(cardSizeSlider); // Assemble primary toolbar @@ -337,8 +339,8 @@ void TabArchidekt::connectSignals() doSearch(); }); - connect(cardSizeSlider, &CardSizeWidget::cardSizeSettingUpdated, &SettingsCache::instance(), - &SettingsCache::setArchidektPreviewCardSize); + connect(cardSizeSlider, &CardSizeWidget::cardSizeSettingUpdated, &SettingsCache::instance().visualDeckStorage(), + &VisualDeckStorageSettings::setArchidektPreviewCardSize); // Search button triggers immediate search connect(searchButton, &QPushButton::clicked, this, &TabArchidekt::doSearchImmediate); diff --git a/cockatrice/src/interface/widgets/tabs/api/edhrec/tab_edhrec_main.cpp b/cockatrice/src/interface/widgets/tabs/api/edhrec/tab_edhrec_main.cpp index f861d8afd..b833f3369 100644 --- a/cockatrice/src/interface/widgets/tabs/api/edhrec/tab_edhrec_main.cpp +++ b/cockatrice/src/interface/widgets/tabs/api/edhrec/tab_edhrec_main.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #include static bool canBeCommander(const CardInfoPtr &cardInfo) @@ -94,9 +95,10 @@ TabEdhRecMain::TabEdhRecMain(TabSupervisor *_tabSupervisor) : Tab(_tabSupervisor settingsButton = new SettingsButtonWidget(this); - cardSizeSlider = new CardSizeWidget(this, nullptr, SettingsCache::instance().getEDHRecCardSize()); - connect(cardSizeSlider, &CardSizeWidget::cardSizeSettingUpdated, &SettingsCache::instance(), - &SettingsCache::setEDHRecCardSize); + cardSizeSlider = + new CardSizeWidget(this, nullptr, SettingsCache::instance().visualDeckStorage().getEDHRecCardSize()); + connect(cardSizeSlider, &CardSizeWidget::cardSizeSettingUpdated, &SettingsCache::instance().visualDeckStorage(), + &VisualDeckStorageSettings::setEDHRecCardSize); settingsButton->addSettingsWidget(cardSizeSlider); diff --git a/cockatrice/src/interface/widgets/tabs/tab_deck_editor.cpp b/cockatrice/src/interface/widgets/tabs/tab_deck_editor.cpp index 3878e12e0..8439aef70 100644 --- a/cockatrice/src/interface/widgets/tabs/tab_deck_editor.cpp +++ b/cockatrice/src/interface/widgets/tabs/tab_deck_editor.cpp @@ -1,6 +1,7 @@ #include "tab_deck_editor.h" #include "../../../client/settings/cache_settings.h" +#include "../../../client/settings/shortcuts_settings.h" #include "../deck_editor/deck_state_manager.h" #include "../filters/filter_builder.h" #include "../interface/pixel_map_generator.h" @@ -21,6 +22,8 @@ #include #include #include +#include +#include /** * @brief Constructs a new TabDeckEditor object. @@ -59,7 +62,8 @@ void TabDeckEditor::createMenus() registerDockWidget(viewMenu, filterDockWidget, {250, 250}); registerDockWidget(viewMenu, printingSelectorDockWidget, {525, 250}); - connect(&SettingsCache::instance(), &SettingsCache::overrideAllCardArtWithPersonalPreferenceChanged, this, + connect(&SettingsCache::instance().cardsDisplay(), + &CardsDisplaySettings::overrideAllCardArtWithPersonalPreferenceChanged, this, [this](bool enabled) { dockToActions[printingSelectorDockWidget].menu->setEnabled(!enabled); }); viewMenu->addSeparator(); diff --git a/cockatrice/src/interface/widgets/tabs/tab_deck_storage.cpp b/cockatrice/src/interface/widgets/tabs/tab_deck_storage.cpp index 8e2b114d9..49e42e4cf 100644 --- a/cockatrice/src/interface/widgets/tabs/tab_deck_storage.cpp +++ b/cockatrice/src/interface/widgets/tabs/tab_deck_storage.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include TabDeckStorage::TabDeckStorage(TabSupervisor *_tabSupervisor, @@ -36,7 +37,7 @@ TabDeckStorage::TabDeckStorage(TabSupervisor *_tabSupervisor, : Tab(_tabSupervisor), client(_client) { localDirModel = new QFileSystemModel(this); - localDirModel->setRootPath(SettingsCache::instance().getDeckPath()); + localDirModel->setRootPath(SettingsCache::instance().paths().getDeckPath()); localDirModel->sort(0, Qt::AscendingOrder); localDirView = new QTreeView; diff --git a/cockatrice/src/interface/widgets/tabs/tab_game.cpp b/cockatrice/src/interface/widgets/tabs/tab_game.cpp index 600647171..86025f242 100644 --- a/cockatrice/src/interface/widgets/tabs/tab_game.cpp +++ b/cockatrice/src/interface/widgets/tabs/tab_game.cpp @@ -1,6 +1,7 @@ #include "tab_game.h" #include "../../../client/settings/cache_settings.h" +#include "../../../client/settings/shortcuts_settings.h" #include "../game/game.h" #include "../game/player/player_logic.h" #include "../game/replay.h" @@ -44,6 +45,10 @@ #include #include #include +#include +#include +#include +#include #include TabGame::TabGame(TabSupervisor *_tabSupervisor, GameReplay *_replay) @@ -252,8 +257,8 @@ void TabGame::resetChatAndPhase() void TabGame::emitUserEvent() { - bool globalEvent = - !game->getPlayerManager()->isSpectator() || SettingsCache::instance().getSpectatorNotificationsEnabled(); + bool globalEvent = !game->getPlayerManager()->isSpectator() || + SettingsCache::instance().interface().getSpectatorNotificationsEnabled(); emit userEvent(globalEvent); updatePlayerListDockTitle(); } @@ -626,8 +631,8 @@ void TabGame::actRotateViewCCW() void TabGame::actCompleterChanged() { - SettingsCache::instance().getChatMentionCompleter() ? completer->setCompletionRole(2) - : completer->setCompletionRole(1); + SettingsCache::instance().chat().getChatMentionCompleter() ? completer->setCompletionRole(2) + : completer->setCompletionRole(1); } void TabGame::notifyPlayerJoin(QString playerName) @@ -1265,7 +1270,7 @@ void TabGame::createMessageDock(bool bReplay) if (!bReplay) { connect(messageLog, &MessageLogWidget::openMessageDialog, this, &TabGame::openMessageDialog); connect(messageLog, &MessageLogWidget::addMentionTag, this, &TabGame::addMentionTag); - connect(&SettingsCache::instance(), &SettingsCache::chatMentionCompleterChanged, this, + connect(&SettingsCache::instance().chat(), &ChatSettings::chatMentionCompleterChanged, this, &TabGame::actCompleterChanged); } diff --git a/cockatrice/src/interface/widgets/tabs/tab_message.cpp b/cockatrice/src/interface/widgets/tabs/tab_message.cpp index 2cacab731..9e9dbce1c 100644 --- a/cockatrice/src/interface/widgets/tabs/tab_message.cpp +++ b/cockatrice/src/interface/widgets/tabs/tab_message.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #include TabMessage::TabMessage(TabSupervisor *_tabSupervisor, @@ -126,7 +127,7 @@ void TabMessage::processUserMessageEvent(const Event_UserMessage &event) if (tabSupervisor->currentIndex() != tabSupervisor->indexOf(this)) { soundEngine->playSound("private_message"); } - if (SettingsCache::instance().getShowMessagePopup() && shouldShowSystemPopup(event)) { + if (SettingsCache::instance().chat().getShowMessagePopup() && shouldShowSystemPopup(event)) { showSystemPopup(event); } if (QString::fromStdString(event.sender_name()).toLower().simplified() == "servatrice") { diff --git a/cockatrice/src/interface/widgets/tabs/tab_replays.cpp b/cockatrice/src/interface/widgets/tabs/tab_replays.cpp index af52c038f..5618604df 100644 --- a/cockatrice/src/interface/widgets/tabs/tab_replays.cpp +++ b/cockatrice/src/interface/widgets/tabs/tab_replays.cpp @@ -29,6 +29,7 @@ #include #include #include +#include inline Q_LOGGING_CATEGORY(TabReplaysLog, "replays_tab"); @@ -59,7 +60,7 @@ TabReplays::TabReplays(TabSupervisor *_tabSupervisor, AbstractClient *_client, c QGroupBox *TabReplays::createLeftLayout() { localDirModel = new QFileSystemModel(this); - localDirModel->setRootPath(SettingsCache::instance().getReplaysPath()); + localDirModel->setRootPath(SettingsCache::instance().paths().getReplaysPath()); localDirModel->sort(0, Qt::AscendingOrder); localDirView = new QTreeView; diff --git a/cockatrice/src/interface/widgets/tabs/tab_room.cpp b/cockatrice/src/interface/widgets/tabs/tab_room.cpp index ec05e9ff6..5cf400099 100644 --- a/cockatrice/src/interface/widgets/tabs/tab_room.cpp +++ b/cockatrice/src/interface/widgets/tabs/tab_room.cpp @@ -1,6 +1,7 @@ #include "tab_room.h" #include "../../../client/settings/cache_settings.h" +#include "../../../client/settings/shortcuts_settings.h" #include "../interface/widgets/dialogs/dlg_settings.h" #include "../interface/widgets/server/chat_view/chat_view.h" #include "../interface/widgets/server/game_selector.h" @@ -31,6 +32,7 @@ #include #include #include +#include #include TabRoom::TabRoom(TabSupervisor *_tabSupervisor, @@ -75,7 +77,7 @@ TabRoom::TabRoom(TabSupervisor *_tabSupervisor, connect(chatView, &ChatView::showCardInfoPopup, this, &TabRoom::showCardInfoPopup); connect(chatView, &ChatView::deleteCardInfoPopup, this, &TabRoom::deleteCardInfoPopup); connect(chatView, &ChatView::addMentionTag, this, &TabRoom::addMentionTag); - connect(&SettingsCache::instance(), &SettingsCache::chatMentionCompleterChanged, this, + connect(&SettingsCache::instance().chat(), &ChatSettings::chatMentionCompleterChanged, this, &TabRoom::actCompleterChanged); sayLabel = new QLabel; sayEdit = new LineEditCompleter; @@ -246,8 +248,8 @@ void TabRoom::actOpenChatSettings() void TabRoom::actCompleterChanged() { - SettingsCache::instance().getChatMentionCompleter() ? completer->setCompletionRole(2) - : completer->setCompletionRole(1); + SettingsCache::instance().chat().getChatMentionCompleter() ? completer->setCompletionRole(2) + : completer->setCompletionRole(1); } void TabRoom::processRoomEvent(const RoomEvent &event) @@ -307,13 +309,13 @@ void TabRoom::processRoomSayEvent(const Event_RoomSay &event) ServerInfo_User userInfo = {}; if (twi) { userInfo = twi->getUserInfo(); - if (SettingsCache::instance().getIgnoreUnregisteredUsers() && + if (SettingsCache::instance().chat().getIgnoreUnregisteredUsers() && !UserLevelFlags(userInfo.user_level()).testFlag(ServerInfo_User::IsRegistered)) { return; } } - if (event.message_type() == Event_RoomSay::ChatHistory && !SettingsCache::instance().getRoomHistory()) { + if (event.message_type() == Event_RoomSay::ChatHistory && !SettingsCache::instance().chat().getRoomHistory()) { return; } diff --git a/cockatrice/src/interface/widgets/tabs/tab_supervisor.cpp b/cockatrice/src/interface/widgets/tabs/tab_supervisor.cpp index 52309d94b..c9478ee0b 100644 --- a/cockatrice/src/interface/widgets/tabs/tab_supervisor.cpp +++ b/cockatrice/src/interface/widgets/tabs/tab_supervisor.cpp @@ -1,6 +1,7 @@ #include "tab_supervisor.h" #include "../../../client/settings/cache_settings.h" +#include "../../../client/settings/shortcuts_settings.h" #include "../interface/pixel_map_generator.h" #include "../interface/widgets/server/user/user_list_manager.h" #include "../interface/widgets/server/user/user_list_widget.h" @@ -37,6 +38,10 @@ #include #include #include +#include +#include +#include +#include QRect MacOSTabFixStyle::subElementRect(SubElement element, const QStyleOption *option, const QWidget *widget) const { @@ -341,13 +346,13 @@ void TabSupervisor::initStartupTabs() openTabHome(); setCurrentWidget(tabHome); - if (SettingsCache::instance().getTabVisualDeckStorageOpen()) { + if (SettingsCache::instance().tabs().getTabVisualDeckStorageOpen()) { openTabVisualDeckStorage(); } - if (SettingsCache::instance().getTabDeckStorageOpen()) { + if (SettingsCache::instance().tabs().getTabDeckStorageOpen()) { openTabDeckStorage(); } - if (SettingsCache::instance().getTabReplaysOpen()) { + if (SettingsCache::instance().tabs().getTabReplaysOpen()) { openTabReplays(); } } @@ -427,10 +432,10 @@ void TabSupervisor::start(const ServerInfo_User &_userInfo) tabsMenu->addAction(aTabServer); tabsMenu->addAction(aTabAccount); - if (SettingsCache::instance().getTabServerOpen()) { + if (SettingsCache::instance().tabs().getTabServerOpen()) { openTabServer(); } - if (SettingsCache::instance().getTabAccountOpen()) { + if (SettingsCache::instance().tabs().getTabAccountOpen()) { openTabAccount(); } @@ -442,10 +447,10 @@ void TabSupervisor::start(const ServerInfo_User &_userInfo) tabsMenu->addAction(aTabLog); tabsMenu->addAction(aTabCardArtRules); - if (SettingsCache::instance().getTabAdminOpen()) { + if (SettingsCache::instance().tabs().getTabAdminOpen()) { openTabAdmin(); } - if (SettingsCache::instance().getTabLogOpen()) { + if (SettingsCache::instance().tabs().getTabLogOpen()) { openTabLog(); } openTabCardArtRules(); @@ -547,7 +552,7 @@ void TabSupervisor::openTabHome() void TabSupervisor::actTabVisualDeckStorage(bool checked) { - SettingsCache::instance().setTabVisualDeckStorageOpen(checked); + SettingsCache::instance().tabs().setTabVisualDeckStorageOpen(checked); if (checked && !tabVisualDeckStorage) { openTabVisualDeckStorage(); setCurrentWidget(tabVisualDeckStorage); @@ -571,7 +576,7 @@ void TabSupervisor::openTabVisualDeckStorage() void TabSupervisor::actTabServer(bool checked) { - SettingsCache::instance().setTabServerOpen(checked); + SettingsCache::instance().tabs().setTabServerOpen(checked); if (checked && !tabServer) { openTabServer(); setCurrentWidget(tabServer); @@ -594,7 +599,7 @@ void TabSupervisor::openTabServer() void TabSupervisor::actTabAccount(bool checked) { - SettingsCache::instance().setTabAccountOpen(checked); + SettingsCache::instance().tabs().setTabAccountOpen(checked); if (checked && !tabAccount) { openTabAccount(); setCurrentWidget(tabAccount); @@ -619,7 +624,7 @@ void TabSupervisor::openTabAccount() void TabSupervisor::actTabDeckStorage(bool checked) { - SettingsCache::instance().setTabDeckStorageOpen(checked); + SettingsCache::instance().tabs().setTabDeckStorageOpen(checked); if (checked && !tabDeckStorage) { openTabDeckStorage(); setCurrentWidget(tabDeckStorage); @@ -642,7 +647,7 @@ void TabSupervisor::openTabDeckStorage() void TabSupervisor::actTabReplays(bool checked) { - SettingsCache::instance().setTabReplaysOpen(checked); + SettingsCache::instance().tabs().setTabReplaysOpen(checked); if (checked && !tabReplays) { openTabReplays(); setCurrentWidget(tabReplays); @@ -667,7 +672,7 @@ void TabSupervisor::openTabReplays() void TabSupervisor::actTabAdmin(bool checked) { - SettingsCache::instance().setTabAdminOpen(checked); + SettingsCache::instance().tabs().setTabAdminOpen(checked); if (checked && !tabAdmin) { openTabAdmin(); setCurrentWidget(tabAdmin); @@ -714,7 +719,7 @@ void TabSupervisor::openTabCardArtRules() void TabSupervisor::actTabLog(bool checked) { - SettingsCache::instance().setTabLogOpen(checked); + SettingsCache::instance().tabs().setTabLogOpen(checked); if (checked && !tabLog) { openTabLog(); setCurrentWidget(tabLog); @@ -905,7 +910,7 @@ void TabSupervisor::talkLeft(TabMessage *tab) */ void TabSupervisor::openDeckInNewTab(const LoadedDeck &deckToOpen) { - int type = SettingsCache::instance().getDefaultDeckEditorType(); + int type = SettingsCache::instance().visualDeckStorage().getDefaultDeckEditorType(); switch (type) { case ClassicDeckEditor: addDeckEditorTab(deckToOpen); @@ -1004,7 +1009,7 @@ void TabSupervisor::tabUserEvent(bool globalEvent) tab->setContentsChanged(true); setTabIcon(indexOf(tab), QPixmap("theme:icons/tab_changed")); } - if (globalEvent && SettingsCache::instance().getNotificationsEnabled()) { + if (globalEvent && SettingsCache::instance().interface().getNotificationsEnabled()) { QApplication::alert(this); } } @@ -1046,11 +1051,11 @@ void TabSupervisor::processUserMessageEvent(const Event_UserMessage &event) const ServerInfo_User *onlineUserInfo = userListManager->getOnlineUser(senderName); if (onlineUserInfo) { auto userLevel = UserLevelFlags(onlineUserInfo->user_level()); - if (SettingsCache::instance().getIgnoreUnregisteredUserMessages() && + if (SettingsCache::instance().chat().getIgnoreUnregisteredUserMessages() && !userLevel.testFlag(ServerInfo_User::IsRegistered)) { // Flags are additive, so reg/mod/admin are all IsRegistered return; - } else if (SettingsCache::instance().getIgnoreNonBuddyUserMessages() && + } else if (SettingsCache::instance().chat().getIgnoreNonBuddyUserMessages() && !userListManager->isUserBuddy(senderName) && !userLevel.testFlag(ServerInfo_User::IsModerator) && !userLevel.testFlag(ServerInfo_User::IsAdmin)) { // Ignore private messages from non-buddies @@ -1099,7 +1104,7 @@ void TabSupervisor::processUserJoined(const ServerInfo_User &userInfoJoined) } } - if (SettingsCache::instance().getBuddyConnectNotificationsEnabled()) { + if (SettingsCache::instance().interface().getBuddyConnectNotificationsEnabled()) { QApplication::alert(this); this->actShowPopup(tr("Your buddy %1 has signed on!").arg(userName)); } diff --git a/cockatrice/src/interface/widgets/tabs/visual_deck_editor/tab_deck_editor_visual.cpp b/cockatrice/src/interface/widgets/tabs/visual_deck_editor/tab_deck_editor_visual.cpp index fd465ec21..0bc927eeb 100644 --- a/cockatrice/src/interface/widgets/tabs/visual_deck_editor/tab_deck_editor_visual.cpp +++ b/cockatrice/src/interface/widgets/tabs/visual_deck_editor/tab_deck_editor_visual.cpp @@ -1,6 +1,7 @@ #include "tab_deck_editor_visual.h" #include "../../../../client/settings/cache_settings.h" +#include "../../../../client/settings/shortcuts_settings.h" #include "../../cards/card_info_display_widget.h" #include "../../deck_editor/deck_state_manager.h" #include "../../filters/filter_builder.h" @@ -30,6 +31,7 @@ #include #include #include +#include /** * @brief Constructs the TabDeckEditorVisual instance. diff --git a/cockatrice/src/interface/widgets/utility/sequence_edit.cpp b/cockatrice/src/interface/widgets/utility/sequence_edit.cpp index a34f39042..c6bf289ba 100644 --- a/cockatrice/src/interface/widgets/utility/sequence_edit.cpp +++ b/cockatrice/src/interface/widgets/utility/sequence_edit.cpp @@ -1,6 +1,7 @@ #include "sequence_edit.h" #include "../../../client/settings/cache_settings.h" +#include "../../../client/settings/shortcuts_settings.h" #include #include diff --git a/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_filter_save_load_widget.cpp b/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_filter_save_load_widget.cpp index 7ee57b1e9..76a611d52 100644 --- a/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_filter_save_load_widget.cpp +++ b/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_filter_save_load_widget.cpp @@ -7,6 +7,7 @@ #include #include #include +#include VisualDatabaseDisplayFilterSaveLoadWidget::VisualDatabaseDisplayFilterSaveLoadWidget(QWidget *parent, FilterTreeModel *_filterModel) @@ -61,7 +62,7 @@ void VisualDatabaseDisplayFilterSaveLoadWidget::saveFilter() return; } - QString filePath = SettingsCache::instance().getFiltersPath() + QDir::separator() + filename + ".json"; + QString filePath = SettingsCache::instance().paths().getFiltersPath() + QDir::separator() + filename + ".json"; // Serialize the filter model to JSON QJsonArray filtersArray; @@ -86,7 +87,7 @@ void VisualDatabaseDisplayFilterSaveLoadWidget::saveFilter() void VisualDatabaseDisplayFilterSaveLoadWidget::loadFilter(const QString &filename) { - QString filePath = SettingsCache::instance().getFiltersPath() + QDir::separator() + filename; + QString filePath = SettingsCache::instance().paths().getFiltersPath() + QDir::separator() + filename; QFile file(filePath); if (!file.open(QIODevice::ReadOnly)) { @@ -156,7 +157,7 @@ void VisualDatabaseDisplayFilterSaveLoadWidget::refreshFilterList() fileListWidget->clearLayout(); fileButtons.clear(); - QDir dir(SettingsCache::instance().getFiltersPath()); + QDir dir(SettingsCache::instance().paths().getFiltersPath()); allFilterFiles = dir.entryList({"*.json"}, QDir::Files, QDir::Name); applySearchFilter(searchInput->text()); diff --git a/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_set_filter_widget.cpp b/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_set_filter_widget.cpp index b72116461..358c3ed88 100644 --- a/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_set_filter_widget.cpp +++ b/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_set_filter_widget.cpp @@ -10,6 +10,7 @@ #include #include #include +#include VisualDatabaseDisplayRecentSetFilterSettingsWidget::VisualDatabaseDisplayRecentSetFilterSettingsWidget(QWidget *parent) : QWidget(parent) @@ -21,17 +22,19 @@ VisualDatabaseDisplayRecentSetFilterSettingsWidget::VisualDatabaseDisplayRecentS filterToMostRecentSetsCheckBox = new QCheckBox(this); filterToMostRecentSetsCheckBox->setChecked( - SettingsCache::instance().getVisualDatabaseDisplayFilterToMostRecentSetsEnabled()); - connect(filterToMostRecentSetsCheckBox, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance(), - &SettingsCache::setVisualDatabaseDisplayFilterToMostRecentSetsEnabled); + SettingsCache::instance().visualDeckStorage().getVisualDatabaseDisplayFilterToMostRecentSetsEnabled()); + connect(filterToMostRecentSetsCheckBox, &QCheckBox::QT_STATE_CHANGED, + &SettingsCache::instance().visualDeckStorage(), + &VisualDeckStorageSettings::setVisualDatabaseDisplayFilterToMostRecentSetsEnabled); filterToMostRecentSetsAmount = new QSpinBox(this); filterToMostRecentSetsAmount->setMinimum(1); filterToMostRecentSetsAmount->setMaximum(100); filterToMostRecentSetsAmount->setValue( - SettingsCache::instance().getVisualDatabaseDisplayFilterToMostRecentSetsAmount()); - connect(filterToMostRecentSetsAmount, qOverload(&QSpinBox::valueChanged), &SettingsCache::instance(), - &SettingsCache::setVisualDatabaseDisplayFilterToMostRecentSetsAmount); + SettingsCache::instance().visualDeckStorage().getVisualDatabaseDisplayFilterToMostRecentSetsAmount()); + connect(filterToMostRecentSetsAmount, qOverload(&QSpinBox::valueChanged), + &SettingsCache::instance().visualDeckStorage(), + &VisualDeckStorageSettings::setVisualDatabaseDisplayFilterToMostRecentSetsAmount); layout->addWidget(filterToMostRecentSetsCheckBox); layout->addWidget(filterToMostRecentSetsAmount); @@ -66,9 +69,11 @@ VisualDatabaseDisplaySetFilterWidget::VisualDatabaseDisplaySetFilterWidget(QWidg recentSetsSettingsWidget = new VisualDatabaseDisplayRecentSetFilterSettingsWidget(this); layout->addWidget(recentSetsSettingsWidget); - connect(&SettingsCache::instance(), &SettingsCache::visualDatabaseDisplayFilterToMostRecentSetsEnabledChanged, this, + connect(&SettingsCache::instance().visualDeckStorage(), + &VisualDeckStorageSettings::visualDatabaseDisplayFilterToMostRecentSetsEnabledChanged, this, &VisualDatabaseDisplaySetFilterWidget::filterToRecentSets); - connect(&SettingsCache::instance(), &SettingsCache::visualDatabaseDisplayFilterToMostRecentSetsAmountChanged, this, + connect(&SettingsCache::instance().visualDeckStorage(), + &VisualDeckStorageSettings::visualDatabaseDisplayFilterToMostRecentSetsAmountChanged, this, &VisualDatabaseDisplaySetFilterWidget::filterToRecentSets); // Create the toggle button for Exact Match/Includes mode @@ -118,7 +123,7 @@ void VisualDatabaseDisplaySetFilterWidget::createSetButtons() void VisualDatabaseDisplaySetFilterWidget::filterToRecentSets() { - if (SettingsCache::instance().getVisualDatabaseDisplayFilterToMostRecentSetsEnabled()) { + if (SettingsCache::instance().visualDeckStorage().getVisualDatabaseDisplayFilterToMostRecentSetsEnabled()) { for (auto set : activeSets.keys()) { activeSets[set] = false; } @@ -129,7 +134,8 @@ void VisualDatabaseDisplaySetFilterWidget::filterToRecentSets() std::sort(allSets.begin(), allSets.end(), [](const auto &a, const auto &b) { return a->getReleaseDate() > b->getReleaseDate(); }); - int setsToPreactivate = SettingsCache::instance().getVisualDatabaseDisplayFilterToMostRecentSetsAmount(); + int setsToPreactivate = + SettingsCache::instance().visualDeckStorage().getVisualDatabaseDisplayFilterToMostRecentSetsAmount(); int setsActivated = 0; for (const auto &set : allSets) { diff --git a/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_widget.cpp b/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_widget.cpp index cc4cce496..21c44246e 100644 --- a/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_widget.cpp +++ b/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_widget.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include VisualDatabaseDisplayWidget::VisualDatabaseDisplayWidget(QWidget *parent, @@ -51,9 +52,10 @@ VisualDatabaseDisplayWidget::VisualDatabaseDisplayWidget(QWidget *parent, mainLayout->setContentsMargins(0, 0, 0, 0); flowWidget = new FlowWidget(this, Qt::Horizontal, Qt::ScrollBarAlwaysOff, Qt::ScrollBarPolicy::ScrollBarAsNeeded); - cardSizeWidget = new CardSizeWidget(this, flowWidget, SettingsCache::instance().getVisualDatabaseDisplayCardSize()); - connect(cardSizeWidget, &CardSizeWidget::cardSizeSettingUpdated, &SettingsCache::instance(), - &SettingsCache::setVisualDatabaseDisplayCardSize); + cardSizeWidget = new CardSizeWidget( + this, flowWidget, SettingsCache::instance().visualDeckStorage().getVisualDatabaseDisplayCardSize()); + connect(cardSizeWidget, &CardSizeWidget::cardSizeSettingUpdated, &SettingsCache::instance().visualDeckStorage(), + &VisualDeckStorageSettings::setVisualDatabaseDisplayCardSize); searchContainer = new FlowWidget(this, Qt::Horizontal, Qt::ScrollBarAlwaysOff, Qt::ScrollBarAlwaysOff); diff --git a/cockatrice/src/interface/widgets/visual_database_display/visual_database_filter_display_widget.cpp b/cockatrice/src/interface/widgets/visual_database_display/visual_database_filter_display_widget.cpp index 5364fa813..bb5b333d9 100644 --- a/cockatrice/src/interface/widgets/visual_database_display/visual_database_filter_display_widget.cpp +++ b/cockatrice/src/interface/widgets/visual_database_display/visual_database_filter_display_widget.cpp @@ -8,6 +8,7 @@ #include #include #include +#include FilterDisplayWidget::FilterDisplayWidget(QWidget *parent, const QString &filename, FilterTreeModel *_filterModel) : QWidget(parent), filterFilename(filename), filterModel(_filterModel) @@ -68,7 +69,7 @@ void FilterDisplayWidget::deleteFilter() QMessageBox::Yes | QMessageBox::No); if (reply == QMessageBox::Yes) { // If confirmed, delete the filter - QString filePath = SettingsCache::instance().getFiltersPath() + QDir::separator() + filterFilename; + QString filePath = SettingsCache::instance().paths().getFiltersPath() + QDir::separator() + filterFilename; QFile file(filePath); if (file.remove()) { emit filterDeleted(filterFilename); // Emit signal for deletion diff --git a/cockatrice/src/interface/widgets/visual_deck_editor/visual_deck_editor_sample_hand_widget.cpp b/cockatrice/src/interface/widgets/visual_deck_editor/visual_deck_editor_sample_hand_widget.cpp index 8417ffa34..20ad3b65c 100644 --- a/cockatrice/src/interface/widgets/visual_deck_editor/visual_deck_editor_sample_hand_widget.cpp +++ b/cockatrice/src/interface/widgets/visual_deck_editor/visual_deck_editor_sample_hand_widget.cpp @@ -8,6 +8,7 @@ #include #include +#include #include VisualDeckEditorSampleHandWidget::VisualDeckEditorSampleHandWidget(QWidget *parent, @@ -33,10 +34,10 @@ VisualDeckEditorSampleHandWidget::VisualDeckEditorSampleHandWidget(QWidget *pare resetAndHandSizeLayout->addWidget(resetButton); handSizeSpinBox = new QSpinBox(this); - handSizeSpinBox->setValue(SettingsCache::instance().getVisualDeckEditorSampleHandSize()); + handSizeSpinBox->setValue(SettingsCache::instance().visualDeckStorage().getVisualDeckEditorSampleHandSize()); handSizeSpinBox->setMinimum(1); - connect(handSizeSpinBox, qOverload(&QSpinBox::valueChanged), &SettingsCache::instance(), - &SettingsCache::setVisualDeckEditorSampleHandSize); + connect(handSizeSpinBox, qOverload(&QSpinBox::valueChanged), &SettingsCache::instance().visualDeckStorage(), + &VisualDeckStorageSettings::setVisualDeckEditorSampleHandSize); connect(handSizeSpinBox, qOverload(&QSpinBox::valueChanged), this, &VisualDeckEditorSampleHandWidget::updateDisplay); resetAndHandSizeLayout->addWidget(handSizeSpinBox); diff --git a/cockatrice/src/interface/widgets/visual_deck_editor/visual_deck_editor_widget.cpp b/cockatrice/src/interface/widgets/visual_deck_editor/visual_deck_editor_widget.cpp index 815892f4c..befd57804 100644 --- a/cockatrice/src/interface/widgets/visual_deck_editor/visual_deck_editor_widget.cpp +++ b/cockatrice/src/interface/widgets/visual_deck_editor/visual_deck_editor_widget.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #include VisualDeckEditorWidget::VisualDeckEditorWidget(QWidget *parent, @@ -43,9 +44,10 @@ VisualDeckEditorWidget::VisualDeckEditorWidget(QWidget *parent, initializeScrollAreaAndZoneContainer(); - cardSizeWidget = new CardSizeWidget(this, nullptr, SettingsCache::instance().getVisualDeckEditorCardSize()); - connect(cardSizeWidget, &CardSizeWidget::cardSizeSettingUpdated, &SettingsCache::instance(), - &SettingsCache::setVisualDeckEditorCardSize); + cardSizeWidget = + new CardSizeWidget(this, nullptr, SettingsCache::instance().visualDeckStorage().getVisualDeckEditorCardSize()); + connect(cardSizeWidget, &CardSizeWidget::cardSizeSettingUpdated, &SettingsCache::instance().visualDeckStorage(), + &VisualDeckStorageSettings::setVisualDeckEditorCardSize); mainLayout->addWidget(displayOptionsAndSearch); mainLayout->addWidget(scrollArea); diff --git a/cockatrice/src/interface/widgets/visual_deck_storage/deck_preview/deck_preview_deck_tags_display_widget.cpp b/cockatrice/src/interface/widgets/visual_deck_storage/deck_preview/deck_preview_deck_tags_display_widget.cpp index 8cd1004de..b45f61be7 100644 --- a/cockatrice/src/interface/widgets/visual_deck_storage/deck_preview/deck_preview_deck_tags_display_widget.cpp +++ b/cockatrice/src/interface/widgets/visual_deck_storage/deck_preview/deck_preview_deck_tags_display_widget.cpp @@ -12,6 +12,8 @@ #include #include #include +#include +#include DeckPreviewDeckTagsDisplayWidget::DeckPreviewDeckTagsDisplayWidget(QWidget *_parent, const QStringList &_tags) : QWidget(_parent), currentTags(_tags) @@ -74,7 +76,7 @@ static QStringList getAllFiles(const QString &filePath) */ static QStringList findAllKnownTags() { - QStringList allFiles = getAllFiles(SettingsCache::instance().getDeckPath()); + QStringList allFiles = getAllFiles(SettingsCache::instance().paths().getDeckPath()); QStringList knownTags; for (const QString &file : allFiles) { @@ -141,8 +143,8 @@ bool DeckPreviewDeckTagsDisplayWidget::promptFileConversionIfRequired(DeckPrevie } // Retrieve saved preference if the prompt is disabled - if (!SettingsCache::instance().getVisualDeckStoragePromptForConversion()) { - if (!SettingsCache::instance().getVisualDeckStorageAlwaysConvert()) { + if (!SettingsCache::instance().visualDeckStorage().getVisualDeckStoragePromptForConversion()) { + if (!SettingsCache::instance().visualDeckStorage().getVisualDeckStorageAlwaysConvert()) { return false; } @@ -157,8 +159,9 @@ bool DeckPreviewDeckTagsDisplayWidget::promptFileConversionIfRequired(DeckPrevie // Show the dialog to the user DialogConvertDeckToCodFormat conversionDialog(parentWidget()); if (conversionDialog.exec() != QDialog::Accepted) { - SettingsCache::instance().setVisualDeckStoragePromptForConversion(!conversionDialog.dontAskAgain()); - SettingsCache::instance().setVisualDeckStorageAlwaysConvert(false); + SettingsCache::instance().visualDeckStorage().setVisualDeckStoragePromptForConversion( + !conversionDialog.dontAskAgain()); + SettingsCache::instance().visualDeckStorage().setVisualDeckStorageAlwaysConvert(false); return false; } @@ -171,8 +174,8 @@ bool DeckPreviewDeckTagsDisplayWidget::promptFileConversionIfRequired(DeckPrevie convertFileToCockatriceFormat(deckPreviewWidget); if (conversionDialog.dontAskAgain()) { - SettingsCache::instance().setVisualDeckStoragePromptForConversion(false); - SettingsCache::instance().setVisualDeckStorageAlwaysConvert(true); + SettingsCache::instance().visualDeckStorage().setVisualDeckStoragePromptForConversion(false); + SettingsCache::instance().visualDeckStorage().setVisualDeckStorageAlwaysConvert(true); } return true; diff --git a/cockatrice/src/interface/widgets/visual_deck_storage/deck_preview/deck_preview_tag_dialog.cpp b/cockatrice/src/interface/widgets/visual_deck_storage/deck_preview/deck_preview_tag_dialog.cpp index e8a399fe5..f27d11d36 100644 --- a/cockatrice/src/interface/widgets/visual_deck_storage/deck_preview/deck_preview_tag_dialog.cpp +++ b/cockatrice/src/interface/widgets/visual_deck_storage/deck_preview/deck_preview_tag_dialog.cpp @@ -11,6 +11,7 @@ #include #include #include +#include DeckPreviewTagDialog::DeckPreviewTagDialog(const QStringList &knownTags, const QStringList &_activeTags, @@ -19,7 +20,7 @@ DeckPreviewTagDialog::DeckPreviewTagDialog(const QStringList &knownTags, { resize(400, 500); - QStringList defaultTags = SettingsCache::instance().getVisualDeckStorageDefaultTagsList(); + QStringList defaultTags = SettingsCache::instance().visualDeckStorage().getVisualDeckStorageDefaultTagsList(); // Merge knownTags with defaultTags, ensuring no duplicates QStringList combinedTags = defaultTags + knownTags + activeTags; @@ -90,7 +91,8 @@ DeckPreviewTagDialog::DeckPreviewTagDialog(const QStringList &knownTags, connect(okButton, &QPushButton::clicked, this, &DeckPreviewTagDialog::accept); connect(cancelButton, &QPushButton::clicked, this, &DeckPreviewTagDialog::reject); - connect(&SettingsCache::instance(), &SettingsCache::visualDeckStorageDefaultTagsListChanged, this, + connect(&SettingsCache::instance().visualDeckStorage(), + &VisualDeckStorageSettings::visualDeckStorageDefaultTagsListChanged, this, &DeckPreviewTagDialog::refreshTagList); retranslateUi(); @@ -114,7 +116,7 @@ void DeckPreviewTagDialog::refreshTagList() tagListView->clear(); // Get the updated list of tags from SettingsCache - QStringList defaultTags = SettingsCache::instance().getVisualDeckStorageDefaultTagsList(); + QStringList defaultTags = SettingsCache::instance().visualDeckStorage().getVisualDeckStorageDefaultTagsList(); QStringList combinedTags = defaultTags + knownTags_ + activeTags; combinedTags.removeDuplicates(); diff --git a/cockatrice/src/interface/widgets/visual_deck_storage/deck_preview/deck_preview_widget.cpp b/cockatrice/src/interface/widgets/visual_deck_storage/deck_preview/deck_preview_widget.cpp index 06dc9dd84..6f888dd26 100644 --- a/cockatrice/src/interface/widgets/visual_deck_storage/deck_preview/deck_preview_widget.cpp +++ b/cockatrice/src/interface/widgets/visual_deck_storage/deck_preview/deck_preview_widget.cpp @@ -16,6 +16,7 @@ #include #include #include +#include DeckPreviewWidget::DeckPreviewWidget(QWidget *_parent, VisualDeckStorageWidget *_visualDeckStorageWidget, @@ -42,11 +43,14 @@ DeckPreviewWidget::DeckPreviewWidget(QWidget *_parent, connect(bannerCardDisplayWidget, &DeckPreviewCardPictureWidget::imageDoubleClicked, this, &DeckPreviewWidget::imageDoubleClickedEvent); - connect(&SettingsCache::instance(), &SettingsCache::visualDeckStorageShowColorIdentityChanged, this, + connect(&SettingsCache::instance().visualDeckStorage(), + &VisualDeckStorageSettings::visualDeckStorageShowColorIdentityChanged, this, &DeckPreviewWidget::updateColorIdentityVisibility); - connect(&SettingsCache::instance(), &SettingsCache::visualDeckStorageShowTagsOnDeckPreviewsChanged, this, + connect(&SettingsCache::instance().visualDeckStorage(), + &VisualDeckStorageSettings::visualDeckStorageShowTagsOnDeckPreviewsChanged, this, &DeckPreviewWidget::updateTagsVisibility); - connect(&SettingsCache::instance(), &SettingsCache::visualDeckStorageShowBannerCardComboBoxChanged, this, + connect(&SettingsCache::instance().visualDeckStorage(), + &VisualDeckStorageSettings::visualDeckStorageShowBannerCardComboBoxChanged, this, &DeckPreviewWidget::updateBannerCardComboBoxVisibility); connect(visualDeckStorageWidget->settings(), &VisualDeckStorageQuickSettingsWidget::deckPreviewTooltipChanged, this, &DeckPreviewWidget::refreshBannerCardToolTip); @@ -128,9 +132,11 @@ void DeckPreviewWidget::initializeUi(const bool deckLoadSuccess) connect(bannerCardComboBox, QOverload::of(&QComboBox::currentIndexChanged), this, &DeckPreviewWidget::setBannerCard); - updateColorIdentityVisibility(SettingsCache::instance().getVisualDeckStorageShowColorIdentity()); - updateBannerCardComboBoxVisibility(SettingsCache::instance().getVisualDeckStorageShowBannerCardComboBox()); - updateTagsVisibility(SettingsCache::instance().getVisualDeckStorageShowTagsOnDeckPreviews()); + updateColorIdentityVisibility( + SettingsCache::instance().visualDeckStorage().getVisualDeckStorageShowColorIdentity()); + updateBannerCardComboBoxVisibility( + SettingsCache::instance().visualDeckStorage().getVisualDeckStorageShowBannerCardComboBox()); + updateTagsVisibility(SettingsCache::instance().visualDeckStorage().getVisualDeckStorageShowTagsOnDeckPreviews()); layout->addWidget(colorIdentityWidget); layout->addWidget(deckTagsDisplayWidget); diff --git a/cockatrice/src/interface/widgets/visual_deck_storage/visual_deck_storage_folder_display_widget.cpp b/cockatrice/src/interface/widgets/visual_deck_storage/visual_deck_storage_folder_display_widget.cpp index fdb44dff4..cc7f07871 100644 --- a/cockatrice/src/interface/widgets/visual_deck_storage/visual_deck_storage_folder_display_widget.cpp +++ b/cockatrice/src/interface/widgets/visual_deck_storage/visual_deck_storage_folder_display_widget.cpp @@ -6,6 +6,7 @@ #include #include +#include VisualDeckStorageFolderDisplayWidget::VisualDeckStorageFolderDisplayWidget( QWidget *parent, @@ -43,7 +44,7 @@ VisualDeckStorageFolderDisplayWidget::VisualDeckStorageFolderDisplayWidget( void VisualDeckStorageFolderDisplayWidget::refreshUi() { QString bannerText = tr("Deck Storage"); - QString deckPath = SettingsCache::instance().getDeckPath(); + QString deckPath = SettingsCache::instance().paths().getDeckPath(); if (filePath != deckPath) { QString relativePath = filePath; diff --git a/cockatrice/src/interface/widgets/visual_deck_storage/visual_deck_storage_quick_settings_widget.cpp b/cockatrice/src/interface/widgets/visual_deck_storage/visual_deck_storage_quick_settings_widget.cpp index a0e8512ac..b89c62f9c 100644 --- a/cockatrice/src/interface/widgets/visual_deck_storage/visual_deck_storage_quick_settings_widget.cpp +++ b/cockatrice/src/interface/widgets/visual_deck_storage/visual_deck_storage_quick_settings_widget.cpp @@ -6,58 +6,67 @@ #include #include #include +#include +#include VisualDeckStorageQuickSettingsWidget::VisualDeckStorageQuickSettingsWidget(QWidget *parent) : SettingsButtonWidget(parent) { // show folders checkbox showFoldersCheckBox = new QCheckBox(this); - showFoldersCheckBox->setChecked(SettingsCache::instance().getVisualDeckStorageShowFolders()); + showFoldersCheckBox->setChecked(SettingsCache::instance().visualDeckStorage().getVisualDeckStorageShowFolders()); connect(showFoldersCheckBox, &QCheckBox::QT_STATE_CHANGED, this, &VisualDeckStorageQuickSettingsWidget::showFoldersChanged); - connect(showFoldersCheckBox, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance(), - &SettingsCache::setVisualDeckStorageShowFolders); + connect(showFoldersCheckBox, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance().visualDeckStorage(), + &VisualDeckStorageSettings::setVisualDeckStorageShowFolders); // show tag filter widget checkbox showTagFilterCheckBox = new QCheckBox(this); - showTagFilterCheckBox->setChecked(SettingsCache::instance().getVisualDeckStorageShowTagFilter()); + showTagFilterCheckBox->setChecked( + SettingsCache::instance().visualDeckStorage().getVisualDeckStorageShowTagFilter()); connect(showTagFilterCheckBox, &QCheckBox::QT_STATE_CHANGED, this, &VisualDeckStorageQuickSettingsWidget::showTagFilterChanged); - connect(showTagFilterCheckBox, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance(), - &SettingsCache::setVisualDeckStorageShowTagFilter); + connect(showTagFilterCheckBox, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance().visualDeckStorage(), + &VisualDeckStorageSettings::setVisualDeckStorageShowTagFilter); // show color identity on DeckPreviewWidget checkbox showColorIdentityCheckBox = new QCheckBox(this); - showColorIdentityCheckBox->setChecked(SettingsCache::instance().getVisualDeckStorageShowColorIdentity()); + showColorIdentityCheckBox->setChecked( + SettingsCache::instance().visualDeckStorage().getVisualDeckStorageShowColorIdentity()); connect(showColorIdentityCheckBox, &QCheckBox::QT_STATE_CHANGED, this, &VisualDeckStorageQuickSettingsWidget::showColorIdentityChanged); - connect(showColorIdentityCheckBox, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance(), - &SettingsCache::setVisualDeckStorageShowColorIdentity); + connect(showColorIdentityCheckBox, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance().visualDeckStorage(), + &VisualDeckStorageSettings::setVisualDeckStorageShowColorIdentity); // show tags on DeckPreviewWidget checkbox showTagsOnDeckPreviewsCheckBox = new QCheckBox(this); - showTagsOnDeckPreviewsCheckBox->setChecked(SettingsCache::instance().getVisualDeckStorageShowTagsOnDeckPreviews()); + showTagsOnDeckPreviewsCheckBox->setChecked( + SettingsCache::instance().visualDeckStorage().getVisualDeckStorageShowTagsOnDeckPreviews()); connect(showTagsOnDeckPreviewsCheckBox, &QCheckBox::QT_STATE_CHANGED, this, &VisualDeckStorageQuickSettingsWidget::showTagsOnDeckPreviewsChanged); - connect(showTagsOnDeckPreviewsCheckBox, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance(), - &SettingsCache::setVisualDeckStorageShowTagsOnDeckPreviews); + connect(showTagsOnDeckPreviewsCheckBox, &QCheckBox::QT_STATE_CHANGED, + &SettingsCache::instance().visualDeckStorage(), + &VisualDeckStorageSettings::setVisualDeckStorageShowTagsOnDeckPreviews); // show banner card selector checkbox showBannerCardComboBoxCheckBox = new QCheckBox(this); - showBannerCardComboBoxCheckBox->setChecked(SettingsCache::instance().getVisualDeckStorageShowBannerCardComboBox()); + showBannerCardComboBoxCheckBox->setChecked( + SettingsCache::instance().visualDeckStorage().getVisualDeckStorageShowBannerCardComboBox()); connect(showBannerCardComboBoxCheckBox, &QCheckBox::QT_STATE_CHANGED, this, &VisualDeckStorageQuickSettingsWidget::showBannerCardComboBoxChanged); - connect(showBannerCardComboBoxCheckBox, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance(), - &SettingsCache::setVisualDeckStorageShowBannerCardComboBox); + connect(showBannerCardComboBoxCheckBox, &QCheckBox::QT_STATE_CHANGED, + &SettingsCache::instance().visualDeckStorage(), + &VisualDeckStorageSettings::setVisualDeckStorageShowBannerCardComboBox); // draw unused color identities checkbox drawUnusedColorIdentitiesCheckBox = new QCheckBox(this); drawUnusedColorIdentitiesCheckBox->setChecked( - SettingsCache::instance().getVisualDeckStorageDrawUnusedColorIdentities()); + SettingsCache::instance().visualDeckStorage().getVisualDeckStorageDrawUnusedColorIdentities()); connect(drawUnusedColorIdentitiesCheckBox, &QCheckBox::QT_STATE_CHANGED, this, &VisualDeckStorageQuickSettingsWidget::drawUnusedColorIdentitiesChanged); - connect(drawUnusedColorIdentitiesCheckBox, &QCheckBox::QT_STATE_CHANGED, &SettingsCache::instance(), - &SettingsCache::setVisualDeckStorageDrawUnusedColorIdentities); + connect(drawUnusedColorIdentitiesCheckBox, &QCheckBox::QT_STATE_CHANGED, + &SettingsCache::instance().visualDeckStorage(), + &VisualDeckStorageSettings::setVisualDeckStorageDrawUnusedColorIdentities); // color identity opacity selector auto unusedColorIdentityOpacityWidget = new QWidget(this); @@ -68,11 +77,12 @@ VisualDeckStorageQuickSettingsWidget::VisualDeckStorageQuickSettingsWidget(QWidg unusedColorIdentitiesOpacitySpinBox->setMinimum(0); unusedColorIdentitiesOpacitySpinBox->setMaximum(100); unusedColorIdentitiesOpacitySpinBox->setValue( - SettingsCache::instance().getVisualDeckStorageUnusedColorIdentitiesOpacity()); + SettingsCache::instance().visualDeckStorage().getVisualDeckStorageUnusedColorIdentitiesOpacity()); connect(unusedColorIdentitiesOpacitySpinBox, qOverload(&QSpinBox::valueChanged), this, &VisualDeckStorageQuickSettingsWidget::unusedColorIdentitiesOpacityChanged); - connect(unusedColorIdentitiesOpacitySpinBox, qOverload(&QSpinBox::valueChanged), &SettingsCache::instance(), - &SettingsCache::setVisualDeckStorageUnusedColorIdentitiesOpacity); + connect(unusedColorIdentitiesOpacitySpinBox, qOverload(&QSpinBox::valueChanged), + &SettingsCache::instance().visualDeckStorage(), + &VisualDeckStorageSettings::setVisualDeckStorageUnusedColorIdentitiesOpacity); unusedColorIdentitiesOpacityLabel->setBuddy(unusedColorIdentitiesOpacitySpinBox); @@ -90,11 +100,13 @@ VisualDeckStorageQuickSettingsWidget::VisualDeckStorageQuickSettingsWidget(QWidg deckPreviewTooltipComboBox->addItem("", TooltipType::None); deckPreviewTooltipComboBox->addItem("", TooltipType::Filepath); - deckPreviewTooltipComboBox->setCurrentIndex(SettingsCache::instance().getVisualDeckStorageTooltipType()); + deckPreviewTooltipComboBox->setCurrentIndex( + SettingsCache::instance().visualDeckStorage().getVisualDeckStorageTooltipType()); connect(deckPreviewTooltipComboBox, QOverload::of(&QComboBox::currentIndexChanged), this, [this] { emit deckPreviewTooltipChanged(getDeckPreviewTooltip()); }); - connect(deckPreviewTooltipComboBox, QOverload::of(&QComboBox::currentIndexChanged), &SettingsCache::instance(), - &SettingsCache::setVisualDeckStorageTooltipType); + connect(deckPreviewTooltipComboBox, QOverload::of(&QComboBox::currentIndexChanged), + &SettingsCache::instance().visualDeckStorage(), + &VisualDeckStorageSettings::setVisualDeckStorageTooltipType); auto deckPreviewTooltipLayout = new QHBoxLayout(deckPreviewTooltipWidget); deckPreviewTooltipLayout->setContentsMargins(11, 0, 11, 0); @@ -102,11 +114,12 @@ VisualDeckStorageQuickSettingsWidget::VisualDeckStorageQuickSettingsWidget(QWidg deckPreviewTooltipLayout->addWidget(deckPreviewTooltipComboBox); // card size slider - cardSizeWidget = new CardSizeWidget(this, nullptr, SettingsCache::instance().getVisualDeckStorageCardSize()); + cardSizeWidget = + new CardSizeWidget(this, nullptr, SettingsCache::instance().visualDeckStorage().getVisualDeckStorageCardSize()); connect(cardSizeWidget->getSlider(), &QSlider::valueChanged, this, &VisualDeckStorageQuickSettingsWidget::cardSizeChanged); - connect(cardSizeWidget, &CardSizeWidget::cardSizeSettingUpdated, &SettingsCache::instance(), - &SettingsCache::setVisualDeckStorageCardSize); + connect(cardSizeWidget, &CardSizeWidget::cardSizeSettingUpdated, &SettingsCache::instance().visualDeckStorage(), + &VisualDeckStorageSettings::setVisualDeckStorageCardSize); // putting everything together this->addSettingsWidget(showFoldersCheckBox); @@ -119,7 +132,7 @@ VisualDeckStorageQuickSettingsWidget::VisualDeckStorageQuickSettingsWidget(QWidg this->addSettingsWidget(deckPreviewTooltipWidget); this->addSettingsWidget(cardSizeWidget); - connect(&SettingsCache::instance(), &SettingsCache::langChanged, this, + connect(&SettingsCache::instance().personal(), &PersonalSettings::langChanged, this, &VisualDeckStorageQuickSettingsWidget::retranslateUi); retranslateUi(); } diff --git a/cockatrice/src/interface/widgets/visual_deck_storage/visual_deck_storage_search_widget.cpp b/cockatrice/src/interface/widgets/visual_deck_storage/visual_deck_storage_search_widget.cpp index 70b438232..07ee55105 100644 --- a/cockatrice/src/interface/widgets/visual_deck_storage/visual_deck_storage_search_widget.cpp +++ b/cockatrice/src/interface/widgets/visual_deck_storage/visual_deck_storage_search_widget.cpp @@ -7,6 +7,7 @@ #include #include +#include /** * @brief Constructs a PrintingSelectorCardSearchWidget for searching cards by set name or set code. @@ -60,7 +61,7 @@ QString VisualDeckStorageSearchWidget::getSearchText() */ static QString toRelativeFilepath(const QString &filePath) { - QString deckPath = SettingsCache::instance().getDeckPath(); + QString deckPath = SettingsCache::instance().paths().getDeckPath(); if (filePath.startsWith(deckPath)) { return filePath.mid(deckPath.length()); } diff --git a/cockatrice/src/interface/widgets/visual_deck_storage/visual_deck_storage_sort_widget.cpp b/cockatrice/src/interface/widgets/visual_deck_storage/visual_deck_storage_sort_widget.cpp index 0eb45cdcc..e4eedb078 100644 --- a/cockatrice/src/interface/widgets/visual_deck_storage/visual_deck_storage_sort_widget.cpp +++ b/cockatrice/src/interface/widgets/visual_deck_storage/visual_deck_storage_sort_widget.cpp @@ -3,6 +3,7 @@ #include "../../../client/settings/cache_settings.h" #include +#include /** * @brief Constructs a PrintingSelectorCardSortWidget for searching cards by set name or set code. @@ -28,7 +29,7 @@ VisualDeckStorageSortWidget::VisualDeckStorageSortWidget(VisualDeckStorageWidget retranslateUi(); // Set the current sort order - sortComboBox->setCurrentIndex(SettingsCache::instance().getVisualDeckStorageSortingOrder()); + sortComboBox->setCurrentIndex(SettingsCache::instance().visualDeckStorage().getVisualDeckStorageSortingOrder()); sortOrder = static_cast(sortComboBox->currentIndex()); // Connect sorting change signal to refresh the file list @@ -61,7 +62,7 @@ void VisualDeckStorageSortWidget::retranslateUi() void VisualDeckStorageSortWidget::updateSortOrder() { sortOrder = static_cast(sortComboBox->currentIndex()); - SettingsCache::instance().setVisualDeckStorageSortingOrder(sortComboBox->currentIndex()); + SettingsCache::instance().visualDeckStorage().setVisualDeckStorageSortingOrder(sortComboBox->currentIndex()); emit sortOrderChanged(); } diff --git a/cockatrice/src/interface/widgets/visual_deck_storage/visual_deck_storage_widget.cpp b/cockatrice/src/interface/widgets/visual_deck_storage/visual_deck_storage_widget.cpp index bfc425993..4b4dee55b 100644 --- a/cockatrice/src/interface/widgets/visual_deck_storage/visual_deck_storage_widget.cpp +++ b/cockatrice/src/interface/widgets/visual_deck_storage/visual_deck_storage_widget.cpp @@ -13,6 +13,8 @@ #include #include #include +#include +#include VisualDeckStorageWidget::VisualDeckStorageWidget(QWidget *parent) : QWidget(parent), folderWidget(nullptr) { @@ -54,10 +56,12 @@ VisualDeckStorageWidget::VisualDeckStorageWidget(QWidget *parent) : QWidget(pare // tag filter box tagFilterWidget = new VisualDeckStorageTagFilterWidget(this); - updateTagsVisibility(SettingsCache::instance().getVisualDeckStorageShowTagFilter()); + updateTagsVisibility(SettingsCache::instance().visualDeckStorage().getVisualDeckStorageShowTagFilter()); - deckPreviewSelectionAnimationEnabled = SettingsCache::instance().getVisualDeckStorageSelectionAnimation(); - connect(&SettingsCache::instance(), &SettingsCache::visualDeckStorageSelectionAnimationChanged, this, + deckPreviewSelectionAnimationEnabled = + SettingsCache::instance().visualDeckStorage().getVisualDeckStorageSelectionAnimation(); + connect(&SettingsCache::instance().visualDeckStorage(), + &VisualDeckStorageSettings::visualDeckStorageSelectionAnimationChanged, this, &VisualDeckStorageWidget::updateSelectionAnimationEnabled); // deck area @@ -142,8 +146,8 @@ void VisualDeckStorageWidget::reapplySortAndFilters() void VisualDeckStorageWidget::createRootFolderWidget() { - folderWidget = new VisualDeckStorageFolderDisplayWidget(this, this, SettingsCache::instance().getDeckPath(), false, - quickSettingsWidget->getShowFolders()); + folderWidget = new VisualDeckStorageFolderDisplayWidget(this, this, SettingsCache::instance().paths().getDeckPath(), + false, quickSettingsWidget->getShowFolders()); scrollArea->setWidget(folderWidget); // this automatically destroys the old folderWidget scrollArea->widget()->setMaximumWidth(scrollArea->viewport()->width()); diff --git a/cockatrice/src/interface/window_main.cpp b/cockatrice/src/interface/window_main.cpp index 69d3260bc..d865c9438 100644 --- a/cockatrice/src/interface/window_main.cpp +++ b/cockatrice/src/interface/window_main.cpp @@ -22,6 +22,7 @@ #include "../client/network/update/client/client_update_checker.h" #include "../client/network/update/client/release_channel.h" #include "../client/settings/cache_settings.h" +#include "../client/settings/shortcuts_settings.h" #include "../interface/widgets/dialogs/dlg_edit_tokens.h" #include "../interface/widgets/dialogs/dlg_local_game_options.h" #include "../interface/widgets/dialogs/dlg_manage_sets.h" @@ -66,6 +67,14 @@ #include #include #include +#include +#include +#include +#include +#include +#include +#include +#include #define GITHUB_PAGES_URL "https://cockatrice.github.io" #define GITHUB_CONTRIBUTORS_URL "https://github.com/Cockatrice/Cockatrice/graphs/contributors?type=c" @@ -177,7 +186,7 @@ void MainWindow::startLocalGame(const LocalGameOptions &options) void MainWindow::actWatchReplay() { QFileDialog dlg(this, tr("Load replay")); - dlg.setDirectory(SettingsCache::instance().getReplaysPath()); + dlg.setDirectory(SettingsCache::instance().paths().getReplaysPath()); dlg.setNameFilters(QStringList() << QObject::tr("Cockatrice replays (*.cor)")); if (!dlg.exec()) { return; @@ -382,8 +391,9 @@ void MainWindow::createActions() connect(aCheckCardUpdatesBackground, &QAction::triggered, this, &MainWindow::actCheckCardUpdatesBackground); aStatusBar = new QAction(this); aStatusBar->setCheckable(true); - aStatusBar->setChecked(SettingsCache::instance().getShowStatusBar()); - connect(aStatusBar, &QAction::triggered, &SettingsCache::instance(), &SettingsCache::setShowStatusBar); + aStatusBar->setChecked(SettingsCache::instance().personal().getShowStatusBar()); + connect(aStatusBar, &QAction::triggered, &SettingsCache::instance().personal(), + &PersonalSettings::setShowStatusBar); aViewLog = new QAction(this); connect(aViewLog, &QAction::triggered, this, &MainWindow::actViewLog); aOpenSettingsFolder = new QAction(this); @@ -472,9 +482,9 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), localServer(nullptr), bHasActivated(false), askedForDbUpdater(false), cardUpdateProcess(nullptr), logviewDialog(nullptr) { - connect(&SettingsCache::instance(), &SettingsCache::pixmapCacheSizeChanged, this, + connect(&SettingsCache::instance().cacheStorage(), &CacheStorageSettings::pixmapCacheSizeChanged, this, &MainWindow::pixmapCacheSizeChanged); - pixmapCacheSizeChanged(SettingsCache::instance().getPixmapCacheSize()); + pixmapCacheSizeChanged(SettingsCache::instance().cacheStorage().getPixmapCacheSize()); connectionController = new ConnectionController(this, this); @@ -508,9 +518,9 @@ MainWindow::MainWindow(QWidget *parent) } // status bar - connect(&SettingsCache::instance(), &SettingsCache::showStatusBarChanged, this, + connect(&SettingsCache::instance().personal(), &PersonalSettings::showStatusBarChanged, this, [this](bool show) { statusBar()->setVisible(show); }); - statusBar()->setVisible(SettingsCache::instance().getShowStatusBar()); + statusBar()->setVisible(SettingsCache::instance().personal().getShowStatusBar()); connect(&SettingsCache::instance().shortcuts(), &ShortcutsSettings::shortCutChanged, this, &MainWindow::refreshShortcuts); @@ -537,23 +547,29 @@ void MainWindow::startupConfigCheck() startLocalGame(options); } - if (SettingsCache::instance().getCheckUpdatesOnStartup()) { + if (SettingsCache::instance().updates().getCheckUpdatesOnStartup()) { actCheckClientUpdates(); } - if (SettingsCache::instance().getClientVersion() == CLIENT_INFO_NOT_SET) { + if (SettingsCache::instance().personal().getClientVersion() == CLIENT_INFO_NOT_SET) { // no config found, 99% new clean install qCInfo(WindowMainStartupVersionLog) << "Startup: old client version empty, assuming first start after clean install"; alertForcedOracleRun(VERSION_STRING, false); SettingsCache::instance().downloads().resetToDefaultURLs(); // populate the download urls - SettingsCache::instance().setClientVersion(VERSION_STRING); - } else if (SettingsCache::instance().getClientVersion() != VERSION_STRING) { + SettingsCache::instance().personal().setClientVersion(VERSION_STRING); + + if (QString(VERSION_STRING).contains("custom", Qt::CaseInsensitive)) { + SettingsCache::instance().updates().setCheckUpdatesOnStartup(false); + } else if (QString(VERSION_STRING).contains("beta", Qt::CaseInsensitive)) { + SettingsCache::instance().updates().setUpdateReleaseChannelIndex(1); + } + } else if (SettingsCache::instance().personal().getClientVersion() != VERSION_STRING) { // config found, from another (presumably older) version qCInfo(WindowMainStartupVersionLog) - << "Startup: old client version" << SettingsCache::instance().getClientVersion() + << "Startup: old client version" << SettingsCache::instance().personal().getClientVersion() << "differs, assuming first start after update"; - if (SettingsCache::instance().getNotifyAboutNewVersion()) { + if (SettingsCache::instance().updates().getNotifyAboutNewVersion()) { alertForcedOracleRun(VERSION_STRING, true); } else { const auto reloadOk0 = QtConcurrent::run([] { CardDatabaseManager::getInstance()->loadCardDatabases(); }); @@ -562,10 +578,10 @@ void MainWindow::startupConfigCheck() qCInfo(WindowMainStartupShortcutsLog) << "Migrating shortcuts after update detected."; SettingsCache::instance().shortcuts().migrateShortcuts(); - if (SettingsCache::instance().getCheckUpdatesOnStartup()) { + if (SettingsCache::instance().updates().getCheckUpdatesOnStartup()) { if (QString(VERSION_STRING).contains("custom", Qt::CaseInsensitive)) { qCInfo(WindowMainStartupShortcutsLog) << "Update has changed to custom version, disabling auto update"; - SettingsCache::instance().setCheckUpdatesOnStartup(Qt::Unchecked); + SettingsCache::instance().updates().setCheckUpdatesOnStartup(false); } else { int channel = 0; if (QString(VERSION_STRING).contains("beta", Qt::CaseInsensitive)) { @@ -573,18 +589,18 @@ void MainWindow::startupConfigCheck() } if (SettingsCache::instance().getUpdateReleaseChannelIndex() != channel) { qCInfo(WindowMainStartupShortcutsLog) << "Update has changed beta state, updating release channel."; - SettingsCache::instance().setUpdateReleaseChannelIndex(channel); + SettingsCache::instance().updates().setUpdateReleaseChannelIndex(channel); } } } - SettingsCache::instance().setClientVersion(VERSION_STRING); + SettingsCache::instance().personal().setClientVersion(VERSION_STRING); } else { // previous config from this version found qCInfo(WindowMainStartupVersionLog) << "Startup: found config with current version"; - if (SettingsCache::instance().getCardUpdateCheckRequired()) { - if (SettingsCache::instance().getStartupCardUpdateCheckPromptForUpdate()) { + if (SettingsCache::instance().updates().getCardUpdateCheckRequired()) { + if (SettingsCache::instance().updates().getStartupCardUpdateCheckPromptForUpdate()) { auto startupCardCheckDialog = new DlgStartupCardCheck(this); if (startupCardCheckDialog->exec() == QDialog::Accepted) { @@ -596,19 +612,19 @@ void MainWindow::startupConfigCheck() actCheckCardUpdatesBackground(); break; case 2: // background + always - SettingsCache::instance().setStartupCardUpdateCheckPromptForUpdate(false); - SettingsCache::instance().setStartupCardUpdateCheckAlwaysUpdate(true); + SettingsCache::instance().updates().setStartupCardUpdateCheckPromptForUpdate(false); + SettingsCache::instance().updates().setStartupCardUpdateCheckAlwaysUpdate(true); actCheckCardUpdatesBackground(); break; case 3: // don't prompt again + don't run - SettingsCache::instance().setStartupCardUpdateCheckPromptForUpdate(false); - SettingsCache::instance().setStartupCardUpdateCheckAlwaysUpdate(false); + SettingsCache::instance().updates().setStartupCardUpdateCheckPromptForUpdate(false); + SettingsCache::instance().updates().setStartupCardUpdateCheckAlwaysUpdate(false); break; default: break; } } - } else if (SettingsCache::instance().getStartupCardUpdateCheckAlwaysUpdate()) { + } else if (SettingsCache::instance().updates().getStartupCardUpdateCheckAlwaysUpdate()) { actCheckCardUpdatesBackground(); } } @@ -617,7 +633,8 @@ void MainWindow::startupConfigCheck() // Run the tips dialog only on subsequent startups. // On the first run after an install/update the startup is already crowded enough - if (tip->successfulInit && SettingsCache::instance().getShowTipsOnStartup() && tip->newTipsAvailable) { + if (tip->successfulInit && SettingsCache::instance().personal().getShowTipsOnStartup() && + tip->newTipsAvailable) { tip->raise(); tip->show(); } @@ -780,7 +797,7 @@ void MainWindow::cardDatabaseLoadingFailed() void MainWindow::cardDatabaseNewSetsFound(int numUnknownSets, QStringList unknownSetsNames) { - if (SettingsCache::instance().getAlwaysEnableNewSets()) { + if (SettingsCache::instance().updates().getAlwaysEnableNewSets()) { CardDatabaseManager::getInstance()->enableAllUnknownSets(); const auto reloadOk1 = QtConcurrent::run([] { CardDatabaseManager::getInstance()->reloadCardDatabasesAndNotify(); }); @@ -812,7 +829,7 @@ void MainWindow::cardDatabaseNewSetsFound(int numUnknownSets, QStringList unknow CardDatabaseManager::getInstance()->enableAllUnknownSets(); const auto reloadOk1 = QtConcurrent::run([] { CardDatabaseManager::getInstance()->reloadCardDatabasesAndNotify(); }); - SettingsCache::instance().setAlwaysEnableNewSets(true); + SettingsCache::instance().updates().setAlwaysEnableNewSets(true); } else if (msgBox.clickedButton() == noButton) { CardDatabaseManager::getInstance()->markAllSetsAsKnown(); } else if (msgBox.clickedButton() == settingsButton) { @@ -957,7 +974,7 @@ void MainWindow::cardUpdateError(QProcess::ProcessError err) void MainWindow::cardUpdateFinished(int, QProcess::ExitStatus exitStatus) { if (exitStatus == QProcess::NormalExit) { - SettingsCache::instance().setLastCardUpdateCheck(QDateTime::currentDateTime().date()); + SettingsCache::instance().updates().setLastCardUpdateCheck(QDateTime::currentDateTime().date()); } exitCardDatabaseUpdate(); } @@ -1004,7 +1021,7 @@ void MainWindow::refreshShortcuts() void MainWindow::actOpenCustomFolder() { - QString dir = SettingsCache::instance().getCustomPicsPath(); + QString dir = SettingsCache::instance().paths().getCustomPicsPath(); QDesktopServices::openUrl(QUrl::fromLocalFile(dir)); } diff --git a/cockatrice/src/main.cpp b/cockatrice/src/main.cpp index ad68d4be9..e9ac19097 100644 --- a/cockatrice/src/main.cpp +++ b/cockatrice/src/main.cpp @@ -41,6 +41,9 @@ #include #include #include +#include +#include +#include QTranslator *translator, *qtTranslator; RNG_Abstract *rng; @@ -125,7 +128,7 @@ LONG WINAPI CockatriceUnhandledExceptionFilter(EXCEPTION_POINTERS *exceptionPoin void installNewTranslator() { - QString lang = SettingsCache::instance().getLang(); + QString lang = SettingsCache::instance().personal().getLang(); QString qtNameHint = "qt_" + lang; #if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) @@ -251,7 +254,7 @@ int main(int argc, char *argv[]) // Dependency Injections CardDatabaseManager::setCardPreferenceProvider(new SettingsCardPreferenceProvider()); CardDatabaseManager::setCardDatabasePathProvider(&SettingsCache::instance()); - CardDatabaseManager::setCardSetPriorityController(SettingsCache::instance().cardDatabase()); + CardDatabaseManager::setCardSetPriorityController(&SettingsCache::instance().cardDatabase()); qCInfo(MainLog) << "Starting main program"; @@ -265,7 +268,7 @@ int main(int argc, char *argv[]) // set name of the app desktop file; used by wayland to load the window icon QGuiApplication::setDesktopFileName("cockatrice"); - SettingsCache::instance().setClientID(generateClientID()); + SettingsCache::instance().personal().setClientID(generateClientID()); // If spoiler mode is enabled, we will download the spoilers // then reload the DB. otherwise just reload the DB @@ -275,7 +278,8 @@ int main(int argc, char *argv[]) qCInfo(MainLog) << "ui.show() finished"; // force shortcuts to be shown/hidden in right-click menus, regardless of system defaults - qApp->setAttribute(Qt::AA_DontShowShortcutsInContextMenus, !SettingsCache::instance().getShowShortcuts()); + qApp->setAttribute(Qt::AA_DontShowShortcutsInContextMenus, + !SettingsCache::instance().cardsDisplay().getShowShortcuts()); #if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0)) app.setAttribute(Qt::AA_UseHighDpiPixmaps); diff --git a/libcockatrice_interfaces/CMakeLists.txt b/libcockatrice_interfaces/CMakeLists.txt index 4f34f7985..7f39a2e15 100644 --- a/libcockatrice_interfaces/CMakeLists.txt +++ b/libcockatrice_interfaces/CMakeLists.txt @@ -3,10 +3,21 @@ set(CMAKE_AUTOUIC ON) set(CMAKE_AUTORCC ON) set(HEADERS + libcockatrice/interfaces/interface_cache_storage_settings_provider.h libcockatrice/interfaces/interface_card_database_path_provider.h libcockatrice/interfaces/interface_card_preference_provider.h libcockatrice/interfaces/interface_card_set_priority_controller.h + libcockatrice/interfaces/interface_cards_display_settings_provider.h + libcockatrice/interfaces/interface_chat_settings_provider.h + libcockatrice/interfaces/interface_game_settings_provider.h + libcockatrice/interfaces/interface_interface_settings_provider.h libcockatrice/interfaces/interface_network_settings_provider.h + libcockatrice/interfaces/interface_paths_settings_provider.h + libcockatrice/interfaces/interface_personal_settings_provider.h + libcockatrice/interfaces/interface_sound_settings_provider.h + libcockatrice/interfaces/interface_tabs_settings_provider.h + libcockatrice/interfaces/interface_updates_settings_provider.h + libcockatrice/interfaces/interface_visual_deck_storage_settings_provider.h libcockatrice/interfaces/noop_card_database_path_provider.h libcockatrice/interfaces/noop_card_preference_provider.h libcockatrice/interfaces/noop_card_set_priority_controller.h diff --git a/libcockatrice_interfaces/libcockatrice/interfaces/interface_cache_storage_settings_provider.h b/libcockatrice_interfaces/libcockatrice/interfaces/interface_cache_storage_settings_provider.h new file mode 100644 index 000000000..2881164d6 --- /dev/null +++ b/libcockatrice_interfaces/libcockatrice/interfaces/interface_cache_storage_settings_provider.h @@ -0,0 +1,14 @@ +#ifndef COCKATRICE_INTERFACE_CACHE_STORAGE_SETTINGS_PROVIDER_H +#define COCKATRICE_INTERFACE_CACHE_STORAGE_SETTINGS_PROVIDER_H + +class ICacheStorageSettingsProvider +{ +public: + virtual ~ICacheStorageSettingsProvider() = default; + + [[nodiscard]] virtual int getPixmapCacheSize() const = 0; + [[nodiscard]] virtual int getNetworkCacheSizeInMB() const = 0; + [[nodiscard]] virtual int getRedirectCacheTtl() const = 0; +}; + +#endif // COCKATRICE_INTERFACE_CACHE_STORAGE_SETTINGS_PROVIDER_H diff --git a/libcockatrice_interfaces/libcockatrice/interfaces/interface_cards_display_settings_provider.h b/libcockatrice_interfaces/libcockatrice/interfaces/interface_cards_display_settings_provider.h new file mode 100644 index 000000000..2ef9dc87d --- /dev/null +++ b/libcockatrice_interfaces/libcockatrice/interfaces/interface_cards_display_settings_provider.h @@ -0,0 +1,28 @@ +#ifndef COCKATRICE_INTERFACE_CARDS_DISPLAY_SETTINGS_PROVIDER_H +#define COCKATRICE_INTERFACE_CARDS_DISPLAY_SETTINGS_PROVIDER_H + +class ICardsDisplaySettingsProvider +{ +public: + virtual ~ICardsDisplaySettingsProvider() = default; + + [[nodiscard]] virtual bool getDisplayCardNames() const = 0; + [[nodiscard]] virtual bool getRoundCardCorners() const = 0; + [[nodiscard]] virtual bool getOverrideAllCardArtWithPersonalPreference() const = 0; + [[nodiscard]] virtual bool getBumpSetsWithCardsInDeckToTop() const = 0; + [[nodiscard]] virtual int getPrintingSelectorSortOrder() const = 0; + [[nodiscard]] virtual int getPrintingSelectorCardSize() const = 0; + [[nodiscard]] virtual bool getIncludeRebalancedCards() const = 0; + [[nodiscard]] virtual bool getPrintingSelectorNavigationButtonsVisible() const = 0; + [[nodiscard]] virtual bool getDeckEditorBannerCardComboBoxVisible() const = 0; + [[nodiscard]] virtual bool getDeckEditorTagsWidgetVisible() const = 0; + [[nodiscard]] virtual bool getTapAnimation() const = 0; + [[nodiscard]] virtual bool getAutoRotateSidewaysLayoutCards() const = 0; + [[nodiscard]] virtual bool getScaleCards() const = 0; + [[nodiscard]] virtual int getStackCardOverlapPercent() const = 0; + [[nodiscard]] virtual int getCardInfoViewMode() const = 0; + [[nodiscard]] virtual bool getShowShortcuts() const = 0; + [[nodiscard]] virtual bool getShowGameSelectorFilterToolbar() const = 0; +}; + +#endif // COCKATRICE_INTERFACE_CARDS_DISPLAY_SETTINGS_PROVIDER_H diff --git a/libcockatrice_interfaces/libcockatrice/interfaces/interface_chat_settings_provider.h b/libcockatrice_interfaces/libcockatrice/interfaces/interface_chat_settings_provider.h new file mode 100644 index 000000000..cd9ad29e1 --- /dev/null +++ b/libcockatrice_interfaces/libcockatrice/interfaces/interface_chat_settings_provider.h @@ -0,0 +1,26 @@ +#ifndef COCKATRICE_INTERFACE_CHAT_SETTINGS_PROVIDER_H +#define COCKATRICE_INTERFACE_CHAT_SETTINGS_PROVIDER_H + +#include + +class IChatSettingsProvider +{ +public: + virtual ~IChatSettingsProvider() = default; + + [[nodiscard]] virtual bool getChatMention() const = 0; + [[nodiscard]] virtual bool getChatMentionCompleter() const = 0; + [[nodiscard]] virtual QString getChatMentionColor() const = 0; + [[nodiscard]] virtual QString getChatHighlightColor() const = 0; + [[nodiscard]] virtual bool getChatMentionForeground() const = 0; + [[nodiscard]] virtual bool getChatHighlightForeground() const = 0; + [[nodiscard]] virtual bool getIgnoreUnregisteredUsers() const = 0; + [[nodiscard]] virtual bool getIgnoreUnregisteredUserMessages() const = 0; + [[nodiscard]] virtual bool getIgnoreNonBuddyUserMessages() const = 0; + [[nodiscard]] virtual bool getShowMessagePopup() const = 0; + [[nodiscard]] virtual bool getShowMentionPopup() const = 0; + [[nodiscard]] virtual bool getRoomHistory() const = 0; + [[nodiscard]] virtual QString getHighlightWords() const = 0; +}; + +#endif // COCKATRICE_INTERFACE_CHAT_SETTINGS_PROVIDER_H diff --git a/libcockatrice_interfaces/libcockatrice/interfaces/interface_game_settings_provider.h b/libcockatrice_interfaces/libcockatrice/interfaces/interface_game_settings_provider.h new file mode 100644 index 000000000..2b1ddf8ec --- /dev/null +++ b/libcockatrice_interfaces/libcockatrice/interfaces/interface_game_settings_provider.h @@ -0,0 +1,29 @@ +#ifndef COCKATRICE_INTERFACE_GAME_SETTINGS_PROVIDER_H +#define COCKATRICE_INTERFACE_GAME_SETTINGS_PROVIDER_H + +#include + +class IGameSettingsProvider +{ +public: + virtual ~IGameSettingsProvider() = default; + + [[nodiscard]] virtual QString getGameDescription() const = 0; + [[nodiscard]] virtual int getMaxPlayers() const = 0; + [[nodiscard]] virtual QString getGameTypes() const = 0; + [[nodiscard]] virtual bool getOnlyBuddies() const = 0; + [[nodiscard]] virtual bool getOnlyRegistered() const = 0; + [[nodiscard]] virtual bool getSpectatorsAllowed() const = 0; + [[nodiscard]] virtual bool getSpectatorsNeedPassword() const = 0; + [[nodiscard]] virtual bool getSpectatorsCanTalk() const = 0; + [[nodiscard]] virtual bool getSpectatorsCanSeeEverything() const = 0; + [[nodiscard]] virtual bool getCreateGameAsSpectator() const = 0; + [[nodiscard]] virtual int getDefaultStartingLifeTotal() const = 0; + [[nodiscard]] virtual bool getShareDecklistsOnLoad() const = 0; + [[nodiscard]] virtual bool getRememberGameSettings() const = 0; + [[nodiscard]] virtual bool getLocalGameRememberSettings() const = 0; + [[nodiscard]] virtual int getLocalGameMaxPlayers() const = 0; + [[nodiscard]] virtual int getLocalGameStartingLifeTotal() const = 0; +}; + +#endif // COCKATRICE_INTERFACE_GAME_SETTINGS_PROVIDER_H diff --git a/libcockatrice_interfaces/libcockatrice/interfaces/interface_interface_settings_provider.h b/libcockatrice_interfaces/libcockatrice/interfaces/interface_interface_settings_provider.h new file mode 100644 index 000000000..e4c8677c8 --- /dev/null +++ b/libcockatrice_interfaces/libcockatrice/interfaces/interface_interface_settings_provider.h @@ -0,0 +1,43 @@ +#ifndef COCKATRICE_INTERFACE_INTERFACE_SETTINGS_PROVIDER_H +#define COCKATRICE_INTERFACE_INTERFACE_SETTINGS_PROVIDER_H + +#include + +class IInterfaceSettingsProvider +{ +public: + virtual ~IInterfaceSettingsProvider() = default; + + [[nodiscard]] virtual bool getUseTearOffMenus() const = 0; + [[nodiscard]] virtual int getCardViewInitialRowsMax() const = 0; + [[nodiscard]] virtual int getCardViewExpandedRowsMax() const = 0; + [[nodiscard]] virtual bool getCloseEmptyCardView() const = 0; + [[nodiscard]] virtual bool getFocusCardViewSearchBar() const = 0; + [[nodiscard]] virtual bool getKeepGameChatFocus() const = 0; + [[nodiscard]] virtual bool getNotificationsEnabled() const = 0; + [[nodiscard]] virtual bool getSpectatorNotificationsEnabled() const = 0; + [[nodiscard]] virtual bool getBuddyConnectNotificationsEnabled() const = 0; + [[nodiscard]] virtual bool getDoubleClickToPlay() const = 0; + [[nodiscard]] virtual bool getClickPlaysAllSelected() const = 0; + [[nodiscard]] virtual bool getPlayToStack() const = 0; + [[nodiscard]] virtual bool getDoNotDeleteArrowsInSubPhases() const = 0; + [[nodiscard]] virtual int getStartingHandSize() const = 0; + [[nodiscard]] virtual bool getAnnotateTokens() const = 0; + [[nodiscard]] virtual bool getShowDragSelectionCount() const = 0; + [[nodiscard]] virtual bool getShowTotalSelectionCount() const = 0; + [[nodiscard]] virtual int getTallyType() const = 0; + [[nodiscard]] virtual bool getHorizontalHand() const = 0; + [[nodiscard]] virtual bool getInvertVerticalCoordinate() const = 0; + [[nodiscard]] virtual int getMinPlayersForMultiColumnLayout() const = 0; + [[nodiscard]] virtual bool getOpenDeckInNewTab() const = 0; + [[nodiscard]] virtual int getRewindBufferingMs() const = 0; + [[nodiscard]] virtual qreal getFastForwardSpeed() const = 0; + [[nodiscard]] virtual bool getStyleUserList() const = 0; + [[nodiscard]] virtual bool getLeftJustified() const = 0; + [[nodiscard]] virtual int getZoneViewGroupByIndex() const = 0; + [[nodiscard]] virtual int getZoneViewSortByIndex() const = 0; + [[nodiscard]] virtual bool getZoneViewPileView() const = 0; + [[nodiscard]] virtual QString getKnownMissingFeatures() = 0; +}; + +#endif // COCKATRICE_INTERFACE_INTERFACE_SETTINGS_PROVIDER_H diff --git a/libcockatrice_interfaces/libcockatrice/interfaces/interface_paths_settings_provider.h b/libcockatrice_interfaces/libcockatrice/interfaces/interface_paths_settings_provider.h new file mode 100644 index 000000000..d4edc8b81 --- /dev/null +++ b/libcockatrice_interfaces/libcockatrice/interfaces/interface_paths_settings_provider.h @@ -0,0 +1,24 @@ +#ifndef COCKATRICE_INTERFACE_PATHS_SETTINGS_PROVIDER_H +#define COCKATRICE_INTERFACE_PATHS_SETTINGS_PROVIDER_H + +#include + +class IPathsSettingsProvider +{ +public: + virtual ~IPathsSettingsProvider() = default; + + [[nodiscard]] virtual QString getDeckPath() const = 0; + [[nodiscard]] virtual QString getFiltersPath() const = 0; + [[nodiscard]] virtual QString getReplaysPath() const = 0; + [[nodiscard]] virtual QString getPicsPath() const = 0; + [[nodiscard]] virtual QString getCustomPicsPath() const = 0; + [[nodiscard]] virtual QString getThemesPath() const = 0; + [[nodiscard]] virtual QString getCardDatabasePath() const = 0; + [[nodiscard]] virtual QString getCustomCardDatabasePath() const = 0; + [[nodiscard]] virtual QString getTokenDatabasePath() const = 0; + [[nodiscard]] virtual QString getSpoilerCardDatabasePath() const = 0; + [[nodiscard]] virtual QString getRedirectCachePath() const = 0; +}; + +#endif // COCKATRICE_INTERFACE_PATHS_SETTINGS_PROVIDER_H diff --git a/libcockatrice_interfaces/libcockatrice/interfaces/interface_personal_settings_provider.h b/libcockatrice_interfaces/libcockatrice/interfaces/interface_personal_settings_provider.h new file mode 100644 index 000000000..76c8a8367 --- /dev/null +++ b/libcockatrice_interfaces/libcockatrice/interfaces/interface_personal_settings_provider.h @@ -0,0 +1,30 @@ +#ifndef COCKATRICE_INTERFACE_PERSONAL_SETTINGS_PROVIDER_H +#define COCKATRICE_INTERFACE_PERSONAL_SETTINGS_PROVIDER_H + +#include +#include +#include + +class IPersonalSettingsProvider +{ +public: + virtual ~IPersonalSettingsProvider() = default; + + [[nodiscard]] virtual QString getLang() const = 0; + [[nodiscard]] virtual QString getClientID() = 0; + [[nodiscard]] virtual QString getClientVersion() = 0; + [[nodiscard]] virtual int getKeepAlive() const = 0; + [[nodiscard]] virtual int getTimeOut() const = 0; + [[nodiscard]] virtual bool getPicDownload() const = 0; + [[nodiscard]] virtual bool getShowStatusBar() const = 0; + [[nodiscard]] virtual int getMaxFontSize() const = 0; + [[nodiscard]] virtual QString getHighlightWords() const = 0; + [[nodiscard]] virtual QString getHomeTabBackgroundSource() const = 0; + [[nodiscard]] virtual int getHomeTabBackgroundShuffleFrequency() const = 0; + [[nodiscard]] virtual bool getHomeTabDisplayCardName() const = 0; + [[nodiscard]] virtual bool getShowTipsOnStartup() const = 0; + [[nodiscard]] virtual QList getSeenTips() const = 0; + [[nodiscard]] virtual bool getDownloadSpoilersStatus() const = 0; +}; + +#endif // COCKATRICE_INTERFACE_PERSONAL_SETTINGS_PROVIDER_H diff --git a/libcockatrice_interfaces/libcockatrice/interfaces/interface_sound_settings_provider.h b/libcockatrice_interfaces/libcockatrice/interfaces/interface_sound_settings_provider.h new file mode 100644 index 000000000..7bc170d0d --- /dev/null +++ b/libcockatrice_interfaces/libcockatrice/interfaces/interface_sound_settings_provider.h @@ -0,0 +1,16 @@ +#ifndef COCKATRICE_INTERFACE_SOUND_SETTINGS_PROVIDER_H +#define COCKATRICE_INTERFACE_SOUND_SETTINGS_PROVIDER_H + +#include + +class ISoundSettingsProvider +{ +public: + virtual ~ISoundSettingsProvider() = default; + + [[nodiscard]] virtual bool getSoundEnabled() const = 0; + [[nodiscard]] virtual QString getSoundThemeName() const = 0; + [[nodiscard]] virtual int getMasterVolume() const = 0; +}; + +#endif // COCKATRICE_INTERFACE_SOUND_SETTINGS_PROVIDER_H diff --git a/libcockatrice_interfaces/libcockatrice/interfaces/interface_tabs_settings_provider.h b/libcockatrice_interfaces/libcockatrice/interfaces/interface_tabs_settings_provider.h new file mode 100644 index 000000000..4403de569 --- /dev/null +++ b/libcockatrice_interfaces/libcockatrice/interfaces/interface_tabs_settings_provider.h @@ -0,0 +1,18 @@ +#ifndef COCKATRICE_INTERFACE_TABS_SETTINGS_PROVIDER_H +#define COCKATRICE_INTERFACE_TABS_SETTINGS_PROVIDER_H + +class ITabsSettingsProvider +{ +public: + virtual ~ITabsSettingsProvider() = default; + + [[nodiscard]] virtual bool getTabVisualDeckStorageOpen() const = 0; + [[nodiscard]] virtual bool getTabServerOpen() const = 0; + [[nodiscard]] virtual bool getTabAccountOpen() const = 0; + [[nodiscard]] virtual bool getTabDeckStorageOpen() const = 0; + [[nodiscard]] virtual bool getTabReplaysOpen() const = 0; + [[nodiscard]] virtual bool getTabAdminOpen() const = 0; + [[nodiscard]] virtual bool getTabLogOpen() const = 0; +}; + +#endif // COCKATRICE_INTERFACE_TABS_SETTINGS_PROVIDER_H diff --git a/libcockatrice_interfaces/libcockatrice/interfaces/interface_updates_settings_provider.h b/libcockatrice_interfaces/libcockatrice/interfaces/interface_updates_settings_provider.h new file mode 100644 index 000000000..687484c2c --- /dev/null +++ b/libcockatrice_interfaces/libcockatrice/interfaces/interface_updates_settings_provider.h @@ -0,0 +1,23 @@ +#ifndef COCKATRICE_INTERFACE_UPDATES_SETTINGS_PROVIDER_H +#define COCKATRICE_INTERFACE_UPDATES_SETTINGS_PROVIDER_H + +#include + +class IUpdatesSettingsProvider +{ +public: + virtual ~IUpdatesSettingsProvider() = default; + + [[nodiscard]] virtual bool getCheckUpdatesOnStartup() const = 0; + [[nodiscard]] virtual bool getStartupCardUpdateCheckPromptForUpdate() = 0; + [[nodiscard]] virtual bool getStartupCardUpdateCheckAlwaysUpdate() = 0; + [[nodiscard]] virtual int getCardUpdateCheckInterval() const = 0; + [[nodiscard]] virtual QDate getLastCardUpdateCheck() const = 0; + [[nodiscard]] virtual bool getCardUpdateCheckRequired() const = 0; + [[nodiscard]] virtual bool getAlwaysEnableNewSets() const = 0; + [[nodiscard]] virtual bool getNotifyAboutUpdates() const = 0; + [[nodiscard]] virtual bool getNotifyAboutNewVersion() const = 0; + [[nodiscard]] virtual int getUpdateReleaseChannelIndex() const = 0; +}; + +#endif // COCKATRICE_INTERFACE_UPDATES_SETTINGS_PROVIDER_H diff --git a/libcockatrice_interfaces/libcockatrice/interfaces/interface_visual_deck_storage_settings_provider.h b/libcockatrice_interfaces/libcockatrice/interfaces/interface_visual_deck_storage_settings_provider.h new file mode 100644 index 000000000..e5e7fe0d3 --- /dev/null +++ b/libcockatrice_interfaces/libcockatrice/interfaces/interface_visual_deck_storage_settings_provider.h @@ -0,0 +1,37 @@ +#ifndef COCKATRICE_INTERFACE_VISUAL_DECK_STORAGE_SETTINGS_PROVIDER_H +#define COCKATRICE_INTERFACE_VISUAL_DECK_STORAGE_SETTINGS_PROVIDER_H + +#include + +class IVisualDeckStorageSettingsProvider +{ +public: + virtual ~IVisualDeckStorageSettingsProvider() = default; + + [[nodiscard]] virtual int getVisualDeckStorageSortingOrder() const = 0; + [[nodiscard]] virtual bool getVisualDeckStorageShowFolders() const = 0; + [[nodiscard]] virtual bool getVisualDeckStorageShowTagFilter() const = 0; + [[nodiscard]] virtual QStringList getVisualDeckStorageDefaultTagsList() const = 0; + [[nodiscard]] virtual bool getVisualDeckStorageSearchFolderNames() const = 0; + [[nodiscard]] virtual bool getVisualDeckStorageShowColorIdentity() const = 0; + [[nodiscard]] virtual bool getVisualDeckStorageShowBannerCardComboBox() const = 0; + [[nodiscard]] virtual bool getVisualDeckStorageShowTagsOnDeckPreviews() const = 0; + [[nodiscard]] virtual int getVisualDeckStorageCardSize() const = 0; + [[nodiscard]] virtual bool getVisualDeckStorageDrawUnusedColorIdentities() const = 0; + [[nodiscard]] virtual int getVisualDeckStorageUnusedColorIdentitiesOpacity() const = 0; + [[nodiscard]] virtual int getVisualDeckStorageTooltipType() const = 0; + [[nodiscard]] virtual bool getVisualDeckStoragePromptForConversion() const = 0; + [[nodiscard]] virtual bool getVisualDeckStorageAlwaysConvert() const = 0; + [[nodiscard]] virtual bool getVisualDeckStorageInGame() const = 0; + [[nodiscard]] virtual bool getVisualDeckStorageSelectionAnimation() const = 0; + [[nodiscard]] virtual int getVisualDeckEditorCardSize() const = 0; + [[nodiscard]] virtual int getVisualDeckEditorSampleHandSize() const = 0; + [[nodiscard]] virtual int getVisualDatabaseDisplayCardSize() const = 0; + [[nodiscard]] virtual bool getVisualDatabaseDisplayFilterToMostRecentSetsEnabled() const = 0; + [[nodiscard]] virtual int getVisualDatabaseDisplayFilterToMostRecentSetsAmount() const = 0; + [[nodiscard]] virtual int getEDHRecCardSize() const = 0; + [[nodiscard]] virtual int getArchidektPreviewSize() const = 0; + [[nodiscard]] virtual int getDefaultDeckEditorType() const = 0; +}; + +#endif // COCKATRICE_INTERFACE_VISUAL_DECK_STORAGE_SETTINGS_PROVIDER_H diff --git a/libcockatrice_settings/CMakeLists.txt b/libcockatrice_settings/CMakeLists.txt index 3afe6e00a..8f78130bf 100644 --- a/libcockatrice_settings/CMakeLists.txt +++ b/libcockatrice_settings/CMakeLists.txt @@ -3,16 +3,28 @@ set(CMAKE_AUTOUIC ON) set(CMAKE_AUTORCC ON) set(HEADERS + libcockatrice/settings/cache_storage_settings.h libcockatrice/settings/card_database_settings.h libcockatrice/settings/card_override_settings.h + libcockatrice/settings/cards_display_settings.h + libcockatrice/settings/chat_settings.h libcockatrice/settings/debug_settings.h libcockatrice/settings/download_settings.h libcockatrice/settings/game_filters_settings.h + libcockatrice/settings/game_settings.h + libcockatrice/settings/interface_settings.h libcockatrice/settings/layouts_settings.h libcockatrice/settings/message_settings.h + libcockatrice/settings/paths_settings.h + libcockatrice/settings/personal_settings.h libcockatrice/settings/recents_settings.h libcockatrice/settings/servers_settings.h libcockatrice/settings/settings_manager.h + libcockatrice/settings/settings_migration.h + libcockatrice/settings/sound_settings.h + libcockatrice/settings/tabs_settings.h + libcockatrice/settings/updates_settings.h + libcockatrice/settings/visual_deck_storage_settings.h ) if(Qt6_FOUND) @@ -24,16 +36,28 @@ endif() add_library( libcockatrice_settings STATIC ${MOC_SOURCES} + libcockatrice/settings/cache_storage_settings.cpp libcockatrice/settings/card_database_settings.cpp libcockatrice/settings/card_override_settings.cpp + libcockatrice/settings/cards_display_settings.cpp + libcockatrice/settings/chat_settings.cpp libcockatrice/settings/debug_settings.cpp libcockatrice/settings/download_settings.cpp libcockatrice/settings/game_filters_settings.cpp + libcockatrice/settings/game_settings.cpp + libcockatrice/settings/interface_settings.cpp libcockatrice/settings/layouts_settings.cpp libcockatrice/settings/message_settings.cpp + libcockatrice/settings/paths_settings.cpp + libcockatrice/settings/personal_settings.cpp libcockatrice/settings/recents_settings.cpp libcockatrice/settings/servers_settings.cpp libcockatrice/settings/settings_manager.cpp + libcockatrice/settings/settings_migration.cpp + libcockatrice/settings/sound_settings.cpp + libcockatrice/settings/tabs_settings.cpp + libcockatrice/settings/updates_settings.cpp + libcockatrice/settings/visual_deck_storage_settings.cpp ) target_include_directories( diff --git a/libcockatrice_settings/libcockatrice/settings/cache_storage_settings.cpp b/libcockatrice_settings/libcockatrice/settings/cache_storage_settings.cpp new file mode 100644 index 000000000..c1fd87ceb --- /dev/null +++ b/libcockatrice_settings/libcockatrice/settings/cache_storage_settings.cpp @@ -0,0 +1,62 @@ +#include "cache_storage_settings.h" + +CacheStorageSettings::CacheStorageSettings(const QString &settingPath, QObject *parent) + : SettingsManager(settingPath + "cache_storage.ini", "personal", QString(), parent) +{ +} + +int CacheStorageSettings::getPixmapCacheSize() const +{ + return getValue("pixmapCacheSize", QString(), QString(), PIXMAPCACHE_SIZE_DEFAULT).toInt(); +} + +int CacheStorageSettings::getNetworkCacheSizeInMB() const +{ + return getValue("networkCacheSize", QString(), QString(), NETWORK_CACHE_SIZE_DEFAULT).toInt(); +} + +int CacheStorageSettings::getRedirectCacheTtl() const +{ + return getValue("redirectCacheTtl", QString(), QString(), NETWORK_REDIRECT_CACHE_TTL_DEFAULT).toInt(); +} + +int CacheStorageSettings::getCardPictureLoaderCacheMethod() const +{ + return getValue("cardPictureLoaderCacheMethod", QString(), QString(), 0).toInt(); +} + +int CacheStorageSettings::getLocalCardImageStorageNamingScheme() const +{ + return getValue("localCardImageStorageNamingScheme", QString(), QString(), LOCAL_CARD_IMAGE_NAMING_SCHEME_DEFAULT) + .toInt(); +} + +void CacheStorageSettings::setPixmapCacheSize(int _pixmapCacheSize) +{ + setValue(_pixmapCacheSize, "pixmapCacheSize"); + emit pixmapCacheSizeChanged(_pixmapCacheSize); +} + +void CacheStorageSettings::setNetworkCacheSizeInMB(int _networkCacheSize) +{ + setValue(_networkCacheSize, "networkCacheSize"); + emit networkCacheSizeChanged(_networkCacheSize); +} + +void CacheStorageSettings::setNetworkRedirectCacheTtl(int _redirectCacheTtl) +{ + setValue(_redirectCacheTtl, "redirectCacheTtl"); + emit redirectCacheTtlChanged(_redirectCacheTtl); +} + +void CacheStorageSettings::setCardImageCacheMethod(int _cardImageCachingMethod) +{ + setValue(_cardImageCachingMethod, "cardPictureLoaderCacheMethod"); + emit cardPictureLoaderCacheMethodChanged(_cardImageCachingMethod); +} + +void CacheStorageSettings::setLocalCardImageStorageNamingScheme(int _localCardImageStorageNamingScheme) +{ + setValue(_localCardImageStorageNamingScheme, "localCardImageStorageNamingScheme"); + emit localCardImageStorageNamingSchemeChanged(_localCardImageStorageNamingScheme); +} diff --git a/libcockatrice_settings/libcockatrice/settings/cache_storage_settings.h b/libcockatrice_settings/libcockatrice/settings/cache_storage_settings.h new file mode 100644 index 000000000..4a4e73461 --- /dev/null +++ b/libcockatrice_settings/libcockatrice/settings/cache_storage_settings.h @@ -0,0 +1,57 @@ +#ifndef CACHE_STORAGE_SETTINGS_H +#define CACHE_STORAGE_SETTINGS_H + +#include "settings_manager.h" + +#include + +// In MB (Increments of 64) +#define PIXMAPCACHE_SIZE_DEFAULT 2048 +#define PIXMAPCACHE_SIZE_MIN 64 +#define PIXMAPCACHE_SIZE_MAX 4096 + +// In MB +constexpr int NETWORK_CACHE_SIZE_DEFAULT = 1024 * 4; // 4 GB +constexpr int NETWORK_CACHE_SIZE_MIN = 1; // 1 MB +constexpr int NETWORK_CACHE_SIZE_MAX = 1024 * 1024; // 1 TB + +#define LOCAL_CARD_IMAGE_NAMING_SCHEME_DEFAULT 6 + +// In Days +#define NETWORK_REDIRECT_CACHE_TTL_DEFAULT 30 +#define NETWORK_REDIRECT_CACHE_TTL_MIN 1 +#define NETWORK_REDIRECT_CACHE_TTL_MAX 90 + +class CacheStorageSettings : public SettingsManager, public ICacheStorageSettingsProvider +{ + Q_OBJECT + friend class SettingsCache; + +public: + [[nodiscard]] int getPixmapCacheSize() const override; + [[nodiscard]] int getNetworkCacheSizeInMB() const override; + [[nodiscard]] int getRedirectCacheTtl() const override; + [[nodiscard]] int getCardPictureLoaderCacheMethod() const; + [[nodiscard]] int getLocalCardImageStorageNamingScheme() const; + + void setPixmapCacheSize(int _pixmapCacheSize); + void setNetworkCacheSizeInMB(int _networkCacheSize); + void setNetworkRedirectCacheTtl(int _redirectCacheTtl); + void setCardImageCacheMethod(int _cardImageCachingMethod); + void setLocalCardImageStorageNamingScheme(int _scheme); + +signals: + void pixmapCacheSizeChanged(int newSizeInMBs); + void networkCacheSizeChanged(int newSizeInMBs); + void redirectCacheTtlChanged(int newTtl); + void cardPictureLoaderCacheMethodChanged(int cardPictureLoaderCacheMethod); + void localCardImageStorageNamingSchemeChanged(int localCardImageStorageNamingScheme); + +public: + explicit CacheStorageSettings(const QString &settingPath, QObject *parent = nullptr); + +private: + CacheStorageSettings(const CacheStorageSettings & /*other*/); +}; + +#endif // CACHE_STORAGE_SETTINGS_H diff --git a/libcockatrice_settings/libcockatrice/settings/cards_display_settings.cpp b/libcockatrice_settings/libcockatrice/settings/cards_display_settings.cpp new file mode 100644 index 000000000..968a67142 --- /dev/null +++ b/libcockatrice_settings/libcockatrice/settings/cards_display_settings.cpp @@ -0,0 +1,193 @@ +#include "cards_display_settings.h" + +CardsDisplaySettings::CardsDisplaySettings(const QString &settingPath, QObject *parent) + : SettingsManager(settingPath + "cards_display.ini", "cards", QString(), parent) +{ +} + +bool CardsDisplaySettings::getDisplayCardNames() const +{ + return getValue("displaycardnames", QString(), QString(), true).toBool(); +} + +bool CardsDisplaySettings::getRoundCardCorners() const +{ + return getValue("roundcardcorners", QString(), QString(), true).toBool(); +} + +bool CardsDisplaySettings::getOverrideAllCardArtWithPersonalPreference() const +{ + return getValue("overrideallcardartwithpersonalpreference", QString(), QString(), false).toBool(); +} + +bool CardsDisplaySettings::getBumpSetsWithCardsInDeckToTop() const +{ + return getValue("bumpsetswithcardsindecktotop", QString(), QString(), true).toBool(); +} + +int CardsDisplaySettings::getPrintingSelectorSortOrder() const +{ + return getValue("printingselectorsortorder", QString(), QString(), 1).toInt(); +} + +int CardsDisplaySettings::getPrintingSelectorCardSize() const +{ + return getValue("printingselectorcardsize", QString(), QString(), 100).toInt(); +} + +bool CardsDisplaySettings::getIncludeRebalancedCards() const +{ + return getValue("includerebalancedcards", QString(), QString(), true).toBool(); +} + +bool CardsDisplaySettings::getPrintingSelectorNavigationButtonsVisible() const +{ + return getValue("printingselectornavigationbuttonsvisible", QString(), QString(), true).toBool(); +} + +bool CardsDisplaySettings::getDeckEditorBannerCardComboBoxVisible() const +{ + return getValue("deckeditorbannercardcomboboxvisible", "interface", QString(), true).toBool(); +} + +bool CardsDisplaySettings::getDeckEditorTagsWidgetVisible() const +{ + return getValue("deckeditortagswidgetvisible", "interface", QString(), true).toBool(); +} + +bool CardsDisplaySettings::getTapAnimation() const +{ + return getValue("tapanimation", QString(), QString(), true).toBool(); +} + +bool CardsDisplaySettings::getAutoRotateSidewaysLayoutCards() const +{ + return getValue("autorotatesidewayslayoutcards", QString(), QString(), true).toBool(); +} + +bool CardsDisplaySettings::getScaleCards() const +{ + return getValue("scaleCards", QString(), QString(), true).toBool(); +} + +int CardsDisplaySettings::getStackCardOverlapPercent() const +{ + return getValue("verticalCardOverlapPercent", QString(), QString(), 33).toInt(); +} + +int CardsDisplaySettings::getCardInfoViewMode() const +{ + return getValue("cardinfoviewmode", QString(), QString(), 0).toInt(); +} + +bool CardsDisplaySettings::getShowShortcuts() const +{ + return getValue("showshortcuts", "menu", QString(), true).toBool(); +} + +bool CardsDisplaySettings::getShowGameSelectorFilterToolbar() const +{ + return getValue("showgameselectorfiltertoolbar", "menu", QString(), true).toBool(); +} + +void CardsDisplaySettings::setDisplayCardNames(bool _displayCardNames) +{ + setValue(_displayCardNames, "displaycardnames"); + emit displayCardNamesChanged(); +} + +void CardsDisplaySettings::setRoundCardCorners(bool _roundCardCorners) +{ + if (_roundCardCorners == getRoundCardCorners()) { + return; + } + setValue(_roundCardCorners, "roundcardcorners"); + emit roundCardCornersChanged(_roundCardCorners); +} + +void CardsDisplaySettings::setOverrideAllCardArtWithPersonalPreference(bool _overrideAllCardArt) +{ + setValue(_overrideAllCardArt, "overrideallcardartwithpersonalpreference"); + emit overrideAllCardArtWithPersonalPreferenceChanged(_overrideAllCardArt); +} + +void CardsDisplaySettings::setBumpSetsWithCardsInDeckToTop(bool _bumpSetsWithCardsInDeckToTop) +{ + setValue(_bumpSetsWithCardsInDeckToTop, "bumpsetswithcardsindecktotop"); + emit bumpSetsWithCardsInDeckToTopChanged(); +} + +void CardsDisplaySettings::setPrintingSelectorSortOrder(int _printingSelectorSortOrder) +{ + setValue(_printingSelectorSortOrder, "printingselectorsortorder"); + emit printingSelectorSortOrderChanged(); +} + +void CardsDisplaySettings::setPrintingSelectorCardSize(int _printingSelectorCardSize) +{ + setValue(_printingSelectorCardSize, "printingselectorcardsize"); + emit printingSelectorCardSizeChanged(); +} + +void CardsDisplaySettings::setIncludeRebalancedCards(bool _includeRebalancedCards) +{ + if (_includeRebalancedCards == getIncludeRebalancedCards()) { + return; + } + setValue(_includeRebalancedCards, "includerebalancedcards"); + emit includeRebalancedCardsChanged(_includeRebalancedCards); +} + +void CardsDisplaySettings::setPrintingSelectorNavigationButtonsVisible(bool _navigationButtonsVisible) +{ + setValue(_navigationButtonsVisible, "printingselectornavigationbuttonsvisible"); + emit printingSelectorNavigationButtonsVisibleChanged(); +} + +void CardsDisplaySettings::setDeckEditorBannerCardComboBoxVisible(bool _deckEditorBannerCardComboBoxVisible) +{ + setValue(_deckEditorBannerCardComboBoxVisible, "deckeditorbannercardcomboboxvisible", "interface"); + emit deckEditorBannerCardComboBoxVisibleChanged(_deckEditorBannerCardComboBoxVisible); +} + +void CardsDisplaySettings::setDeckEditorTagsWidgetVisible(bool _deckEditorTagsWidgetVisible) +{ + setValue(_deckEditorTagsWidgetVisible, "deckeditortagswidgetvisible", "interface"); + emit deckEditorTagsWidgetVisibleChanged(_deckEditorTagsWidgetVisible); +} + +void CardsDisplaySettings::setTapAnimation(bool _tapAnimation) +{ + setValue(_tapAnimation, "tapanimation"); +} + +void CardsDisplaySettings::setAutoRotateSidewaysLayoutCards(bool _autoRotateSidewaysLayoutCards) +{ + setValue(_autoRotateSidewaysLayoutCards, "autorotatesidewayslayoutcards"); +} + +void CardsDisplaySettings::setCardScaling(bool _scaleCards) +{ + setValue(_scaleCards, "scaleCards"); +} + +void CardsDisplaySettings::setStackCardOverlapPercent(int _verticalCardOverlapPercent) +{ + setValue(_verticalCardOverlapPercent, "verticalCardOverlapPercent"); +} + +void CardsDisplaySettings::setCardInfoViewMode(int _viewMode) +{ + setValue(_viewMode, "cardinfoviewmode"); +} + +void CardsDisplaySettings::setShowShortcuts(bool _showShortcuts) +{ + setValue(_showShortcuts, "showshortcuts", "menu"); +} + +void CardsDisplaySettings::setShowGameSelectorFilterToolbar(bool _showGameSelectorFilterToolbar) +{ + setValue(_showGameSelectorFilterToolbar, "showgameselectorfiltertoolbar", "menu"); + emit showGameSelectorFilterToolbarChanged(_showGameSelectorFilterToolbar); +} diff --git a/libcockatrice_settings/libcockatrice/settings/cards_display_settings.h b/libcockatrice_settings/libcockatrice/settings/cards_display_settings.h new file mode 100644 index 000000000..78480dd74 --- /dev/null +++ b/libcockatrice_settings/libcockatrice/settings/cards_display_settings.h @@ -0,0 +1,68 @@ +#ifndef CARDS_DISPLAY_SETTINGS_H +#define CARDS_DISPLAY_SETTINGS_H + +#include "settings_manager.h" + +#include + +class CardsDisplaySettings : public SettingsManager, public ICardsDisplaySettingsProvider +{ + Q_OBJECT + friend class SettingsCache; + +public: + [[nodiscard]] bool getDisplayCardNames() const override; + [[nodiscard]] bool getRoundCardCorners() const override; + [[nodiscard]] bool getOverrideAllCardArtWithPersonalPreference() const override; + [[nodiscard]] bool getBumpSetsWithCardsInDeckToTop() const override; + [[nodiscard]] int getPrintingSelectorSortOrder() const override; + [[nodiscard]] int getPrintingSelectorCardSize() const override; + [[nodiscard]] bool getIncludeRebalancedCards() const override; + [[nodiscard]] bool getPrintingSelectorNavigationButtonsVisible() const override; + [[nodiscard]] bool getDeckEditorBannerCardComboBoxVisible() const override; + [[nodiscard]] bool getDeckEditorTagsWidgetVisible() const override; + [[nodiscard]] bool getTapAnimation() const override; + [[nodiscard]] bool getAutoRotateSidewaysLayoutCards() const override; + [[nodiscard]] bool getScaleCards() const override; + [[nodiscard]] int getStackCardOverlapPercent() const override; + [[nodiscard]] int getCardInfoViewMode() const override; + [[nodiscard]] bool getShowShortcuts() const override; + [[nodiscard]] bool getShowGameSelectorFilterToolbar() const override; + + void setDisplayCardNames(bool _displayCardNames); + void setRoundCardCorners(bool _roundCardCorners); + void setOverrideAllCardArtWithPersonalPreference(bool _overrideAllCardArt); + void setBumpSetsWithCardsInDeckToTop(bool _bumpSetsWithCardsInDeckToTop); + void setPrintingSelectorSortOrder(int _printingSelectorSortOrder); + void setPrintingSelectorCardSize(int _printingSelectorCardSize); + void setIncludeRebalancedCards(bool _includeRebalancedCards); + void setPrintingSelectorNavigationButtonsVisible(bool _navigationButtonsVisible); + void setDeckEditorBannerCardComboBoxVisible(bool _deckEditorBannerCardComboBoxVisible); + void setDeckEditorTagsWidgetVisible(bool _deckEditorTagsWidgetVisible); + void setTapAnimation(bool _tapAnimation); + void setAutoRotateSidewaysLayoutCards(bool _autoRotateSidewaysLayoutCards); + void setCardScaling(bool _scaleCards); + void setStackCardOverlapPercent(int _verticalCardOverlapPercent); + void setCardInfoViewMode(int _viewMode); + void setShowShortcuts(bool _showShortcuts); + void setShowGameSelectorFilterToolbar(bool _showGameSelectorFilterToolbar); + +signals: + void displayCardNamesChanged(); + void roundCardCornersChanged(bool roundCardCorners); + void overrideAllCardArtWithPersonalPreferenceChanged(bool _overrideAllCardArtWithPersonalPreference); + void bumpSetsWithCardsInDeckToTopChanged(); + void printingSelectorSortOrderChanged(); + void printingSelectorCardSizeChanged(); + void includeRebalancedCardsChanged(bool _includeRebalancedCards); + void printingSelectorNavigationButtonsVisibleChanged(); + void deckEditorBannerCardComboBoxVisibleChanged(bool _visible); + void deckEditorTagsWidgetVisibleChanged(bool _visible); + void showGameSelectorFilterToolbarChanged(bool state); + +private: + explicit CardsDisplaySettings(const QString &settingPath, QObject *parent = nullptr); + CardsDisplaySettings(const CardsDisplaySettings & /*other*/); +}; + +#endif // CARDS_DISPLAY_SETTINGS_H diff --git a/libcockatrice_settings/libcockatrice/settings/chat_settings.cpp b/libcockatrice_settings/libcockatrice/settings/chat_settings.cpp new file mode 100644 index 000000000..e4069a1d4 --- /dev/null +++ b/libcockatrice_settings/libcockatrice/settings/chat_settings.cpp @@ -0,0 +1,137 @@ +#include "chat_settings.h" + +ChatSettings::ChatSettings(const QString &settingPath, QObject *parent) + : SettingsManager(settingPath + "chat.ini", "chat", QString(), parent) +{ +} + +bool ChatSettings::getChatMention() const +{ + return getValue("mention", QString(), QString(), true).toBool(); +} + +bool ChatSettings::getChatMentionCompleter() const +{ + return getValue("mentioncompleter", QString(), QString(), true).toBool(); +} + +QString ChatSettings::getChatMentionColor() const +{ + return getValue("mentioncolor", QString(), QString(), "A6120D").toString(); +} + +QString ChatSettings::getChatHighlightColor() const +{ + return getValue("highlightcolor", QString(), QString(), "A6120D").toString(); +} + +bool ChatSettings::getChatMentionForeground() const +{ + return getValue("mentionforeground", QString(), QString(), true).toBool(); +} + +bool ChatSettings::getChatHighlightForeground() const +{ + return getValue("highlightforeground", QString(), QString(), true).toBool(); +} + +bool ChatSettings::getIgnoreUnregisteredUsers() const +{ + return getValue("ignore_unregistered").toBool(); +} + +bool ChatSettings::getIgnoreUnregisteredUserMessages() const +{ + return getValue("ignore_unregistered_messages").toBool(); +} + +bool ChatSettings::getIgnoreNonBuddyUserMessages() const +{ + return getValue("ignore_nonbuddy_messages").toBool(); +} + +bool ChatSettings::getShowMessagePopup() const +{ + return getValue("showmessagepopups", QString(), QString(), true).toBool(); +} + +bool ChatSettings::getShowMentionPopup() const +{ + return getValue("showmentionpopups", QString(), QString(), true).toBool(); +} + +bool ChatSettings::getRoomHistory() const +{ + return getValue("roomhistory", QString(), QString(), true).toBool(); +} + +QString ChatSettings::getHighlightWords() const +{ + return getValue("highlightwords").toString(); +} + +void ChatSettings::setChatMention(bool _chatMention) +{ + setValue(_chatMention, "mention"); +} + +void ChatSettings::setChatMentionCompleter(bool _chatMentionCompleter) +{ + setValue(_chatMentionCompleter, "mentioncompleter"); + emit chatMentionCompleterChanged(); +} + +void ChatSettings::setChatMentionColor(const QString &_chatMentionColor) +{ + setValue(_chatMentionColor, "mentioncolor"); +} + +void ChatSettings::setChatHighlightColor(const QString &_chatHighlightColor) +{ + setValue(_chatHighlightColor, "highlightcolor"); +} + +void ChatSettings::setChatMentionForeground(bool _chatMentionForeground) +{ + setValue(_chatMentionForeground, "mentionforeground"); +} + +void ChatSettings::setChatHighlightForeground(bool _chatHighlightForeground) +{ + setValue(_chatHighlightForeground, "highlightforeground"); +} + +void ChatSettings::setIgnoreUnregisteredUsers(bool _ignoreUnregisteredUsers) +{ + setValue(_ignoreUnregisteredUsers, "ignore_unregistered"); +} + +void ChatSettings::setIgnoreUnregisteredUserMessages(bool _ignoreUnregisteredUserMessages) +{ + setValue(_ignoreUnregisteredUserMessages, "ignore_unregistered_messages"); +} + +void ChatSettings::setIgnoreNonBuddyUserMessages(bool _ignoreNonBuddyUserMessages) +{ + setValue(_ignoreNonBuddyUserMessages, "ignore_nonbuddy_messages"); +} + +void ChatSettings::setShowMessagePopups(bool _showMessagePopups) +{ + setValue(_showMessagePopups, "showmessagepopups"); +} + +void ChatSettings::setShowMentionPopups(bool _showMentionPopups) +{ + setValue(_showMentionPopups, "showmentionpopups"); +} + +void ChatSettings::setRoomHistory(bool _roomHistory) +{ + setValue(_roomHistory, "roomhistory"); +} + +void ChatSettings::setHighlightWords(const QString &_highlightWords) +{ + setValue(_highlightWords, "highlightwords"); +} diff --git a/libcockatrice_settings/libcockatrice/settings/chat_settings.h b/libcockatrice_settings/libcockatrice/settings/chat_settings.h new file mode 100644 index 000000000..7cf4be3f6 --- /dev/null +++ b/libcockatrice_settings/libcockatrice/settings/chat_settings.h @@ -0,0 +1,52 @@ +#ifndef CHAT_SETTINGS_H +#define CHAT_SETTINGS_H + +#include "settings_manager.h" + +#include + +class ChatSettings : public SettingsManager, public IChatSettingsProvider +{ + Q_OBJECT + friend class SettingsCache; + +public: + [[nodiscard]] bool getChatMention() const override; + [[nodiscard]] bool getChatMentionCompleter() const override; + [[nodiscard]] QString getChatMentionColor() const override; + [[nodiscard]] QString getChatHighlightColor() const override; + [[nodiscard]] bool getChatMentionForeground() const override; + [[nodiscard]] bool getChatHighlightForeground() const override; + [[nodiscard]] bool getIgnoreUnregisteredUsers() const override; + [[nodiscard]] bool getIgnoreUnregisteredUserMessages() const override; + [[nodiscard]] bool getIgnoreNonBuddyUserMessages() const override; + [[nodiscard]] bool getShowMessagePopup() const override; + [[nodiscard]] bool getShowMentionPopup() const override; + [[nodiscard]] bool getRoomHistory() const override; + [[nodiscard]] QString getHighlightWords() const override; + + void setChatMention(bool _chatMention); + void setChatMentionCompleter(bool _chatMentionCompleter); + void setChatMentionColor(const QString &_chatMentionColor); + void setChatHighlightColor(const QString &_chatHighlightColor); + void setChatMentionForeground(bool _chatMentionForeground); + void setChatHighlightForeground(bool _chatHighlightForeground); + void setIgnoreUnregisteredUsers(bool _ignoreUnregisteredUsers); + void setIgnoreUnregisteredUserMessages(bool _ignoreUnregisteredUserMessages); + void setIgnoreNonBuddyUserMessages(bool _ignoreNonBuddyUserMessages); + void setShowMessagePopups(bool _showMessagePopups); + void setShowMentionPopups(bool _showMentionPopups); + void setRoomHistory(bool _roomHistory); + void setHighlightWords(const QString &_highlightWords); + +signals: + void chatMentionCompleterChanged(); + +public: + explicit ChatSettings(const QString &settingPath, QObject *parent = nullptr); + +private: + ChatSettings(const ChatSettings & /*other*/); +}; + +#endif // CHAT_SETTINGS_H diff --git a/libcockatrice_settings/libcockatrice/settings/game_settings.cpp b/libcockatrice_settings/libcockatrice/settings/game_settings.cpp new file mode 100644 index 000000000..c8d19f801 --- /dev/null +++ b/libcockatrice_settings/libcockatrice/settings/game_settings.cpp @@ -0,0 +1,166 @@ +#include "game_settings.h" + +GameSettings::GameSettings(const QString &settingPath, QObject *parent) + : SettingsManager(settingPath + "game.ini", QString(), QString(), parent) +{ +} + +QString GameSettings::getGameDescription() const +{ + return getValue("gamedescription", "game").toString(); +} + +int GameSettings::getMaxPlayers() const +{ + return getValue("maxplayers", "game", QString(), 2).toInt(); +} + +QString GameSettings::getGameTypes() const +{ + return getValue("gametypes", "game").toString(); +} + +bool GameSettings::getOnlyBuddies() const +{ + return getValue("onlybuddies", "game").toBool(); +} + +bool GameSettings::getOnlyRegistered() const +{ + return getValue("onlyregistered", "game").toBool(); +} + +bool GameSettings::getSpectatorsAllowed() const +{ + return getValue("spectatorsallowed", "game").toBool(); +} + +bool GameSettings::getSpectatorsNeedPassword() const +{ + return getValue("spectatorsneedpassword", "game").toBool(); +} + +bool GameSettings::getSpectatorsCanTalk() const +{ + return getValue("spectatorscantalk", "game").toBool(); +} + +bool GameSettings::getSpectatorsCanSeeEverything() const +{ + return getValue("spectatorscanseeeverything", "game").toBool(); +} + +bool GameSettings::getCreateGameAsSpectator() const +{ + return getValue("creategameasspectator", "game").toBool(); +} + +int GameSettings::getDefaultStartingLifeTotal() const +{ + return getValue("defaultstartinglifetotal", "game", QString(), 20).toInt(); +} + +bool GameSettings::getShareDecklistsOnLoad() const +{ + return getValue("sharedecklistsonload", "game").toBool(); +} + +bool GameSettings::getRememberGameSettings() const +{ + return getValue("remembergamesettings", "game", QString(), true).toBool(); +} + +bool GameSettings::getLocalGameRememberSettings() const +{ + return getValue("remembersettings", "localgameoptions").toBool(); +} + +int GameSettings::getLocalGameMaxPlayers() const +{ + return getValue("maxplayers", "localgameoptions", QString(), 1).toInt(); +} + +int GameSettings::getLocalGameStartingLifeTotal() const +{ + return getValue("startinglifetotal", "localgameoptions", QString(), 20).toInt(); +} + +void GameSettings::setGameDescription(const QString &_gameDescription) +{ + setValue(_gameDescription, "gamedescription", "game"); +} + +void GameSettings::setMaxPlayers(int _maxPlayers) +{ + setValue(_maxPlayers, "maxplayers", "game"); +} + +void GameSettings::setGameTypes(const QString &_gameTypes) +{ + setValue(_gameTypes, "gametypes", "game"); +} + +void GameSettings::setOnlyBuddies(bool _onlyBuddies) +{ + setValue(_onlyBuddies, "onlybuddies", "game"); +} + +void GameSettings::setOnlyRegistered(bool _onlyRegistered) +{ + setValue(_onlyRegistered, "onlyregistered", "game"); +} + +void GameSettings::setSpectatorsAllowed(bool _spectatorsAllowed) +{ + setValue(_spectatorsAllowed, "spectatorsallowed", "game"); +} + +void GameSettings::setSpectatorsNeedPassword(bool _spectatorsNeedPassword) +{ + setValue(_spectatorsNeedPassword, "spectatorsneedpassword", "game"); +} + +void GameSettings::setSpectatorsCanTalk(bool _spectatorsCanTalk) +{ + setValue(_spectatorsCanTalk, "spectatorscantalk", "game"); +} + +void GameSettings::setSpectatorsCanSeeEverything(bool _spectatorsCanSeeEverything) +{ + setValue(_spectatorsCanSeeEverything, "spectatorscanseeeverything", "game"); +} + +void GameSettings::setCreateGameAsSpectator(bool _createGameAsSpectator) +{ + setValue(_createGameAsSpectator, "creategameasspectator", "game"); +} + +void GameSettings::setDefaultStartingLifeTotal(int _defaultStartingLifeTotal) +{ + setValue(_defaultStartingLifeTotal, "defaultstartinglifetotal", "game"); +} + +void GameSettings::setShareDecklistsOnLoad(bool _shareDecklistsOnLoad) +{ + setValue(_shareDecklistsOnLoad, "sharedecklistsonload", "game"); +} + +void GameSettings::setRememberGameSettings(bool _rememberGameSettings) +{ + setValue(_rememberGameSettings, "remembergamesettings", "game"); +} + +void GameSettings::setLocalGameRememberSettings(bool value) +{ + setValue(value, "remembersettings", "localgameoptions"); +} + +void GameSettings::setLocalGameMaxPlayers(int value) +{ + setValue(value, "maxplayers", "localgameoptions"); +} + +void GameSettings::setLocalGameStartingLifeTotal(int value) +{ + setValue(value, "startinglifetotal", "localgameoptions"); +} diff --git a/libcockatrice_settings/libcockatrice/settings/game_settings.h b/libcockatrice_settings/libcockatrice/settings/game_settings.h new file mode 100644 index 000000000..e0a484bac --- /dev/null +++ b/libcockatrice_settings/libcockatrice/settings/game_settings.h @@ -0,0 +1,55 @@ +#ifndef GAME_SETTINGS_H +#define GAME_SETTINGS_H + +#include "settings_manager.h" + +#include + +class GameSettings : public SettingsManager, public IGameSettingsProvider +{ + Q_OBJECT + friend class SettingsCache; + +public: + [[nodiscard]] QString getGameDescription() const override; + [[nodiscard]] int getMaxPlayers() const override; + [[nodiscard]] QString getGameTypes() const override; + [[nodiscard]] bool getOnlyBuddies() const override; + [[nodiscard]] bool getOnlyRegistered() const override; + [[nodiscard]] bool getSpectatorsAllowed() const override; + [[nodiscard]] bool getSpectatorsNeedPassword() const override; + [[nodiscard]] bool getSpectatorsCanTalk() const override; + [[nodiscard]] bool getSpectatorsCanSeeEverything() const override; + [[nodiscard]] bool getCreateGameAsSpectator() const override; + [[nodiscard]] int getDefaultStartingLifeTotal() const override; + [[nodiscard]] bool getShareDecklistsOnLoad() const override; + [[nodiscard]] bool getRememberGameSettings() const override; + [[nodiscard]] bool getLocalGameRememberSettings() const override; + [[nodiscard]] int getLocalGameMaxPlayers() const override; + [[nodiscard]] int getLocalGameStartingLifeTotal() const override; + + void setGameDescription(const QString &_gameDescription); + void setMaxPlayers(int _maxPlayers); + void setGameTypes(const QString &_gameTypes); + void setOnlyBuddies(bool _onlyBuddies); + void setOnlyRegistered(bool _onlyRegistered); + void setSpectatorsAllowed(bool _spectatorsAllowed); + void setSpectatorsNeedPassword(bool _spectatorsNeedPassword); + void setSpectatorsCanTalk(bool _spectatorsCanTalk); + void setSpectatorsCanSeeEverything(bool _spectatorsCanSeeEverything); + void setCreateGameAsSpectator(bool _createGameAsSpectator); + void setDefaultStartingLifeTotal(int _defaultStartingLifeTotal); + void setShareDecklistsOnLoad(bool _shareDecklistsOnLoad); + void setRememberGameSettings(bool _rememberGameSettings); + void setLocalGameRememberSettings(bool value); + void setLocalGameMaxPlayers(int value); + void setLocalGameStartingLifeTotal(int value); + +public: + explicit GameSettings(const QString &settingPath, QObject *parent = nullptr); + +private: + GameSettings(const GameSettings & /*other*/); +}; + +#endif // GAME_SETTINGS_H diff --git a/libcockatrice_settings/libcockatrice/settings/interface_settings.cpp b/libcockatrice_settings/libcockatrice/settings/interface_settings.cpp new file mode 100644 index 000000000..b0d1d523d --- /dev/null +++ b/libcockatrice_settings/libcockatrice/settings/interface_settings.cpp @@ -0,0 +1,317 @@ +#include "interface_settings.h" + +InterfaceSettings::InterfaceSettings(const QString &settingPath, QObject *parent) + : SettingsManager(settingPath + "interface.ini", "interface", QString(), parent) +{ +} + +bool InterfaceSettings::getUseTearOffMenus() const +{ + return getValue("usetearoffmenus", QString(), QString(), true).toBool(); +} + +int InterfaceSettings::getCardViewInitialRowsMax() const +{ + return getValue("cardViewInitialRowsMax", QString(), QString(), 14).toInt(); +} + +int InterfaceSettings::getCardViewExpandedRowsMax() const +{ + return getValue("cardViewExpandedRowsMax", QString(), QString(), 20).toInt(); +} + +bool InterfaceSettings::getCloseEmptyCardView() const +{ + return getValue("closeEmptyCardView", QString(), QString(), true).toBool(); +} + +bool InterfaceSettings::getFocusCardViewSearchBar() const +{ + return getValue("focusCardViewSearchBar", QString(), QString(), true).toBool(); +} + +bool InterfaceSettings::getKeepGameChatFocus() const +{ + return getValue("keepGameChatFocus", QString(), QString(), false).toBool(); +} + +bool InterfaceSettings::getNotificationsEnabled() const +{ + return getValue("notificationsenabled", QString(), QString(), true).toBool(); +} + +bool InterfaceSettings::getSpectatorNotificationsEnabled() const +{ + return getValue("specnotificationsenabled", QString(), QString(), false).toBool(); +} + +bool InterfaceSettings::getBuddyConnectNotificationsEnabled() const +{ + return getValue("buddyconnectnotificationsenabled", QString(), QString(), true).toBool(); +} + +bool InterfaceSettings::getDoubleClickToPlay() const +{ + return getValue("doubleclicktoplay", QString(), QString(), true).toBool(); +} + +bool InterfaceSettings::getClickPlaysAllSelected() const +{ + return getValue("clickPlaysAllSelected", QString(), QString(), true).toBool(); +} + +bool InterfaceSettings::getPlayToStack() const +{ + return getValue("playtostack", QString(), QString(), true).toBool(); +} + +bool InterfaceSettings::getDoNotDeleteArrowsInSubPhases() const +{ + return getValue("doNotDeleteArrowsInSubPhases", QString(), QString(), true).toBool(); +} + +int InterfaceSettings::getStartingHandSize() const +{ + return getValue("startinghandsize", QString(), QString(), 7).toInt(); +} + +bool InterfaceSettings::getAnnotateTokens() const +{ + return getValue("annotatetokens", QString(), QString(), false).toBool(); +} + +bool InterfaceSettings::getShowDragSelectionCount() const +{ + return getValue("showlassoselectioncount", QString(), QString(), true).toBool(); +} + +bool InterfaceSettings::getShowTotalSelectionCount() const +{ + return getValue("showpersistentselectioncount", QString(), QString(), true).toBool(); +} + +int InterfaceSettings::getTallyType() const +{ + return getValue("tallyType", QString(), QString(), 0).toInt(); +} + +bool InterfaceSettings::getHorizontalHand() const +{ + return getValue("horizontal", "hand", QString(), true).toBool(); +} + +bool InterfaceSettings::getInvertVerticalCoordinate() const +{ + return getValue("invert_vertical", "table", QString(), false).toBool(); +} + +int InterfaceSettings::getMinPlayersForMultiColumnLayout() const +{ + return getValue("min_players_multicolumn", QString(), QString(), 4).toInt(); +} + +bool InterfaceSettings::getOpenDeckInNewTab() const +{ + return getValue("openDeckInNewTab", "editor", QString(), false).toBool(); +} + +int InterfaceSettings::getRewindBufferingMs() const +{ + return getValue("rewindBufferingMs", "replay", QString(), 200).toInt(); +} + +qreal InterfaceSettings::getFastForwardSpeed() const +{ + return getValue("fastForwardSpeed", "replay", QString(), 10).toReal(); +} + +bool InterfaceSettings::getStyleUserList() const +{ + return getValue("styleUserList", "appearance", QString(), true).toBool(); +} + +bool InterfaceSettings::getLeftJustified() const +{ + return getValue("leftjustified", QString(), QString(), false).toBool(); +} + +int InterfaceSettings::getZoneViewGroupByIndex() const +{ + return getValue("groupby", "zoneview", QString(), 1).toInt(); +} + +int InterfaceSettings::getZoneViewSortByIndex() const +{ + return getValue("sortby", "zoneview", QString(), 1).toInt(); +} + +bool InterfaceSettings::getZoneViewPileView() const +{ + return getValue("pileview", "zoneview", QString(), true).toBool(); +} + +QString InterfaceSettings::getKnownMissingFeatures() +{ + return getValue("knownmissingfeatures", QString(), QString(), "").toString(); +} + +void InterfaceSettings::setUseTearOffMenus(bool _useTearOffMenus) +{ + setValue(_useTearOffMenus, "usetearoffmenus"); + emit useTearOffMenusChanged(_useTearOffMenus); +} + +void InterfaceSettings::setCardViewInitialRowsMax(int _cardViewInitialRowsMax) +{ + setValue(_cardViewInitialRowsMax, "cardViewInitialRowsMax"); +} + +void InterfaceSettings::setCardViewExpandedRowsMax(int value) +{ + setValue(value, "cardViewExpandedRowsMax"); +} + +void InterfaceSettings::setCloseEmptyCardView(bool value) +{ + setValue(value, "closeEmptyCardView"); +} + +void InterfaceSettings::setFocusCardViewSearchBar(bool value) +{ + setValue(value, "focusCardViewSearchBar"); +} + +void InterfaceSettings::setKeepGameChatFocus(bool value) +{ + setValue(value, "keepGameChatFocus"); + emit keepGameChatFocusChanged(value); +} + +void InterfaceSettings::setNotificationsEnabled(bool _notificationsEnabled) +{ + setValue(_notificationsEnabled, "notificationsenabled"); +} + +void InterfaceSettings::setSpectatorNotificationsEnabled(bool _spectatorNotificationsEnabled) +{ + setValue(_spectatorNotificationsEnabled, "specnotificationsenabled"); +} + +void InterfaceSettings::setBuddyConnectNotificationsEnabled(bool _buddyConnectNotificationsEnabled) +{ + setValue(_buddyConnectNotificationsEnabled, "buddyconnectnotificationsenabled"); +} + +void InterfaceSettings::setDoubleClickToPlay(bool _doubleClickToPlay) +{ + setValue(_doubleClickToPlay, "doubleclicktoplay"); +} + +void InterfaceSettings::setClickPlaysAllSelected(bool _clickPlaysAllSelected) +{ + setValue(_clickPlaysAllSelected, "clickPlaysAllSelected"); +} + +void InterfaceSettings::setPlayToStack(bool _playToStack) +{ + setValue(_playToStack, "playtostack"); +} + +void InterfaceSettings::setDoNotDeleteArrowsInSubPhases(bool _doNotDeleteArrowsInSubPhases) +{ + setValue(_doNotDeleteArrowsInSubPhases, "doNotDeleteArrowsInSubPhases"); +} + +void InterfaceSettings::setStartingHandSize(int _startingHandSize) +{ + setValue(_startingHandSize, "startinghandsize"); +} + +void InterfaceSettings::setAnnotateTokens(bool _annotateTokens) +{ + setValue(_annotateTokens, "annotatetokens"); +} + +void InterfaceSettings::setShowDragSelectionCount(bool _showDragSelectionCount) +{ + setValue(_showDragSelectionCount, "showlassoselectioncount"); +} + +void InterfaceSettings::setShowTotalSelectionCount(bool _showTotalSelectionCount) +{ + setValue(_showTotalSelectionCount, "showpersistentselectioncount"); +} + +void InterfaceSettings::setTallyType(int value) +{ + if (getTallyType() == value) { + return; + } + setValue(value, "tallyType"); + emit tallyTypeChanged(value); +} + +void InterfaceSettings::setHorizontalHand(bool _horizontalHand) +{ + setValue(_horizontalHand, "horizontal", "hand"); + emit horizontalHandChanged(); +} + +void InterfaceSettings::setInvertVerticalCoordinate(bool _invertVerticalCoordinate) +{ + setValue(_invertVerticalCoordinate, "invert_vertical", "table"); + emit invertVerticalCoordinateChanged(); +} + +void InterfaceSettings::setMinPlayersForMultiColumnLayout(int _minPlayersForMultiColumnLayout) +{ + setValue(_minPlayersForMultiColumnLayout, "min_players_multicolumn"); + emit minPlayersForMultiColumnLayoutChanged(); +} + +void InterfaceSettings::setOpenDeckInNewTab(bool _openDeckInNewTab) +{ + setValue(_openDeckInNewTab, "openDeckInNewTab", "editor"); +} + +void InterfaceSettings::setRewindBufferingMs(int _rewindBufferingMs) +{ + setValue(_rewindBufferingMs, "rewindBufferingMs", "replay"); +} + +void InterfaceSettings::setFastForwardSpeed(qreal _value) +{ + setValue(_value, "fastForwardSpeed", "replay"); +} + +void InterfaceSettings::setStyleUserList(bool _styleUserList) +{ + setValue(_styleUserList, "styleUserList", "appearance"); + emit styleUserListChanged(); +} + +void InterfaceSettings::setLeftJustified(bool _leftJustified) +{ + setValue(_leftJustified, "leftjustified"); + emit handJustificationChanged(); +} + +void InterfaceSettings::setZoneViewGroupByIndex(int _zoneViewGroupByIndex) +{ + setValue(_zoneViewGroupByIndex, "groupby", "zoneview"); +} + +void InterfaceSettings::setZoneViewSortByIndex(int _zoneViewSortByIndex) +{ + setValue(_zoneViewSortByIndex, "sortby", "zoneview"); +} + +void InterfaceSettings::setZoneViewPileView(bool _zoneViewPileView) +{ + setValue(_zoneViewPileView, "pileview", "zoneview"); +} + +void InterfaceSettings::setKnownMissingFeatures(const QString &_knownMissingFeatures) +{ + setValue(_knownMissingFeatures, "knownmissingfeatures"); +} diff --git a/libcockatrice_settings/libcockatrice/settings/interface_settings.h b/libcockatrice_settings/libcockatrice/settings/interface_settings.h new file mode 100644 index 000000000..9d3fec496 --- /dev/null +++ b/libcockatrice_settings/libcockatrice/settings/interface_settings.h @@ -0,0 +1,91 @@ +#ifndef INTERFACE_SETTINGS_H +#define INTERFACE_SETTINGS_H + +#include "settings_manager.h" + +#include + +class InterfaceSettings : public SettingsManager, public IInterfaceSettingsProvider +{ + Q_OBJECT + friend class SettingsCache; + +public: + [[nodiscard]] bool getUseTearOffMenus() const override; + [[nodiscard]] int getCardViewInitialRowsMax() const override; + [[nodiscard]] int getCardViewExpandedRowsMax() const override; + [[nodiscard]] bool getCloseEmptyCardView() const override; + [[nodiscard]] bool getFocusCardViewSearchBar() const override; + [[nodiscard]] bool getKeepGameChatFocus() const override; + [[nodiscard]] bool getNotificationsEnabled() const override; + [[nodiscard]] bool getSpectatorNotificationsEnabled() const override; + [[nodiscard]] bool getBuddyConnectNotificationsEnabled() const override; + [[nodiscard]] bool getDoubleClickToPlay() const override; + [[nodiscard]] bool getClickPlaysAllSelected() const override; + [[nodiscard]] bool getPlayToStack() const override; + [[nodiscard]] bool getDoNotDeleteArrowsInSubPhases() const override; + [[nodiscard]] int getStartingHandSize() const override; + [[nodiscard]] bool getAnnotateTokens() const override; + [[nodiscard]] bool getShowDragSelectionCount() const override; + [[nodiscard]] bool getShowTotalSelectionCount() const override; + [[nodiscard]] int getTallyType() const override; + [[nodiscard]] bool getHorizontalHand() const override; + [[nodiscard]] bool getInvertVerticalCoordinate() const override; + [[nodiscard]] int getMinPlayersForMultiColumnLayout() const override; + [[nodiscard]] bool getOpenDeckInNewTab() const override; + [[nodiscard]] int getRewindBufferingMs() const override; + [[nodiscard]] qreal getFastForwardSpeed() const override; + [[nodiscard]] bool getStyleUserList() const override; + [[nodiscard]] bool getLeftJustified() const override; + [[nodiscard]] int getZoneViewGroupByIndex() const override; + [[nodiscard]] int getZoneViewSortByIndex() const override; + [[nodiscard]] bool getZoneViewPileView() const override; + [[nodiscard]] QString getKnownMissingFeatures() override; + + void setUseTearOffMenus(bool _useTearOffMenus); + void setCardViewInitialRowsMax(int _cardViewInitialRowsMax); + void setCardViewExpandedRowsMax(int value); + void setCloseEmptyCardView(bool value); + void setFocusCardViewSearchBar(bool value); + void setKeepGameChatFocus(bool value); + void setNotificationsEnabled(bool _notificationsEnabled); + void setSpectatorNotificationsEnabled(bool _spectatorNotificationsEnabled); + void setBuddyConnectNotificationsEnabled(bool _buddyConnectNotificationsEnabled); + void setDoubleClickToPlay(bool _doubleClickToPlay); + void setClickPlaysAllSelected(bool _clickPlaysAllSelected); + void setPlayToStack(bool _playToStack); + void setDoNotDeleteArrowsInSubPhases(bool _doNotDeleteArrowsInSubPhases); + void setStartingHandSize(int _startingHandSize); + void setAnnotateTokens(bool _annotateTokens); + void setShowDragSelectionCount(bool _showDragSelectionCount); + void setShowTotalSelectionCount(bool _showTotalSelectionCount); + void setTallyType(int value); + void setHorizontalHand(bool _horizontalHand); + void setInvertVerticalCoordinate(bool _invertVerticalCoordinate); + void setMinPlayersForMultiColumnLayout(int _minPlayersForMultiColumnLayout); + void setOpenDeckInNewTab(bool _openDeckInNewTab); + void setRewindBufferingMs(int _rewindBufferingMs); + void setFastForwardSpeed(qreal _value); + void setStyleUserList(bool _styleUserList); + void setLeftJustified(bool _leftJustified); + void setZoneViewGroupByIndex(int _zoneViewGroupByIndex); + void setZoneViewSortByIndex(int _zoneViewSortByIndex); + void setZoneViewPileView(bool _zoneViewPileView); + void setKnownMissingFeatures(const QString &_knownMissingFeatures); + +signals: + void useTearOffMenusChanged(bool state); + void keepGameChatFocusChanged(bool value); + void horizontalHandChanged(); + void invertVerticalCoordinateChanged(); + void minPlayersForMultiColumnLayoutChanged(); + void styleUserListChanged(); + void handJustificationChanged(); + void tallyTypeChanged(int type); + +private: + explicit InterfaceSettings(const QString &settingPath, QObject *parent = nullptr); + InterfaceSettings(const InterfaceSettings & /*other*/); +}; + +#endif // INTERFACE_SETTINGS_H diff --git a/libcockatrice_settings/libcockatrice/settings/paths_settings.cpp b/libcockatrice_settings/libcockatrice/settings/paths_settings.cpp new file mode 100644 index 000000000..bf155414d --- /dev/null +++ b/libcockatrice_settings/libcockatrice/settings/paths_settings.cpp @@ -0,0 +1,120 @@ +#include "paths_settings.h" + +#include +#include + +PathsSettings::PathsSettings(const QString &settingPath, QObject *parent) + : SettingsManager(settingPath + "paths.ini", "paths", QString(), parent) +{ +} + +QString PathsSettings::getDeckPath() const +{ + return getValue("decks").toString(); +} + +QString PathsSettings::getFiltersPath() const +{ + return getValue("filters").toString(); +} + +QString PathsSettings::getReplaysPath() const +{ + return getValue("replays").toString(); +} + +QString PathsSettings::getPicsPath() const +{ + return getValue("pics").toString(); +} + +QString PathsSettings::getCustomPicsPath() const +{ + return getValue("custompics").toString(); +} + +QString PathsSettings::getThemesPath() const +{ + return getValue("themes").toString(); +} + +QString PathsSettings::getCardDatabasePath() const +{ + return getValue("carddatabase").toString(); +} + +QString PathsSettings::getCustomCardDatabasePath() const +{ + return getValue("customsets").toString(); +} + +QString PathsSettings::getTokenDatabasePath() const +{ + return getValue("tokendatabase").toString(); +} + +QString PathsSettings::getSpoilerCardDatabasePath() const +{ + return getValue("spoilerdatabase").toString(); +} + +QString PathsSettings::getRedirectCachePath() const +{ + return getValue("redirects").toString(); +} + +void PathsSettings::setDeckPath(const QString &_deckPath) +{ + setValue(_deckPath, "decks"); +} + +void PathsSettings::setFiltersPath(const QString &_filtersPath) +{ + setValue(_filtersPath, "filters"); +} + +void PathsSettings::setReplaysPath(const QString &_replaysPath) +{ + setValue(_replaysPath, "replays"); +} + +void PathsSettings::setPicsPath(const QString &_picsPath) +{ + setValue(_picsPath, "pics"); + emit picsPathChanged(); +} + +void PathsSettings::setCustomPicsPath(const QString &_customPicsPath) +{ + setValue(_customPicsPath, "custompics"); +} + +void PathsSettings::setThemesPath(const QString &_themesPath) +{ + setValue(_themesPath, "themes"); + emit themeChanged(); +} + +void PathsSettings::setCardDatabasePath(const QString &_cardDatabasePath) +{ + setValue(_cardDatabasePath, "carddatabase"); + emit cardDatabasePathChanged(); +} + +void PathsSettings::setCustomCardDatabasePath(const QString &_customCardDatabasePath) +{ + setValue(_customCardDatabasePath, "customsets"); + emit cardDatabasePathChanged(); +} + +void PathsSettings::setTokenDatabasePath(const QString &_tokenDatabasePath) +{ + setValue(_tokenDatabasePath, "tokendatabase"); + emit cardDatabasePathChanged(); +} + +void PathsSettings::setSpoilerDatabasePath(const QString &_spoilerDatabasePath) +{ + setValue(_spoilerDatabasePath, "spoilerdatabase"); + emit cardDatabasePathChanged(); +} diff --git a/libcockatrice_settings/libcockatrice/settings/paths_settings.h b/libcockatrice_settings/libcockatrice/settings/paths_settings.h new file mode 100644 index 000000000..ab1ea05c8 --- /dev/null +++ b/libcockatrice_settings/libcockatrice/settings/paths_settings.h @@ -0,0 +1,47 @@ +#ifndef PATHS_SETTINGS_H +#define PATHS_SETTINGS_H + +#include "settings_manager.h" + +#include + +class PathsSettings : public SettingsManager, public IPathsSettingsProvider +{ + Q_OBJECT + friend class SettingsCache; + +public: + [[nodiscard]] QString getDeckPath() const override; + [[nodiscard]] QString getFiltersPath() const override; + [[nodiscard]] QString getReplaysPath() const override; + [[nodiscard]] QString getPicsPath() const override; + [[nodiscard]] QString getCustomPicsPath() const override; + [[nodiscard]] QString getThemesPath() const override; + [[nodiscard]] QString getCardDatabasePath() const override; + [[nodiscard]] QString getCustomCardDatabasePath() const override; + [[nodiscard]] QString getTokenDatabasePath() const override; + [[nodiscard]] QString getSpoilerCardDatabasePath() const override; + [[nodiscard]] QString getRedirectCachePath() const override; + + void setDeckPath(const QString &_deckPath); + void setFiltersPath(const QString &_filtersPath); + void setReplaysPath(const QString &_replaysPath); + void setPicsPath(const QString &_picsPath); + void setCustomPicsPath(const QString &_customPicsPath); + void setThemesPath(const QString &_themesPath); + void setCardDatabasePath(const QString &_cardDatabasePath); + void setCustomCardDatabasePath(const QString &_customCardDatabasePath); + void setTokenDatabasePath(const QString &_tokenDatabasePath); + void setSpoilerDatabasePath(const QString &_spoilerDatabasePath); + +signals: + void cardDatabasePathChanged(); + void picsPathChanged(); + void themeChanged(); + +private: + explicit PathsSettings(const QString &settingPath, QObject *parent = nullptr); + PathsSettings(const PathsSettings & /*other*/); +}; + +#endif // PATHS_SETTINGS_H diff --git a/libcockatrice_settings/libcockatrice/settings/personal_settings.cpp b/libcockatrice_settings/libcockatrice/settings/personal_settings.cpp new file mode 100644 index 000000000..aec8d4df6 --- /dev/null +++ b/libcockatrice_settings/libcockatrice/settings/personal_settings.cpp @@ -0,0 +1,173 @@ +#include "personal_settings.h" + +PersonalSettings::PersonalSettings(const QString &settingPath, QObject *parent) + : SettingsManager(settingPath + "personal.ini", "personal", QString(), parent) +{ +} + +QString PersonalSettings::getLang() const +{ + return getValue("lang", QString(), QString(), QString()).toString(); +} + +QString PersonalSettings::getClientID() +{ + return getValue("clientid", QString(), QString(), "notset").toString(); +} + +QString PersonalSettings::getClientVersion() +{ + return getValue("clientversion", QString(), QString(), "notset").toString(); +} + +int PersonalSettings::getKeepAlive() const +{ + return getValue("keepalive", QString(), QString(), 3).toInt(); +} + +int PersonalSettings::getTimeOut() const +{ + return getValue("timeout", QString(), QString(), 5).toInt(); +} + +bool PersonalSettings::getPicDownload() const +{ + return getValue("picturedownload", QString(), QString(), true).toBool(); +} + +bool PersonalSettings::getShowStatusBar() const +{ + return getValue("showStatusBar", QString(), QString(), false).toBool(); +} + +int PersonalSettings::getMaxFontSize() const +{ + return getValue("maxfontsize", "game", QString(), 12).toInt(); +} + +QString PersonalSettings::getHighlightWords() const +{ + return getValue("highlightWords", QString(), QString(), "").toString(); +} + +QString PersonalSettings::getHomeTabBackgroundSource() const +{ + return getValue("background", "home", QString(), "themed").toString(); +} + +int PersonalSettings::getHomeTabBackgroundShuffleFrequency() const +{ + return getValue("shuffleTimer", "home/background", QString(), 0).toInt(); +} + +bool PersonalSettings::getHomeTabDisplayCardName() const +{ + return getValue("displayCardName", "home/background", QString(), true).toBool(); +} + +bool PersonalSettings::getShowTipsOnStartup() const +{ + return getValue("showTips", "tipOfDay", QString(), true).toBool(); +} + +QList PersonalSettings::getSeenTips() const +{ + QList tips; + auto tipValues = getValue("seenTips", "tipOfDay", QString()).toList(); + for (const auto &tipNumber : tipValues) { + tips.append(tipNumber.toInt()); + } + return tips; +} + +bool PersonalSettings::getDownloadSpoilersStatus() const +{ + return getValue("downloadspoilers", QString(), QString(), false).toBool(); +} + +void PersonalSettings::setLang(const QString &_lang) +{ + setValue(_lang, "lang"); + emit langChanged(); +} + +void PersonalSettings::setClientID(const QString &_clientID) +{ + setValue(_clientID, "clientid"); +} + +void PersonalSettings::setClientVersion(const QString &_clientVersion) +{ + setValue(_clientVersion, "clientversion"); +} + +void PersonalSettings::setPicDownload(bool _picDownload) +{ + setValue(_picDownload, "picturedownload"); + emit picDownloadChanged(); +} + +void PersonalSettings::setShowStatusBar(bool value) +{ + setValue(value, "showStatusBar"); + emit showStatusBarChanged(value); +} + +void PersonalSettings::setMaxFontSize(int _max) +{ + setValue(_max, "maxfontsize", "game"); +} + +QString PersonalSettings::getThemeName() const +{ + return getValue("themeName", QString(), QString()).toString(); +} + +void PersonalSettings::setThemeName(const QString &_themeName) +{ + setValue(_themeName, "themeName"); + emit themeNameChanged(); +} + +void PersonalSettings::setHighlightWords(const QString &_highlightWords) +{ + setValue(_highlightWords, "highlightWords"); +} + +void PersonalSettings::setHomeTabBackgroundSource(const QString &_backgroundSource) +{ + setValue(_backgroundSource, "background", "home"); + emit homeTabBackgroundSourceChanged(); +} + +void PersonalSettings::setHomeTabBackgroundShuffleFrequency(int _frequency) +{ + setValue(_frequency, "shuffleTimer", "home/background"); + emit homeTabBackgroundShuffleFrequencyChanged(); +} + +void PersonalSettings::setHomeTabDisplayCardName(bool _displayCardName) +{ + setValue(_displayCardName, "displayCardName", "home/background"); + emit homeTabDisplayCardNameChanged(); +} + +void PersonalSettings::setShowTipsOnStartup(bool _showTipsOnStartup) +{ + setValue(_showTipsOnStartup, "showTips", "tipOfDay"); +} + +void PersonalSettings::setSeenTips(const QList &_seenTips) +{ + QList storedTipList; + for (auto tipNumber : _seenTips) { + storedTipList.append(tipNumber); + } + setValue(QVariant::fromValue(storedTipList), "seenTips", "tipOfDay"); +} + +void PersonalSettings::setDownloadSpoilerStatus(bool _spoilerStatus) +{ + setValue(_spoilerStatus, "downloadspoilers"); + emit downloadSpoilerStatusChanged(); +} diff --git a/libcockatrice_settings/libcockatrice/settings/personal_settings.h b/libcockatrice_settings/libcockatrice/settings/personal_settings.h new file mode 100644 index 000000000..2c79eec8f --- /dev/null +++ b/libcockatrice_settings/libcockatrice/settings/personal_settings.h @@ -0,0 +1,65 @@ +#ifndef PERSONAL_SETTINGS_H +#define PERSONAL_SETTINGS_H + +#include "settings_manager.h" + +#include +#include +#include + +class PersonalSettings : public SettingsManager, public IPersonalSettingsProvider +{ + Q_OBJECT + friend class SettingsCache; + +public: + [[nodiscard]] QString getLang() const override; + [[nodiscard]] QString getClientID() override; + [[nodiscard]] QString getClientVersion() override; + [[nodiscard]] int getKeepAlive() const override; + [[nodiscard]] int getTimeOut() const override; + [[nodiscard]] bool getPicDownload() const override; + [[nodiscard]] bool getShowStatusBar() const override; + [[nodiscard]] int getMaxFontSize() const override; + [[nodiscard]] QString getHighlightWords() const override; + [[nodiscard]] QString getHomeTabBackgroundSource() const override; + [[nodiscard]] int getHomeTabBackgroundShuffleFrequency() const override; + [[nodiscard]] QString getThemeName() const; + void setThemeName(const QString &_themeName); + [[nodiscard]] bool getHomeTabDisplayCardName() const override; + [[nodiscard]] bool getShowTipsOnStartup() const override; + [[nodiscard]] QList getSeenTips() const override; + [[nodiscard]] bool getDownloadSpoilersStatus() const override; + + void setLang(const QString &_lang); + void setClientID(const QString &_clientID); + void setClientVersion(const QString &_clientVersion); + void setPicDownload(bool _picDownload); + void setShowStatusBar(bool value); + void setMaxFontSize(int _max); + void setHighlightWords(const QString &_highlightWords); + void setHomeTabBackgroundSource(const QString &_backgroundSource); + void setHomeTabBackgroundShuffleFrequency(int _frequency); + void setHomeTabDisplayCardName(bool _displayCardName); + void setShowTipsOnStartup(bool _showTipsOnStartup); + void setSeenTips(const QList &_seenTips); + void setDownloadSpoilerStatus(bool _spoilerStatus); + +signals: + void langChanged(); + void themeNameChanged(); + void picDownloadChanged(); + void showStatusBarChanged(bool state); + void homeTabBackgroundSourceChanged(); + void homeTabBackgroundShuffleFrequencyChanged(); + void homeTabDisplayCardNameChanged(); + void downloadSpoilerStatusChanged(); + +public: + explicit PersonalSettings(const QString &settingPath, QObject *parent = nullptr); + +private: + PersonalSettings(const PersonalSettings & /*other*/); +}; + +#endif // PERSONAL_SETTINGS_H diff --git a/libcockatrice_settings/libcockatrice/settings/settings_manager.cpp b/libcockatrice_settings/libcockatrice/settings/settings_manager.cpp index b66edd630..f98778ca0 100644 --- a/libcockatrice_settings/libcockatrice/settings/settings_manager.cpp +++ b/libcockatrice_settings/libcockatrice/settings/settings_manager.cpp @@ -138,21 +138,55 @@ QVariant SettingsManager::getValue(const QString &name, const QString &group, co { auto settings = getSettings(); - if (!group.isEmpty()) { - settings.beginGroup(group); + QString effectiveGroup = group.isEmpty() ? defaultGroup : group; + QString effectiveSubGroup = subGroup.isEmpty() ? defaultSubGroup : subGroup; + + if (!effectiveGroup.isEmpty()) { + settings.beginGroup(effectiveGroup); } - if (!subGroup.isEmpty()) { - settings.beginGroup(subGroup); + if (!effectiveSubGroup.isEmpty()) { + settings.beginGroup(effectiveSubGroup); } QVariant value = settings.value(name); - if (!subGroup.isEmpty()) { + if (!effectiveSubGroup.isEmpty()) { settings.endGroup(); } - if (!group.isEmpty()) { + if (!effectiveGroup.isEmpty()) { + settings.endGroup(); + } + + return value; +} + +QVariant SettingsManager::getValue(const QString &name, + const QString &group, + const QString &subGroup, + const QVariant &defaultValue) const +{ + auto settings = getSettings(); + + QString effectiveGroup = group.isEmpty() ? defaultGroup : group; + QString effectiveSubGroup = subGroup.isEmpty() ? defaultSubGroup : subGroup; + + if (!effectiveGroup.isEmpty()) { + settings.beginGroup(effectiveGroup); + } + + if (!effectiveSubGroup.isEmpty()) { + settings.beginGroup(effectiveSubGroup); + } + + QVariant value = settings.value(name, defaultValue); + + if (!effectiveSubGroup.isEmpty()) { + settings.endGroup(); + } + + if (!effectiveGroup.isEmpty()) { settings.endGroup(); } diff --git a/libcockatrice_settings/libcockatrice/settings/settings_manager.h b/libcockatrice_settings/libcockatrice/settings/settings_manager.h index 4213cf4c1..3d3c95d3e 100644 --- a/libcockatrice_settings/libcockatrice/settings/settings_manager.h +++ b/libcockatrice_settings/libcockatrice/settings/settings_manager.h @@ -23,6 +23,8 @@ public: QVariant getValue(const QString &name) const; QVariant getValue(const QString &name, const QString &group, const QString &subGroup = QString()) const; + QVariant + getValue(const QString &name, const QString &group, const QString &subGroup, const QVariant &defaultValue) const; void batchWrite(std::function batchWriteFunction); void sync(); diff --git a/libcockatrice_settings/libcockatrice/settings/settings_migration.cpp b/libcockatrice_settings/libcockatrice/settings/settings_migration.cpp new file mode 100644 index 000000000..078e5ac16 --- /dev/null +++ b/libcockatrice_settings/libcockatrice/settings/settings_migration.cpp @@ -0,0 +1,519 @@ +#include "settings_migration.h" + +#include +#include +#include +#include + +static const QString MIGRATION_SENTINEL_KEY = QStringLiteral("migration/perfile_complete"); + +static void migrateTabsSettings(const QString &settingsPath, QSettings &globalIni) +{ + if (!globalIni.contains("tabs/visualDeckStorage") && !globalIni.contains("tabs/server") && + !globalIni.contains("tabs/account") && !globalIni.contains("tabs/deckStorage") && + !globalIni.contains("tabs/replays") && !globalIni.contains("tabs/admin") && !globalIni.contains("tabs/log")) { + return; + } + + QSettings tabsIni(settingsPath + "tabs.ini", QSettings::IniFormat); + tabsIni.setValue("tabs/visualDeckStorage", globalIni.value("tabs/visualDeckStorage", true)); + tabsIni.setValue("tabs/server", globalIni.value("tabs/server", true)); + tabsIni.setValue("tabs/account", globalIni.value("tabs/account", true)); + tabsIni.setValue("tabs/deckStorage", globalIni.value("tabs/deckStorage", true)); + tabsIni.setValue("tabs/replays", globalIni.value("tabs/replays", true)); + tabsIni.setValue("tabs/admin", globalIni.value("tabs/admin", true)); + tabsIni.setValue("tabs/log", globalIni.value("tabs/log", true)); +} + +static void migrateSoundSettings(const QString &settingsPath, QSettings &globalIni) +{ + if (!globalIni.contains("sound/enabled") && !globalIni.contains("sound/theme") && + !globalIni.contains("sound/mastervolume")) { + return; + } + + QSettings soundIni(settingsPath + "sound.ini", QSettings::IniFormat); + soundIni.setValue("sound/enabled", globalIni.value("sound/enabled", false)); + soundIni.setValue("sound/theme", globalIni.value("sound/theme")); + soundIni.setValue("sound/mastervolume", globalIni.value("sound/mastervolume", 100)); +} + +static void migrateGameSettings(const QString &settingsPath, QSettings &globalIni) +{ + bool hasGameKeys = false; + globalIni.beginGroup("game"); + if (!globalIni.childKeys().isEmpty()) { + hasGameKeys = true; + } + QStringList gameKeys = globalIni.childKeys(); + globalIni.endGroup(); + + globalIni.beginGroup("localgameoptions"); + if (!globalIni.childKeys().isEmpty()) { + hasGameKeys = true; + } + QStringList localGameKeys = globalIni.childKeys(); + globalIni.endGroup(); + + if (!hasGameKeys) { + return; + } + + QSettings gameIni(settingsPath + "game.ini", QSettings::IniFormat); + for (const auto &key : gameKeys) { + if (key == "maxfontsize") { + continue; + } + gameIni.setValue("game/" + key, globalIni.value("game/" + key)); + } + for (const auto &key : localGameKeys) { + gameIni.setValue("localgameoptions/" + key, globalIni.value("localgameoptions/" + key)); + } +} + +static void migrateChatSettings(const QString &settingsPath, QSettings &globalIni) +{ + globalIni.beginGroup("chat"); + QStringList chatKeys = globalIni.childKeys(); + globalIni.endGroup(); + + if (chatKeys.isEmpty()) { + return; + } + + QSettings chatIni(settingsPath + "chat.ini", QSettings::IniFormat); + for (const auto &key : chatKeys) { + chatIni.setValue("chat/" + key, globalIni.value("chat/" + key)); + } +} + +static void migrateCacheStorageSettings(const QString &settingsPath, QSettings &globalIni) +{ + const QStringList cacheKeys = {"personal/pixmapCacheSize", "personal/networkCacheSize", "personal/redirectCacheTtl", + "personal/cardPictureLoaderCacheMethod", + "personal/localCardImageStorageNamingScheme"}; + bool hasAny = false; + for (const auto &key : cacheKeys) { + if (globalIni.contains(key)) { + hasAny = true; + break; + } + } + if (!hasAny) { + return; + } + + QSettings cacheStorageIni(settingsPath + "cache_storage.ini", QSettings::IniFormat); + for (const auto &key : cacheKeys) { + if (globalIni.contains(key)) { + cacheStorageIni.setValue(key, globalIni.value(key)); + } + } +} + +static void migrateUpdatesSettings(const QString &settingsPath, QSettings &globalIni) +{ + const QMap updateKeyMap = { + {"personal/startupUpdateCheck", "updates/startupUpdateCheck"}, + {"personal/startupCardUpdateCheckPromptForUpdate", "updates/startupCardUpdateCheckPromptForUpdate"}, + {"personal/startupCardUpdateCheckAlwaysUpdate", "updates/startupCardUpdateCheckAlwaysUpdate"}, + {"personal/cardUpdateCheckInterval", "updates/cardUpdateCheckInterval"}, + {"personal/lastCardUpdateCheck", "updates/lastCardUpdateCheck"}, + {"personal/alwaysEnableNewSets", "updates/alwaysEnableNewSets"}, + {"personal/updatenotification", "updates/updatenotification"}, + {"personal/newversionnotification", "updates/newversionnotification"}, + {"personal/updatereleasechannel", "updates/updatereleasechannel"}, + }; + bool hasAny = false; + for (auto it = updateKeyMap.constBegin(); it != updateKeyMap.constEnd(); ++it) { + if (globalIni.contains(it.key())) { + hasAny = true; + break; + } + } + if (!hasAny) { + return; + } + + QSettings updatesIni(settingsPath + "updates.ini", QSettings::IniFormat); + for (auto it = updateKeyMap.constBegin(); it != updateKeyMap.constEnd(); ++it) { + if (globalIni.contains(it.key())) { + updatesIni.setValue(it.value(), globalIni.value(it.key())); + } + } +} + +static void migratePersonalSettings(const QString &settingsPath, QSettings &globalIni) +{ + const QStringList personalRootKeys = {"personal/lang", "personal/highlightWords"}; + const QMap personalKeyMap = { + {"theme/name", "personal/themeName"}, + {"personal/clientid", "personal/clientid"}, + {"personal/clientversion", "personal/clientversion"}, + {"personal/keepalive", "personal/keepalive"}, + {"personal/timeout", "personal/timeout"}, + {"personal/picturedownload", "personal/picturedownload"}, + {"personal/showStatusBar", "personal/showStatusBar"}, + {"game/maxfontsize", "game/maxfontsize"}, + {"personal/downloadspoilers", "personal/downloadspoilers"}, + }; + const QStringList homeKeys = {"home/background", "home/background/shuffleTimer", "home/background/displayCardName"}; + const QStringList tipKeys = {"tipOfDay/showTips", "tipOfDay/seenTips"}; + + bool hasAny = false; + for (const auto &key : personalRootKeys) { + if (globalIni.contains(key)) { + hasAny = true; + } + } + for (auto it = personalKeyMap.constBegin(); it != personalKeyMap.constEnd(); ++it) { + if (globalIni.contains(it.key())) { + hasAny = true; + } + } + for (const auto &key : homeKeys) { + if (globalIni.contains(key)) { + hasAny = true; + } + } + for (const auto &key : tipKeys) { + if (globalIni.contains(key)) { + hasAny = true; + } + } + if (!hasAny) { + return; + } + + QSettings personalIni(settingsPath + "personal.ini", QSettings::IniFormat); + for (const auto &key : personalRootKeys) { + if (globalIni.contains(key)) { + personalIni.setValue(key, globalIni.value(key)); + } + } + for (auto it = personalKeyMap.constBegin(); it != personalKeyMap.constEnd(); ++it) { + if (globalIni.contains(it.key())) { + personalIni.setValue(it.value(), globalIni.value(it.key())); + } + } + for (const auto &key : homeKeys) { + if (globalIni.contains(key)) { + personalIni.setValue(key, globalIni.value(key)); + } + } + for (const auto &key : tipKeys) { + if (globalIni.contains(key)) { + personalIni.setValue(key, globalIni.value(key)); + } + } +} + +static void migrateCardsDisplaySettings(const QString &settingsPath, QSettings &globalIni) +{ + const QStringList cardsRootKeys = { + "cards/displaycardnames", + "cards/roundcardcorners", + "cards/overrideallcardartwithpersonalpreference", + "cards/bumpsetswithcardsindecktotop", + "cards/printingselectorsortorder", + "cards/printingselectorcardsize", + "cards/includerebalancedcards", + "cards/printingselectornavigationbuttonsvisible", + "cards/tapanimation", + "cards/autorotatesidewayslayoutcards", + "cards/scaleCards", + "cards/verticalCardOverlapPercent", + "cards/cardinfoviewmode", + }; + const QStringList cardsInterfaceKeys = {"interface/deckeditorbannercardcomboboxvisible", + "interface/deckeditortagswidgetvisible"}; + const QStringList menuKeys = {"menu/showshortcuts", "menu/showgameselectorfiltertoolbar"}; + + bool hasAny = false; + for (const auto &key : cardsRootKeys) { + if (globalIni.contains(key)) { + hasAny = true; + } + } + for (const auto &key : cardsInterfaceKeys) { + if (globalIni.contains(key)) { + hasAny = true; + } + } + for (const auto &key : menuKeys) { + if (globalIni.contains(key)) { + hasAny = true; + } + } + if (!hasAny) { + return; + } + + QSettings cardsIni(settingsPath + "cards_display.ini", QSettings::IniFormat); + for (const auto &key : cardsRootKeys) { + if (globalIni.contains(key)) { + cardsIni.setValue(key, globalIni.value(key)); + } + } + for (const auto &key : cardsInterfaceKeys) { + if (globalIni.contains(key)) { + cardsIni.setValue(key, globalIni.value(key)); + } + } + for (const auto &key : menuKeys) { + if (globalIni.contains(key)) { + cardsIni.setValue(key, globalIni.value(key)); + } + } +} + +static void migrateInterfaceSettings(const QString &settingsPath, QSettings &globalIni) +{ + const QStringList interfaceRootKeys = { + "interface/usetearoffmenus", + "interface/cardViewInitialRowsMax", + "interface/cardViewExpandedRowsMax", + "interface/closeEmptyCardView", + "interface/focusCardViewSearchBar", + "interface/keepGameChatFocus", + "interface/notificationsenabled", + "interface/specnotificationsenabled", + "interface/buddyconnectnotificationsenabled", + "interface/doubleclicktoplay", + "interface/clickPlaysAllSelected", + "interface/playtostack", + "interface/doNotDeleteArrowsInSubPhases", + "interface/startinghandsize", + "interface/annotatetokens", + "interface/showlassoselectioncount", + "interface/showpersistentselectioncount", + "interface/showsubtypeselectiontally", + "interface/leftjustified", + "interface/min_players_multicolumn", + "interface/knownmissingfeatures", + }; + const QStringList interfaceSubKeys = { + "hand/horizontal", "table/invert_vertical", "editor/openDeckInNewTab", "replay/rewindBufferingMs", + "appearance/styleUserList", "zoneview/groupby", "zoneview/sortby", "zoneview/pileview"}; + bool hasAny = false; + for (const auto &key : interfaceRootKeys) { + if (globalIni.contains(key)) { + hasAny = true; + } + } + for (const auto &key : interfaceSubKeys) { + if (globalIni.contains(key)) { + hasAny = true; + } + } + if (!hasAny) { + return; + } + + QSettings interfaceIni(settingsPath + "interface.ini", QSettings::IniFormat); + for (const auto &key : interfaceRootKeys) { + if (globalIni.contains(key)) { + interfaceIni.setValue(key, globalIni.value(key)); + } + } + for (const auto &key : interfaceSubKeys) { + if (globalIni.contains(key)) { + interfaceIni.setValue(key, globalIni.value(key)); + } + } +} + +static void migratePathsSettings(const QString &settingsPath, QSettings &globalIni) +{ + globalIni.beginGroup("paths"); + QStringList pathsKeys = globalIni.childKeys(); + globalIni.endGroup(); + if (pathsKeys.isEmpty()) { + return; + } + + QSettings pathsIni(settingsPath + "paths.ini", QSettings::IniFormat); + for (const auto &key : pathsKeys) { + pathsIni.setValue("paths/" + key, globalIni.value("paths/" + key)); + } +} + +static void migrateVisualDeckStorageSettings(const QString &settingsPath, QSettings &globalIni) +{ + const QStringList vdsKeys = {"interface/visualdeckstoragecardsize", + "interface/visualdeckstoragesortingorder", + "interface/visualdeckstorageshowfolders", + "interface/visualdeckstorageshowtagfilter", + "interface/visualdeckstoragedefaulttagslist", + "interface/visualdeckstoragesearchfoldernames", + "interface/visualdeckstorageshowcoloridentity", + "interface/visualdeckstorageshowbannercardcombobox", + "interface/visualdeckstorageshowtagsondeckpreviews", + "interface/visualdeckstoragedrawunusedcoloridentities", + "interface/visualdeckstorageunusedcoloridentitiesopacity", + "interface/visualdeckstoragetooltiptype", + "interface/visualdeckstoragepromptforconversion", + "interface/visualdeckstoragealwaysconvert", + "interface/visualdeckstorageingame", + "interface/visualdeckstorageselectionanimation", + "interface/defaultDeckEditorType", + "interface/visualdatabasedisplayfiltertomostrecentsetsenabled", + "interface/visualdatabasedisplayfiltertomostrecentsetsamount", + "interface/visualdeckeditorsamplehandsize", + "interface/visualdeckeditorcardsize", + "interface/visualdatabasedisplaycardsize", + "interface/edhreccardsize", + "interface/archidektpreviewsize"}; + bool hasAny = false; + for (const auto &key : vdsKeys) { + if (globalIni.contains(key)) { + hasAny = true; + } + } + if (!hasAny) { + return; + } + + QSettings vdsIni(settingsPath + "visual_deck_storage.ini", QSettings::IniFormat); + for (const auto &key : vdsKeys) { + if (globalIni.contains(key)) { + vdsIni.setValue(key, globalIni.value(key)); + } + } +} + +static void migrateLegacySets(const QString &settingsPath) +{ + QSettings legacySetting; + legacySetting.beginGroup("sets"); + QStringList groups = legacySetting.childGroups(); + if (groups.isEmpty()) { + legacySetting.endGroup(); + return; + } + + QSettings cardDbIni(settingsPath + "cardDatabase.ini", QSettings::IniFormat); + for (const auto &shortName : groups) { + legacySetting.beginGroup(shortName); + cardDbIni.setValue("sets/" + shortName + "/sortkey", legacySetting.value("sortkey")); + cardDbIni.setValue("sets/" + shortName + "/enabled", legacySetting.value("enabled")); + cardDbIni.setValue("sets/" + shortName + "/isknown", legacySetting.value("isknown")); + legacySetting.endGroup(); + } + legacySetting.endGroup(); +} + +static void migrateLegacyServers(const QString &settingsPath) +{ + QSettings legacySetting; + legacySetting.beginGroup("server"); + QStringList keys = legacySetting.allKeys(); + if (keys.isEmpty()) { + legacySetting.endGroup(); + return; + } + + QSettings serversIni(settingsPath + "servers.ini", QSettings::IniFormat); + serversIni.setValue("server/previoushostlogin", legacySetting.value("previoushostlogin")); + serversIni.setValue("server/previoushosts", legacySetting.value("previoushosts")); + serversIni.setValue("server/auto_connect", legacySetting.value("auto_connect")); + serversIni.setValue("server/fphostname", legacySetting.value("fphostname")); + serversIni.setValue("server/fpport", legacySetting.value("fpport")); + serversIni.setValue("server/fpplayername", legacySetting.value("fpplayername")); + legacySetting.endGroup(); +} + +static void migrateLegacyMessages(const QString &settingsPath) +{ + QSettings legacySetting; + legacySetting.beginGroup("messages"); + QStringList keys = legacySetting.allKeys(); + if (keys.isEmpty()) { + legacySetting.endGroup(); + return; + } + + QSettings messageIni(settingsPath + "messages.ini", QSettings::IniFormat); + for (const auto &key : keys) { + if (key == "count") { + messageIni.setValue("messages/count", legacySetting.value("count")); + } else { + messageIni.setValue("messages/" + key, legacySetting.value(key)); + } + } + legacySetting.endGroup(); +} + +static void migrateLegacyGameFilters(const QString &settingsPath) +{ + QSettings legacySetting; + legacySetting.beginGroup("filter_games"); + QStringList keys = legacySetting.allKeys(); + if (keys.isEmpty()) { + legacySetting.endGroup(); + return; + } + + QSettings filtersIni(settingsPath + "gamefilters.ini", QSettings::IniFormat); + for (const auto &key : keys) { + filtersIni.setValue("filter_games/" + key, legacySetting.value(key)); + } + legacySetting.endGroup(); +} + +bool SettingsMigration::migrateLegacySettings(const QString &settingsPath) +{ + QSettings personalIni(settingsPath + "personal.ini", QSettings::IniFormat); + if (personalIni.value("migration/legacy_complete", false).toBool()) { + return false; + } + + migrateLegacySets(settingsPath); + migrateLegacyServers(settingsPath); + migrateLegacyMessages(settingsPath); + migrateLegacyGameFilters(settingsPath); + + personalIni.setValue("migration/legacy_complete", true); + personalIni.sync(); + return true; +} + +bool SettingsMigration::migrateSettingsFromGlobalIni(const QString &settingsPath) +{ + if (!QFile::exists(settingsPath + "global.ini")) { + return false; + } + + QSettings globalIni(settingsPath + "global.ini", QSettings::IniFormat); + if (globalIni.value(MIGRATION_SENTINEL_KEY, false).toBool()) { + // If a user runs an older Cockatrice build that writes to global.ini (non-sentinel keys) + // and then upgrades back, those new keys will be silently ignored. Re-migrate them. + globalIni.sync(); + auto allKeys = globalIni.allKeys(); + allKeys.removeAll(MIGRATION_SENTINEL_KEY); + if (allKeys.isEmpty()) { + return false; + } + } + + migrateTabsSettings(settingsPath, globalIni); + migrateSoundSettings(settingsPath, globalIni); + migrateGameSettings(settingsPath, globalIni); + migrateChatSettings(settingsPath, globalIni); + migrateCacheStorageSettings(settingsPath, globalIni); + migrateUpdatesSettings(settingsPath, globalIni); + migratePersonalSettings(settingsPath, globalIni); + migrateCardsDisplaySettings(settingsPath, globalIni); + migrateInterfaceSettings(settingsPath, globalIni); + migratePathsSettings(settingsPath, globalIni); + migrateVisualDeckStorageSettings(settingsPath, globalIni); + + QFile::remove(settingsPath + "global.ini.old"); + QFile::rename(settingsPath + "global.ini", settingsPath + "global.ini.old"); + + QSettings newGlobalIni(settingsPath + "global.ini", QSettings::IniFormat); + newGlobalIni.setValue(MIGRATION_SENTINEL_KEY, true); + newGlobalIni.sync(); + + return true; +} diff --git a/libcockatrice_settings/libcockatrice/settings/settings_migration.h b/libcockatrice_settings/libcockatrice/settings/settings_migration.h new file mode 100644 index 000000000..f596dba75 --- /dev/null +++ b/libcockatrice_settings/libcockatrice/settings/settings_migration.h @@ -0,0 +1,13 @@ +#ifndef SETTINGS_MIGRATION_H +#define SETTINGS_MIGRATION_H + +#include + +class SettingsMigration +{ +public: + static bool migrateSettingsFromGlobalIni(const QString &settingsPath); + static bool migrateLegacySettings(const QString &settingsPath); +}; + +#endif // SETTINGS_MIGRATION_H diff --git a/libcockatrice_settings/libcockatrice/settings/sound_settings.cpp b/libcockatrice_settings/libcockatrice/settings/sound_settings.cpp new file mode 100644 index 000000000..7fd61d263 --- /dev/null +++ b/libcockatrice_settings/libcockatrice/settings/sound_settings.cpp @@ -0,0 +1,39 @@ +#include "sound_settings.h" + +SoundSettings::SoundSettings(const QString &settingPath, QObject *parent) + : SettingsManager(settingPath + "sound.ini", "sound", QString(), parent) +{ +} + +bool SoundSettings::getSoundEnabled() const +{ + return getValue("enabled", QString(), QString(), false).toBool(); +} + +QString SoundSettings::getSoundThemeName() const +{ + return getValue("theme", QString(), QString()).toString(); +} + +int SoundSettings::getMasterVolume() const +{ + return getValue("mastervolume", QString(), QString(), 100).toInt(); +} + +void SoundSettings::setSoundEnabled(bool _soundEnabled) +{ + setValue(_soundEnabled, "enabled"); + emit soundEnabledChanged(); +} + +void SoundSettings::setSoundThemeName(const QString &_soundThemeName) +{ + setValue(_soundThemeName, "theme"); + emit soundThemeChanged(); +} + +void SoundSettings::setMasterVolume(int _masterVolume) +{ + setValue(_masterVolume, "mastervolume"); + emit masterVolumeChanged(_masterVolume); +} diff --git a/libcockatrice_settings/libcockatrice/settings/sound_settings.h b/libcockatrice_settings/libcockatrice/settings/sound_settings.h new file mode 100644 index 000000000..ffaed2a7c --- /dev/null +++ b/libcockatrice_settings/libcockatrice/settings/sound_settings.h @@ -0,0 +1,34 @@ +#ifndef SOUND_SETTINGS_H +#define SOUND_SETTINGS_H + +#include "settings_manager.h" + +#include + +class SoundSettings : public SettingsManager, public ISoundSettingsProvider +{ + Q_OBJECT + friend class SettingsCache; + +public: + [[nodiscard]] bool getSoundEnabled() const override; + [[nodiscard]] QString getSoundThemeName() const override; + [[nodiscard]] int getMasterVolume() const override; + + void setSoundEnabled(bool _soundEnabled); + void setSoundThemeName(const QString &_soundThemeName); + void setMasterVolume(int _masterVolume); + +signals: + void soundEnabledChanged(); + void soundThemeChanged(); + void masterVolumeChanged(int value); + +public: + explicit SoundSettings(const QString &settingPath, QObject *parent = nullptr); + +private: + SoundSettings(const SoundSettings & /*other*/); +}; + +#endif // SOUND_SETTINGS_H diff --git a/libcockatrice_settings/libcockatrice/settings/tabs_settings.cpp b/libcockatrice_settings/libcockatrice/settings/tabs_settings.cpp new file mode 100644 index 000000000..1838f667e --- /dev/null +++ b/libcockatrice_settings/libcockatrice/settings/tabs_settings.cpp @@ -0,0 +1,76 @@ +#include "tabs_settings.h" + +TabsSettings::TabsSettings(const QString &settingPath, QObject *parent) + : SettingsManager(settingPath + "tabs.ini", "tabs", QString(), parent) +{ +} + +bool TabsSettings::getTabVisualDeckStorageOpen() const +{ + return getValue("visualDeckStorage", QString(), QString(), true).toBool(); +} + +bool TabsSettings::getTabServerOpen() const +{ + return getValue("server", QString(), QString(), true).toBool(); +} + +bool TabsSettings::getTabAccountOpen() const +{ + return getValue("account", QString(), QString(), true).toBool(); +} + +bool TabsSettings::getTabDeckStorageOpen() const +{ + return getValue("deckStorage", QString(), QString(), true).toBool(); +} + +bool TabsSettings::getTabReplaysOpen() const +{ + return getValue("replays", QString(), QString(), true).toBool(); +} + +bool TabsSettings::getTabAdminOpen() const +{ + return getValue("admin", QString(), QString(), true).toBool(); +} + +bool TabsSettings::getTabLogOpen() const +{ + return getValue("log", QString(), QString(), true).toBool(); +} + +void TabsSettings::setTabVisualDeckStorageOpen(bool value) +{ + setValue(value, "visualDeckStorage"); +} + +void TabsSettings::setTabServerOpen(bool value) +{ + setValue(value, "server"); +} + +void TabsSettings::setTabAccountOpen(bool value) +{ + setValue(value, "account"); +} + +void TabsSettings::setTabDeckStorageOpen(bool value) +{ + setValue(value, "deckStorage"); +} + +void TabsSettings::setTabReplaysOpen(bool value) +{ + setValue(value, "replays"); +} + +void TabsSettings::setTabAdminOpen(bool value) +{ + setValue(value, "admin"); +} + +void TabsSettings::setTabLogOpen(bool value) +{ + setValue(value, "log"); +} diff --git a/libcockatrice_settings/libcockatrice/settings/tabs_settings.h b/libcockatrice_settings/libcockatrice/settings/tabs_settings.h new file mode 100644 index 000000000..c8e952b87 --- /dev/null +++ b/libcockatrice_settings/libcockatrice/settings/tabs_settings.h @@ -0,0 +1,37 @@ +#ifndef TABS_SETTINGS_H +#define TABS_SETTINGS_H + +#include "settings_manager.h" + +#include + +class TabsSettings : public SettingsManager, public ITabsSettingsProvider +{ + Q_OBJECT + friend class SettingsCache; + +public: + [[nodiscard]] bool getTabVisualDeckStorageOpen() const override; + [[nodiscard]] bool getTabServerOpen() const override; + [[nodiscard]] bool getTabAccountOpen() const override; + [[nodiscard]] bool getTabDeckStorageOpen() const override; + [[nodiscard]] bool getTabReplaysOpen() const override; + [[nodiscard]] bool getTabAdminOpen() const override; + [[nodiscard]] bool getTabLogOpen() const override; + + void setTabVisualDeckStorageOpen(bool value); + void setTabServerOpen(bool value); + void setTabAccountOpen(bool value); + void setTabDeckStorageOpen(bool value); + void setTabReplaysOpen(bool value); + void setTabAdminOpen(bool value); + void setTabLogOpen(bool value); + +public: + explicit TabsSettings(const QString &settingPath, QObject *parent = nullptr); + +private: + TabsSettings(const TabsSettings & /*other*/); +}; + +#endif // TABS_SETTINGS_H diff --git a/libcockatrice_settings/libcockatrice/settings/updates_settings.cpp b/libcockatrice_settings/libcockatrice/settings/updates_settings.cpp new file mode 100644 index 000000000..3d6d77e53 --- /dev/null +++ b/libcockatrice_settings/libcockatrice/settings/updates_settings.cpp @@ -0,0 +1,104 @@ +#include "updates_settings.h" + +#include + +UpdatesSettings::UpdatesSettings(const QString &settingPath, QObject *parent) + : SettingsManager(settingPath + "updates.ini", "updates", QString(), parent) +{ +} + +bool UpdatesSettings::getCheckUpdatesOnStartup() const +{ + return getValue("startupUpdateCheck", QString(), QString(), true).toBool(); +} + +bool UpdatesSettings::getStartupCardUpdateCheckPromptForUpdate() +{ + return getValue("startupCardUpdateCheckPromptForUpdate", QString(), QString(), true).toBool(); +} + +bool UpdatesSettings::getStartupCardUpdateCheckAlwaysUpdate() +{ + return getValue("startupCardUpdateCheckAlwaysUpdate", QString(), QString(), false).toBool(); +} + +int UpdatesSettings::getCardUpdateCheckInterval() const +{ + return getValue("cardUpdateCheckInterval", QString(), QString(), 7).toInt(); +} + +QDate UpdatesSettings::getLastCardUpdateCheck() const +{ + return getValue("lastCardUpdateCheck", QString(), QString(), QDateTime::currentDateTime().date()).toDate(); +} + +bool UpdatesSettings::getCardUpdateCheckRequired() const +{ + return getLastCardUpdateCheck().daysTo(QDateTime::currentDateTime().date()) >= getCardUpdateCheckInterval() && + getLastCardUpdateCheck() != QDateTime::currentDateTime().date(); +} + +bool UpdatesSettings::getAlwaysEnableNewSets() const +{ + return getValue("alwaysEnableNewSets", QString(), QString(), false).toBool(); +} + +bool UpdatesSettings::getNotifyAboutUpdates() const +{ + return getValue("updatenotification", QString(), QString(), true).toBool(); +} + +bool UpdatesSettings::getNotifyAboutNewVersion() const +{ + return getValue("newversionnotification", QString(), QString(), true).toBool(); +} + +int UpdatesSettings::getUpdateReleaseChannelIndex() const +{ + return getValue("updatereleasechannel", QString(), QString(), 0).toInt(); +} + +void UpdatesSettings::setCheckUpdatesOnStartup(bool value) +{ + setValue(value, "startupUpdateCheck"); +} + +void UpdatesSettings::setStartupCardUpdateCheckPromptForUpdate(bool value) +{ + setValue(value, "startupCardUpdateCheckPromptForUpdate"); +} + +void UpdatesSettings::setStartupCardUpdateCheckAlwaysUpdate(bool value) +{ + setValue(value, "startupCardUpdateCheckAlwaysUpdate"); +} + +void UpdatesSettings::setCardUpdateCheckInterval(int value) +{ + setValue(value, "cardUpdateCheckInterval"); +} + +void UpdatesSettings::setLastCardUpdateCheck(QDate value) +{ + setValue(value, "lastCardUpdateCheck"); +} + +void UpdatesSettings::setAlwaysEnableNewSets(bool value) +{ + setValue(value, "alwaysEnableNewSets"); +} + +void UpdatesSettings::setNotifyAboutUpdates(bool _notifyaboutupdate) +{ + setValue(_notifyaboutupdate, "updatenotification"); +} + +void UpdatesSettings::setNotifyAboutNewVersion(bool _notifyaboutnewversion) +{ + setValue(_notifyaboutnewversion, "newversionnotification"); +} + +void UpdatesSettings::setUpdateReleaseChannelIndex(int value) +{ + setValue(value, "updatereleasechannel"); +} diff --git a/libcockatrice_settings/libcockatrice/settings/updates_settings.h b/libcockatrice_settings/libcockatrice/settings/updates_settings.h new file mode 100644 index 000000000..6df0f8ce4 --- /dev/null +++ b/libcockatrice_settings/libcockatrice/settings/updates_settings.h @@ -0,0 +1,43 @@ +#ifndef UPDATES_SETTINGS_H +#define UPDATES_SETTINGS_H + +#include "settings_manager.h" + +#include +#include + +class UpdatesSettings : public SettingsManager, public IUpdatesSettingsProvider +{ + Q_OBJECT + friend class SettingsCache; + +public: + [[nodiscard]] bool getCheckUpdatesOnStartup() const override; + [[nodiscard]] bool getStartupCardUpdateCheckPromptForUpdate() override; + [[nodiscard]] bool getStartupCardUpdateCheckAlwaysUpdate() override; + [[nodiscard]] int getCardUpdateCheckInterval() const override; + [[nodiscard]] QDate getLastCardUpdateCheck() const override; + [[nodiscard]] bool getCardUpdateCheckRequired() const override; + [[nodiscard]] bool getAlwaysEnableNewSets() const override; + [[nodiscard]] bool getNotifyAboutUpdates() const override; + [[nodiscard]] bool getNotifyAboutNewVersion() const override; + [[nodiscard]] int getUpdateReleaseChannelIndex() const override; + + void setCheckUpdatesOnStartup(bool value); + void setStartupCardUpdateCheckPromptForUpdate(bool value); + void setStartupCardUpdateCheckAlwaysUpdate(bool value); + void setCardUpdateCheckInterval(int value); + void setLastCardUpdateCheck(QDate value); + void setAlwaysEnableNewSets(bool value); + void setNotifyAboutUpdates(bool _notifyaboutupdate); + void setNotifyAboutNewVersion(bool _notifyaboutnewversion); + void setUpdateReleaseChannelIndex(int value); + +public: + explicit UpdatesSettings(const QString &settingPath, QObject *parent = nullptr); + +private: + UpdatesSettings(const UpdatesSettings & /*other*/); +}; + +#endif // UPDATES_SETTINGS_H diff --git a/libcockatrice_settings/libcockatrice/settings/visual_deck_storage_settings.cpp b/libcockatrice_settings/libcockatrice/settings/visual_deck_storage_settings.cpp new file mode 100644 index 000000000..c0ccc37aa --- /dev/null +++ b/libcockatrice_settings/libcockatrice/settings/visual_deck_storage_settings.cpp @@ -0,0 +1,348 @@ +#include "visual_deck_storage_settings.h" + +namespace +{ +QStringList defaultTags = { + // Strategies + "🏃️ Aggro", + "🧙‍️ Control", + "⚔️ Midrange", + "🌀 Combo", + "🪓 Mill", + "🔒 Stax", + "🗺️ Landfall", + "🛡️ Pillowfort", + "🌱 Ramp", + "⚡ Storm", + "💀 Aristocrats", + "☠️ Reanimator", + "👹 Sacrifice", + "🔥 Burn", + "🌟 Lifegain", + "🔮 Spellslinger", + "👥 Tokens", + "🎭 Blink", + "⏳ Time Manipulation", + "🌍 Domain", + "💫 Proliferate", + "📜 Saga", + "🎲 Chaos", + "🪄 Auras", + "🔫 Pingers", + + // Themes + "👑 Monarch", + "🚀 Vehicles", + "💉 Infect", + "🩸 Madness", + "🌀 Morph", + + // Card Types + "⚔️ Creature", + "💎 Artifact", + "🌔 Enchantment", + "📖 Sorcery", + "⚡ Instant", + "🌌 Planeswalker", + "🌏 Land", + "🪄 Aura", + + // Kindred Types + "🐉 Kindred", + "🧙 Humans", + "⚔️ Soldiers", + "🛡️ Knights", + "🎻 Bards", + "🧝 Elves", + "🌲 Dryads", + "😇 Angels", + "🎩 Wizards", + "🧛 Vampires", + "🦴 Skeletons", + "💀 Zombies", + "👹 Demons", + "👾 Eldrazi", + "🐉 Dragons", + "🐠 Merfolk", + "🦁 Cats", + "🐺 Wolves", + "🐺 Werewolves", + "🦇 Bats", + "🐀 Rats", + "🦅 Birds", + "🦗 Insects", + "🍄 Fungus", + "🐚 Sea Creatures", + "🐗 Boars", + "🦊 Foxes", + "🦄 Unicorns", + "🐘 Elephants", + "🐻 Bears", + "🦏 Rhinos", + "🦂 Scorpions", + +}; +} + +VisualDeckStorageSettings::VisualDeckStorageSettings(const QString &settingPath, QObject *parent) + : SettingsManager(settingPath + "visual_deck_storage.ini", "interface", QString(), parent) +{ +} + +int VisualDeckStorageSettings::getVisualDeckStorageSortingOrder() const +{ + return getValue("visualdeckstoragesortingorder", QString(), QString(), 0).toInt(); +} + +bool VisualDeckStorageSettings::getVisualDeckStorageShowFolders() const +{ + return getValue("visualdeckstorageshowfolders", QString(), QString(), true).toBool(); +} + +bool VisualDeckStorageSettings::getVisualDeckStorageShowTagFilter() const +{ + return getValue("visualdeckstorageshowtagfilter", QString(), QString(), true).toBool(); +} + +QStringList VisualDeckStorageSettings::getVisualDeckStorageDefaultTagsList() const +{ + return getValue("visualdeckstoragedefaulttagslist", QString(), QString(), QVariant::fromValue(defaultTags)) + .toStringList(); +} + +bool VisualDeckStorageSettings::getVisualDeckStorageSearchFolderNames() const +{ + return getValue("visualdeckstoragesearchfoldernames", QString(), QString(), true).toBool(); +} + +bool VisualDeckStorageSettings::getVisualDeckStorageShowColorIdentity() const +{ + return getValue("visualdeckstorageshowcoloridentity", QString(), QString(), true).toBool(); +} + +bool VisualDeckStorageSettings::getVisualDeckStorageShowBannerCardComboBox() const +{ + return getValue("visualdeckstorageshowbannercardcombobox", QString(), QString(), true).toBool(); +} + +bool VisualDeckStorageSettings::getVisualDeckStorageShowTagsOnDeckPreviews() const +{ + return getValue("visualdeckstorageshowtagsondeckpreviews", QString(), QString(), true).toBool(); +} + +int VisualDeckStorageSettings::getVisualDeckStorageCardSize() const +{ + return getValue("visualdeckstoragecardsize", QString(), QString(), 100).toInt(); +} + +bool VisualDeckStorageSettings::getVisualDeckStorageDrawUnusedColorIdentities() const +{ + return getValue("visualdeckstoragedrawunusedcoloridentities", QString(), QString(), true).toBool(); +} + +int VisualDeckStorageSettings::getVisualDeckStorageUnusedColorIdentitiesOpacity() const +{ + return getValue("visualdeckstorageunusedcoloridentitiesopacity", QString(), QString(), 15).toInt(); +} + +int VisualDeckStorageSettings::getVisualDeckStorageTooltipType() const +{ + return getValue("visualdeckstoragetooltiptype", QString(), QString(), 0).toInt(); +} + +bool VisualDeckStorageSettings::getVisualDeckStoragePromptForConversion() const +{ + return getValue("visualdeckstoragepromptforconversion", QString(), QString(), true).toBool(); +} + +bool VisualDeckStorageSettings::getVisualDeckStorageAlwaysConvert() const +{ + return getValue("visualdeckstoragealwaysconvert", QString(), QString(), false).toBool(); +} + +bool VisualDeckStorageSettings::getVisualDeckStorageInGame() const +{ + return getValue("visualdeckstorageingame", QString(), QString(), true).toBool(); +} + +bool VisualDeckStorageSettings::getVisualDeckStorageSelectionAnimation() const +{ + return getValue("visualdeckstorageselectionanimation", QString(), QString(), true).toBool(); +} + +int VisualDeckStorageSettings::getVisualDeckEditorCardSize() const +{ + return getValue("visualdeckeditorcardsize", QString(), QString(), 100).toInt(); +} + +int VisualDeckStorageSettings::getVisualDeckEditorSampleHandSize() const +{ + return getValue("visualdeckeditorsamplehandsize", QString(), QString(), 7).toInt(); +} + +int VisualDeckStorageSettings::getVisualDatabaseDisplayCardSize() const +{ + return getValue("visualdatabasedisplaycardsize", QString(), QString(), 100).toInt(); +} + +bool VisualDeckStorageSettings::getVisualDatabaseDisplayFilterToMostRecentSetsEnabled() const +{ + return getValue("visualdatabasedisplayfiltertomostrecentsetsenabled", QString(), QString(), false).toBool(); +} + +int VisualDeckStorageSettings::getVisualDatabaseDisplayFilterToMostRecentSetsAmount() const +{ + return getValue("visualdatabasedisplayfiltertomostrecentsetsamount", QString(), QString(), 10).toInt(); +} + +int VisualDeckStorageSettings::getEDHRecCardSize() const +{ + return getValue("edhreccardsize", QString(), QString(), 100).toInt(); +} + +int VisualDeckStorageSettings::getArchidektPreviewSize() const +{ + return getValue("archidektpreviewsize", QString(), QString(), 100).toInt(); +} + +int VisualDeckStorageSettings::getDefaultDeckEditorType() const +{ + return getValue("defaultDeckEditorType", QString(), QString(), 1).toInt(); +} + +void VisualDeckStorageSettings::setVisualDeckStorageSortingOrder(int _sortingOrder) +{ + setValue(_sortingOrder, "visualdeckstoragesortingorder"); +} + +void VisualDeckStorageSettings::setVisualDeckStorageShowFolders(bool value) +{ + setValue(value, "visualdeckstorageshowfolders"); +} + +void VisualDeckStorageSettings::setVisualDeckStorageShowTagFilter(bool _showTags) +{ + setValue(_showTags, "visualdeckstorageshowtagfilter"); + emit visualDeckStorageShowTagFilterChanged(_showTags); +} + +void VisualDeckStorageSettings::setVisualDeckStorageDefaultTagsList(QStringList _defaultTagsList) +{ + setValue(QVariant::fromValue(_defaultTagsList), "visualdeckstoragedefaulttagslist"); + emit visualDeckStorageDefaultTagsListChanged(); +} + +void VisualDeckStorageSettings::setVisualDeckStorageSearchFolderNames(bool value) +{ + setValue(value, "visualdeckstoragesearchfoldernames"); +} + +void VisualDeckStorageSettings::setVisualDeckStorageShowColorIdentity(bool value) +{ + setValue(value, "visualdeckstorageshowcoloridentity"); + emit visualDeckStorageShowColorIdentityChanged(value); +} + +void VisualDeckStorageSettings::setVisualDeckStorageShowBannerCardComboBox(bool _showBannerCardComboBox) +{ + setValue(_showBannerCardComboBox, "visualdeckstorageshowbannercardcombobox"); + emit visualDeckStorageShowBannerCardComboBoxChanged(_showBannerCardComboBox); +} + +void VisualDeckStorageSettings::setVisualDeckStorageShowTagsOnDeckPreviews(bool _showTags) +{ + setValue(_showTags, "visualdeckstorageshowtagsondeckpreviews"); + emit visualDeckStorageShowTagsOnDeckPreviewsChanged(_showTags); +} + +void VisualDeckStorageSettings::setVisualDeckStorageCardSize(int _cardSize) +{ + setValue(_cardSize, "visualdeckstoragecardsize"); + emit visualDeckStorageCardSizeChanged(); +} + +void VisualDeckStorageSettings::setVisualDeckStorageDrawUnusedColorIdentities(bool _draw) +{ + setValue(_draw, "visualdeckstoragedrawunusedcoloridentities"); + emit visualDeckStorageDrawUnusedColorIdentitiesChanged(_draw); +} + +void VisualDeckStorageSettings::setVisualDeckStorageUnusedColorIdentitiesOpacity(int _opacity) +{ + setValue(_opacity, "visualdeckstorageunusedcoloridentitiesopacity"); + emit visualDeckStorageUnusedColorIdentitiesOpacityChanged(_opacity); +} + +void VisualDeckStorageSettings::setVisualDeckStorageTooltipType(int value) +{ + setValue(value, "visualdeckstoragetooltiptype"); +} + +void VisualDeckStorageSettings::setVisualDeckStoragePromptForConversion(bool _prompt) +{ + setValue(_prompt, "visualdeckstoragepromptforconversion"); +} + +void VisualDeckStorageSettings::setVisualDeckStorageAlwaysConvert(bool _always) +{ + setValue(_always, "visualdeckstoragealwaysconvert"); +} + +void VisualDeckStorageSettings::setVisualDeckStorageInGame(bool enabled) +{ + setValue(enabled, "visualdeckstorageingame"); + emit visualDeckStorageInGameChanged(enabled); +} + +void VisualDeckStorageSettings::setVisualDeckStorageSelectionAnimation(bool enabled) +{ + setValue(enabled, "visualdeckstorageselectionanimation"); + emit visualDeckStorageSelectionAnimationChanged(enabled); +} + +void VisualDeckStorageSettings::setVisualDeckEditorCardSize(int _cardSize) +{ + setValue(_cardSize, "visualdeckeditorcardsize"); + emit visualDeckEditorCardSizeChanged(); +} + +void VisualDeckStorageSettings::setVisualDeckEditorSampleHandSize(int _amount) +{ + setValue(_amount, "visualdeckeditorsamplehandsize"); + emit visualDeckEditorSampleHandSizeAmountChanged(_amount); +} + +void VisualDeckStorageSettings::setVisualDatabaseDisplayCardSize(int _cardSize) +{ + setValue(_cardSize, "visualdatabasedisplaycardsize"); + emit visualDatabaseDisplayCardSizeChanged(); +} + +void VisualDeckStorageSettings::setVisualDatabaseDisplayFilterToMostRecentSetsEnabled(bool _enabled) +{ + setValue(_enabled, "visualdatabasedisplayfiltertomostrecentsetsenabled"); + emit visualDatabaseDisplayFilterToMostRecentSetsEnabledChanged(_enabled); +} + +void VisualDeckStorageSettings::setVisualDatabaseDisplayFilterToMostRecentSetsAmount(int _amount) +{ + setValue(_amount, "visualdatabasedisplayfiltertomostrecentsetsamount"); + emit visualDatabaseDisplayFilterToMostRecentSetsAmountChanged(_amount); +} + +void VisualDeckStorageSettings::setEDHRecCardSize(int _edhrecCardSize) +{ + setValue(_edhrecCardSize, "edhreccardsize"); + emit edhRecCardSizeChanged(); +} + +void VisualDeckStorageSettings::setArchidektPreviewCardSize(int _archidektPreviewCardSize) +{ + setValue(_archidektPreviewCardSize, "archidektpreviewsize"); + emit archidektPreviewSizeChanged(); +} + +void VisualDeckStorageSettings::setDefaultDeckEditorType(int value) +{ + setValue(value, "defaultDeckEditorType"); +} diff --git a/libcockatrice_settings/libcockatrice/settings/visual_deck_storage_settings.h b/libcockatrice_settings/libcockatrice/settings/visual_deck_storage_settings.h new file mode 100644 index 000000000..06337ce79 --- /dev/null +++ b/libcockatrice_settings/libcockatrice/settings/visual_deck_storage_settings.h @@ -0,0 +1,91 @@ +#ifndef VISUAL_DECK_STORAGE_SETTINGS_H +#define VISUAL_DECK_STORAGE_SETTINGS_H + +#include "settings_manager.h" + +#include +#include + +class VisualDeckStorageSettings : public SettingsManager, public IVisualDeckStorageSettingsProvider +{ + Q_OBJECT + friend class SettingsCache; + +public: + [[nodiscard]] int getVisualDeckStorageSortingOrder() const override; + [[nodiscard]] bool getVisualDeckStorageShowFolders() const override; + [[nodiscard]] bool getVisualDeckStorageShowTagFilter() const override; + [[nodiscard]] QStringList getVisualDeckStorageDefaultTagsList() const override; + [[nodiscard]] bool getVisualDeckStorageSearchFolderNames() const override; + [[nodiscard]] bool getVisualDeckStorageShowColorIdentity() const override; + [[nodiscard]] bool getVisualDeckStorageShowBannerCardComboBox() const override; + [[nodiscard]] bool getVisualDeckStorageShowTagsOnDeckPreviews() const override; + [[nodiscard]] int getVisualDeckStorageCardSize() const override; + [[nodiscard]] bool getVisualDeckStorageDrawUnusedColorIdentities() const override; + [[nodiscard]] int getVisualDeckStorageUnusedColorIdentitiesOpacity() const override; + [[nodiscard]] int getVisualDeckStorageTooltipType() const override; + [[nodiscard]] bool getVisualDeckStoragePromptForConversion() const override; + [[nodiscard]] bool getVisualDeckStorageAlwaysConvert() const override; + [[nodiscard]] bool getVisualDeckStorageInGame() const override; + [[nodiscard]] bool getVisualDeckStorageSelectionAnimation() const override; + [[nodiscard]] int getVisualDeckEditorCardSize() const override; + [[nodiscard]] int getVisualDeckEditorSampleHandSize() const override; + [[nodiscard]] int getVisualDatabaseDisplayCardSize() const override; + [[nodiscard]] bool getVisualDatabaseDisplayFilterToMostRecentSetsEnabled() const override; + [[nodiscard]] int getVisualDatabaseDisplayFilterToMostRecentSetsAmount() const override; + [[nodiscard]] int getEDHRecCardSize() const override; + [[nodiscard]] int getArchidektPreviewSize() const override; + [[nodiscard]] int getDefaultDeckEditorType() const override; + + void setVisualDeckStorageSortingOrder(int _sortingOrder); + void setVisualDeckStorageShowFolders(bool value); + void setVisualDeckStorageShowTagFilter(bool _showTags); + void setVisualDeckStorageDefaultTagsList(QStringList _defaultTagsList); + void setVisualDeckStorageSearchFolderNames(bool value); + void setVisualDeckStorageShowColorIdentity(bool value); + void setVisualDeckStorageShowBannerCardComboBox(bool _showBannerCardComboBox); + void setVisualDeckStorageShowTagsOnDeckPreviews(bool _showTags); + void setVisualDeckStorageCardSize(int _cardSize); + void setVisualDeckStorageDrawUnusedColorIdentities(bool _draw); + void setVisualDeckStorageUnusedColorIdentitiesOpacity(int _opacity); + void setVisualDeckStorageTooltipType(int value); + void setVisualDeckStoragePromptForConversion(bool _prompt); + void setVisualDeckStorageAlwaysConvert(bool _always); + void setVisualDeckStorageInGame(bool enabled); + void setVisualDeckStorageSelectionAnimation(bool enabled); + void setVisualDeckEditorCardSize(int _cardSize); + void setVisualDeckEditorSampleHandSize(int _amount); + void setVisualDatabaseDisplayCardSize(int _cardSize); + void setVisualDatabaseDisplayFilterToMostRecentSetsEnabled(bool _enabled); + void setVisualDatabaseDisplayFilterToMostRecentSetsAmount(int _amount); + void setEDHRecCardSize(int _edhrecCardSize); + void setArchidektPreviewCardSize(int _archidektPreviewCardSize); + void setDefaultDeckEditorType(int value); + +signals: + void visualDeckStorageShowTagFilterChanged(bool _visible); + void visualDeckStorageDefaultTagsListChanged(); + void visualDeckStorageShowColorIdentityChanged(bool _visible); + void visualDeckStorageShowBannerCardComboBoxChanged(bool _visible); + void visualDeckStorageShowTagsOnDeckPreviewsChanged(bool _visible); + void visualDeckStorageCardSizeChanged(); + void visualDeckStorageDrawUnusedColorIdentitiesChanged(bool _visible); + void visualDeckStorageUnusedColorIdentitiesOpacityChanged(bool value); + void visualDeckStorageInGameChanged(bool enabled); + void visualDeckStorageSelectionAnimationChanged(bool enabled); + void visualDatabaseDisplayFilterToMostRecentSetsEnabledChanged(bool enabled); + void visualDatabaseDisplayFilterToMostRecentSetsAmountChanged(int amount); + void visualDeckEditorSampleHandSizeAmountChanged(int amount); + void visualDeckEditorCardSizeChanged(); + void visualDatabaseDisplayCardSizeChanged(); + void edhRecCardSizeChanged(); + void archidektPreviewSizeChanged(); + +public: + explicit VisualDeckStorageSettings(const QString &settingPath, QObject *parent = nullptr); + +private: + VisualDeckStorageSettings(const VisualDeckStorageSettings & /*other*/); +}; + +#endif // VISUAL_DECK_STORAGE_SETTINGS_H diff --git a/oracle/src/main.cpp b/oracle/src/main.cpp index 5def0c887..f8f069ab0 100644 --- a/oracle/src/main.cpp +++ b/oracle/src/main.cpp @@ -10,6 +10,7 @@ #include #include #include +#include QTranslator *translator, *qtTranslator; ThemeManager *themeManager; @@ -21,7 +22,7 @@ bool isBackgrounded; void installNewTranslator() { - QString lang = SettingsCache::instance().getLang(); + QString lang = SettingsCache::instance().personal().getLang(); QString qtNameHint = "qt_" + lang; #if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) diff --git a/oracle/src/oraclewizard.cpp b/oracle/src/oraclewizard.cpp index 2edb9e561..11200dfc5 100644 --- a/oracle/src/oraclewizard.cpp +++ b/oracle/src/oraclewizard.cpp @@ -15,6 +15,7 @@ #include #include #include +#include OracleWizard::OracleWizard(QWidget *parent) : QWizard(parent) { @@ -33,7 +34,7 @@ OracleWizard::OracleWizard(QWidget *parent) : QWizard(parent) migrateOracleSettings(); } - connect(&SettingsCache::instance(), &SettingsCache::langChanged, this, &OracleWizard::updateLanguage); + connect(&SettingsCache::instance().personal(), &PersonalSettings::langChanged, this, &OracleWizard::updateLanguage); importer = new OracleImporter(this); diff --git a/oracle/src/pages.cpp b/oracle/src/pages.cpp index 7629a291b..df4d1a98c 100644 --- a/oracle/src/pages.cpp +++ b/oracle/src/pages.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #ifdef HAS_LZMA #include "lzma/decompress.h" @@ -119,7 +120,7 @@ QString IntroPage::languageName(const QString &lang) void IntroPage::languageBoxChanged(int index) { - SettingsCache::instance().setLang(languageBox->itemData(index).toString()); + SettingsCache::instance().personal().setLang(languageBox->itemData(index).toString()); } void IntroPage::retranslateUi() diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index a179a3603..857e0b041 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -87,3 +87,4 @@ add_subdirectory(carddatabase) add_subdirectory(loading_from_clipboard) add_subdirectory(movecard_tests) add_subdirectory(oracle) +add_subdirectory(settings) diff --git a/tests/settings/CMakeLists.txt b/tests/settings/CMakeLists.txt new file mode 100644 index 000000000..7ee32a645 --- /dev/null +++ b/tests/settings/CMakeLists.txt @@ -0,0 +1,26 @@ +add_executable(settings_manager_test settings_manager_test.cpp) +add_executable(settings_defaults_test settings_defaults_test.cpp) +add_executable(settings_migration_test settings_migration_test.cpp) + +target_link_libraries( + settings_manager_test libcockatrice_settings Threads::Threads ${GTEST_BOTH_LIBRARIES} ${TEST_QT_MODULES} +) + +target_link_libraries( + settings_defaults_test libcockatrice_settings Threads::Threads ${GTEST_BOTH_LIBRARIES} ${TEST_QT_MODULES} +) +target_compile_definitions(settings_defaults_test PRIVATE SETTINGS_UNIT_TEST) + +target_link_libraries( + settings_migration_test libcockatrice_settings Threads::Threads ${GTEST_BOTH_LIBRARIES} ${TEST_QT_MODULES} +) + +add_test(NAME settings_manager_test COMMAND settings_manager_test) +add_test(NAME settings_defaults_test COMMAND settings_defaults_test) +add_test(NAME settings_migration_test COMMAND settings_migration_test) + +if(NOT GTEST_FOUND) + add_dependencies(settings_manager_test gtest) + add_dependencies(settings_defaults_test gtest) + add_dependencies(settings_migration_test gtest) +endif() diff --git a/tests/settings/settings_defaults_test.cpp b/tests/settings/settings_defaults_test.cpp new file mode 100644 index 000000000..0cd68d9d4 --- /dev/null +++ b/tests/settings/settings_defaults_test.cpp @@ -0,0 +1,355 @@ +#include "gtest/gtest.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace +{ + +class SettingsDefaultsTest : public ::testing::Test +{ +protected: + QTemporaryDir tempDir; + QString settingsPath; + + void SetUp() override + { + settingsPath = tempDir.path() + "/"; + } +}; + +// --- CacheStorageSettings --- + +TEST_F(SettingsDefaultsTest, CacheStorage_PixmapCacheSize_Default) +{ + CacheStorageSettings s(settingsPath, nullptr); + ASSERT_EQ(s.getPixmapCacheSize(), PIXMAPCACHE_SIZE_DEFAULT); +} + +TEST_F(SettingsDefaultsTest, CacheStorage_PixmapCacheSize_SetAndGet) +{ + CacheStorageSettings s(settingsPath, nullptr); + s.setPixmapCacheSize(1024); + ASSERT_EQ(s.getPixmapCacheSize(), 1024); +} + +TEST_F(SettingsDefaultsTest, CacheStorage_NetworkCacheSizeInMB_Default) +{ + CacheStorageSettings s(settingsPath, nullptr); + ASSERT_EQ(s.getNetworkCacheSizeInMB(), NETWORK_CACHE_SIZE_DEFAULT); +} + +TEST_F(SettingsDefaultsTest, CacheStorage_RedirectCacheTtl_Default) +{ + CacheStorageSettings s(settingsPath, nullptr); + ASSERT_EQ(s.getRedirectCacheTtl(), NETWORK_REDIRECT_CACHE_TTL_DEFAULT); +} + +TEST_F(SettingsDefaultsTest, CacheStorage_CardPictureLoaderCacheMethod_Default) +{ + CacheStorageSettings s(settingsPath, nullptr); + ASSERT_EQ(s.getCardPictureLoaderCacheMethod(), 0); +} + +TEST_F(SettingsDefaultsTest, CacheStorage_LocalCardImageStorageNamingScheme_Default) +{ + CacheStorageSettings s(settingsPath, nullptr); + ASSERT_EQ(s.getLocalCardImageStorageNamingScheme(), LOCAL_CARD_IMAGE_NAMING_SCHEME_DEFAULT); +} + +// --- GameSettings --- + +TEST_F(SettingsDefaultsTest, Game_MaxPlayers_Default) +{ + GameSettings s(settingsPath, nullptr); + ASSERT_EQ(s.getMaxPlayers(), 2); +} + +TEST_F(SettingsDefaultsTest, Game_MaxPlayers_SetAndGet) +{ + GameSettings s(settingsPath, nullptr); + s.setMaxPlayers(4); + ASSERT_EQ(s.getMaxPlayers(), 4); +} + +TEST_F(SettingsDefaultsTest, Game_DefaultStartingLifeTotal_Default) +{ + GameSettings s(settingsPath, nullptr); + ASSERT_EQ(s.getDefaultStartingLifeTotal(), 20); +} + +TEST_F(SettingsDefaultsTest, Game_RememberGameSettings_Default) +{ + GameSettings s(settingsPath, nullptr); + ASSERT_EQ(s.getRememberGameSettings(), true); +} + +TEST_F(SettingsDefaultsTest, Game_LocalGameMaxPlayers_Default) +{ + GameSettings s(settingsPath, nullptr); + ASSERT_EQ(s.getLocalGameMaxPlayers(), 1); +} + +TEST_F(SettingsDefaultsTest, Game_LocalGameStartingLifeTotal_Default) +{ + GameSettings s(settingsPath, nullptr); + ASSERT_EQ(s.getLocalGameStartingLifeTotal(), 20); +} + +TEST_F(SettingsDefaultsTest, Game_LocalGameRememberSettings_Default) +{ + GameSettings s(settingsPath, nullptr); + ASSERT_EQ(s.getLocalGameRememberSettings(), false); +} + +// --- UpdatesSettings --- + +TEST_F(SettingsDefaultsTest, Updates_CheckUpdatesOnStartup_Default) +{ + UpdatesSettings s(settingsPath, nullptr); + ASSERT_EQ(s.getCheckUpdatesOnStartup(), true); +} + +TEST_F(SettingsDefaultsTest, Updates_StartupCardUpdateCheckPromptForUpdate_Default) +{ + UpdatesSettings s(settingsPath, nullptr); + ASSERT_EQ(s.getStartupCardUpdateCheckPromptForUpdate(), true); +} + +TEST_F(SettingsDefaultsTest, Updates_StartupCardUpdateCheckAlwaysUpdate_Default) +{ + UpdatesSettings s(settingsPath, nullptr); + ASSERT_EQ(s.getStartupCardUpdateCheckAlwaysUpdate(), false); +} + +TEST_F(SettingsDefaultsTest, Updates_CardUpdateCheckInterval_Default) +{ + UpdatesSettings s(settingsPath, nullptr); + ASSERT_EQ(s.getCardUpdateCheckInterval(), 7); +} + +TEST_F(SettingsDefaultsTest, Updates_AlwaysEnableNewSets_Default) +{ + UpdatesSettings s(settingsPath, nullptr); + ASSERT_EQ(s.getAlwaysEnableNewSets(), false); +} + +TEST_F(SettingsDefaultsTest, Updates_NotifyAboutUpdates_Default) +{ + UpdatesSettings s(settingsPath, nullptr); + ASSERT_EQ(s.getNotifyAboutUpdates(), true); +} + +TEST_F(SettingsDefaultsTest, Updates_NotifyAboutNewVersion_Default) +{ + UpdatesSettings s(settingsPath, nullptr); + ASSERT_EQ(s.getNotifyAboutNewVersion(), true); +} + +TEST_F(SettingsDefaultsTest, Updates_UpdateReleaseChannelIndex_Default) +{ + UpdatesSettings s(settingsPath, nullptr); + ASSERT_EQ(s.getUpdateReleaseChannelIndex(), 0); +} + +// --- SoundSettings --- + +TEST_F(SettingsDefaultsTest, Sound_SoundEnabled_Default) +{ + SoundSettings s(settingsPath, nullptr); + ASSERT_EQ(s.getSoundEnabled(), false); +} + +TEST_F(SettingsDefaultsTest, Sound_MasterVolume_Default) +{ + SoundSettings s(settingsPath, nullptr); + ASSERT_EQ(s.getMasterVolume(), 100); +} + +TEST_F(SettingsDefaultsTest, Sound_MasterVolume_SetAndGet) +{ + SoundSettings s(settingsPath, nullptr); + s.setMasterVolume(50); + ASSERT_EQ(s.getMasterVolume(), 50); +} + +// --- TabsSettings --- + +TEST_F(SettingsDefaultsTest, Tabs_AllTabsOpen_Default) +{ + TabsSettings s(settingsPath, nullptr); + ASSERT_EQ(s.getTabVisualDeckStorageOpen(), true); + ASSERT_EQ(s.getTabServerOpen(), true); + ASSERT_EQ(s.getTabAccountOpen(), true); + ASSERT_EQ(s.getTabDeckStorageOpen(), true); + ASSERT_EQ(s.getTabReplaysOpen(), true); + ASSERT_EQ(s.getTabAdminOpen(), true); + ASSERT_EQ(s.getTabLogOpen(), true); +} + +// --- ChatSettings --- + +TEST_F(SettingsDefaultsTest, Chat_Mention_Default) +{ + ChatSettings s(settingsPath, nullptr); + ASSERT_EQ(s.getChatMention(), true); +} + +TEST_F(SettingsDefaultsTest, Chat_MentionCompleter_Default) +{ + ChatSettings s(settingsPath, nullptr); + ASSERT_EQ(s.getChatMentionCompleter(), true); +} + +TEST_F(SettingsDefaultsTest, Chat_MentionColor_Default) +{ + ChatSettings s(settingsPath, nullptr); + ASSERT_EQ(s.getChatMentionColor(), QString("A6120D")); +} + +TEST_F(SettingsDefaultsTest, Chat_HighlightColor_Default) +{ + ChatSettings s(settingsPath, nullptr); + ASSERT_EQ(s.getChatHighlightColor(), QString("A6120D")); +} + +TEST_F(SettingsDefaultsTest, Chat_MentionForeground_Default) +{ + ChatSettings s(settingsPath, nullptr); + ASSERT_EQ(s.getChatMentionForeground(), true); +} + +TEST_F(SettingsDefaultsTest, Chat_HighlightForeground_Default) +{ + ChatSettings s(settingsPath, nullptr); + ASSERT_EQ(s.getChatHighlightForeground(), true); +} + +TEST_F(SettingsDefaultsTest, Chat_ShowMessagePopup_Default) +{ + ChatSettings s(settingsPath, nullptr); + ASSERT_EQ(s.getShowMessagePopup(), true); +} + +TEST_F(SettingsDefaultsTest, Chat_ShowMentionPopup_Default) +{ + ChatSettings s(settingsPath, nullptr); + ASSERT_EQ(s.getShowMentionPopup(), true); +} + +TEST_F(SettingsDefaultsTest, Chat_RoomHistory_Default) +{ + ChatSettings s(settingsPath, nullptr); + ASSERT_EQ(s.getRoomHistory(), true); +} + +// --- PersonalSettings --- + +TEST_F(SettingsDefaultsTest, Personal_Lang_Default) +{ + PersonalSettings s(settingsPath, nullptr); + ASSERT_EQ(s.getLang(), QString("")); +} + +TEST_F(SettingsDefaultsTest, Personal_ClientID_Default) +{ + PersonalSettings s(settingsPath, nullptr); + ASSERT_EQ(s.getClientID(), QString("notset")); +} + +TEST_F(SettingsDefaultsTest, Personal_KeepAlive_Default) +{ + PersonalSettings s(settingsPath, nullptr); + ASSERT_EQ(s.getKeepAlive(), 3); +} + +TEST_F(SettingsDefaultsTest, Personal_TimeOut_Default) +{ + PersonalSettings s(settingsPath, nullptr); + ASSERT_EQ(s.getTimeOut(), 5); +} + +TEST_F(SettingsDefaultsTest, Personal_PicDownload_Default) +{ + PersonalSettings s(settingsPath, nullptr); + ASSERT_EQ(s.getPicDownload(), true); +} + +TEST_F(SettingsDefaultsTest, Personal_ShowStatusBar_Default) +{ + PersonalSettings s(settingsPath, nullptr); + ASSERT_EQ(s.getShowStatusBar(), false); +} + +TEST_F(SettingsDefaultsTest, Personal_MaxFontSize_Default) +{ + PersonalSettings s(settingsPath, nullptr); + ASSERT_EQ(s.getMaxFontSize(), 12); +} + +TEST_F(SettingsDefaultsTest, Personal_HomeTabBackgroundSource_Default) +{ + PersonalSettings s(settingsPath, nullptr); + ASSERT_EQ(s.getHomeTabBackgroundSource(), QString("themed")); +} + +TEST_F(SettingsDefaultsTest, Personal_HomeTabDisplayCardName_Default) +{ + PersonalSettings s(settingsPath, nullptr); + ASSERT_EQ(s.getHomeTabDisplayCardName(), true); +} + +TEST_F(SettingsDefaultsTest, Personal_ShowTipsOnStartup_Default) +{ + PersonalSettings s(settingsPath, nullptr); + ASSERT_EQ(s.getShowTipsOnStartup(), true); +} + +TEST_F(SettingsDefaultsTest, Personal_DownloadSpoilersStatus_Default) +{ + PersonalSettings s(settingsPath, nullptr); + ASSERT_EQ(s.getDownloadSpoilersStatus(), false); +} + +// --- VisualDeckStorageSettings --- + +TEST_F(SettingsDefaultsTest, VisualDeckStorage_SortingOrder_Default) +{ + VisualDeckStorageSettings s(settingsPath, nullptr); + ASSERT_EQ(s.getVisualDeckStorageSortingOrder(), 0); +} + +TEST_F(SettingsDefaultsTest, VisualDeckStorage_ShowFolders_Default) +{ + VisualDeckStorageSettings s(settingsPath, nullptr); + ASSERT_EQ(s.getVisualDeckStorageShowFolders(), true); +} + +TEST_F(SettingsDefaultsTest, VisualDeckStorage_DefaultTagsList_NotEmpty) +{ + VisualDeckStorageSettings s(settingsPath, nullptr); + ASSERT_GT(s.getVisualDeckStorageDefaultTagsList().size(), 0); +} + +TEST_F(SettingsDefaultsTest, VisualDeckStorage_DefaultTagsList_SetAndGet) +{ + VisualDeckStorageSettings s(settingsPath, nullptr); + QStringList custom = {"Tag1", "Tag2"}; + s.setVisualDeckStorageDefaultTagsList(custom); + ASSERT_EQ(s.getVisualDeckStorageDefaultTagsList(), custom); +} + +} // namespace + +int main(int argc, char **argv) +{ + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} diff --git a/tests/settings/settings_manager_test.cpp b/tests/settings/settings_manager_test.cpp new file mode 100644 index 000000000..51eb66dbb --- /dev/null +++ b/tests/settings/settings_manager_test.cpp @@ -0,0 +1,171 @@ +#include "gtest/gtest.h" +#include +#include +#include + +namespace +{ + +class SettingsManagerTest : public ::testing::Test +{ +protected: + QTemporaryDir tempDir; + QString settingsPath; + + void SetUp() override + { + settingsPath = tempDir.path() + "/"; + } + + void writeValue(const QString &file, const QString &key, const QVariant &value) + { + QSettings qs(file, QSettings::IniFormat); + qs.setValue(key, value); + } +}; + +TEST_F(SettingsManagerTest, GetValueNoDefaultReturnsInvalid) +{ + SettingsManager sm(settingsPath + "test.ini"); + QVariant val = sm.getValue("nonexistent"); + ASSERT_TRUE(val.isNull()); +} + +TEST_F(SettingsManagerTest, GetValueWithDefaultReturnsDefaultWhenMissing) +{ + SettingsManager sm(settingsPath + "test.ini"); + QVariant val = sm.getValue("nonexistent", QString(), QString(), 42); + ASSERT_EQ(val.toInt(), 42); +} + +TEST_F(SettingsManagerTest, GetValueWithDefaultReturnsStoredWhenPresent) +{ + writeValue(settingsPath + "test.ini", "mykey", 99); + + SettingsManager sm(settingsPath + "test.ini"); + QVariant val = sm.getValue("mykey", QString(), QString(), 42); + ASSERT_EQ(val.toInt(), 99); +} + +TEST_F(SettingsManagerTest, GetValueWithGroup) +{ + writeValue(settingsPath + "grouped.ini", "group1/greeting", "world"); + + SettingsManager sm(settingsPath + "grouped.ini"); + QVariant val = sm.getValue("greeting", "group1"); + ASSERT_EQ(val.toString(), QString("world")); +} + +TEST_F(SettingsManagerTest, GetValueWithGroupAndSubGroup) +{ + writeValue(settingsPath + "nested.ini", "outer/inner/depth", 1); + + SettingsManager sm(settingsPath + "nested.ini"); + QVariant val = sm.getValue("depth", "outer", "inner"); + ASSERT_EQ(val.toInt(), 1); +} + +TEST_F(SettingsManagerTest, DefaultGroupUsedInGetValue) +{ + writeValue(settingsPath + "defgroup.ini", "defaultGroup/key", "val"); + + SettingsManager sm(settingsPath + "defgroup.ini", "defaultGroup"); + QVariant val = sm.getValue("key"); + ASSERT_EQ(val.toString(), QString("val")); +} + +TEST_F(SettingsManagerTest, DefaultGroupScopesGetValue) +{ + writeValue(settingsPath + "scoped.ini", "key", "ungrouped"); + writeValue(settingsPath + "scoped.ini", "defaultGroup/key", "grouped"); + + SettingsManager sm(settingsPath + "scoped.ini", "defaultGroup"); + QVariant val = sm.getValue("key"); + ASSERT_EQ(val.toString(), QString("grouped")); +} + +TEST_F(SettingsManagerTest, DefaultSubGroupUsedInGetValue) +{ + writeValue(settingsPath + "sub.ini", "top/bottom/key", "nested"); + + SettingsManager sm(settingsPath + "sub.ini", "top", "bottom"); + QVariant val = sm.getValue("key"); + ASSERT_EQ(val.toString(), QString("nested")); +} + +TEST_F(SettingsManagerTest, BatchWriteWritesAllValues) +{ + SettingsManager sm(settingsPath + "batch.ini"); + sm.batchWrite([&](QSettings &qs) { + qs.setValue("a", 1); + qs.setValue("b", 2); + qs.setValue("c", 3); + }); + + SettingsManager sm2(settingsPath + "batch.ini"); + ASSERT_EQ(sm2.getValue("a", QString(), QString(), 0).toInt(), 1); + ASSERT_EQ(sm2.getValue("b", QString(), QString(), 0).toInt(), 2); + ASSERT_EQ(sm2.getValue("c", QString(), QString(), 0).toInt(), 3); +} + +TEST_F(SettingsManagerTest, BatchWriteWithGroup) +{ + SettingsManager sm(settingsPath + "batch_group.ini"); + sm.batchWrite([&](QSettings &qs) { + qs.beginGroup("section"); + qs.setValue("x", 10); + qs.endGroup(); + }); + + SettingsManager sm2(settingsPath + "batch_group.ini"); + ASSERT_EQ(sm2.getValue("x", "section", QString(), 0).toInt(), 10); +} + +TEST_F(SettingsManagerTest, SyncPersistsToDisk) +{ + QString filePath = settingsPath + "sync_test.ini"; + { + SettingsManager sm(filePath); + sm.batchWrite([&](QSettings &qs) { qs.setValue("persist", "yes"); }); + } + { + QSettings qs(filePath, QSettings::IniFormat); + ASSERT_EQ(qs.value("persist").toString(), QString("yes")); + } +} + +TEST_F(SettingsManagerTest, MultipleReadsAfterWrite) +{ + SettingsManager sm(settingsPath + "multi.ini"); + sm.batchWrite([&](QSettings &qs) { qs.setValue("k1", 1); }); + + QVariant v1 = sm.getValue("k1", QString(), QString(), 0); + QVariant v2 = sm.getValue("nonexistent", QString(), QString(), 99); + + ASSERT_EQ(v1.toInt(), 1); + ASSERT_EQ(v2.toInt(), 99); +} + +TEST_F(SettingsManagerTest, ValuesDeletedViaQSettingsAreReadAsDefault) +{ + writeValue(settingsPath + "del.ini", "deleteMe", "present"); + + SettingsManager sm(settingsPath + "del.ini"); + ASSERT_EQ(sm.getValue("deleteMe", QString(), QString(), "default").toString(), QString("present")); + + // Delete via QSettings directly (deleteValue is protected) + { + QSettings qs(settingsPath + "del.ini", QSettings::IniFormat); + qs.remove("deleteMe"); + } + + ASSERT_EQ(sm.getValue("deleteMe", QString(), QString(), "default").toString(), QString("default")); +} + +} // namespace + +int main(int argc, char **argv) +{ + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} diff --git a/tests/settings/settings_migration_test.cpp b/tests/settings/settings_migration_test.cpp new file mode 100644 index 000000000..00e5c65c1 --- /dev/null +++ b/tests/settings/settings_migration_test.cpp @@ -0,0 +1,413 @@ +#include "gtest/gtest.h" +#include +#include +#include +#include +#include +#include +#include + +namespace +{ + +static bool nativeSettingsAvailable() +{ + QSettings probe; + probe.setValue("_migration_native_probe", "ok"); + probe.sync(); + QSettings read; + bool ok = read.value("_migration_native_probe").toString() == "ok"; + QSettings().clear(); + QSettings().sync(); + return ok; +} + +class SettingsMigrationTest : public ::testing::Test +{ +protected: + QTemporaryDir tempDir; + QString settingsPath; + + void SetUp() override + { + settingsPath = tempDir.path() + "/"; + } + + bool fileExists(const QString &name) const + { + return QFile::exists(settingsPath + name); + } + + QVariant readFromIni(const QString &fileName, const QString &key) const + { + QSettings ini(settingsPath + fileName, QSettings::IniFormat); + return ini.value(key); + } +}; + +TEST_F(SettingsMigrationTest, NoGlobalIniDoesNothing) +{ + bool result = SettingsMigration::migrateSettingsFromGlobalIni(settingsPath); + ASSERT_FALSE(result); +} + +TEST_F(SettingsMigrationTest, EmptyGlobalIniGetsBackedUp) +{ + { + QFile f(settingsPath + "global.ini"); + ASSERT_TRUE(f.open(QIODevice::WriteOnly)); + f.close(); + } + bool result = SettingsMigration::migrateSettingsFromGlobalIni(settingsPath); + ASSERT_TRUE(result); + ASSERT_TRUE(fileExists("global.ini.old")); + ASSERT_TRUE(fileExists("global.ini")); + + // No per-file INIs should be created + ASSERT_FALSE(fileExists("tabs.ini")); + ASSERT_FALSE(fileExists("sound.ini")); + + // Sentinel should be in the new global.ini + ASSERT_EQ(readFromIni("global.ini", "migration/perfile_complete"), QVariant(true)); +} + +TEST_F(SettingsMigrationTest, MigratesAllSettingsGroups) +{ + { + QSettings g(settingsPath + "global.ini", QSettings::IniFormat); + + // tabs + g.setValue("tabs/visualDeckStorage", false); + g.setValue("tabs/server", true); + g.setValue("tabs/account", true); + g.setValue("tabs/deckStorage", true); + g.setValue("tabs/replays", false); + g.setValue("tabs/admin", false); + g.setValue("tabs/log", true); + + // sound + g.setValue("sound/enabled", true); + g.setValue("sound/theme", "custom_theme"); + g.setValue("sound/mastervolume", 75); + + // game + g.beginGroup("game"); + g.setValue("maxplayers", 4); + g.setValue("gamedescription", "test game"); + g.setValue("remembergamesettings", false); + g.endGroup(); + + // localgameoptions + g.beginGroup("localgameoptions"); + g.setValue("maxplayers", 2); + g.setValue("startinglifetotal", 40); + g.endGroup(); + + // chat + g.beginGroup("chat"); + g.setValue("mention", false); + g.setValue("mentioncolor", "FF0000"); + g.setValue("showmessagepopups", false); + g.endGroup(); + + // cache storage (under [personal] group) + g.setValue("personal/pixmapCacheSize", 1024); + g.setValue("personal/networkCacheSize", 2048); + + // updates (under [personal] group) + g.setValue("personal/startupUpdateCheck", false); + g.setValue("personal/cardUpdateCheckInterval", 14); + + // personal + g.setValue("personal/lang", "de"); + g.setValue("personal/keepalive", 10); + g.setValue("personal/timeout", 30); + g.setValue("personal/clientid", "test-client-id"); + g.setValue("personal/picturedownload", true); + g.setValue("personal/showStatusBar", true); + + // personal home + g.setValue("home/background", "custom_bg"); + g.setValue("home/background/shuffleTimer", 30); + + // personal tipOfDay + g.setValue("tipOfDay/showTips", false); + + // cards + g.setValue("cards/displaycardnames", false); + g.setValue("cards/tapanimation", true); + g.setValue("cards/scaleCards", false); + + // interface + g.setValue("interface/usetearoffmenus", true); + g.setValue("interface/notificationsenabled", false); + g.setValue("interface/startinghandsize", 5); + + // hand/table + g.setValue("hand/horizontal", true); + g.setValue("table/invert_vertical", true); + + // paths + g.beginGroup("paths"); + g.setValue("decks", "/custom/decks"); + g.setValue("pics", "/custom/pics"); + g.endGroup(); + + // visual deck storage (under [interface] group) + g.setValue("interface/visualdeckstoragecardsize", 150); + g.setValue("interface/visualdeckstorageshowfolders", false); + g.setValue("interface/visualdeckstorageshowtagfilter", false); + + g.sync(); + } + + bool result = SettingsMigration::migrateSettingsFromGlobalIni(settingsPath); + ASSERT_TRUE(result); + + // Original global.ini should be backed up + ASSERT_TRUE(fileExists("global.ini.old")); + + // Verify each per-file INI was created and has correct values + ASSERT_TRUE(fileExists("tabs.ini")); + ASSERT_EQ(readFromIni("tabs.ini", "tabs/visualDeckStorage"), QVariant(false)); + ASSERT_EQ(readFromIni("tabs.ini", "tabs/server"), QVariant(true)); + ASSERT_EQ(readFromIni("tabs.ini", "tabs/log"), QVariant(true)); + + ASSERT_TRUE(fileExists("sound.ini")); + ASSERT_EQ(readFromIni("sound.ini", "sound/enabled"), QVariant(true)); + ASSERT_EQ(readFromIni("sound.ini", "sound/theme"), QVariant("custom_theme")); + ASSERT_EQ(readFromIni("sound.ini", "sound/mastervolume"), QVariant(75)); + + ASSERT_TRUE(fileExists("game.ini")); + ASSERT_EQ(readFromIni("game.ini", "game/maxplayers"), QVariant(4)); + ASSERT_EQ(readFromIni("game.ini", "game/gamedescription"), QVariant("test game")); + ASSERT_EQ(readFromIni("game.ini", "game/remembergamesettings"), QVariant(false)); + ASSERT_EQ(readFromIni("game.ini", "localgameoptions/maxplayers"), QVariant(2)); + ASSERT_EQ(readFromIni("game.ini", "localgameoptions/startinglifetotal"), QVariant(40)); + + ASSERT_TRUE(fileExists("chat.ini")); + ASSERT_EQ(readFromIni("chat.ini", "chat/mention"), QVariant(false)); + ASSERT_EQ(readFromIni("chat.ini", "chat/mentioncolor"), QVariant("FF0000")); + ASSERT_EQ(readFromIni("chat.ini", "chat/showmessagepopups"), QVariant(false)); + + ASSERT_TRUE(fileExists("cache_storage.ini")); + ASSERT_EQ(readFromIni("cache_storage.ini", "personal/pixmapCacheSize"), QVariant(1024)); + ASSERT_EQ(readFromIni("cache_storage.ini", "personal/networkCacheSize"), QVariant(2048)); + + ASSERT_TRUE(fileExists("updates.ini")); + ASSERT_EQ(readFromIni("updates.ini", "updates/startupUpdateCheck"), QVariant(false)); + ASSERT_EQ(readFromIni("updates.ini", "updates/cardUpdateCheckInterval"), QVariant(14)); + + ASSERT_TRUE(fileExists("personal.ini")); + ASSERT_EQ(readFromIni("personal.ini", "personal/lang"), QVariant("de")); + ASSERT_EQ(readFromIni("personal.ini", "personal/keepalive"), QVariant(10)); + ASSERT_EQ(readFromIni("personal.ini", "personal/clientid"), QVariant("test-client-id")); + ASSERT_EQ(readFromIni("personal.ini", "personal/showStatusBar"), QVariant(true)); + ASSERT_EQ(readFromIni("personal.ini", "home/background"), QVariant("custom_bg")); + ASSERT_EQ(readFromIni("personal.ini", "tipOfDay/showTips"), QVariant(false)); + + ASSERT_TRUE(fileExists("cards_display.ini")); + ASSERT_EQ(readFromIni("cards_display.ini", "cards/displaycardnames"), QVariant(false)); + ASSERT_EQ(readFromIni("cards_display.ini", "cards/tapanimation"), QVariant(true)); + + ASSERT_TRUE(fileExists("interface.ini")); + ASSERT_EQ(readFromIni("interface.ini", "interface/usetearoffmenus"), QVariant(true)); + ASSERT_EQ(readFromIni("interface.ini", "interface/notificationsenabled"), QVariant(false)); + ASSERT_EQ(readFromIni("interface.ini", "interface/startinghandsize"), QVariant(5)); + ASSERT_EQ(readFromIni("interface.ini", "hand/horizontal"), QVariant(true)); + ASSERT_EQ(readFromIni("interface.ini", "table/invert_vertical"), QVariant(true)); + + ASSERT_TRUE(fileExists("paths.ini")); + ASSERT_EQ(readFromIni("paths.ini", "paths/decks"), QVariant("/custom/decks")); + ASSERT_EQ(readFromIni("paths.ini", "paths/pics"), QVariant("/custom/pics")); + + ASSERT_TRUE(fileExists("visual_deck_storage.ini")); + ASSERT_EQ(readFromIni("visual_deck_storage.ini", "interface/visualdeckstoragecardsize"), QVariant(150)); + ASSERT_EQ(readFromIni("visual_deck_storage.ini", "interface/visualdeckstorageshowfolders"), QVariant(false)); + + // Verify sentinel was written + ASSERT_EQ(readFromIni("global.ini", "migration/perfile_complete"), QVariant(true)); +} + +TEST_F(SettingsMigrationTest, SecondCallDoesNothing) +{ + { + QSettings g(settingsPath + "global.ini", QSettings::IniFormat); + g.setValue("tabs/visualDeckStorage", true); + g.setValue("sound/enabled", true); + g.sync(); + } + + ASSERT_TRUE(SettingsMigration::migrateSettingsFromGlobalIni(settingsPath)); + ASSERT_FALSE(SettingsMigration::migrateSettingsFromGlobalIni(settingsPath)); +} + +TEST_F(SettingsMigrationTest, SecondCallDoesNotOverwriteUserChanges) +{ + { + QSettings g(settingsPath + "global.ini", QSettings::IniFormat); + g.setValue("tabs/visualDeckStorage", true); + g.setValue("sound/enabled", true); + g.sync(); + } + + ASSERT_TRUE(SettingsMigration::migrateSettingsFromGlobalIni(settingsPath)); + + // User changes the value after migration + { + QSettings tabsIni(settingsPath + "tabs.ini", QSettings::IniFormat); + tabsIni.setValue("tabs/visualDeckStorage", false); + tabsIni.sync(); + } + + // Second migration should NOT overwrite the user's change + ASSERT_FALSE(SettingsMigration::migrateSettingsFromGlobalIni(settingsPath)); + + ASSERT_EQ(readFromIni("tabs.ini", "tabs/visualDeckStorage"), QVariant(false)); +} + +TEST_F(SettingsMigrationTest, PartialMigrationOnlyMigratesPresentKeys) +{ + { + QSettings g(settingsPath + "global.ini", QSettings::IniFormat); + g.setValue("tabs/visualDeckStorage", true); + g.setValue("tabs/server", false); + g.sync(); + } + + ASSERT_TRUE(SettingsMigration::migrateSettingsFromGlobalIni(settingsPath)); + + ASSERT_TRUE(fileExists("global.ini.old")); + ASSERT_TRUE(fileExists("tabs.ini")); + ASSERT_EQ(readFromIni("tabs.ini", "tabs/visualDeckStorage"), QVariant(true)); + ASSERT_EQ(readFromIni("tabs.ini", "tabs/server"), QVariant(false)); + + // Other files should NOT exist since no keys were present for them + ASSERT_FALSE(fileExists("sound.ini")); + ASSERT_FALSE(fileExists("game.ini")); + ASSERT_FALSE(fileExists("chat.ini")); +} + +TEST_F(SettingsMigrationTest, KeyMapTranslationIsCorrect) +{ + { + QSettings g(settingsPath + "global.ini", QSettings::IniFormat); + g.setValue("personal/cardUpdateCheckInterval", 30); + g.setValue("personal/updatereleasechannel", 1); + g.sync(); + } + + ASSERT_TRUE(SettingsMigration::migrateSettingsFromGlobalIni(settingsPath)); + + ASSERT_TRUE(fileExists("global.ini.old")); + ASSERT_TRUE(fileExists("updates.ini")); + // The key should be translated from "personal/cardUpdateCheckInterval" to "updates/cardUpdateCheckInterval" + ASSERT_EQ(readFromIni("updates.ini", "updates/cardUpdateCheckInterval"), QVariant(30)); + ASSERT_EQ(readFromIni("updates.ini", "updates/updatereleasechannel"), QVariant(1)); +} + +TEST_F(SettingsMigrationTest, CardsKeysKeepGroupPrefix) +{ + { + QSettings g(settingsPath + "global.ini", QSettings::IniFormat); + g.setValue("cards/displaycardnames", false); + g.setValue("interface/deckeditorbannercardcomboboxvisible", true); + g.sync(); + } + + ASSERT_TRUE(SettingsMigration::migrateSettingsFromGlobalIni(settingsPath)); + + ASSERT_TRUE(fileExists("global.ini.old")); + ASSERT_TRUE(fileExists("cards_display.ini")); + // "cards/displaycardnames" should be stored with its group prefix + ASSERT_EQ(readFromIni("cards_display.ini", "cards/displaycardnames"), QVariant(false)); + // "interface/..." keys should keep their full path + ASSERT_EQ(readFromIni("cards_display.ini", "interface/deckeditorbannercardcomboboxvisible"), QVariant(true)); +} + +TEST_F(SettingsMigrationTest, LegacyMigrationIsIdempotent) +{ + if (!nativeSettingsAvailable()) { + GTEST_SKIP() << "NativeFormat QSettings not available in this environment"; + } + + { + QSettings nativeSettings; + nativeSettings.setValue("server/previoushostlogin", "test_user"); + nativeSettings.setValue("server/auto_connect", true); + nativeSettings.sync(); + } + + ASSERT_TRUE(SettingsMigration::migrateLegacySettings(settingsPath)); + + // Change the migrated value + { + QSettings serversIni(settingsPath + "servers.ini", QSettings::IniFormat); + serversIni.setValue("server/previoushostlogin", "modified_user"); + serversIni.sync(); + } + + // Second migration should NOT overwrite the change + ASSERT_FALSE(SettingsMigration::migrateLegacySettings(settingsPath)); + ASSERT_EQ(readFromIni("servers.ini", "server/previoushostlogin"), QVariant("modified_user")); +} + +TEST_F(SettingsMigrationTest, LegacyMigrationEmptyNativeFormatWritesSentinel) +{ + ASSERT_TRUE(SettingsMigration::migrateLegacySettings(settingsPath)); + ASSERT_TRUE(fileExists("personal.ini")); + ASSERT_EQ(readFromIni("personal.ini", "migration/legacy_complete"), QVariant(true)); + ASSERT_FALSE(fileExists("messages.ini")); + ASSERT_FALSE(fileExists("gamefilters.ini")); + ASSERT_FALSE(fileExists("cardDatabase.ini")); + + // Second call should be a no-op + ASSERT_FALSE(SettingsMigration::migrateLegacySettings(settingsPath)); +} + +// --- migrateSettingsFromGlobalIni rename-failure test --- + +TEST_F(SettingsMigrationTest, RenameFailureWithExistingBackup) +{ + { + QSettings g(settingsPath + "global.ini", QSettings::IniFormat); + g.setValue("tabs/visualDeckStorage", true); + g.setValue("sound/enabled", true); + g.sync(); + } + + // Create a stale backup + { + QFile oldBackup(settingsPath + "global.ini.old"); + ASSERT_TRUE(oldBackup.open(QIODevice::WriteOnly)); + oldBackup.close(); + } + + // Migration should still succeed + ASSERT_TRUE(SettingsMigration::migrateSettingsFromGlobalIni(settingsPath)); + + // Per-file INIs should be created + ASSERT_TRUE(fileExists("tabs.ini")); + ASSERT_TRUE(fileExists("sound.ini")); + + // Sentinel should be set in the new global.ini + ASSERT_EQ(readFromIni("global.ini", "migration/perfile_complete"), QVariant(true)); + + // Original data should be backed up (stale backup was replaced) + ASSERT_TRUE(fileExists("global.ini.old")); + ASSERT_EQ(readFromIni("global.ini.old", "tabs/visualDeckStorage"), QVariant(true)); + + // Second call should be a no-op + ASSERT_FALSE(SettingsMigration::migrateSettingsFromGlobalIni(settingsPath)); +} + +} // namespace + +int main(int argc, char **argv) +{ + ::testing::InitGoogleTest(&argc, argv); + QCoreApplication app(argc, argv); + app.setOrganizationName("CockatriceTest"); + app.setApplicationName("SettingsMigrationTest"); + return RUN_ALL_TESTS(); +}