From ad4425d11e1d14af4b8f926f04ebe58d139cbf8a Mon Sep 17 00:00:00 2001 From: Ivaylo Draganov Date: Sat, 21 Nov 2020 21:33:57 +0200 Subject: [PATCH] Use cached transforms for images in widgets --- .../Widgets/DropDownButtonWidget.cs | 18 +++++++++++------- .../Widgets/ProductionTabsWidget.cs | 11 +++++++---- .../Widgets/ScrollPanelWidget.cs | 11 +++++++---- OpenRA.Mods.Common/Widgets/WidgetUtils.cs | 10 ++++++++++ 4 files changed, 35 insertions(+), 15 deletions(-) diff --git a/OpenRA.Mods.Common/Widgets/DropDownButtonWidget.cs b/OpenRA.Mods.Common/Widgets/DropDownButtonWidget.cs index 02197d8ea5..1050420c19 100644 --- a/OpenRA.Mods.Common/Widgets/DropDownButtonWidget.cs +++ b/OpenRA.Mods.Common/Widgets/DropDownButtonWidget.cs @@ -29,18 +29,26 @@ namespace OpenRA.Mods.Common.Widgets Widget panel; MaskWidget fullscreenMask; Widget panelRoot; + readonly CachedTransform<(bool Disabled, bool Pressed, bool Hover, bool Focused), Sprite> getMarkerImage; + readonly CachedTransform<(bool Disabled, bool Pressed, bool Hover, bool Focused), Sprite> getSeparatorImage; public string PanelRoot; public string SelectedItem; [ObjectCreator.UseCtor] public DropDownButtonWidget(ModData modData) - : base(modData) { } + : base(modData) + { + getMarkerImage = WidgetUtils.GetCachedStatefulImage(Decorations, DecorationMarker); + getSeparatorImage = WidgetUtils.GetCachedStatefulImage(Separators, SeparatorImage); + } protected DropDownButtonWidget(DropDownButtonWidget widget) : base(widget) { PanelRoot = widget.PanelRoot; + getMarkerImage = WidgetUtils.GetCachedStatefulImage(Decorations, DecorationMarker); + getSeparatorImage = WidgetUtils.GetCachedStatefulImage(Separators, SeparatorImage); } public override void Draw() @@ -52,14 +60,10 @@ namespace OpenRA.Mods.Common.Widgets var isDisabled = IsDisabled(); var isHover = Ui.MouseOverWidget == this || Children.Any(c => c == Ui.MouseOverWidget); - var markerImageName = WidgetUtils.GetStatefulImageName(DecorationMarker, isDisabled, Depressed, isHover); - var arrowImage = ChromeProvider.GetImage(Decorations, markerImageName) ?? ChromeProvider.GetImage(Decorations, DecorationMarker); - + var arrowImage = getMarkerImage.Update((isDisabled, Depressed, isHover, false)); WidgetUtils.DrawRGBA(arrowImage, stateOffset + new float2(rb.Right - (int)((rb.Height + arrowImage.Size.X) / 2), rb.Top + (int)((rb.Height - arrowImage.Size.Y) / 2))); - var separatorImageName = WidgetUtils.GetStatefulImageName(SeparatorImage, isDisabled, Depressed, isHover); - var separatorImage = ChromeProvider.GetImage(Separators, separatorImageName) ?? ChromeProvider.GetImage(Separators, SeparatorImage); - + var separatorImage = getSeparatorImage.Update((isDisabled, Depressed, isHover, false)); if (separatorImage != null) WidgetUtils.DrawRGBA(separatorImage, stateOffset + new float2(-3, 0) + new float2(rb.Right - rb.Height + 4, rb.Top + (int)((rb.Height - separatorImage.Size.Y) / 2))); } diff --git a/OpenRA.Mods.Common/Widgets/ProductionTabsWidget.cs b/OpenRA.Mods.Common/Widgets/ProductionTabsWidget.cs index 1fcf85bca2..ef05e1765a 100644 --- a/OpenRA.Mods.Common/Widgets/ProductionTabsWidget.cs +++ b/OpenRA.Mods.Common/Widgets/ProductionTabsWidget.cs @@ -86,6 +86,8 @@ namespace OpenRA.Mods.Common.Widgets public readonly string Decorations = "scrollpanel-decorations"; public readonly string DecorationScrollLeft = "left"; public readonly string DecorationScrollRight = "right"; + readonly CachedTransform<(bool Disabled, bool Pressed, bool Hover, bool Focused), Sprite> getLeftArrowImage; + readonly CachedTransform<(bool Disabled, bool Pressed, bool Hover, bool Focused), Sprite> getRightArrowImage; int contentWidth = 0; float listOffset = 0; @@ -109,6 +111,9 @@ namespace OpenRA.Mods.Common.Widgets IsVisible = () => queueGroup != null && Groups[queueGroup].Tabs.Count > 0; paletteWidget = Exts.Lazy(() => Ui.Root.Get(PaletteWidget)); + + getLeftArrowImage = WidgetUtils.GetCachedStatefulImage(Decorations, DecorationScrollLeft); + getRightArrowImage = WidgetUtils.GetCachedStatefulImage(Decorations, DecorationScrollRight); } public override void Initialize(WidgetArgs args) @@ -188,13 +193,11 @@ namespace OpenRA.Mods.Common.Widgets ButtonWidget.DrawBackground(Button, leftButtonRect, leftDisabled, leftPressed, leftHover, false); ButtonWidget.DrawBackground(Button, rightButtonRect, rightDisabled, rightPressed, rightHover, false); - var leftArrowImageName = WidgetUtils.GetStatefulImageName(DecorationScrollLeft, leftDisabled, leftPressed, leftHover); - var leftArrowImage = ChromeProvider.GetImage(Decorations, leftArrowImageName) ?? ChromeProvider.GetImage(Decorations, DecorationScrollLeft); + var leftArrowImage = getLeftArrowImage.Update((leftDisabled, leftPressed, leftHover, false)); WidgetUtils.DrawRGBA(leftArrowImage, new float2(leftButtonRect.Left + 2, leftButtonRect.Top + 2)); - var rightArrowImageName = WidgetUtils.GetStatefulImageName(DecorationScrollRight, rightDisabled, rightPressed, rightHover); - var rightArrowImage = ChromeProvider.GetImage(Decorations, rightArrowImageName) ?? ChromeProvider.GetImage(Decorations, DecorationScrollRight); + var rightArrowImage = getRightArrowImage.Update((rightDisabled, rightPressed, rightHover, false)); WidgetUtils.DrawRGBA(rightArrowImage, new float2(rightButtonRect.Left + 2, rightButtonRect.Top + 2)); diff --git a/OpenRA.Mods.Common/Widgets/ScrollPanelWidget.cs b/OpenRA.Mods.Common/Widgets/ScrollPanelWidget.cs index 24116a31f1..8631830441 100644 --- a/OpenRA.Mods.Common/Widgets/ScrollPanelWidget.cs +++ b/OpenRA.Mods.Common/Widgets/ScrollPanelWidget.cs @@ -51,6 +51,8 @@ namespace OpenRA.Mods.Common.Widgets public readonly string Decorations = "scrollpanel-decorations"; public readonly string DecorationScrollUp = "up"; public readonly string DecorationScrollDown = "down"; + readonly CachedTransform<(bool Disabled, bool Pressed, bool Hover, bool Focused), Sprite> getUpArrowImage; + readonly CachedTransform<(bool Disabled, bool Pressed, bool Hover, bool Focused), Sprite> getDownArrowImage; public int ContentHeight; public ILayout Layout; public int MinimumThumbSize = 10; @@ -110,6 +112,9 @@ namespace OpenRA.Mods.Common.Widgets modRules = modData.DefaultRules; Layout = new ListLayout(this); + + getUpArrowImage = WidgetUtils.GetCachedStatefulImage(Decorations, DecorationScrollUp); + getDownArrowImage = WidgetUtils.GetCachedStatefulImage(Decorations, DecorationScrollDown); } public override void RemoveChildren() @@ -204,13 +209,11 @@ namespace OpenRA.Mods.Common.Widgets var upOffset = !upPressed || upDisabled ? 4 : 4 + ButtonDepth; var downOffset = !downPressed || downDisabled ? 4 : 4 + ButtonDepth; - var upArrowImageName = WidgetUtils.GetStatefulImageName(DecorationScrollUp, upDisabled, upPressed, upHover); - var upArrowImage = ChromeProvider.GetImage(Decorations, upArrowImageName) ?? ChromeProvider.GetImage(Decorations, DecorationScrollUp); + var upArrowImage = getUpArrowImage.Update((upDisabled, upPressed, upHover, false)); WidgetUtils.DrawRGBA(upArrowImage, new float2(upButtonRect.Left + upOffset, upButtonRect.Top + upOffset)); - var downArrowImageName = WidgetUtils.GetStatefulImageName(DecorationScrollDown, downDisabled, downPressed, downHover); - var downArrowImage = ChromeProvider.GetImage(Decorations, downArrowImageName) ?? ChromeProvider.GetImage(Decorations, DecorationScrollDown); + var downArrowImage = getDownArrowImage.Update((downDisabled, downPressed, downHover, false)); WidgetUtils.DrawRGBA(downArrowImage, new float2(downButtonRect.Left + downOffset, downButtonRect.Top + downOffset)); } diff --git a/OpenRA.Mods.Common/Widgets/WidgetUtils.cs b/OpenRA.Mods.Common/Widgets/WidgetUtils.cs index 463484ad25..762826db48 100644 --- a/OpenRA.Mods.Common/Widgets/WidgetUtils.cs +++ b/OpenRA.Mods.Common/Widgets/WidgetUtils.cs @@ -31,6 +31,16 @@ namespace OpenRA.Mods.Common.Widgets return baseName + suffix; } + public static CachedTransform<(bool Disabled, bool Pressed, bool Hover, bool Focused), Sprite> GetCachedStatefulImage(string collection, string baseName) + { + return new CachedTransform<(bool, bool, bool, bool), Sprite>( + ((bool Disabled, bool Pressed, bool Hover, bool Focused) args) => + { + var imageName = GetStatefulImageName(baseName, args.Disabled, args.Pressed, args.Hover, args.Focused); + return ChromeProvider.GetImage(collection, imageName) ?? ChromeProvider.GetImage(collection, baseName); + }); + } + public static void DrawRGBA(Sprite s, float2 pos) { Game.Renderer.RgbaSpriteRenderer.DrawSprite(s, pos);