mirror of
https://gitea.wildfiregames.com/0ad/0ad
synced 2026-06-16 13:23:56 -07:00
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.
This commit is contained in:
parent
21070a4592
commit
eb3b7f089e
1 changed files with 46 additions and 16 deletions
|
|
@ -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 =
|
||||
|
|
|
|||
Loading…
Reference in a new issue