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,30 +40,51 @@
function deleteGame()
{
let gameSelection = Engine.GetGUIObjectByName("gameSelection");
- let gameID = gameSelection.list_data[gameSelection.selected];
+ let selected = gameSelection.selected;
- if (!gameID)
- return;
+ let toDelete = [];
+ let toDeleteNames = [];
+
+ if (!gameSelection.multiSelected.length)
+ {
+ toDelete.push(gameSelection.list_data[selected]);
+ toDeleteNames.push(gameSelection.list[selected]);
+ }
+ else
+ {
+ for (let i = 0; i < gameSelection.multiSelected.length; ++i)
+ {
+ selected = gameSelection.multiSelected[i];
+ 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,9 +89,10 @@
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()
@@ -99,7 +100,7 @@
let metadata = g_SavedGamesMetadata[Engine.GetGUIObjectByName("gameSelection").selected];
Engine.GetGUIObjectByName("invalidGame").hidden = !!metadata;
Engine.GetGUIObjectByName("validGame").hidden = !metadata;
- Engine.GetGUIObjectByName("loadGameButton").enabled = !!metadata;
+ Engine.GetGUIObjectByName("loadGameButton").enabled = !!metadata && !Engine.GetGUIObjectByName("gameSelection").multiSelected.length;
Engine.GetGUIObjectByName("deleteGameButton").enabled = !!metadata;
if (!metadata)
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/replaymenu/replay_actions.js
===================================================================
--- binaries/data/mods/public/gui/replaymenu/replay_actions.js
+++ binaries/data/mods/public/gui/replaymenu/replay_actions.js
@@ -157,19 +157,36 @@
function deleteReplay()
{
// Get selected replay
- var selected = Engine.GetGUIObjectByName("replaySelection").selected;
+ let replaySelection = Engine.GetGUIObjectByName("replaySelection");
+ var selected = replaySelection.selected;
if (selected == -1)
return;
-
- var replay = g_ReplaysFiltered[selected];
-
+ let directories = [];
+ let directoryNames = [];
+ if (!replaySelection.multiSelected.length)
+ {
+ directories.push(g_ReplaysFiltered[selected].directory);
+ directoryNames.push(Engine.GetReplayDirectoryName(g_ReplaysFiltered[selected].directory));
+ }
+ else
+ {
+ for (let i = 0; i < replaySelection.multiSelected.length; ++i)
+ {
+ selected = replaySelection.multiSelected[i];
+ directories.push(g_ReplaysFiltered[selected].directory);
+ directoryNames.push(Engine.GetReplayDirectoryName(g_ReplaysFiltered[selected].directory));
+ }
+ }
messageBox(
500, 200,
- translate("Are you sure you want to delete this replay permanently?") + "\n" +
- escapeText(Engine.GetReplayDirectoryName(replay.directory)),
- translate("Delete replay"),
+ translatePlural("Are you sure you want to delete this replay permanently?",
+ "Are you sure you want to delete these replays permanently?",
+ directories.length
+ ) + "\n" +
+ escapeText(directoryNames.join("\n")),
+ translatePlural("Delete replay", "Delete replays", directories.length),
[translate("No"), translate("Yes")],
- [null, function() { reallyDeleteReplay(replay.directory); }]
+ [null, function() { reallyDeleteReplay(directories); }]
);
}
@@ -178,23 +195,41 @@
*/
function deleteReplayWithoutConfirmation()
{
- var selected = Engine.GetGUIObjectByName("replaySelection").selected;
- if (selected > -1)
- reallyDeleteReplay(g_ReplaysFiltered[selected].directory);
+ let replaySelection = Engine.GetGUIObjectByName("replaySelection");
+ var selected = replaySelection.selected;
+ if (selected == -1)
+ return;
+ let directories = [];
+ if (!replaySelection.multiSelected.length)
+ {
+ directories.push(g_ReplaysFiltered[selected].directory);
+ }
+ else
+ {
+ for (let i = 0; i < replaySelection.multiSelected.length; ++i)
+ {
+ selected = replaySelection.multiSelected[i];
+ directories.push(g_ReplaysFiltered[selected].directory);
+ }
+ }
+ reallyDeleteReplay(directories);
}
/**
* Attempts to delete the given replay directory from the disk.
*
- * @param replayDirectory {string}
+ * @param replayDirectories {string[]}
*/
-function reallyDeleteReplay(replayDirectory)
+function reallyDeleteReplay(replayDirectories)
{
var replaySelection = Engine.GetGUIObjectByName("replaySelection");
var selectedIndex = replaySelection.selected;
- if (!Engine.DeleteReplay(replayDirectory))
- error("Could not delete replay!");
+ for (let replayDirectory of replayDirectories)
+ {
+ if (!Engine.DeleteReplay(replayDirectory))
+ error("Could not delete replay!");
+ }
// Refresh replay list
init();
Index: binaries/data/mods/public/gui/replaymenu/replay_menu.js
===================================================================
--- binaries/data/mods/public/gui/replaymenu/replay_menu.js
+++ binaries/data/mods/public/gui/replaymenu/replay_menu.js
@@ -77,6 +77,10 @@
if (data && data.summarySelectedData)
g_SummarySelectedData = data.summarySelectedData;
+
+ let replaySelection = Engine.GetGUIObjectByName("replaySelection");
+ if(replaySelection)
+ replaySelection.multiSelected = [];
}
/**
@@ -259,16 +263,16 @@
function displayReplayDetails()
{
let selected = Engine.GetGUIObjectByName("replaySelection").selected;
- let replaySelected = selected > -1;
+ let oneReplaySelected = selected > -1 && !Engine.GetGUIObjectByName("replaySelection").multiSelected.length;
- Engine.GetGUIObjectByName("replayInfo").hidden = !replaySelected;
- Engine.GetGUIObjectByName("replayInfoEmpty").hidden = replaySelected;
- Engine.GetGUIObjectByName("startReplayButton").enabled = replaySelected;
- Engine.GetGUIObjectByName("deleteReplayButton").enabled = replaySelected;
- Engine.GetGUIObjectByName("replayFilename").hidden = !replaySelected;
+ Engine.GetGUIObjectByName("replayInfo").hidden = !oneReplaySelected;
+ Engine.GetGUIObjectByName("replayInfoEmpty").hidden = oneReplaySelected;
+ Engine.GetGUIObjectByName("startReplayButton").enabled = oneReplaySelected;
+ Engine.GetGUIObjectByName("deleteReplayButton").enabled = (selected > -1);
+ Engine.GetGUIObjectByName("replayFilename").hidden = !oneReplaySelected;
Engine.GetGUIObjectByName("summaryButton").hidden = true;
- if (!replaySelected)
+ if (!oneReplaySelected)
return;
let replay = g_ReplaysFiltered[selected];
Index: binaries/data/mods/public/gui/replaymenu/replay_menu.xml
===================================================================
--- binaries/data/mods/public/gui/replaymenu/replay_menu.xml
+++ binaries/data/mods/public/gui/replaymenu/replay_menu.xml
@@ -58,6 +58,7 @@
selected_column_order="-1"
font="sans-stroke-13"
auto_scroll="true"
+ multiSelection_enabled="true"
>
displayReplayDetails();
Index: binaries/data/mods/public/gui/savegame/save.js
===================================================================
--- binaries/data/mods/public/gui/savegame/save.js
+++ binaries/data/mods/public/gui/savegame/save.js
@@ -6,6 +6,7 @@
let gameSelection = Engine.GetGUIObjectByName("gameSelection");
let gameID = gameSelection.list_data[gameSelection.selected];
Engine.GetGUIObjectByName("deleteGameButton").enabled = !!gameID;
+ Engine.GetGUIObjectByName("saveGameButton").enabled = !gameSelection.multiSelected.length;
if (!gameID)
return;
@@ -40,8 +41,9 @@
gameSelection.list = savedGames.map(game => generateSavegameLabel(game.metadata, engineInfo));
gameSelection.list_data = savedGames.map(game => game.id);
gameSelection.selected = Math.min(gameSelection.selected, gameSelection.list.length - 1);
-
+ gameSelection.multiSelected = [];
Engine.GetGUIObjectByName("deleteGameButton").tooltip = deleteTooltip();
+ selectDescription();
}
function saveGame()
Index: binaries/data/mods/public/gui/savegame/save.xml
===================================================================
--- binaries/data/mods/public/gui/savegame/save.xml
+++ binaries/data/mods/public/gui/savegame/save.xml
@@ -17,7 +17,7 @@
-