diff --git a/OpenRA.Mods.Common/Widgets/ObserverArmyIconsWidget.cs b/OpenRA.Mods.Common/Widgets/ObserverArmyIconsWidget.cs index c992d8a4b4..9a28dcd741 100644 --- a/OpenRA.Mods.Common/Widgets/ObserverArmyIconsWidget.cs +++ b/OpenRA.Mods.Common/Widgets/ObserverArmyIconsWidget.cs @@ -44,7 +44,7 @@ namespace OpenRA.Mods.Common.Widgets readonly CachedTransform stats = new CachedTransform(player => player.PlayerActor.TraitOrDefault()); int lastIconIdx; - Rectangle currentIconBounds; + int currentTooltipToken; [ObjectCreator.UseCtor] public ObserverArmyIconsWidget(World world, WorldRenderer worldRenderer) @@ -118,7 +118,18 @@ namespace OpenRA.Mods.Common.Widgets 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(); @@ -149,41 +160,29 @@ namespace OpenRA.Mods.Common.Widgets 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() { - 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; } - if (TooltipUnit != null && currentIconBounds.Contains(Viewport.LastMousePos)) - return; + if (TooltipUnit != null && lastIconIdx < armyIcons.Count) + { + var armyIcon = armyIcons[lastIconIdx]; + if (armyIcon.Unit.ActorInfo == TooltipUnit.ActorInfo && armyIcon.Bounds.Contains(Viewport.LastMousePos)) + return; + } for (var i = 0; i < armyIcons.Count; i++) { @@ -192,8 +191,9 @@ namespace OpenRA.Mods.Common.Widgets continue; lastIconIdx = i; - currentIconBounds = armyIcon.Bounds; TooltipUnit = armyIcon.Unit; + currentTooltipToken = tooltipContainer.Value.SetTooltip(TooltipTemplate, new WidgetArgs { { "getTooltipUnit", GetTooltipUnit } }); + return; } diff --git a/OpenRA.Mods.Common/Widgets/ObserverProductionIconsWidget.cs b/OpenRA.Mods.Common/Widgets/ObserverProductionIconsWidget.cs index e421478550..a85045ee94 100644 --- a/OpenRA.Mods.Common/Widgets/ObserverProductionIconsWidget.cs +++ b/OpenRA.Mods.Common/Widgets/ObserverProductionIconsWidget.cs @@ -48,6 +48,7 @@ namespace OpenRA.Mods.Common.Widgets float2 iconSize; int lastIconIdx; public int MinWidth = 240; + int currentTooltipToken; [ObjectCreator.UseCtor] public ObserverProductionIconsWidget(World world, WorldRenderer worldRenderer) @@ -117,8 +118,6 @@ namespace OpenRA.Mods.Common.Widgets .ThenBy(g => g.First().BuildPaletteOrder) .ToList(); - Bounds.Width = Math.Max(currentItemsByItem.Count * (IconWidth + IconSpacing), MinWidth); - Game.Renderer.EnableAntialiasingFilter(); var queueCol = 0; @@ -177,6 +176,20 @@ namespace OpenRA.Mods.Common.Widgets 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(); var tiny = Game.Renderer.Fonts["Tiny"]; @@ -227,40 +240,24 @@ namespace OpenRA.Mods.Common.Widgets 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() { - 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; } - 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; for (var i = 0; i < productionIconsBounds.Count; i++) @@ -270,6 +267,7 @@ namespace OpenRA.Mods.Common.Widgets lastIconIdx = i; TooltipIcon = productionIcons[i]; + currentTooltipToken = tooltipContainer.Value.SetTooltip(TooltipTemplate, new WidgetArgs { { "player", GetPlayer() }, { "getTooltipIcon", GetTooltipIcon } }); return; } diff --git a/OpenRA.Mods.Common/Widgets/ObserverSupportPowerIconsWidget.cs b/OpenRA.Mods.Common/Widgets/ObserverSupportPowerIconsWidget.cs index 15d635a3b0..a4ee3b1dbd 100644 --- a/OpenRA.Mods.Common/Widgets/ObserverSupportPowerIconsWidget.cs +++ b/OpenRA.Mods.Common/Widgets/ObserverSupportPowerIconsWidget.cs @@ -46,6 +46,7 @@ namespace OpenRA.Mods.Common.Widgets readonly List supportPowerIconsIcons = new List(); readonly List supportPowerIconsBounds = new List(); int lastIconIdx; + int currentTooltipToken; [ObjectCreator.UseCtor] public ObserverSupportPowerIconsWidget(World world, WorldRenderer worldRenderer) @@ -164,32 +165,24 @@ namespace OpenRA.Mods.Common.Widgets 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() { - 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; } - 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; for (var i = 0; i < supportPowerIconsBounds.Count; i++) @@ -199,6 +192,8 @@ namespace OpenRA.Mods.Common.Widgets lastIconIdx = i; TooltipIcon = supportPowerIconsIcons[i]; + currentTooltipToken = tooltipContainer.Value.SetTooltip(TooltipTemplate, + new WidgetArgs() { { "world", worldRenderer.World }, { "player", GetPlayer() }, { "getTooltipIcon", GetTooltipIcon } }); return; } diff --git a/OpenRA.Mods.Common/Widgets/TooltipContainerWidget.cs b/OpenRA.Mods.Common/Widgets/TooltipContainerWidget.cs index d35113e233..dc48e2c209 100644 --- a/OpenRA.Mods.Common/Widgets/TooltipContainerWidget.cs +++ b/OpenRA.Mods.Common/Widgets/TooltipContainerWidget.cs @@ -53,7 +53,6 @@ namespace OpenRA.Mods.Common.Widgets RemoveChildren(); BeforeRender = Nothing; - currentToken = -1; } public void RemoveTooltip()