Index: binaries/data/mods/mod/gui/modmod/modmod.js =================================================================== --- binaries/data/mods/mod/gui/modmod/modmod.js +++ binaries/data/mods/mod/gui/modmod/modmod.js @@ -48,6 +48,9 @@ var g_ModsEnabled = []; var g_ModsDisabled = []; +var g_ModsEnabledFiltered = []; +var g_ModsDisabledFiltered = []; + /** * Name of the mods installed by the ModInstaller. */ @@ -88,6 +91,8 @@ { 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 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,18 @@ 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 reloadEnabledMods() +{ + g_ModsEnabled = Object.keys(g_Mods).filter(folder => g_ModsDisabled.indexOf(folder) == -1); } function enableMod() @@ -160,17 +177,17 @@ 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,12 +197,13 @@ if (pos == -1) return; - g_ModsDisabled.push(g_ModsEnabled.splice(pos, 1)[0]); + g_ModsDisabled.push(g_ModsEnabledFiltered.splice(pos, 1)[0]); // Remove mods that required the removed mod and cascade // Sort them, so we know which ones can depend on the removed mod // TODO: Find position where the removed mod would have fit (for now assume idx 0) + reloadEnabledMods(); sortEnabledMods(); for (let i = 0; i < g_ModsEnabled.length; ++i) @@ -195,9 +213,8 @@ --i; } - modsEnabledList.selected = Math.min(pos, g_ModsEnabled.length - 1); - displayModLists(); + modsEnabledList.selected = Math.min(pos, g_ModsEnabledFiltered.length - 1); } function applyFilters() @@ -248,11 +265,23 @@ 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) @@ -265,12 +294,10 @@ let tmp = g_ModsEnabled[idx]; g_ModsEnabled[idx] = g_ModsEnabled[idx2]; - g_ModsEnabled[idx2] = tmp; - - obj.list = g_ModsEnabled; + g_ModsEnabled[idx2] = tmp; + + g_ModsEnabledFiltered = displayModList("modsEnabledList", g_ModsEnabled); obj.selected = idx2; - - displayModList("modsEnabledList", g_ModsEnabled); } function areDependenciesMet(folder) @@ -353,7 +380,7 @@ 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 +397,8 @@ 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 =