Fix tooltip in Observer widgets

This commit is contained in:
teinarss
2020-02-15 20:15:59 +01:00
committed by Matthias Mailänder
parent cffe5e3d9d
commit 9d68b815a1
4 changed files with 75 additions and 83 deletions

View File

@@ -44,7 +44,7 @@ namespace OpenRA.Mods.Common.Widgets
readonly CachedTransform<Player, PlayerStatistics> stats = new CachedTransform<Player, PlayerStatistics>(player => player.PlayerActor.TraitOrDefault<PlayerStatistics>()); readonly CachedTransform<Player, PlayerStatistics> stats = new CachedTransform<Player, PlayerStatistics>(player => player.PlayerActor.TraitOrDefault<PlayerStatistics>());
int lastIconIdx; int lastIconIdx;
Rectangle currentIconBounds; int currentTooltipToken;
[ObjectCreator.UseCtor] [ObjectCreator.UseCtor]
public ObserverArmyIconsWidget(World world, WorldRenderer worldRenderer) public ObserverArmyIconsWidget(World world, WorldRenderer worldRenderer)
@@ -118,7 +118,18 @@ namespace OpenRA.Mods.Common.Widgets
queueCol++; queueCol++;
} }
Bounds.Width = queueCol * (IconWidth + IconSpacing); var newWidth = Math.Max(queueCol * (IconWidth + IconSpacing), MinWidth);
if (newWidth != Bounds.Width)
{
var wasInBounds = EventBounds.Contains(Viewport.LastMousePos);
Bounds.Width = newWidth;
var isInBounds = EventBounds.Contains(Viewport.LastMousePos);
// HACK: Ui.MouseOverWidget is normally only updated when the mouse moves
// Call ResetTooltips to force a fake mouse movement so the checks in Tick will work properly
if (wasInBounds != isInBounds)
Game.RunAfterTick(Ui.ResetTooltips);
}
Game.Renderer.DisableAntialiasingFilter(); Game.Renderer.DisableAntialiasingFilter();
@@ -149,41 +160,29 @@ namespace OpenRA.Mods.Common.Widgets
return new ObserverArmyIconsWidget(this); return new ObserverArmyIconsWidget(this);
} }
public override void MouseEntered()
{
if (TooltipContainer == null)
return;
foreach (var armyIcon in armyIcons)
{
if (!armyIcon.Bounds.Contains(Viewport.LastMousePos))
continue;
TooltipUnit = armyIcon.Unit;
break;
}
tooltipContainer.Value.SetTooltip(TooltipTemplate, new WidgetArgs { { "getTooltipUnit", GetTooltipUnit } });
}
public override void MouseExited()
{
if (TooltipContainer == null)
return;
tooltipContainer.Value.RemoveTooltip();
}
public override void Tick() public override void Tick()
{ {
if (lastIconIdx >= armyIcons.Count) if (TooltipContainer == null)
return;
if (Ui.MouseOverWidget != this)
{ {
TooltipUnit = null; if (TooltipUnit != null)
{
tooltipContainer.Value.RemoveTooltip(currentTooltipToken);
lastIconIdx = 0;
TooltipUnit = null;
}
return; return;
} }
if (TooltipUnit != null && currentIconBounds.Contains(Viewport.LastMousePos)) if (TooltipUnit != null && lastIconIdx < armyIcons.Count)
return; {
var armyIcon = armyIcons[lastIconIdx];
if (armyIcon.Unit.ActorInfo == TooltipUnit.ActorInfo && armyIcon.Bounds.Contains(Viewport.LastMousePos))
return;
}
for (var i = 0; i < armyIcons.Count; i++) for (var i = 0; i < armyIcons.Count; i++)
{ {
@@ -192,8 +191,9 @@ namespace OpenRA.Mods.Common.Widgets
continue; continue;
lastIconIdx = i; lastIconIdx = i;
currentIconBounds = armyIcon.Bounds;
TooltipUnit = armyIcon.Unit; TooltipUnit = armyIcon.Unit;
currentTooltipToken = tooltipContainer.Value.SetTooltip(TooltipTemplate, new WidgetArgs { { "getTooltipUnit", GetTooltipUnit } });
return; return;
} }

View File

@@ -48,6 +48,7 @@ namespace OpenRA.Mods.Common.Widgets
float2 iconSize; float2 iconSize;
int lastIconIdx; int lastIconIdx;
public int MinWidth = 240; public int MinWidth = 240;
int currentTooltipToken;
[ObjectCreator.UseCtor] [ObjectCreator.UseCtor]
public ObserverProductionIconsWidget(World world, WorldRenderer worldRenderer) public ObserverProductionIconsWidget(World world, WorldRenderer worldRenderer)
@@ -117,8 +118,6 @@ namespace OpenRA.Mods.Common.Widgets
.ThenBy(g => g.First().BuildPaletteOrder) .ThenBy(g => g.First().BuildPaletteOrder)
.ToList(); .ToList();
Bounds.Width = Math.Max(currentItemsByItem.Count * (IconWidth + IconSpacing), MinWidth);
Game.Renderer.EnableAntialiasingFilter(); Game.Renderer.EnableAntialiasingFilter();
var queueCol = 0; var queueCol = 0;
@@ -177,6 +176,20 @@ namespace OpenRA.Mods.Common.Widgets
queueCol++; queueCol++;
} }
var newWidth = Math.Max(queueCol * (IconWidth + IconSpacing), MinWidth);
if (newWidth != Bounds.Width)
{
var wasInBounds = EventBounds.Contains(Viewport.LastMousePos);
Bounds.Width = newWidth;
var isInBounds = EventBounds.Contains(Viewport.LastMousePos);
// HACK: Ui.MouseOverWidget is normally only updated when the mouse moves
// Call ResetTooltips to force a fake mouse movement so the checks in Tick will work properly
if (wasInBounds != isInBounds)
Game.RunAfterTick(Ui.ResetTooltips);
}
Game.Renderer.DisableAntialiasingFilter(); Game.Renderer.DisableAntialiasingFilter();
var tiny = Game.Renderer.Fonts["Tiny"]; var tiny = Game.Renderer.Fonts["Tiny"];
@@ -227,40 +240,24 @@ namespace OpenRA.Mods.Common.Widgets
return new ObserverProductionIconsWidget(this); return new ObserverProductionIconsWidget(this);
} }
public override void MouseEntered()
{
if (TooltipContainer == null)
return;
for (var i = 0; i < productionIconsBounds.Count; i++)
{
if (!productionIconsBounds[i].Contains(Viewport.LastMousePos))
continue;
TooltipIcon = productionIcons[i];
break;
}
tooltipContainer.Value.SetTooltip(TooltipTemplate, new WidgetArgs { { "player", GetPlayer() }, { "getTooltipIcon", GetTooltipIcon } });
}
public override void MouseExited()
{
if (TooltipContainer == null)
return;
tooltipContainer.Value.RemoveTooltip();
}
public override void Tick() public override void Tick()
{ {
if (lastIconIdx >= productionIconsBounds.Count) if (TooltipContainer == null)
return;
if (Ui.MouseOverWidget != this)
{ {
TooltipIcon = null; if (TooltipIcon != null)
{
tooltipContainer.Value.RemoveTooltip(currentTooltipToken);
lastIconIdx = 0;
TooltipIcon = null;
}
return; return;
} }
if (TooltipIcon != null && productionIconsBounds[lastIconIdx].Contains(Viewport.LastMousePos)) if (TooltipIcon != null && productionIconsBounds.Count > lastIconIdx && productionIcons[lastIconIdx].Actor == TooltipIcon.Actor && productionIconsBounds[lastIconIdx].Contains(Viewport.LastMousePos))
return; return;
for (var i = 0; i < productionIconsBounds.Count; i++) for (var i = 0; i < productionIconsBounds.Count; i++)
@@ -270,6 +267,7 @@ namespace OpenRA.Mods.Common.Widgets
lastIconIdx = i; lastIconIdx = i;
TooltipIcon = productionIcons[i]; TooltipIcon = productionIcons[i];
currentTooltipToken = tooltipContainer.Value.SetTooltip(TooltipTemplate, new WidgetArgs { { "player", GetPlayer() }, { "getTooltipIcon", GetTooltipIcon } });
return; return;
} }

