From eb3b7f089e183fdb77735f57a94442acf94de749 Mon Sep 17 00:00:00 2001 From: Angen Date: Fri, 20 Dec 2019 20:19:21 +0000 Subject: [PATCH] Fix mod list filter Fixing problem with filters reported in 64bfa089af. Use filtered version of mods for manipulation in javascript instead non filtered one. Fixing following problems when filter is applied: not enabling selected mod displaying wrong tooltip getting out of bounds error when using keyboard arrows to select next/previous mod This is also disabling possibility to sort enabled mods manually when filters are applied. See comment in moveCurrItem for more details. Differential Revision: https://code.wildfiregames.com/D1944 This was SVN commit r23269. --- binaries/data/mods/mod/gui/modmod/modmod.js | 62 +++++++++++++++------ 1 file changed, 46 insertions(+), 16 deletions(-) diff --git a/binaries/data/mods/mod/gui/modmod/modmod.js b/binaries/data/mods/mod/gui/modmod/modmod.js index 904cfd8ac1..981fa7ed4f 100644 --- a/binaries/data/mods/mod/gui/modmod/modmod.js +++ b/binaries/data/mods/mod/gui/modmod/modmod.js @@ -48,6 +48,9 @@ var g_Mods = {}; var g_ModsEnabled = []; var g_ModsDisabled = []; +var g_ModsEnabledFiltered = []; +var g_ModsDisabledFiltered = []; + /** * Name of the mods installed by the ModInstaller. */ @@ -88,6 +91,8 @@ function loadEnabledMods() { g_ModsEnabled = Engine.ConfigDB_GetValue("user", "mod.enabledmods").split(/\s+/).filter(folder => !!g_Mods[folder]); g_ModsDisabled = Object.keys(g_Mods).filter(folder => g_ModsEnabled.indexOf(folder) == -1); + g_ModsEnabledFiltered = g_ModsEnabled; + g_ModsDisabledFiltered = g_ModsDisabled; } function validateMods() @@ -128,8 +133,8 @@ function startMods() function displayModLists() { - displayModList("modsEnabledList", g_ModsEnabled); - displayModList("modsDisabledList", g_ModsDisabled); + g_ModsEnabledFiltered = displayModList("modsEnabledList", g_ModsEnabled); + g_ModsDisabledFiltered = displayModList("modsDisabledList", g_ModsDisabled); } function displayModList(listObjectName, folders) @@ -153,6 +158,13 @@ function displayModList(listObjectName, folders) listObject.list_version = folders.map(folder => g_Mods[folder].version); listObject.list_dependencies = folders.map(folder => g_Mods[folder].dependencies.join(" ")); listObject.list = folders; + + return folders; +} + +function reloadDisabledMods() +{ + g_ModsDisabled = Object.keys(g_Mods).filter(folder => g_ModsEnabled.indexOf(folder) == -1); } function enableMod() @@ -160,17 +172,17 @@ function enableMod() let modsDisabledList = Engine.GetGUIObjectByName("modsDisabledList"); let pos = modsDisabledList.selected; - if (pos == -1 || !areDependenciesMet(g_ModsDisabled[pos])) + if (pos == -1 || !areDependenciesMet(g_ModsDisabledFiltered[pos])) return; - g_ModsEnabled.push(g_ModsDisabled.splice(pos, 1)[0]); + g_ModsEnabled.push(g_ModsDisabledFiltered.splice(pos, 1)[0]); + reloadDisabledMods(); - if (pos >= g_ModsDisabled.length) + if (pos >= g_ModsDisabledFiltered.length) --pos; - modsDisabledList.selected = pos; - displayModLists(); + modsDisabledList.selected = pos; } function disableMod() @@ -180,7 +192,16 @@ function disableMod() if (pos == -1) return; - g_ModsDisabled.push(g_ModsEnabled.splice(pos, 1)[0]); + // Find true position of disabled mod and remove it + let disabledMod = g_ModsEnabledFiltered[pos]; + for (let i = 0; i < g_ModsEnabled.length; ++i) + if (g_ModsEnabled[i] == disabledMod) + { + g_ModsEnabled.splice(i, 1); + break; + } + + g_ModsDisabled.push(disabledMod); // Remove mods that required the removed mod and cascade // Sort them, so we know which ones can depend on the removed mod @@ -195,9 +216,8 @@ function disableMod() --i; } - modsEnabledList.selected = Math.min(pos, g_ModsEnabled.length - 1); - displayModLists(); + modsEnabledList.selected = Math.min(pos, g_ModsEnabledFiltered.length - 1); } function applyFilters() @@ -248,11 +268,23 @@ function closePage() Engine.SwitchGuiPage("page_pregame.xml", {}); } +function areFilters() +{ + let searchText = Engine.GetGUIObjectByName("modGenericFilter").caption; + return searchText && searchText != translate("Filter"); +} + /** * Moves an item in the list up or down. */ function moveCurrItem(objectName, up) { + // Prevent moving while filters are applied + // because we would need to map filtered positions + // to not filtered positions so changes will persist. + if (areFilters()) + return; + let obj = Engine.GetGUIObjectByName(objectName); let idx = obj.selected; if (idx == -1) @@ -267,10 +299,8 @@ function moveCurrItem(objectName, up) g_ModsEnabled[idx] = g_ModsEnabled[idx2]; g_ModsEnabled[idx2] = tmp; - obj.list = g_ModsEnabled; + g_ModsEnabledFiltered = displayModList("modsEnabledList", g_ModsEnabled); obj.selected = idx2; - - displayModList("modsEnabledList", g_ModsEnabled); } function areDependenciesMet(folder) @@ -353,7 +383,7 @@ function sortEnabledMods() dependencies[folder1].indexOf(g_Mods[folder2].name) != -1 ? 1 : dependencies[folder2].indexOf(g_Mods[folder1].name) != -1 ? -1 : 0); - displayModList("modsEnabledList", g_ModsEnabled); + g_ModsEnabledFiltered = displayModList("modsEnabledList", g_ModsEnabled); } function selectedMod(listObjectName) @@ -370,8 +400,8 @@ function selectedMod(listObjectName) toggleModButton.caption = listObjectName == "modsDisabledList" ? translate("Enable") : translate("Disable"); toggleModButton.enabled = true; toggleModButton.onPress = listObjectName == "modsDisabledList" ? enableMod : disableMod; - Engine.GetGUIObjectByName("enabledModUp").enabled = listObjectName == "modsEnabledList"; - Engine.GetGUIObjectByName("enabledModDown").enabled = listObjectName == "modsEnabledList"; + Engine.GetGUIObjectByName("enabledModUp").enabled = listObjectName == "modsEnabledList" && !areFilters(); + Engine.GetGUIObjectByName("enabledModDown").enabled = listObjectName == "modsEnabledList" && !areFilters(); } Engine.GetGUIObjectByName("globalModDescription").caption =