Use cached transforms for images in widgets

This commit is contained in:
Ivaylo Draganov
2020-11-21 21:33:57 +02:00
committed by Paul Chote
parent c8ab409d38
commit ad4425d11e
4 changed files with 35 additions and 15 deletions

View File

@@ -29,18 +29,26 @@ namespace OpenRA.Mods.Common.Widgets
Widget panel; Widget panel;
MaskWidget fullscreenMask; MaskWidget fullscreenMask;
Widget panelRoot; 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 PanelRoot;
public string SelectedItem; public string SelectedItem;
[ObjectCreator.UseCtor] [ObjectCreator.UseCtor]
public DropDownButtonWidget(ModData modData) public DropDownButtonWidget(ModData modData)
: base(modData) { } : base(modData)
{
getMarkerImage = WidgetUtils.GetCachedStatefulImage(Decorations, DecorationMarker);
getSeparatorImage = WidgetUtils.GetCachedStatefulImage(Separators, SeparatorImage);
}
protected DropDownButtonWidget(DropDownButtonWidget widget) protected DropDownButtonWidget(DropDownButtonWidget widget)
: base(widget) : base(widget)
{ {
PanelRoot = widget.PanelRoot; PanelRoot = widget.PanelRoot;
getMarkerImage = WidgetUtils.GetCachedStatefulImage(Decorations, DecorationMarker);
getSeparatorImage = WidgetUtils.GetCachedStatefulImage(Separators, SeparatorImage);
} }
public override void Draw() public override void Draw()
@@ -52,14 +60,10 @@ namespace OpenRA.Mods.Common.Widgets
var isDisabled = IsDisabled(); var isDisabled = IsDisabled();
var isHover = Ui.MouseOverWidget == this || Children.Any(c => c == Ui.MouseOverWidget); var isHover = Ui.MouseOverWidget == this || Children.Any(c => c == Ui.MouseOverWidget);
var markerImageName = WidgetUtils.GetStatefulImageName(DecorationMarker, isDisabled, Depressed, isHover); var arrowImage = getMarkerImage.Update((isDisabled, Depressed, isHover, false));
var arrowImage = ChromeProvider.GetImage(Decorations, markerImageName) ?? ChromeProvider.GetImage(Decorations, DecorationMarker);
WidgetUtils.DrawRGBA(arrowImage, stateOffset + new float2(rb.Right - (int)((rb.Height + arrowImage.Size.X) / 2), rb.Top + (int)((rb.Height - arrowImage.Size.Y) / 2))); 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 = getSeparatorImage.Update((isDisabled, Depressed, isHover, false));
var separatorImage = ChromeProvider.GetImage(Separators, separatorImageName) ?? ChromeProvider.GetImage(Separators, SeparatorImage);
if (separatorImage != null) 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))); WidgetUtils.DrawRGBA(separatorImage, stateOffset + new float2(-3, 0) + new float2(rb.Right - rb.Height + 4, rb.Top + (int)((rb.Height - separatorImage.Size.Y) / 2)));
} }

View File

@@ -86,6 +86,8 @@ namespace OpenRA.Mods.Common.Widgets
public readonly string Decorations = "scrollpanel-decorations"; public readonly string Decorations = "scrollpanel-decorations";
public readonly string DecorationScrollLeft = "left"; public readonly string DecorationScrollLeft = "left";
public readonly string DecorationScrollRight = "right"; 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; int contentWidth = 0;
float listOffset = 0; float listOffset = 0;
@@ -109,6 +111,9 @@ namespace OpenRA.Mods.Common.Widgets
IsVisible = () => queueGroup != null && Groups[queueGroup].Tabs.Count > 0; IsVisible = () => queueGroup != null && Groups[queueGroup].Tabs.Count > 0;
paletteWidget = Exts.Lazy(() => Ui.Root.Get<ProductionPaletteWidget>(PaletteWidget)); paletteWidget = Exts.Lazy(() => Ui.Root.Get<ProductionPaletteWidget>(PaletteWidget));
getLeftArrowImage = WidgetUtils.GetCachedStatefulImage(Decorations, DecorationScrollLeft);
getRightArrowImage = WidgetUtils.GetCachedStatefulImage(Decorations, DecorationScrollRight);
} }
public override void Initialize(WidgetArgs args) 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, leftButtonRect, leftDisabled, leftPressed, leftHover, false);
ButtonWidget.DrawBackground(Button, rightButtonRect, rightDisabled, rightPressed, rightHover, false); ButtonWidget.DrawBackground(Button, rightButtonRect, rightDisabled, rightPressed, rightHover, false);
var leftArrowImageName = WidgetUtils.GetStatefulImageName(DecorationScrollLeft, leftDisabled, leftPressed, leftHover); var leftArrowImage = getLeftArrowImage.Update((leftDisabled, leftPressed, leftHover, false));
var leftArrowImage = ChromeProvider.GetImage(Decorations, leftArrowImageName) ?? ChromeProvider.GetImage(Decorations, DecorationScrollLeft);
WidgetUtils.DrawRGBA(leftArrowImage, WidgetUtils.DrawRGBA(leftArrowImage,
new float2(leftButtonRect.Left + 2, leftButtonRect.Top + 2)); new float2(leftButtonRect.Left + 2, leftButtonRect.Top + 2));
var rightArrowImageName = WidgetUtils.GetStatefulImageName(DecorationScrollRight, rightDisabled, rightPressed, rightHover); var rightArrowImage = getRightArrowImage.Update((rightDisabled, rightPressed, rightHover, false));
var rightArrowImage = ChromeProvider.GetImage(Decorations, rightArrowImageName) ?? ChromeProvider.GetImage(Decorations, DecorationScrollRight);
WidgetUtils.DrawRGBA(rightArrowImage, WidgetUtils.DrawRGBA(rightArrowImage,
new float2(rightButtonRect.Left + 2, rightButtonRect.Top + 2)); new float2(rightButtonRect.Left + 2, rightButtonRect.Top + 2));

