diff --git a/binaries/data/mods/public/gui/common/color.js b/binaries/data/mods/public/gui/common/color.js
index aa9473a4f1..a6e8ef79bb 100644
--- a/binaries/data/mods/public/gui/common/color.js
+++ b/binaries/data/mods/public/gui/common/color.js
@@ -144,3 +144,17 @@ function colorizeHotkey(text, hotkey)
"[/color]"
});
}
+
+/**
+ * The autocomplete hotkey is hardcoded in SDLK_TAB of CInput.cpp,
+ * as we don't want hotkeys interfering with typing text.
+ */
+function colorizeAutocompleteHotkey()
+{
+ return sprintf(translate("Press %(hotkey)s to autocomplete playernames."), {
+ "hotkey":
+ "[color=\"" + g_HotkeyColor + "\"]" +
+ "\\[" + translateWithContext("hotkey", "Tab") + "]" +
+ "[/color]"
+ });
+}
diff --git a/binaries/data/mods/public/gui/common/functions_utility_loadsave.js b/binaries/data/mods/public/gui/common/functions_utility_loadsave.js
index 67d548a007..cad6e099d6 100644
--- a/binaries/data/mods/public/gui/common/functions_utility_loadsave.js
+++ b/binaries/data/mods/public/gui/common/functions_utility_loadsave.js
@@ -75,3 +75,17 @@ function reallyDeleteGame(gameID)
// Run init again to refresh saved game list
init();
}
+
+function deleteTooltip()
+{
+ let deleteTooltip = colorizeHotkey(
+ translate("Delete the selected entry using %(hotkey)s."),
+ "session.savedgames.delete");
+
+ if (deleteTooltip)
+ deleteTooltip += colorizeHotkey(
+ "\n" + translate("Hold %(hotkey)s to delete without confirmation."),
+ "session.savedgames.noconfirmation");
+
+ return deleteTooltip;
+}
diff --git a/binaries/data/mods/public/gui/gamesetup/gamesetup.js b/binaries/data/mods/public/gui/gamesetup/gamesetup.js
index fce3cd886a..3f103da510 100644
--- a/binaries/data/mods/public/gui/gamesetup/gamesetup.js
+++ b/binaries/data/mods/public/gui/gamesetup/gamesetup.js
@@ -294,6 +294,8 @@ function initGUIObjects()
resizeMoreOptionsWindow();
+ Engine.GetGUIObjectByName("chatInput").tooltip = colorizeAutocompleteHotkey();
+
if (g_IsNetworked)
Engine.GetGUIObjectByName("chatInput").focus();
diff --git a/binaries/data/mods/public/gui/lobby/lobby.js b/binaries/data/mods/public/gui/lobby/lobby.js
index d61dc50781..ef3fe3b02f 100644
--- a/binaries/data/mods/public/gui/lobby/lobby.js
+++ b/binaries/data/mods/public/gui/lobby/lobby.js
@@ -224,6 +224,8 @@ function init(attribs)
Engine.LobbyClearPresenceUpdates();
updatePlayerList();
updateSubject(Engine.LobbyGetRoomSubject());
+
+ Engine.GetGUIObjectByName("chatInput").tooltip = colorizeAutocompleteHotkey();
}
function returnToMainMenu()
diff --git a/binaries/data/mods/public/gui/replaymenu/replay_menu.js b/binaries/data/mods/public/gui/replaymenu/replay_menu.js
index a41f80192a..5a46e33c04 100644
--- a/binaries/data/mods/public/gui/replaymenu/replay_menu.js
+++ b/binaries/data/mods/public/gui/replaymenu/replay_menu.js
@@ -67,6 +67,7 @@ function init(data)
return;
}
+ initHotkeyTooltips();
displayReplayList();
}
@@ -185,6 +186,15 @@ function sanitizeGameAttributes(attribs)
});
}
+function initHotkeyTooltips()
+{
+ Engine.GetGUIObjectByName("playersFilter").tooltip =
+ translate("Filter replays by typing one or more, partial or complete playernames.") +
+ " " + colorizeAutocompleteHotkey();
+
+ Engine.GetGUIObjectByName("deleteReplayButton").tooltip = deleteTooltip();
+}
+
/**
* Filter g_Replays, fill the GUI list with that data and show the description of the current replay.
*/
diff --git a/binaries/data/mods/public/gui/replaymenu/replay_menu.xml b/binaries/data/mods/public/gui/replaymenu/replay_menu.xml
index 95c9ad63e4..9b2366e350 100644
--- a/binaries/data/mods/public/gui/replaymenu/replay_menu.xml
+++ b/binaries/data/mods/public/gui/replaymenu/replay_menu.xml
@@ -12,7 +12,7 @@
-
+
diff --git a/binaries/data/mods/public/gui/savedgames/load.js b/binaries/data/mods/public/gui/savedgames/load.js
index e70f0c5e09..9f3e6c571d 100644
--- a/binaries/data/mods/public/gui/savedgames/load.js
+++ b/binaries/data/mods/public/gui/savedgames/load.js
@@ -34,6 +34,8 @@ function init()
gameSelection.selected = savedGames.length - 1;
else
selectionChanged();
+
+ Engine.GetGUIObjectByName("deleteGameButton").tooltip = deleteTooltip();
}
function selectionChanged()
diff --git a/binaries/data/mods/public/gui/savedgames/save.js b/binaries/data/mods/public/gui/savedgames/save.js
index 9aae41c6fc..cdb6c3a3a8 100644
--- a/binaries/data/mods/public/gui/savedgames/save.js
+++ b/binaries/data/mods/public/gui/savedgames/save.js
@@ -37,6 +37,8 @@ function init(data)
gameSelection.list = savedGames.map(game => generateLabel(game.metadata));
gameSelection.list_data = savedGames.map(game => game.id);
gameSelection.selected = -1;
+
+ Engine.GetGUIObjectByName("deleteGameButton").tooltip = deleteTooltip();
}
function saveGame()
diff --git a/binaries/data/mods/public/gui/savedgames/save.xml b/binaries/data/mods/public/gui/savedgames/save.xml
index 61e3fea54a..f66d16b334 100644
--- a/binaries/data/mods/public/gui/savedgames/save.xml
+++ b/binaries/data/mods/public/gui/savedgames/save.xml
@@ -2,6 +2,7 @@
+
diff --git a/binaries/data/mods/public/gui/session/chat_window.xml b/binaries/data/mods/public/gui/session/chat_window.xml
index e9a996ecea..4093b3b348 100644
--- a/binaries/data/mods/public/gui/session/chat_window.xml
+++ b/binaries/data/mods/public/gui/session/chat_window.xml
@@ -15,7 +15,6 @@
Text: