Index: ps/trunk/binaries/data/mods/mod/gui/modmod/modmod.js
===================================================================
--- ps/trunk/binaries/data/mods/mod/gui/modmod/modmod.js
+++ ps/trunk/binaries/data/mods/mod/gui/modmod/modmod.js
@@ -52,6 +52,11 @@
var g_ModsDisabledFiltered = [];
/**
+ * Cache mod compatibility recomputed when some mod is enbaled/disabled.
+ */
+var g_ModsCompatibility = [];
+
+/**
* Name of the mods installed by the ModInstaller.
*/
var g_InstalledMods;
@@ -72,6 +77,7 @@
{
loadMods();
loadEnabledMods();
+ recomputeCompatibility();
validateMods();
initGUIFilters();
}
@@ -104,6 +110,7 @@
function initGUIFilters()
{
Engine.GetGUIObjectByName("negateFilter").checked = false;
+ Engine.GetGUIObjectByName("modCompatibleFilter").checked = true;
displayModLists();
}
@@ -133,11 +140,11 @@
function displayModLists()
{
- g_ModsEnabledFiltered = displayModList("modsEnabledList", g_ModsEnabled);
- g_ModsDisabledFiltered = displayModList("modsDisabledList", g_ModsDisabled);
+ g_ModsEnabledFiltered = displayModList("modsEnabledList", g_ModsEnabled, true);
+ g_ModsDisabledFiltered = displayModList("modsDisabledList", g_ModsDisabled, false);
}
-function displayModList(listObjectName, folders)
+function displayModList(listObjectName, folders, enabled)
{
let listObject = Engine.GetGUIObjectByName(listObjectName);
@@ -150,15 +157,17 @@
}
folders = folders.filter(filterMod);
+ if (!enabled && Engine.GetGUIObjectByName("modCompatibleFilter").checked)
+ folders = folders.filter(folder => g_ModsCompatibility[folder]);
let selected = listObject.selected !== -1 ? listObject.list_name[listObject.selected] : null;
- listObject.list_name = folders.map(folder => g_Mods[folder].name).map(name => g_InstalledMods.indexOf(name) == -1 ? name : coloredText(name, "green"));
- listObject.list_folder = folders;
- listObject.list_label = folders.map(folder => g_Mods[folder].label);
- listObject.list_url = folders.map(folder => g_Mods[folder].url || "");
- listObject.list_version = folders.map(folder => g_Mods[folder].version);
- listObject.list_dependencies = folders.map(folder => g_Mods[folder].dependencies.join(" "));
+ listObject.list_name = folders.map(folder => colorMod(folder, g_Mods[folder].name, enabled));
+ listObject.list_folder = folders.map(folder => colorMod(folder, folder, enabled));
+ listObject.list_label = folders.map(folder => colorMod(folder, g_Mods[folder].label, enabled));
+ listObject.list_url = folders.map(folder => colorMod(folder, g_Mods[folder].url || ""), enabled);
+ listObject.list_version = folders.map(folder => colorMod(folder, g_Mods[folder].version, enabled));
+ listObject.list_dependencies = folders.map(folder => colorMod(folder, g_Mods[folder].dependencies.join(" "), enabled));
listObject.list = folders;
listObject.selected = selected ? listObject.list_name.indexOf(selected) : -1;
@@ -166,6 +175,21 @@
return folders;
}
+function getModColor(folder, enabled)
+{
+ if (!g_ModsCompatibility[folder])
+ return enabled ? g_ColorDependenciesNotMet : "gray";
+ if (g_InstalledMods.indexOf(g_Mods[folder].name) != -1)
+ return "green";
+ return false;
+}
+
+function colorMod(folder, text, enabled)
+{
+ let color = getModColor(folder, enabled);
+ return color ? coloredText(text, color) : text;
+}
+
function reloadDisabledMods()
{
g_ModsDisabled = Object.keys(g_Mods).filter(folder => g_ModsEnabled.indexOf(folder) == -1);
@@ -176,11 +200,12 @@
let modsDisabledList = Engine.GetGUIObjectByName("modsDisabledList");
let pos = modsDisabledList.selected;
- if (pos == -1 || !areDependenciesMet(g_ModsDisabledFiltered[pos]))
+ if (pos == -1 || !g_ModsCompatibility[g_ModsDisabledFiltered[pos]])
return;
g_ModsEnabled.push(g_ModsDisabledFiltered.splice(pos, 1)[0]);
reloadDisabledMods();
+ recomputeCompatibility();
if (pos >= g_ModsDisabledFiltered.length)
--pos;
@@ -214,12 +239,13 @@
sortEnabledMods();
for (let i = 0; i < g_ModsEnabled.length; ++i)
- if (!areDependenciesMet(g_ModsEnabled[i]))
+ if (!areDependenciesMet(g_ModsEnabled[i], true))
{
g_ModsDisabled.push(g_ModsEnabled.splice(i, 1)[0]);
--i;
}
+ recomputeCompatibility(true);
displayModLists();
modsEnabledList.selected = Math.min(pos, g_ModsEnabledFiltered.length - 1);
}
@@ -280,30 +306,31 @@
g_ModsEnabled[idx] = g_ModsEnabled[idx2];
g_ModsEnabled[idx2] = tmp;
- g_ModsEnabledFiltered = displayModList("modsEnabledList", g_ModsEnabled);
+ g_ModsEnabledFiltered = displayModList("modsEnabledList", g_ModsEnabled, true);
obj.selected = idx2;
}
-function areDependenciesMet(folder)
+function areDependenciesMet(folder, disabledAction = false)
{
- let guiObject = Engine.GetGUIObjectByName("message");
+ // If we disabled mod it will not change satus of incompatible mods
+ if (disabledAction && !g_ModsCompatibility[folder])
+ return g_ModsCompatibility[folder];
for (let dependency of g_Mods[folder].dependencies)
{
- if (isDependencyMet(dependency))
- continue;
-
- guiObject.caption = coloredText(
- sprintf(translate('Dependency not met: %(dep)s'), { "dep": dependency }),
- g_ColorDependenciesNotMet);
-
- return false;
+ if (!isDependencyMet(dependency))
+ return false;
}
- guiObject.caption = coloredText(translate('All dependencies met'), g_ColorDependenciesMet);
return true;
}
+function recomputeCompatibility(disabledAction = false)
+{
+ for (let mod in g_Mods)
+ g_ModsCompatibility[mod] = areDependenciesMet(mod, disabledAction);
+}
+
/**
* @param dependency is a mod name or a mod version comparison.
*/
@@ -364,31 +391,31 @@
dependencies[folder1].indexOf(g_Mods[folder2].name) != -1 ? 1 :
dependencies[folder2].indexOf(g_Mods[folder1].name) != -1 ? -1 : 0);
- g_ModsEnabledFiltered = displayModList("modsEnabledList", g_ModsEnabled);
+ g_ModsEnabledFiltered = displayModList("modsEnabledList", g_ModsEnabled, true);
}
function selectedMod(listObjectName)
{
let listObject = Engine.GetGUIObjectByName(listObjectName);
- let otherListObject = Engine.GetGUIObjectByName(listObjectName == "modsDisabledList" ?
+ let isPickedDisabledList = listObjectName == "modsDisabledList";
+ let otherListObject = Engine.GetGUIObjectByName(isPickedDisabledList ?
"modsEnabledList" : "modsDisabledList");
let toggleModButton = Engine.GetGUIObjectByName("toggleModButton");
- let modSelected = listObject.selected != -1;
-
- if (modSelected)
+ let isModSelected = listObject.selected != -1;
+ if (isModSelected)
{
otherListObject.selected = -1;
- toggleModButton.onPress = listObjectName == "modsDisabledList" ? enableMod : disableMod;
+ toggleModButton.onPress = isPickedDisabledList ? enableMod : disableMod;
}
- Engine.GetGUIObjectByName("visitWebButton").enabled = modSelected && !!getSelectedModUrl();
- toggleModButton.caption = listObjectName == "modsDisabledList" ?
+ Engine.GetGUIObjectByName("visitWebButton").enabled = isModSelected && !!getSelectedModUrl();
+ toggleModButton.caption = isPickedDisabledList ?
translateWithContext("mod activation", "Enable") :
translateWithContext("mod activation", "Disable");
- toggleModButton.enabled = modSelected;
- Engine.GetGUIObjectByName("enabledModUp").enabled = modSelected && listObjectName == "modsEnabledList" && !areFilters();
- Engine.GetGUIObjectByName("enabledModDown").enabled = modSelected && listObjectName == "modsEnabledList" && !areFilters();
+ toggleModButton.enabled = isPickedDisabledList ? isModSelected && g_ModsCompatibility[listObject.list[listObject.selected]] : isModSelected;
+ Engine.GetGUIObjectByName("enabledModUp").enabled = isModSelected && listObjectName == "modsEnabledList" && !areFilters();
+ Engine.GetGUIObjectByName("enabledModDown").enabled = isModSelected && listObjectName == "modsEnabledList" && !areFilters();
Engine.GetGUIObjectByName("globalModDescription").caption =
listObject.list[listObject.selected] ?
@@ -405,7 +432,7 @@
let modsDisabledList = Engine.GetGUIObjectByName("modsDisabledList");
let list = modsEnabledList.selected == -1 ? modsDisabledList : modsEnabledList;
- let folder = list.list_folder[list.selected];
+ let folder = list.list[list.selected];
return folder && g_Mods[folder] && g_Mods[folder].url || undefined;
}
Index: ps/trunk/binaries/data/mods/mod/gui/modmod/modmod.xml
===================================================================
--- ps/trunk/binaries/data/mods/mod/gui/modmod/modmod.xml
+++ ps/trunk/binaries/data/mods/mod/gui/modmod/modmod.xml
@@ -38,6 +38,20 @@
+
+