diff --git a/OpenRA.Mods.Common/Widgets/Logic/Ingame/CommandBarLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Ingame/CommandBarLogic.cs index b6b76767e4..9096042f86 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Ingame/CommandBarLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Ingame/CommandBarLogic.cs @@ -12,7 +12,6 @@ using System; using System.Collections.Generic; using System.Linq; -using OpenRA.Graphics; using OpenRA.Mods.Common.Orders; using OpenRA.Mods.Common.Traits; using OpenRA.Orders; @@ -54,7 +53,7 @@ namespace OpenRA.Mods.Common.Widgets var attackMoveButton = widget.GetOrNull("ATTACK_MOVE"); if (attackMoveButton != null) { - BindButtonIcon(attackMoveButton); + WidgetUtils.BindButtonIcon(attackMoveButton); attackMoveButton.IsDisabled = () => { UpdateStateIfNecessary(); return attackMoveDisabled; }; attackMoveButton.IsHighlighted = () => world.OrderGenerator is AttackMoveOrderGenerator; @@ -77,7 +76,7 @@ namespace OpenRA.Mods.Common.Widgets var forceMoveButton = widget.GetOrNull("FORCE_MOVE"); if (forceMoveButton != null) { - BindButtonIcon(forceMoveButton); + WidgetUtils.BindButtonIcon(forceMoveButton); forceMoveButton.IsDisabled = () => { UpdateStateIfNecessary(); return forceMoveDisabled; }; forceMoveButton.IsHighlighted = () => !forceMoveButton.IsDisabled() && IsForceModifiersActive(Modifiers.Alt); @@ -93,7 +92,7 @@ namespace OpenRA.Mods.Common.Widgets var forceAttackButton = widget.GetOrNull("FORCE_ATTACK"); if (forceAttackButton != null) { - BindButtonIcon(forceAttackButton); + WidgetUtils.BindButtonIcon(forceAttackButton); forceAttackButton.IsDisabled = () => { UpdateStateIfNecessary(); return forceAttackDisabled; }; forceAttackButton.IsHighlighted = () => !forceAttackButton.IsDisabled() && IsForceModifiersActive(Modifiers.Ctrl) @@ -111,7 +110,7 @@ namespace OpenRA.Mods.Common.Widgets var guardButton = widget.GetOrNull("GUARD"); if (guardButton != null) { - BindButtonIcon(guardButton); + WidgetUtils.BindButtonIcon(guardButton); guardButton.IsDisabled = () => { UpdateStateIfNecessary(); return guardDisabled; }; guardButton.IsHighlighted = () => world.OrderGenerator is GuardOrderGenerator; @@ -135,7 +134,7 @@ namespace OpenRA.Mods.Common.Widgets var scatterButton = widget.GetOrNull("SCATTER"); if (scatterButton != null) { - BindButtonIcon(scatterButton); + WidgetUtils.BindButtonIcon(scatterButton); scatterButton.IsDisabled = () => { UpdateStateIfNecessary(); return scatterDisabled; }; scatterButton.IsHighlighted = () => scatterHighlighted > 0; @@ -153,7 +152,7 @@ namespace OpenRA.Mods.Common.Widgets var deployButton = widget.GetOrNull("DEPLOY"); if (deployButton != null) { - BindButtonIcon(deployButton); + WidgetUtils.BindButtonIcon(deployButton); deployButton.IsDisabled = () => { @@ -179,7 +178,7 @@ namespace OpenRA.Mods.Common.Widgets var stopButton = widget.GetOrNull("STOP"); if (stopButton != null) { - BindButtonIcon(stopButton); + WidgetUtils.BindButtonIcon(stopButton); stopButton.IsDisabled = () => { UpdateStateIfNecessary(); return stopDisabled; }; stopButton.IsHighlighted = () => stopHighlighted > 0; @@ -197,7 +196,7 @@ namespace OpenRA.Mods.Common.Widgets var queueOrdersButton = widget.GetOrNull("QUEUE_ORDERS"); if (queueOrdersButton != null) { - BindButtonIcon(queueOrdersButton); + WidgetUtils.BindButtonIcon(queueOrdersButton); queueOrdersButton.IsDisabled = () => { UpdateStateIfNecessary(); return waypointModeDisabled; }; queueOrdersButton.IsHighlighted = () => !queueOrdersButton.IsDisabled() && IsForceModifiersActive(Modifiers.Shift); @@ -272,20 +271,6 @@ namespace OpenRA.Mods.Common.Widgets base.Tick(); } - void BindButtonIcon(ButtonWidget button) - { - var icon = button.Get("ICON"); - var hasDisabled = ChromeProvider.GetImage(icon.ImageCollection, icon.ImageName + "-disabled") != null; - var hasActive = ChromeProvider.GetImage(icon.ImageCollection, icon.ImageName + "-active") != null; - var hasActiveHover = ChromeProvider.GetImage(icon.ImageCollection, icon.ImageName + "-active-hover") != null; - var hasHover = ChromeProvider.GetImage(icon.ImageCollection, icon.ImageName + "-hover") != null; - - icon.GetImageName = () => hasActive && button.IsHighlighted() ? - (hasActiveHover && Ui.MouseOverWidget == button ? icon.ImageName + "-active-hover" : icon.ImageName + "-active") : - hasDisabled && button.IsDisabled() ? icon.ImageName + "-disabled" : - hasHover && Ui.MouseOverWidget == button ? icon.ImageName + "-hover" : icon.ImageName; - } - bool IsForceModifiersActive(Modifiers modifiers) { var fmog = world.OrderGenerator as ForceModifiersOrderGenerator; diff --git a/OpenRA.Mods.Common/Widgets/Logic/Ingame/StanceSelectorLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Ingame/StanceSelectorLogic.cs index 98ef769478..9c93209ab4 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Ingame/StanceSelectorLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Ingame/StanceSelectorLogic.cs @@ -10,7 +10,6 @@ #endregion using System.Linq; -using OpenRA.Graphics; using OpenRA.Mods.Common.Traits; using OpenRA.Widgets; @@ -47,16 +46,7 @@ namespace OpenRA.Mods.Common.Widgets void BindStanceButton(ButtonWidget button, UnitStance stance) { - var icon = button.Get("ICON"); - var hasDisabled = ChromeProvider.GetImage(icon.ImageCollection, icon.ImageName + "-disabled") != null; - var hasActive = ChromeProvider.GetImage(icon.ImageCollection, icon.ImageName + "-active") != null; - var hasActiveHover = ChromeProvider.GetImage(icon.ImageCollection, icon.ImageName + "-active-hover") != null; - var hasHover = ChromeProvider.GetImage(icon.ImageCollection, icon.ImageName + "-hover") != null; - - icon.GetImageName = () => hasActive && button.IsHighlighted() ? - (hasActiveHover && Ui.MouseOverWidget == button ? icon.ImageName + "-active-hover" : icon.ImageName + "-active") : - hasDisabled && button.IsDisabled() ? icon.ImageName + "-disabled" : - hasHover && Ui.MouseOverWidget == button ? icon.ImageName + "-hover" : icon.ImageName; + WidgetUtils.BindButtonIcon(button); button.IsDisabled = () => { UpdateStateIfNecessary(); return !actorStances.Any(); }; button.IsHighlighted = () => actorStances.Any( diff --git a/OpenRA.Mods.Common/Widgets/WidgetUtils.cs b/OpenRA.Mods.Common/Widgets/WidgetUtils.cs index ec89f1baf7..05b845645b 100644 --- a/OpenRA.Mods.Common/Widgets/WidgetUtils.cs +++ b/OpenRA.Mods.Common/Widgets/WidgetUtils.cs @@ -14,6 +14,7 @@ using System.Linq; using OpenRA.Graphics; using OpenRA.Network; using OpenRA.Primitives; +using OpenRA.Widgets; namespace OpenRA.Mods.Common.Widgets { @@ -283,6 +284,55 @@ namespace OpenRA.Mods.Common.Widgets button.GetTooltipText = null; } + public static void BindButtonIcon(ButtonWidget button) + { + var icon = button.Get("ICON"); + + var hasActiveImage = ChromeProvider.GetImage(icon.ImageCollection, icon.ImageName + "-active") != null; + var hasActiveDisabledImage = ChromeProvider.GetImage(icon.ImageCollection, icon.ImageName + "-active-disabled") != null; + var hasActivePressedImage = ChromeProvider.GetImage(icon.ImageCollection, icon.ImageName + "-active-pressed") != null; + var hasActiveHoverImage = ChromeProvider.GetImage(icon.ImageCollection, icon.ImageName + "-active-hover") != null; + + var hasImage = ChromeProvider.GetImage(icon.ImageCollection, icon.ImageName) != null; + var hasDisabledImage = ChromeProvider.GetImage(icon.ImageCollection, icon.ImageName + "-disabled") != null; + var hasPressedImage = ChromeProvider.GetImage(icon.ImageCollection, icon.ImageName + "-pressed") != null; + var hasHoverImage = ChromeProvider.GetImage(icon.ImageCollection, icon.ImageName + "-hover") != null; + + icon.GetImageName = () => + { + var isActive = button.IsHighlighted(); + var isDisabled = button.IsDisabled(); + var isPressed = button.Depressed; + var isHovered = Ui.MouseOverWidget == button; + + var baseName = button.IsHighlighted() ? icon.ImageName + "-active" : icon.ImageName; + var stateName = WidgetUtils.GetStatefulImageName(baseName, isDisabled, isPressed, isHovered); + + if (isActive) + { + if (isDisabled) + return hasActiveDisabledImage ? stateName : hasActiveImage ? baseName : icon.ImageName; + else if (isPressed) + return hasActivePressedImage ? stateName : hasActiveImage ? baseName : icon.ImageName; + else if (isHovered) + return hasActiveHoverImage ? stateName : hasActiveImage ? baseName : icon.ImageName; + else + return hasActiveImage ? baseName : icon.ImageName; + } + else + { + if (isDisabled) + return hasDisabledImage ? stateName : baseName; + else if (isPressed) + return hasPressedImage ? stateName : baseName; + else if (isHovered) + return hasHoverImage ? stateName : baseName; + else + return baseName; + } + }; + } + public static void BindPlayerNameAndStatus(LabelWidget label, Player p) { var client = p.World.LobbyInfo.ClientWithIndex(p.ClientIndex);