1
0
forked from 0ad/0ad

Make the resource/pop tooltips sortable

Patch By: ffffffff
Differential Revision: https://code.wildfiregames.com/D1113
This was SVN commit r21071.
This commit is contained in:
bb 2018-01-29 23:12:12 +00:00
parent 99dc7c8f1c
commit 7e14a33411
7 changed files with 76 additions and 33 deletions

View File

@ -364,6 +364,7 @@ woundedunithotkeythreshold = 33 ; The wounded unit hotkey considers the select
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

View File

@ -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 @@ function colorizeHotkey(text, hotkey)
});
return sprintf(text, {
"hotkey": coloredText("\\[" + key + "]", g_HotkeyColor)
"hotkey": setStringTags("\\[" + key + "]", g_HotkeyTags)
});
}
@ -163,7 +163,7 @@ function colorizeAutocompleteHotkey(string)
{
return sprintf(string || translate("Press %(hotkey)s to autocomplete playernames."), {
"hotkey":
coloredText("\\[" + translateWithContext("hotkey", "Tab") + "]", g_HotkeyColor)
setStringTags("\\[" + translateWithContext("hotkey", "Tab") + "]", g_HotkeyTags)
});
}

View File

@ -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" }
]
}
]
},

View File

@ -162,14 +162,14 @@ function formatBatchTrainingString(buildingsCountToTrainFullBatch, fullBatchSize
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]";
}

View File

@ -1123,34 +1123,56 @@ function updateDebug()
debug.caption = text.replace(/\[/g, "\\[");
}
function getAllyStatTooltip(resource)
/**
* 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 playersState = GetSimState().players;
let ret = "";
let tooltip = [];
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;
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 @@ function updatePlayerDisplay()
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)

View File

@ -1,6 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<object name="population" size="0 0 50%-52 100%" type="image" style="resourceCounter" tooltip_style="sessionToolTipBold">
<object name="population" size="0 0 50%-52 100%" type="button" style="resourceCounter" tooltip_style="sessionToolTipBold">
<object size="0 -2 40 38" type="image" sprite="stretched:session/icons/resources/population.png" ghost="true"/>
<object size="32 0 100% 100%-2" type="text" style="resourceText" name="resourcePop"/>
<action on="Press">
saveSettingAndWriteToUserConfig("gui.session.respoptooltipsort", (+Engine.ConfigDB_GetValue("user", "gui.session.respoptooltipsort") + 2) % 3 - 1);
updatePlayerDisplay();
</action>
</object>

View File

@ -2,9 +2,13 @@
<object size="0 0 50%-90-52 100%" name="resourceCounts">
<repeat count="4">
<object name="resource[n]" size="0 0 89 100%" type="image" style="resourceCounter" tooltip_style="sessionToolTipBold">
<object name="resource[n]" size="0 0 89 100%" type="button" style="resourceCounter" tooltip_style="sessionToolTipBold">
<object size="0 -2 40 38" type="image" name="resource[n]_icon" ghost="true"/>
<object size="34 0 100%-2 100%-2" type="text" style="resourceText" name="resource[n]_count"/>
<action on="Press">
saveSettingAndWriteToUserConfig("gui.session.respoptooltipsort", (+Engine.ConfigDB_GetValue("user", "gui.session.respoptooltipsort") + 2) % 3 - 1);
updatePlayerDisplay();
</action>
</object>
</repeat>
</object>