View File

@@ -46,6 +46,7 @@ namespace OpenRA.Mods.Common.Widgets
readonly List<SupportPowersWidget.SupportPowerIcon> supportPowerIconsIcons = new List<SupportPowersWidget.SupportPowerIcon>(); readonly List<SupportPowersWidget.SupportPowerIcon> supportPowerIconsIcons = new List<SupportPowersWidget.SupportPowerIcon>();
readonly List<Rectangle> supportPowerIconsBounds = new List<Rectangle>(); readonly List<Rectangle> supportPowerIconsBounds = new List<Rectangle>();
int lastIconIdx; int lastIconIdx;
int currentTooltipToken;
[ObjectCreator.UseCtor] [ObjectCreator.UseCtor]
public ObserverSupportPowerIconsWidget(World world, WorldRenderer worldRenderer) public ObserverSupportPowerIconsWidget(World world, WorldRenderer worldRenderer)
@@ -164,32 +165,24 @@ namespace OpenRA.Mods.Common.Widgets
return new ObserverSupportPowerIconsWidget(this); return new ObserverSupportPowerIconsWidget(this);
} }
public override void MouseEntered()
{
if (TooltipContainer == null)
return;
tooltipContainer.Value.SetTooltip(TooltipTemplate,
new WidgetArgs() { { "world", worldRenderer.World }, { "player", GetPlayer() }, { "getTooltipIcon", GetTooltipIcon } });
}
public override void MouseExited()
{
if (TooltipContainer == null)
return;
tooltipContainer.Value.RemoveTooltip();
}
public override void Tick() public override void Tick()
{ {
if (lastIconIdx >= supportPowerIconsBounds.Count) if (TooltipContainer == null)
return;
if (Ui.MouseOverWidget != this)
{ {
TooltipIcon = null; if (TooltipIcon != null)
{
tooltipContainer.Value.RemoveTooltip(currentTooltipToken);
lastIconIdx = 0;
TooltipIcon = null;
}
return; return;
} }
if (TooltipIcon != null && supportPowerIconsBounds[lastIconIdx].Contains(Viewport.LastMousePos)) if (TooltipIcon != null && lastIconIdx < supportPowerIconsBounds.Count && supportPowerIconsIcons[lastIconIdx].Power == TooltipIcon.Power && supportPowerIconsBounds[lastIconIdx].Contains(Viewport.LastMousePos))
return; return;
for (var i = 0; i < supportPowerIconsBounds.Count; i++) for (var i = 0; i < supportPowerIconsBounds.Count; i++)
@@ -199,6 +192,8 @@ namespace OpenRA.Mods.Common.Widgets
lastIconIdx = i; lastIconIdx = i;
TooltipIcon = supportPowerIconsIcons[i]; TooltipIcon = supportPowerIconsIcons[i];
currentTooltipToken = tooltipContainer.Value.SetTooltip(TooltipTemplate,
new WidgetArgs() { { "world", worldRenderer.World }, { "player", GetPlayer() }, { "getTooltipIcon", GetTooltipIcon } });
return; return;
} }

View File

@@ -53,7 +53,6 @@ namespace OpenRA.Mods.Common.Widgets
RemoveChildren(); RemoveChildren();
BeforeRender = Nothing; BeforeRender = Nothing;
currentToken = -1;
} }
public void RemoveTooltip() public void RemoveTooltip()