Changeset View
Changeset View
Standalone View
Standalone View
binaries/data/mods/mod/gui/modmod/modmod.js
Show First 20 Lines • Show All 42 Lines • ▼ Show 20 Lines | |||||
var g_Mods = {}; | var g_Mods = {}; | ||||
/** | /** | ||||
* Folder names of all mods that are or can be launched. | * Folder names of all mods that are or can be launched. | ||||
*/ | */ | ||||
var g_ModsEnabled = []; | var g_ModsEnabled = []; | ||||
var g_ModsDisabled = []; | var g_ModsDisabled = []; | ||||
var g_ModsEnabledFiltered = []; | |||||
var g_ModsDisabledFiltered = []; | |||||
/** | /** | ||||
* Name of the mods installed by the ModInstaller. | * Name of the mods installed by the ModInstaller. | ||||
*/ | */ | ||||
var g_InstalledMods; | var g_InstalledMods; | ||||
var g_ColorNoModSelected = "255 255 100"; | var g_ColorNoModSelected = "255 255 100"; | ||||
var g_ColorDependenciesMet = "100 255 100"; | var g_ColorDependenciesMet = "100 255 100"; | ||||
var g_ColorDependenciesNotMet = "255 100 100"; | var g_ColorDependenciesNotMet = "255 100 100"; | ||||
Show All 24 Lines | function loadMods() | ||||
g_Mods = Engine.GetAvailableMods(); | g_Mods = Engine.GetAvailableMods(); | ||||
deepfreeze(g_Mods); | deepfreeze(g_Mods); | ||||
} | } | ||||
function loadEnabledMods() | function loadEnabledMods() | ||||
{ | { | ||||
g_ModsEnabled = Engine.ConfigDB_GetValue("user", "mod.enabledmods").split(/\s+/).filter(folder => !!g_Mods[folder]); | 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_ModsDisabled = Object.keys(g_Mods).filter(folder => g_ModsEnabled.indexOf(folder) == -1); | ||||
g_ModsEnabledFiltered = g_ModsEnabled; | |||||
g_ModsDisabledFiltered = g_ModsDisabled; | |||||
} | } | ||||
function validateMods() | function validateMods() | ||||
{ | { | ||||
for (let folder in g_Mods) | for (let folder in g_Mods) | ||||
validateMod(folder, g_Mods[folder], true); | validateMod(folder, g_Mods[folder], true); | ||||
} | } | ||||
Show All 24 Lines | |||||
{ | { | ||||
sortEnabledMods(); | sortEnabledMods(); | ||||
Engine.SetMods(["mod"].concat(g_ModsEnabled)); | Engine.SetMods(["mod"].concat(g_ModsEnabled)); | ||||
Engine.RestartEngine(); | Engine.RestartEngine(); | ||||
} | } | ||||
function displayModLists() | function displayModLists() | ||||
{ | { | ||||
displayModList("modsEnabledList", g_ModsEnabled); | g_ModsEnabledFiltered = displayModList("modsEnabledList", g_ModsEnabled); | ||||
displayModList("modsDisabledList", g_ModsDisabled); | g_ModsDisabledFiltered = displayModList("modsDisabledList", g_ModsDisabled); | ||||
} | } | ||||
function displayModList(listObjectName, folders) | function displayModList(listObjectName, folders) | ||||
{ | { | ||||
let listObject = Engine.GetGUIObjectByName(listObjectName); | let listObject = Engine.GetGUIObjectByName(listObjectName); | ||||
if (listObjectName == "modsDisabledList") | if (listObjectName == "modsDisabledList") | ||||
{ | { | ||||
let sortFolder = folder => String(g_Mods[folder][listObject.selected_column] || folder); | let sortFolder = folder => String(g_Mods[folder][listObject.selected_column] || folder); | ||||
folders.sort((folder1, folder2) => | folders.sort((folder1, folder2) => | ||||
listObject.selected_column_order * | listObject.selected_column_order * | ||||
sortFolder(folder1).localeCompare(sortFolder(folder2))); | sortFolder(folder1).localeCompare(sortFolder(folder2))); | ||||
} | } | ||||
folders = folders.filter(filterMod); | folders = folders.filter(filterMod); | ||||
listObject.list_name = folders.map(folder => g_Mods[folder].name).map(name => g_InstalledMods.indexOf(name) == -1 ? name : coloredText(name, "green")); | 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_folder = folders; | ||||
listObject.list_label = folders.map(folder => g_Mods[folder].label); | listObject.list_label = folders.map(folder => g_Mods[folder].label); | ||||
listObject.list_url = folders.map(folder => g_Mods[folder].url || ""); | listObject.list_url = folders.map(folder => g_Mods[folder].url || ""); | ||||
listObject.list_version = folders.map(folder => g_Mods[folder].version); | listObject.list_version = folders.map(folder => g_Mods[folder].version); | ||||
listObject.list_dependencies = folders.map(folder => g_Mods[folder].dependencies.join(" ")); | listObject.list_dependencies = folders.map(folder => g_Mods[folder].dependencies.join(" ")); | ||||
listObject.list = folders; | 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() | function enableMod() | ||||
{ | { | ||||
let modsDisabledList = Engine.GetGUIObjectByName("modsDisabledList"); | let modsDisabledList = Engine.GetGUIObjectByName("modsDisabledList"); | ||||
let pos = modsDisabledList.selected; | let pos = modsDisabledList.selected; | ||||
if (pos == -1 || !areDependenciesMet(g_ModsDisabled[pos])) | if (pos == -1 || !areDependenciesMet(g_ModsDisabledFiltered[pos])) | ||||
return; | 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; | --pos; | ||||
modsDisabledList.selected = pos; | |||||
displayModLists(); | displayModLists(); | ||||
modsDisabledList.selected = pos; | |||||
} | } | ||||
function disableMod() | function disableMod() | ||||
{ | { | ||||
let modsEnabledList = Engine.GetGUIObjectByName("modsEnabledList"); | let modsEnabledList = Engine.GetGUIObjectByName("modsEnabledList"); | ||||
let pos = modsEnabledList.selected; | let pos = modsEnabledList.selected; | ||||
if (pos == -1) | if (pos == -1) | ||||
return; | 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 | // Remove mods that required the removed mod and cascade | ||||
// Sort them, so we know which ones can depend on the removed mod | // 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) | // TODO: Find position where the removed mod would have fit (for now assume idx 0) | ||||
reloadEnabledMods(); | |||||
Silier: this discards current sorting of enabled mods done by user | |||||
sortEnabledMods(); | sortEnabledMods(); | ||||
for (let i = 0; i < g_ModsEnabled.length; ++i) | for (let i = 0; i < g_ModsEnabled.length; ++i) | ||||
if (!areDependenciesMet(g_ModsEnabled[i])) | if (!areDependenciesMet(g_ModsEnabled[i])) | ||||
{ | { | ||||
g_ModsDisabled.push(g_ModsEnabled.splice(i, 1)[0]); | g_ModsDisabled.push(g_ModsEnabled.splice(i, 1)[0]); | ||||
--i; | --i; | ||||
} | } | ||||
modsEnabledList.selected = Math.min(pos, g_ModsEnabled.length - 1); | |||||
displayModLists(); | displayModLists(); | ||||
modsEnabledList.selected = Math.min(pos, g_ModsEnabledFiltered.length - 1); | |||||
Not Done Inline ActionsWhy do the selection after displaying the list ? Stan: Why do the selection after displaying the list ? | |||||
Done Inline ActionsdisplayModLists does filter action and sets what should be displayed so we need to do selection after we know what will be displayed to trigger event in cpp part if we do this before, we can end up out of range Silier: displayModLists does filter action and sets what should be displayed so we need to do selection… | |||||
Not Done Inline ActionsMight deserve a comment then ;) Stan: Might deserve a comment then ;) | |||||
} | } | ||||
function applyFilters() | function applyFilters() | ||||
{ | { | ||||
// Save selected rows | // Save selected rows | ||||
let modsDisabledList = Engine.GetGUIObjectByName("modsDisabledList"); | let modsDisabledList = Engine.GetGUIObjectByName("modsDisabledList"); | ||||
let modsEnabledList = Engine.GetGUIObjectByName("modsEnabledList"); | let modsEnabledList = Engine.GetGUIObjectByName("modsEnabledList"); | ||||
Show All 34 Lines | function filterMod(folder) | ||||
return !negateFilter; | return !negateFilter; | ||||
} | } | ||||
function closePage() | function closePage() | ||||
{ | { | ||||
Engine.SwitchGuiPage("page_pregame.xml", {}); | 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. | * Moves an item in the list up or down. | ||||
*/ | */ | ||||
function moveCurrItem(objectName, up) | 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 obj = Engine.GetGUIObjectByName(objectName); | ||||
let idx = obj.selected; | let idx = obj.selected; | ||||
if (idx == -1) | if (idx == -1) | ||||
return; | return; | ||||
let num = obj.list.length; | let num = obj.list.length; | ||||
let idx2 = idx + (up ? -1 : 1); | let idx2 = idx + (up ? -1 : 1); | ||||
if (idx2 < 0 || idx2 >= num) | if (idx2 < 0 || idx2 >= num) | ||||
return; | return; | ||||
let tmp = g_ModsEnabled[idx]; | let tmp = g_ModsEnabled[idx]; | ||||
g_ModsEnabled[idx] = g_ModsEnabled[idx2]; | g_ModsEnabled[idx] = g_ModsEnabled[idx2]; | ||||
g_ModsEnabled[idx2] = tmp; | g_ModsEnabled[idx2] = tmp; | ||||
obj.list = g_ModsEnabled; | g_ModsEnabledFiltered = displayModList("modsEnabledList", g_ModsEnabled); | ||||
obj.selected = idx2; | obj.selected = idx2; | ||||
displayModList("modsEnabledList", g_ModsEnabled); | |||||
} | } | ||||
function areDependenciesMet(folder) | function areDependenciesMet(folder) | ||||
{ | { | ||||
let guiObject = Engine.GetGUIObjectByName("message"); | let guiObject = Engine.GetGUIObjectByName("message"); | ||||
for (let dependency of g_Mods[folder].dependencies) | for (let dependency of g_Mods[folder].dependencies) | ||||
{ | { | ||||
▲ Show 20 Lines • Show All 66 Lines • ▼ Show 20 Lines | function sortEnabledMods() | ||||
let dependencies = {}; | let dependencies = {}; | ||||
for (let folder of g_ModsEnabled) | for (let folder of g_ModsEnabled) | ||||
dependencies[folder] = g_Mods[folder].dependencies.map(d => d.split(g_RegExpComparisonOperator)[0]); | dependencies[folder] = g_Mods[folder].dependencies.map(d => d.split(g_RegExpComparisonOperator)[0]); | ||||
g_ModsEnabled.sort((folder1, folder2) => | g_ModsEnabled.sort((folder1, folder2) => | ||||
dependencies[folder1].indexOf(g_Mods[folder2].name) != -1 ? 1 : | dependencies[folder1].indexOf(g_Mods[folder2].name) != -1 ? 1 : | ||||
dependencies[folder2].indexOf(g_Mods[folder1].name) != -1 ? -1 : 0); | dependencies[folder2].indexOf(g_Mods[folder1].name) != -1 ? -1 : 0); | ||||
displayModList("modsEnabledList", g_ModsEnabled); | g_ModsEnabledFiltered = displayModList("modsEnabledList", g_ModsEnabled); | ||||
} | } | ||||
function selectedMod(listObjectName) | function selectedMod(listObjectName) | ||||
{ | { | ||||
let listObject = Engine.GetGUIObjectByName(listObjectName); | let listObject = Engine.GetGUIObjectByName(listObjectName); | ||||
let otherListObject = Engine.GetGUIObjectByName(listObjectName == "modsDisabledList" ? | let otherListObject = Engine.GetGUIObjectByName(listObjectName == "modsDisabledList" ? | ||||
"modsEnabledList" : "modsDisabledList"); | "modsEnabledList" : "modsDisabledList"); | ||||
if (listObject.selected != -1) | if (listObject.selected != -1) | ||||
{ | { | ||||
otherListObject.selected = -1; | otherListObject.selected = -1; | ||||
Engine.GetGUIObjectByName("visitWebButton").enabled = true; | Engine.GetGUIObjectByName("visitWebButton").enabled = true; | ||||
let toggleModButton = Engine.GetGUIObjectByName("toggleModButton"); | let toggleModButton = Engine.GetGUIObjectByName("toggleModButton"); | ||||
toggleModButton.caption = listObjectName == "modsDisabledList" ? translate("Enable") : translate("Disable"); | toggleModButton.caption = listObjectName == "modsDisabledList" ? translate("Enable") : translate("Disable"); | ||||
toggleModButton.enabled = true; | toggleModButton.enabled = true; | ||||
toggleModButton.onPress = listObjectName == "modsDisabledList" ? enableMod : disableMod; | toggleModButton.onPress = listObjectName == "modsDisabledList" ? enableMod : disableMod; | ||||
Engine.GetGUIObjectByName("enabledModUp").enabled = listObjectName == "modsEnabledList"; | Engine.GetGUIObjectByName("enabledModUp").enabled = listObjectName == "modsEnabledList" && !areFilters(); | ||||
Engine.GetGUIObjectByName("enabledModDown").enabled = listObjectName == "modsEnabledList"; | Engine.GetGUIObjectByName("enabledModDown").enabled = listObjectName == "modsEnabledList" && !areFilters(); | ||||
} | } | ||||
Engine.GetGUIObjectByName("globalModDescription").caption = | Engine.GetGUIObjectByName("globalModDescription").caption = | ||||
listObject.list[listObject.selected] ? | listObject.list[listObject.selected] ? | ||||
g_Mods[listObject.list[listObject.selected]].description : | g_Mods[listObject.list[listObject.selected]].description : | ||||
'[color="' + g_ColorNoModSelected + '"]' + translate("No mod has been selected.") + '[/color]'; | '[color="' + g_ColorNoModSelected + '"]' + translate("No mod has been selected.") + '[/color]'; | ||||
} | } | ||||
Show All 17 Lines |
Wildfire Games · Phabricator
this discards current sorting of enabled mods done by user