diff --git a/OpenRA.Mods.Common/Widgets/ScrollItemWidget.cs b/OpenRA.Mods.Common/Widgets/ScrollItemWidget.cs index f168562baf..1dc23fc93b 100644 --- a/OpenRA.Mods.Common/Widgets/ScrollItemWidget.cs +++ b/OpenRA.Mods.Common/Widgets/ScrollItemWidget.cs @@ -10,6 +10,7 @@ #endregion using System; +using OpenRA.Graphics; using OpenRA.Widgets; namespace OpenRA.Mods.Common.Widgets @@ -20,12 +21,15 @@ namespace OpenRA.Mods.Common.Widgets public readonly bool EnableChildMouseOver = false; public string ItemKey; + readonly CachedTransform<(bool, bool, bool, bool, bool), Sprite[]> getPanelCache; + [ObjectCreator.UseCtor] public ScrollItemWidget(ModData modData) : base(modData) { IsVisible = () => false; VisualHeight = 0; + getPanelCache = WidgetUtils.GetCachedStatefulPanelImages(BaseName); } protected ScrollItemWidget(ScrollItemWidget other) @@ -36,6 +40,7 @@ namespace OpenRA.Mods.Common.Widgets Key = other.Key; BaseName = other.BaseName; EnableChildMouseOver = other.EnableChildMouseOver; + getPanelCache = WidgetUtils.GetCachedStatefulPanelImages(BaseName); } public override void Initialize(WidgetArgs args) @@ -51,17 +56,18 @@ namespace OpenRA.Mods.Common.Widgets public override void Draw() { + if (string.IsNullOrEmpty(BaseName)) + return; + // PERF: Only check for ourself or our direct children - var isHover = Ui.MouseOverWidget == this; - if (!IgnoreChildMouseOver && !isHover) - isHover = Children.Contains(Ui.MouseOverWidget); + var hover = Ui.MouseOverWidget == this; + if (!IgnoreChildMouseOver && !hover) + hover = Children.Contains(Ui.MouseOverWidget); - var state = IsSelected() ? BaseName + "-selected" : - isHover ? BaseName + "-hover" : - null; + var panel = getPanelCache.Update((IsDisabled(), Depressed, hover, false, IsSelected() || IsHighlighted())); - if (state != null) - WidgetUtils.DrawPanel(state, RenderBounds); + if (panel != null) + WidgetUtils.DrawPanel(RenderBounds, panel); } public override Widget Clone() { return new ScrollItemWidget(this); } diff --git a/OpenRA.Mods.Common/Widgets/WidgetUtils.cs b/OpenRA.Mods.Common/Widgets/WidgetUtils.cs index aaa244b9b1..f4f8f7591a 100644 --- a/OpenRA.Mods.Common/Widgets/WidgetUtils.cs +++ b/OpenRA.Mods.Common/Widgets/WidgetUtils.cs @@ -41,6 +41,18 @@ namespace OpenRA.Mods.Common.Widgets }); } + // TODO: refactor buttons and related UI to use this function + public static CachedTransform<(bool Disabled, bool Pressed, bool Hover, bool Focused, bool Highlighted), Sprite[]> GetCachedStatefulPanelImages(string collection) + { + return new CachedTransform<(bool, bool, bool, bool, bool), Sprite[]>( + ((bool Disabled, bool Pressed, bool Hover, bool Focused, bool Highlighted) args) => + { + var collectionName = collection + (args.Highlighted ? "-highlighted" : ""); + var variantCollectionName = GetStatefulImageName(collectionName, args.Disabled, args.Pressed, args.Hover, args.Focused); + return ChromeProvider.GetPanelImages(variantCollectionName) ?? ChromeProvider.GetPanelImages(collectionName); + }); + } + public static void DrawSprite(Sprite s, float2 pos) { Game.Renderer.RgbaSpriteRenderer.DrawSprite(s, pos); diff --git a/mods/cnc/chrome.yaml b/mods/cnc/chrome.yaml index 69b9a829fe..c4b53c14f6 100644 --- a/mods/cnc/chrome.yaml +++ b/mods/cnc/chrome.yaml @@ -205,16 +205,23 @@ scrollpanel-button-gdi-disabled: scrollpanel-button-gdi-pressed: Inherits: button-gdi-pressed +scrollitem: + scrollitem-hover: Inherits: button -scrollitem-selected: +scrollitem-highlighted: Inherits: button-pressed scrollitem-nohover: -scrollitem-nohover-hover: +scrollitem-nohover-highlighted: +scrollheader: + Inherits: button + +scrollheader-highlighted: + Inherits: button # # Slider diff --git a/mods/cnc/chrome/missionbrowser.yaml b/mods/cnc/chrome/missionbrowser.yaml index 595c6e2aef..303d81fbd1 100644 --- a/mods/cnc/chrome/missionbrowser.yaml +++ b/mods/cnc/chrome/missionbrowser.yaml @@ -24,6 +24,7 @@ Container@MISSIONBROWSER_PANEL: Height: PARENT_BOTTOM - 30 Children: ScrollItem@HEADER: + BaseName: scrollheader Width: PARENT_RIGHT - 27 Height: 13 X: 2 diff --git a/mods/d2k/chrome.yaml b/mods/d2k/chrome.yaml index 834c7b5a2c..3253f3102d 100644 --- a/mods/d2k/chrome.yaml +++ b/mods/d2k/chrome.yaml @@ -446,18 +446,23 @@ checkbox-toggle-highlighted-hover: checkbox-toggle-highlighted-pressed: Inherits: checkbox-highlighted-pressed -scrollitem-selected: - Inherits: button-pressed +scrollitem: scrollitem-hover: Inherits: button -scrollheader-selected: - Inherits: button +scrollitem-highlighted: + Inherits: button-pressed scrollitem-nohover: -scrollitem-nohover-hover: +scrollitem-nohover-highlighted: + +scrollheader: + Inherits: button + +scrollheader-highlighted: + Inherits: button scrollpanel-decorations: Inherits: ^Glyphs diff --git a/mods/ra/chrome.yaml b/mods/ra/chrome.yaml index 17e9b15767..9c6f1a276a 100644 --- a/mods/ra/chrome.yaml +++ b/mods/ra/chrome.yaml @@ -575,18 +575,23 @@ checkbox-toggle-highlighted-hover: checkbox-toggle-highlighted-pressed: Inherits: checkbox-highlighted-pressed -scrollitem-selected: - Inherits: button-pressed +scrollitem: scrollitem-hover: Inherits: button -scrollheader-selected: - Inherits: button +scrollitem-highlighted: + Inherits: button-pressed scrollitem-nohover: -scrollitem-nohover-hover: +scrollitem-nohover-highlighted: + +scrollheader: + Inherits: button + +scrollheader-highlighted: + Inherits: button logos: Inherits: ^LoadScreen diff --git a/mods/ts/chrome.yaml b/mods/ts/chrome.yaml index 147be67589..aac426671f 100644 --- a/mods/ts/chrome.yaml +++ b/mods/ts/chrome.yaml @@ -708,17 +708,22 @@ checkbox-toggle-highlighted-hover: checkbox-toggle-highlighted-pressed: Inherits: checkbox-highlighted-pressed -scrollitem-selected: - Inherits: button-pressed +scrollitem: scrollitem-hover: Inherits: button +scrollitem-highlighted: + Inherits: button-pressed + scrollitem-nohover: -scrollitem-nohover-hover: +scrollitem-nohover-highlighted: -scrollheader-selected: +scrollheader: + Inherits: button + +scrollheader-highlighted: Inherits: button mainmenu-border: