From 6eadc9c4b35501bc6b7dd9c36f84c8e776668c0a Mon Sep 17 00:00:00 2001 From: WrinklyNinja Date: Sun, 24 Aug 2014 12:15:32 +0100 Subject: [PATCH] Changing game settings now takes immediate effect. Fixes #243. Also fixed missing game defaults not being restored in UI. --- resources/report/js/script.js | 12 ++++++++++-- src/backend/game.cpp | 5 ++++- src/backend/game.h | 2 +- src/gui/app.cpp | 37 ++++++++++++++++++++++++++++++++--- src/gui/app.h | 1 + src/gui/handler.cpp | 12 +++++++++--- 6 files changed, 59 insertions(+), 10 deletions(-) diff --git a/resources/report/js/script.js b/resources/report/js/script.js index 22381f78..9e88444b 100644 --- a/resources/report/js/script.js +++ b/resources/report/js/script.js @@ -753,10 +753,18 @@ function closeSettingsDialog(evt) { settings ] }); - loot.query(request).catch(processCefError); + loot.query(request).then(function(result){ - loot.settings = settings; + try { + loot.installedGames = JSON.parse(result); + } catch (e) { + console.log(e); + console.log('getInstalledGames response: ' + results[1]); + } + loot.settings = settings; + updateSettingsUI(); + }).catch(processCefError); } else { /* Re-apply the existing settings to the settings dialog elements. */ updateSettingsUI(); diff --git a/src/backend/game.cpp b/src/backend/game.cpp index 98aa46fd..82424e45 100644 --- a/src/backend/game.cpp +++ b/src/backend/game.cpp @@ -44,7 +44,7 @@ namespace lc = boost::locale; namespace loot { - std::vector GetGames(const YAML::Node& settings) { + std::vector GetGames(YAML::Node& settings) { vector games; if (settings["games"]) @@ -62,6 +62,9 @@ namespace loot { if (find(games.begin(), games.end(), Game(Game::fonv)) == games.end()) games.push_back(Game(Game::fonv)); + // If there were any missing defaults, make sure they're in settings now. + settings["games"] = games; + return games; } diff --git a/src/backend/game.h b/src/backend/game.h index b03ddd89..0ba14b27 100644 --- a/src/backend/game.h +++ b/src/backend/game.h @@ -161,7 +161,7 @@ namespace loot { void CreateLOOTGameFolder(); }; - std::vector GetGames(const YAML::Node& settings); + std::vector GetGames(YAML::Node& settings); size_t SelectGame(const YAML::Node& settings, const std::vector& games, const std::string& cmdLineGame); } diff --git a/src/gui/app.cpp b/src/gui/app.cpp index ed75b435..3dc8abae 100644 --- a/src/gui/app.cpp +++ b/src/gui/app.cpp @@ -240,11 +240,42 @@ namespace loot { return _initErrors; } + + void LootState::UpdateGames(std::vector& games) { + unordered_set newGameFolders; + + // Update existing games, add new games. + for (auto &game : games) { + auto pos = find(_games.begin(), _games.end(), game); + + if (pos != _games.end()) { + pos->SetDetails(game.Name(), game.Master(), game.RepoURL(), game.RepoBranch(), game.GamePath().string(), game.RegistryKey()); + } + else { + _games.push_back(game); + } + + newGameFolders.insert(game.FolderName()); + } + // Remove deleted games. As the current game is stored using its index, + // removing an earlier game may invalidate it. + for (auto it = _games.begin(); it != _games.end();) { + if (newGameFolders.find(it->FolderName()) == newGameFolders.end()) { + if (distance(_games.begin(), it) < _currentGame) { + // Deleting a game before the current game, so the current game's + // index decreases by one. + --_currentGame; + } + it = _games.erase(it); + } + else + ++it; + } + } + void LootState::ChangeGame(const std::string& newGameFolder) { BOOST_LOG_TRIVIAL(debug) << "Changing current game to that with folder: " << newGameFolder; - auto it = std::find_if(_games.begin(), _games.end(), [&newGameFolder](const Game& game){ - return game.FolderName() == newGameFolder; - }); + auto it = find(_games.begin(), _games.end(), newGameFolder); _currentGame = std::distance(_games.begin(), it); _games[_currentGame].Init(); diff --git a/src/gui/app.h b/src/gui/app.h index 766c4e13..33cae986 100644 --- a/src/gui/app.h +++ b/src/gui/app.h @@ -72,6 +72,7 @@ namespace loot { Game& CurrentGame(); void ChangeGame(const std::string& newGameFolder); + void UpdateGames(std::vector& games); // Get the folder names of the installed games. std::vector InstalledGames() const; diff --git a/src/gui/handler.cpp b/src/gui/handler.cpp index 9fb189cf..75192a62 100644 --- a/src/gui/handler.cpp +++ b/src/gui/handler.cpp @@ -278,11 +278,17 @@ namespace loot { } else if (requestName == "closeSettings") { BOOST_LOG_TRIVIAL(trace) << "Settings dialog closed and changes accepted, updating settings object."; - g_app_state.UpdateSettings(request["args"][0]); - // Also update the game details. + // Update the game details and settings. + g_app_state.UpdateSettings(request["args"][0]); + // If the user has deleted a default game, we don't want to restore it now. + // It will be restored when LOOT is next loaded. + vector games(request["args"][0]["games"].as< vector >()); - callback->Success(""); + g_app_state.UpdateGames(games); + + // Now send back the new list of installed games to the UI. + callback->Success(GetInstalledGames()); return true; } else if (requestName == "applySort") {