Index: binaries/data/mods/public/gui/common/functions_utility_loadsave.js
===================================================================
--- binaries/data/mods/public/gui/common/functions_utility_loadsave.js
+++ binaries/data/mods/public/gui/common/functions_utility_loadsave.js
@@ -40,29 +40,39 @@
function deleteGame()
{
let gameSelection = Engine.GetGUIObjectByName("gameSelection");
- let gameID = gameSelection.list_data[gameSelection.selected];
- if (!gameID)
- return;
+ let toDelete = [];
+ let toDeleteNames = [];
+
+ for (let selected of gameSelection.multiSelected)
+ {
+ toDelete.push(gameSelection.list_data[selected]);
+ toDeleteNames.push(gameSelection.list[selected]);
+ }
if (Engine.HotkeyIsPressed("session.savedgames.noconfirmation"))
- reallyDeleteGame(gameID);
+ reallyDeleteGame(toDelete);
else
messageBox(
500, 200,
sprintf(translate("\"%(label)s\""), {
- "label": gameSelection.list[gameSelection.selected]
- }) + "\n" + translate("Saved game will be permanently deleted, are you sure?"),
+ "label": toDeleteNames.join("\n")
+ }) + "\n" + translatePlural(
+ "Saved game will be permanently deleted, are you sure?",
+ "Saved games will be permanently deleted, are you sure?",
+ toDeleteNames.length
+ ),
translate("DELETE"),
[translate("No"), translate("Yes")],
- [null, function(){ reallyDeleteGame(gameID); }]
+ [null, function(){ reallyDeleteGame(toDelete); }]
);
}
-function reallyDeleteGame(gameID)
+function reallyDeleteGame(gameIDs)
{
- if (!Engine.DeleteSavedGame(gameID))
- error("Could not delete saved game: " + gameID);
+ for (let gameID of gameIDs)
+ if (!Engine.DeleteSavedGame(gameID))
+ error("Could not delete saved game: " + gameID);
// Run init again to refresh saved game list
init();
Index: binaries/data/mods/public/gui/loadgame/load.js
===================================================================
--- binaries/data/mods/public/gui/loadgame/load.js
+++ binaries/data/mods/public/gui/loadgame/load.js
@@ -89,17 +89,20 @@
gameSelection.selected = g_SavedGamesMetadata.length - 1;
else if (gameSelection.selected == -1 && g_SavedGamesMetadata.length)
gameSelection.selected = 0;
- selectionChanged();
+ gameSelection.multiSelected = [];
Engine.GetGUIObjectByName("deleteGameButton").tooltip = deleteTooltip();
+ selectionChanged();
}
function selectionChanged()
{
- let metadata = g_SavedGamesMetadata[Engine.GetGUIObjectByName("gameSelection").selected];
+ let gameSelection = Engine.GetGUIObjectByName("gameSelection");
+ let index = gameSelection.multiSelected.length ? gameSelection.multiSelected[0] : -1;
+ let metadata = g_SavedGamesMetadata[index];
Engine.GetGUIObjectByName("invalidGame").hidden = !!metadata;
Engine.GetGUIObjectByName("validGame").hidden = !metadata;
- Engine.GetGUIObjectByName("loadGameButton").enabled = !!metadata;
+ Engine.GetGUIObjectByName("loadGameButton").enabled = !!metadata && gameSelection.multiSelected.length == 1;
Engine.GetGUIObjectByName("deleteGameButton").enabled = !!metadata;
if (!metadata)
@@ -129,8 +132,8 @@
function loadGame()
{
let gameSelection = Engine.GetGUIObjectByName("gameSelection");
- let gameId = gameSelection.list_data[gameSelection.selected];
- let metadata = g_SavedGamesMetadata[gameSelection.selected];
+ let gameId = gameSelection.list_data[gameSelection.multiSelected[0]];
+ let metadata = g_SavedGamesMetadata[gameSelection.multiSelected[0]];
// Check compatibility before really loading it
let engineInfo = Engine.GetEngineInfo();
Index: binaries/data/mods/public/gui/loadgame/load.xml
===================================================================
--- binaries/data/mods/public/gui/loadgame/load.xml
+++ binaries/data/mods/public/gui/loadgame/load.xml
@@ -23,6 +23,7 @@
size="24 4 100%-24 100%-70"
type="olist"
auto_scroll="true"
+ multiSelection_enabled="true"
>
selectionChanged();
init();
Index: binaries/data/mods/public/gui/lobby/lobby.js
===================================================================
--- binaries/data/mods/public/gui/lobby/lobby.js
+++ binaries/data/mods/public/gui/lobby/lobby.js
@@ -681,7 +681,8 @@
function updateToggleBuddy()
{
let playerList = Engine.GetGUIObjectByName("playersBox");
- let playerName = playerList.list[playerList.selected];
+ let index = playerList.multiSelected.length ? playerList.multiSelected[0] : -1;
+ let playerName = playerList.list[index];
let toggleBuddyButton = Engine.GetGUIObjectByName("toggleBuddyButton");
toggleBuddyButton.caption = g_Buddies.indexOf(playerName) != -1 ? translate("Unmark as Buddy") : translate("Mark as Buddy");
@@ -762,7 +763,12 @@
playersBox.list_rating = ratingList;
playersBox.list = nickList;
- playersBox.selected = playersBox.list.indexOf(g_SelectedPlayer);
+ let index = playersBox.list.indexOf(g_SelectedPlayer);
+ playersBox.selected = index;
+ if (index > -1)
+ playersBox.multiSelected = [index];
+ else
+ playersBox.multiSelected = [];
}
/**
@@ -771,17 +777,16 @@
function toggleBuddy()
{
let playerList = Engine.GetGUIObjectByName("playersBox");
- let name = playerList.list[playerList.selected];
-
+
+ let selected = playerList.multiSelected[0];
+ let name = playerList.list[selected];
if (!name || name == g_Username || name.indexOf(g_BuddyListDelimiter) != -1)
return;
-
let index = g_Buddies.indexOf(name);
if (index != -1)
g_Buddies.splice(index, 1);
else
g_Buddies.push(name);
-
updateToggleBuddy();
saveSettingAndWriteToUserConfig("lobby.buddies", g_Buddies.filter(nick => nick).join(g_BuddyListDelimiter) || g_BuddyListDelimiter);
@@ -813,24 +818,30 @@
{
foundAsObserver = true;
gameList.selected = i;
+ gamelist.multiSelected = [i];
}
else if (!player.Offline)
{
gameList.selected = i;
+ gamelist.multiSelected = [i];
return;
}
- else if (!foundAsObserver)
+ else if (!foundAsObserver) {
gameList.selected = i;
+ gamelist.multiSelected = [i];
+ }
}
}
function onPlayerListSelection()
{
let playerList = Engine.GetGUIObjectByName("playersBox");
- if (playerList.selected == playerList.list.indexOf(g_SelectedPlayer))
+ if (!playerList.multiSelected.length && playerList.list.indexOf(g_SelectedPlayer) == -1)
+ return;
+ if (playerList.multiSelected[0] == playerList.list.indexOf(g_SelectedPlayer))
return;
- g_SelectedPlayer = playerList.list[playerList.selected];
+ g_SelectedPlayer = playerList.list[playerList.multiSelected[0]];
lookupSelectedUserProfile("playersBox");
updateToggleBuddy();
selectGameFromPlayername();
@@ -986,8 +997,9 @@
let gamesBox = Engine.GetGUIObjectByName("gamesBox");
let sortBy = gamesBox.selected_column;
let sortOrder = gamesBox.selected_column_order;
-
- if (gamesBox.selected > -1)
+ let selected = gamesBox.multiSelected.length ? gamesBox.multiSelected[0] : -1;
+
+ if (selected > -1)
{
g_SelectedGameIP = g_GameList[gamesBox.selected].ip;
g_SelectedGamePort = g_GameList[gamesBox.selected].port;
@@ -1107,6 +1119,10 @@
gamesBox.auto_scroll = false;
gamesBox.selected = selectedGameIndex;
+ if (selectedGameIndex > -1)
+ gamesBox.multiSelected = [selectedGameIndex];
+ else
+ gamesBox.multiSelected = [];
updateGameSelection();
}
@@ -1165,10 +1181,10 @@
function selectedGame()
{
let gamesBox = Engine.GetGUIObjectByName("gamesBox");
- if (gamesBox.selected < 0)
+ if (!gamesBox.multiSelected.length)
return undefined;
- return g_GameList[gamesBox.list_data[gamesBox.selected]];
+ return g_GameList[gamesBox.list_data[gamesBox.multiSelected[0]]];
}
/**
Index: binaries/data/mods/public/gui/lobby/lobby_panels.xml
===================================================================
--- binaries/data/mods/public/gui/lobby/lobby_panels.xml
+++ binaries/data/mods/public/gui/lobby/lobby_panels.xml
@@ -15,6 +15,7 @@
selected_column="name"
selected_column_order="1"
type="olist"
+ multiSelection_enabled="false"
sortable="true"
size="0 0 100% 100%"
font="sans-bold-stroke-13"
@@ -178,6 +179,7 @@
selected_column="name"
selected_column_order="1"
type="olist"
+ multiSelection_enabled="false"
sortable="true"
size="0 25 100% 48%"
font="sans-stroke-13"
@@ -281,6 +283,7 @@