Index: ps/trunk/binaries/data/config/default.cfg =================================================================== --- ps/trunk/binaries/data/config/default.cfg +++ ps/trunk/binaries/data/config/default.cfg @@ -364,6 +364,7 @@ attackrange = true ; Display attack range overlays of selected defensive structures aurasrange = true ; Display aura range overlays of selected units and structures healrange = true ; Display heal range overlays of selected units +respoptooltipsort = 0 ; Sorting players in the resources and population tooltip by value (0 - no sort, -1 - ascending, 1 - descending) [gui.session.minimap] blinkduration = 1.7 ; The blink duration while pinging Index: ps/trunk/binaries/data/mods/public/gui/common/color.js =================================================================== --- ps/trunk/binaries/data/mods/public/gui/common/color.js +++ ps/trunk/binaries/data/mods/public/gui/common/color.js @@ -1,7 +1,7 @@ /** * Used to highlight hotkeys in tooltip descriptions. */ -var g_HotkeyColor = "255 251 131"; +var g_HotkeyTags = {"color": "255 251 131" }; /** * Concatenate integer color values to a string (for use in GUI objects) @@ -151,7 +151,7 @@ }); return sprintf(text, { - "hotkey": coloredText("\\[" + key + "]", g_HotkeyColor) + "hotkey": setStringTags("\\[" + key + "]", g_HotkeyTags) }); } @@ -163,7 +163,7 @@ { return sprintf(string || translate("Press %(hotkey)s to autocomplete playernames."), { "hotkey": - coloredText("\\[" + translateWithContext("hotkey", "Tab") + "]", g_HotkeyColor) + setStringTags("\\[" + translateWithContext("hotkey", "Tab") + "]", g_HotkeyTags) }); } Index: ps/trunk/binaries/data/mods/public/gui/options/options.json =================================================================== --- ps/trunk/binaries/data/mods/public/gui/options/options.json +++ ps/trunk/binaries/data/mods/public/gui/options/options.json @@ -127,6 +127,17 @@ "label": "Heal Range Visualization", "tooltip": "Display the healing range of selected units (can also be toggled in-game with the hotkey).", "config": "gui.session.healrange" + }, + { + "type": "dropdown", + "label": "Sort resources and population tooltip", + "tooltip": "Dynamically sort players in the resources and population tooltip by value.", + "config": "gui.session.respoptooltipsort", + "list": [ + { "value": 0, "label": "Unordered" }, + { "value": -1, "label": "Ascending" }, + { "value": 1, "label": "Descending" } + ] } ] }, Index: ps/trunk/binaries/data/mods/public/gui/session/selection_panels_helpers.js =================================================================== --- ps/trunk/binaries/data/mods/public/gui/session/selection_panels_helpers.js +++ ps/trunk/binaries/data/mods/public/gui/session/selection_panels_helpers.js @@ -162,14 +162,14 @@ batchString = translate("%(action)s to train %(number)s."); return "[font=\"sans-13\"]" + - coloredText( + setStringTags( sprintf(batchString, { "action": "[font=\"sans-bold-13\"]" + translate("Shift-click") + "[/font]", "number": totalBatchTrainingCount, "fullBatch": fullBatchesString, "remainderBatch": remainderBatch }), - g_HotkeyColor) + + g_HotkeyTags) + "[/font]"; } Index: ps/trunk/binaries/data/mods/public/gui/session/session.js =================================================================== --- ps/trunk/binaries/data/mods/public/gui/session/session.js +++ ps/trunk/binaries/data/mods/public/gui/session/session.js @@ -1123,34 +1123,56 @@ debug.caption = text.replace(/\[/g, "\\["); } -function getAllyStatTooltip(resource) -{ - let playersState = GetSimState().players; - let ret = ""; - - for (let player in playersState) - if (player != 0 && - player != g_ViewedPlayer && - g_Players[player].state != "defeated" && - (g_IsObserver || - playersState[g_ViewedPlayer].hasSharedLos && - g_Players[player].isMutualAlly[g_ViewedPlayer])) - ret += "\n" + sprintf(translate("%(playername)s: %(statValue)s"), { - "playername": colorizePlayernameHelper("■", player) + " " + g_Players[player].name, - "statValue": resource == "pop" ? - sprintf(translate("%(popCount)s/%(popLimit)s/%(popMax)s"), playersState[player]) : - Math.round(playersState[player].resourceCounts[resource]) - }); - - return ret; +/** + * Create ally player stat tooltip. + * @param {string} resource - Resource type, on which values will be sorted. + * @param {object} playerStates - Playerstates from players whos stats are viewed in the tooltip. + * @param {number} sort - 0 no order, -1 descending, 1 ascending order. + * @returns {string} Tooltip string. + */ +function getAllyStatTooltip(resource, playerStates, sort) +{ + let tooltip = []; + + for (let player in playerStates) + tooltip.push({ + "playername": colorizePlayernameHelper("■", player) + " " + g_Players[player].name, + "statValue": resource == "pop" ? + sprintf(translate("%(popCount)s/%(popLimit)s/%(popMax)s"), playerStates[player]) : + Math.round(playerStates[player].resourceCounts[resource]), + "orderValue": resource == "pop" ? playerStates[player].popCount : + Math.round(playerStates[player].resourceCounts[resource]) + }); + if (sort) + tooltip.sort((a, b) => sort * (b.orderValue - a.orderValue)); + return "\n" + tooltip.map(stat => sprintf(translate("%(playername)s: %(statValue)s"), stat)).join("\n"); } function updatePlayerDisplay() { - let playerState = GetSimState().players[g_ViewedPlayer]; - if (!playerState) + let allPlayerStates = GetSimState().players; + let viewedPlayerState = allPlayerStates[g_ViewedPlayer]; + let viewablePlayerStates = {}; + for (let player in allPlayerStates) + if (player != 0 && + player != g_ViewedPlayer && + g_Players[player].state != "defeated" && + (g_IsObserver || + viewedPlayerState.hasSharedLos && + g_Players[player].isMutualAlly[g_ViewedPlayer])) + viewablePlayerStates[player] = allPlayerStates[player]; + + if (!viewedPlayerState) return; + let tooltipSort = +Engine.ConfigDB_GetValue("user", "gui.session.respoptooltipsort"); + + let orderHotkeyTooltip = Object.keys(viewablePlayerStates).length <= 1 ? "" : + "\n" + sprintf(translate("%(order)s: %(hotkey)s to change order."), { + "hotkey": setStringTags("\\[Click]", g_HotkeyTags), + "order": tooltipSort == 0 ? translate("Unordered") : tooltipSort == 1 ? translate("Descending") : translate("Ascending") + }); + let resCodes = g_ResourceData.GetCodes(); for (let r = 0; r < resCodes.length; ++r) { @@ -1167,19 +1189,20 @@ if (descr) tooltip += "\n" + translate(descr); - tooltip += getAllyStatTooltip(res); + tooltip += orderHotkeyTooltip + getAllyStatTooltip(res, viewablePlayerStates, tooltipSort); resourceObj.tooltip = tooltip; - Engine.GetGUIObjectByName("resource[" + r + "]_count").caption = Math.floor(playerState.resourceCounts[res]); + Engine.GetGUIObjectByName("resource[" + r + "]_count").caption = Math.floor(viewedPlayerState.resourceCounts[res]); } - Engine.GetGUIObjectByName("resourcePop").caption = sprintf(translate("%(popCount)s/%(popLimit)s"), playerState); + Engine.GetGUIObjectByName("resourcePop").caption = sprintf(translate("%(popCount)s/%(popLimit)s"), viewedPlayerState); Engine.GetGUIObjectByName("population").tooltip = translate("Population (current / limit)") + "\n" + - sprintf(translate("Maximum population: %(popCap)s"), { "popCap": playerState.popMax }) + - getAllyStatTooltip("pop"); + sprintf(translate("Maximum population: %(popCap)s"), { "popCap": viewedPlayerState.popMax }) + + orderHotkeyTooltip + + getAllyStatTooltip("pop", viewablePlayerStates, tooltipSort); - g_IsTrainingBlocked = playerState.trainingBlocked; + g_IsTrainingBlocked = viewedPlayerState.trainingBlocked; } function selectAndMoveTo(ent) Index: ps/trunk/binaries/data/mods/public/gui/session/top_panel/resource_population.xml =================================================================== --- ps/trunk/binaries/data/mods/public/gui/session/top_panel/resource_population.xml +++ ps/trunk/binaries/data/mods/public/gui/session/top_panel/resource_population.xml @@ -1,6 +1,10 @@ - + + + saveSettingAndWriteToUserConfig("gui.session.respoptooltipsort", (+Engine.ConfigDB_GetValue("user", "gui.session.respoptooltipsort") + 2) % 3 - 1); + updatePlayerDisplay(); + Index: ps/trunk/binaries/data/mods/public/gui/session/top_panel/resources.xml =================================================================== --- ps/trunk/binaries/data/mods/public/gui/session/top_panel/resources.xml +++ ps/trunk/binaries/data/mods/public/gui/session/top_panel/resources.xml @@ -2,9 +2,13 @@ - + + + saveSettingAndWriteToUserConfig("gui.session.respoptooltipsort", (+Engine.ConfigDB_GetValue("user", "gui.session.respoptooltipsort") + 2) % 3 - 1); + updatePlayerDisplay(); +