Fix tooltip in Observer widgets
This commit is contained in:
committed by
Matthias Mailänder
parent
cffe5e3d9d
commit
9d68b815a1
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -53,7 +53,6 @@ namespace OpenRA.Mods.Common.Widgets
|
|||||||
|
|
||||||
RemoveChildren();
|
RemoveChildren();
|
||||||
BeforeRender = Nothing;
|
BeforeRender = Nothing;
|
||||||
currentToken = -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RemoveTooltip()
|
public void RemoveTooltip()
|
||||||
|
|||||||
Reference in New Issue
Block a user