View File

@@ -51,6 +51,8 @@ namespace OpenRA.Mods.Common.Widgets
public readonly string Decorations = "scrollpanel-decorations"; public readonly string Decorations = "scrollpanel-decorations";
public readonly string DecorationScrollUp = "up"; public readonly string DecorationScrollUp = "up";
public readonly string DecorationScrollDown = "down"; 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 int ContentHeight;
public ILayout Layout; public ILayout Layout;
public int MinimumThumbSize = 10; public int MinimumThumbSize = 10;
@@ -110,6 +112,9 @@ namespace OpenRA.Mods.Common.Widgets
modRules = modData.DefaultRules; modRules = modData.DefaultRules;
Layout = new ListLayout(this); Layout = new ListLayout(this);
getUpArrowImage = WidgetUtils.GetCachedStatefulImage(Decorations, DecorationScrollUp);
getDownArrowImage = WidgetUtils.GetCachedStatefulImage(Decorations, DecorationScrollDown);
} }
public override void RemoveChildren() public override void RemoveChildren()
@@ -204,13 +209,11 @@ namespace OpenRA.Mods.Common.Widgets
var upOffset = !upPressed || upDisabled ? 4 : 4 + ButtonDepth; var upOffset = !upPressed || upDisabled ? 4 : 4 + ButtonDepth;
var downOffset = !downPressed || downDisabled ? 4 : 4 + ButtonDepth; var downOffset = !downPressed || downDisabled ? 4 : 4 + ButtonDepth;
var upArrowImageName = WidgetUtils.GetStatefulImageName(DecorationScrollUp, upDisabled, upPressed, upHover); var upArrowImage = getUpArrowImage.Update((upDisabled, upPressed, upHover, false));
var upArrowImage = ChromeProvider.GetImage(Decorations, upArrowImageName) ?? ChromeProvider.GetImage(Decorations, DecorationScrollUp);
WidgetUtils.DrawRGBA(upArrowImage, WidgetUtils.DrawRGBA(upArrowImage,
new float2(upButtonRect.Left + upOffset, upButtonRect.Top + upOffset)); new float2(upButtonRect.Left + upOffset, upButtonRect.Top + upOffset));
var downArrowImageName = WidgetUtils.GetStatefulImageName(DecorationScrollDown, downDisabled, downPressed, downHover); var downArrowImage = getDownArrowImage.Update((downDisabled, downPressed, downHover, false));
var downArrowImage = ChromeProvider.GetImage(Decorations, downArrowImageName) ?? ChromeProvider.GetImage(Decorations, DecorationScrollDown);
WidgetUtils.DrawRGBA(downArrowImage, WidgetUtils.DrawRGBA(downArrowImage,
new float2(downButtonRect.Left + downOffset, downButtonRect.Top + downOffset)); new float2(downButtonRect.Left + downOffset, downButtonRect.Top + downOffset));
} }

View File

@@ -31,6 +31,16 @@ namespace OpenRA.Mods.Common.Widgets
return baseName + suffix; 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) public static void DrawRGBA(Sprite s, float2 pos)
{ {
Game.Renderer.RgbaSpriteRenderer.DrawSprite(s, pos); Game.Renderer.RgbaSpriteRenderer.DrawSprite(s, pos);