Index: binaries/data/mods/mod/gui/gui.rnc
===================================================================
--- binaries/data/mods/mod/gui/gui.rnc
+++ binaries/data/mods/mod/gui/gui.rnc
@@ -70,6 +70,8 @@
attribute max_length { xsd:nonNegativeInteger }?&
attribute maxwidth { xsd:decimal }? &
attribute multiline { bool }?&
+ attribute multiSelected { bool }?&
+ attribute multiSelection_enabled { bool }?&
attribute offset { pos }?&
attribute readonly { bool }?&
attribute scrollbar { bool }?&
Index: binaries/data/mods/mod/gui/gui.rng
===================================================================
--- binaries/data/mods/mod/gui/gui.rng
+++ binaries/data/mods/mod/gui/gui.rng
@@ -297,6 +297,16 @@
+
+
+
+
+
+
+
+
+
+
Index: binaries/data/mods/mod/gui/modio/modio.js
===================================================================
--- binaries/data/mods/mod/gui/modio/modio.js
+++ binaries/data/mods/mod/gui/modio/modio.js
@@ -158,7 +158,9 @@
function displayMods()
{
let modsAvailableList = Engine.GetGUIObjectByName("modsAvailableList");
- let selectedMod = modsAvailableList.list[modsAvailableList.selected];
+ let index = modsAvailableList.multiSelected.length ? modsAvailableList.multiSelected[0] : -1;
+ let selectedMod = modsAvailableList.list[index];
+ modsAvailableList.multiSelected = [];
modsAvailableList.selected = -1;
let displayedMods = clone(g_ModsAvailableOnline);
@@ -187,6 +189,7 @@
function clearModList()
{
let modsAvailableList = Engine.GetGUIObjectByName("modsAvailableList");
+ modsAvailableList.multiSelected = [];
modsAvailableList.selected = -1;
for (let listIdx of Object.keys(modsAvailableList).filter(key => key.startsWith("list")))
modsAvailableList[listIdx] = [];
@@ -196,10 +199,11 @@
{
let modsAvailableList = Engine.GetGUIObjectByName("modsAvailableList");
- if (modsAvailableList.selected == -1)
+ if (!modsAvailableList.multiSelected.length)
return undefined;
- return +modsAvailableList.list[modsAvailableList.selected];
+ let index = modsAvailableList.multiSelected.length ? modsAvailableList.multiSelected[0] : -1;
+ return +modsAvailableList.list[index];
}
function showModDescription()
Index: binaries/data/mods/mod/gui/modio/modio.xml
===================================================================
--- binaries/data/mods/mod/gui/modio/modio.xml
+++ binaries/data/mods/mod/gui/modio/modio.xml
@@ -41,6 +41,7 @@
sortable="true"
selected_column="name"
selected_column_order="1"
+ multiSelection_enabled="false"
font="sans-stroke-13"
>
showModDescription();
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
@@ -158,7 +158,7 @@
function enableMod()
{
let modsDisabledList = Engine.GetGUIObjectByName("modsDisabledList");
- let pos = modsDisabledList.selected;
+ let pos = modsDisabledList.multiSelected.length ? modsDisabledList.multiSelected[0] : -1;
if (pos == -1 || !areDependenciesMet(g_ModsDisabled[pos]))
return;
@@ -168,6 +168,10 @@
if (pos >= g_ModsDisabled.length)
--pos;
+ if (pos == -1)
+ modsDisabledList.multiSelected = [];
+ else
+ modsDisabledList.multiSelected = [pos];
modsDisabledList.selected = pos;
displayModLists();
@@ -176,7 +180,7 @@
function disableMod()
{
let modsEnabledList = Engine.GetGUIObjectByName("modsEnabledList");
- let pos = modsEnabledList.selected;
+ let pos = modsEnabledList.multiSelected.length ? modsEnabledList.multiSelected[0] : -1;
if (pos == -1)
return;
@@ -195,7 +199,12 @@
--i;
}
- modsEnabledList.selected = Math.min(pos, g_ModsEnabled.length - 1);
+ let newPos = Math.min(pos, g_ModsEnabled.length - 1);
+ if (newPos == -1)
+ modsEnabledList.multiSelected = [];
+ else
+ modsEnabledList.multiSelected = [newPos];
+ modsEnabledList.selected = newPos;
displayModLists();
}
@@ -206,18 +215,34 @@
let modsDisabledList = Engine.GetGUIObjectByName("modsDisabledList");
let modsEnabledList = Engine.GetGUIObjectByName("modsEnabledList");
- let selectedDisabledFolder = modsDisabledList.list_folder[modsDisabledList.selected];
- let selectedEnabledFolder = modsEnabledList.list_folder[modsEnabledList.selected];
+ let selectedDisabledFolder = modsDisabledList.list_folder[modsDisabledList.multiSelected.length ? modsDisabledList.multiSelected[0] : -1];
+ let selectedEnabledFolder = modsEnabledList.list_folder[modsEnabledList.multiSelected.length ? modsEnabledList.multiSelected[0] : -1];
// Remove selected rows to prevent a link to a non existing item
+ modsDisabledList.multiSelected = [];
modsDisabledList.selected = -1;
+
+ modsEnabledList.multiSelected = [];
modsEnabledList.selected = -1;
displayModLists();
// Restore previously selected rows
- modsDisabledList.selected = modsDisabledList.list_folder.indexOf(selectedDisabledFolder);
- modsEnabledList.selected = modsEnabledList.list_folder.indexOf(selectedEnabledFolder);
+ let disPos = modsDisabledList.list_folder.indexOf(selectedDisabledFolder);
+ let enPos = modsEnabledList.list_folder.indexOf(selectedEnabledFolder);
+
+ if (enPos == -1)
+ modsEnabledList.multiSelected = [];
+ else
+ modsEnabledList.multiSelected = [enPos];
+ modsEnabledList.selected = enPos;
+
+ if (disPos == -1)
+ modsDisabledList.multiSelected = [];
+ else
+ modsDisabledList.multiSelected = [disPos];
+
+ modsDisabledList.selected = disPos;
Engine.GetGUIObjectByName("globalModDescription").caption = "";
}
@@ -254,7 +279,7 @@
function moveCurrItem(objectName, up)
{
let obj = Engine.GetGUIObjectByName(objectName);
- let idx = obj.selected;
+ let idx = obj.multiSelected.length ? obj.multiSelected[0] : -1;
if (idx == -1)
return;
@@ -268,6 +293,7 @@
g_ModsEnabled[idx2] = tmp;
obj.list = g_ModsEnabled;
+ obj.multiSelected = [idx2];
obj.selected = idx2;
displayModList("modsEnabledList", g_ModsEnabled);
@@ -362,8 +388,9 @@
let otherListObject = Engine.GetGUIObjectByName(listObjectName == "modsDisabledList" ?
"modsEnabledList" : "modsDisabledList");
- if (listObject.selected != -1)
+ if (listObject.multiSelected.length)
{
+ otherListObject.multiSelected = [];
otherListObject.selected = -1;
Engine.GetGUIObjectByName("visitWebButton").enabled = true;
let toggleModButton = Engine.GetGUIObjectByName("toggleModButton");
@@ -374,9 +401,10 @@
Engine.GetGUIObjectByName("enabledModDown").enabled = listObjectName == "modsEnabledList";
}
+ let index = listObject.multiSelected.length ? listObject.multiSelected[0] : -1;
Engine.GetGUIObjectByName("globalModDescription").caption =
- listObject.list[listObject.selected] ?
- g_Mods[listObject.list[listObject.selected]].description :
+ listObject.list[index] ?
+ g_Mods[listObject.list[index]].description :
'[color="' + g_ColorNoModSelected + '"]' + translate("No mod has been selected.") + '[/color]';
}
@@ -385,8 +413,9 @@
let modsEnabledList = Engine.GetGUIObjectByName("modsEnabledList");
let modsDisabledList = Engine.GetGUIObjectByName("modsDisabledList");
- let list = modsEnabledList.selected == -1 ? modsDisabledList : modsEnabledList;
- let folder = list.list_folder[list.selected];
+ let list = !modsEnabledList.multiSelected.length ? modsDisabledList : modsEnabledList;
+ let index = list.multiSelected.length ? list.multiSelected[0] : -1;
+ let folder = list.list_folder[index];
let url = folder && g_Mods[folder] && g_Mods[folder].url;
if (!url)
Index: binaries/data/mods/mod/gui/modmod/modmod.xml
===================================================================
--- binaries/data/mods/mod/gui/modmod/modmod.xml
+++ binaries/data/mods/mod/gui/modmod/modmod.xml
@@ -62,6 +62,7 @@
sortable="true"
selected_column="name"
selected_column_order="1"
+ multiSelection_enabled="false"
size="0 25 100%-2 100%"
font="sans-stroke-13"
auto_scroll="true"
@@ -103,6 +104,7 @@