-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathMainMenuButton.cs
More file actions
96 lines (76 loc) · 3.76 KB
/
MainMenuButton.cs
File metadata and controls
96 lines (76 loc) · 3.76 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
using System.Numerics;
using System.Runtime.CompilerServices;
using Walgelijk;
using Walgelijk.Onion.Controls;
using Walgelijk.Onion;
using Walgelijk.SimpleDrawing;
namespace MadnessMicroactive;
public readonly struct MainMenuButton : IControl
{
private readonly IReadableTexture img;
private static readonly OptionalControlState<(bool, bool)> optionalControlState = new((false,false));
public MainMenuButton(IReadableTexture img)
{
this.img = img;
}
public static bool Hold(string label, IReadableTexture img, int identity = 0, [CallerLineNumber] int site = 0)
=> Start(label, img, identity, site).Held;
public static bool Click(string label, IReadableTexture img, int identity = 0, [CallerLineNumber] int site = 0)
=> Start(label, img, identity, site).Up;
public static InteractionReport Start(string label, IReadableTexture img, int identity = 0, [CallerLineNumber] int site = 0)
{
var (instance, node) = Onion.Tree.Start(IdGen.Create(nameof(MainMenuButton).GetHashCode(), identity, site), new MainMenuButton(img));
instance.RenderFocusBox = false;
instance.Name = label;
Onion.Tree.End();
return new InteractionReport(instance, node, InteractionReport.CastingBehaviour.Up);
}
public void OnAdd(in ControlParams p) { }
public void OnRemove(in ControlParams p) { }
public void OnStart(in ControlParams p) { }
public void OnProcess(in ControlParams p)
{
ControlUtils.ProcessButtonLike(p);
var n = optionalControlState.GetValue(p.Identity);
if (!n.Item1 && p.Instance.IsActive)
Game.Main.AudioRenderer.PlayOnce(SoundCache.Instance.LoadUISoundEffect(Resources.Load<FixedAudioData>("ui_confirm.wav")));
else if (!n.Item2 && p.Instance.IsHover)
Game.Main.AudioRenderer.PlayOnce(SoundCache.Instance.LoadUISoundEffect(Resources.Load<FixedAudioData>("ui_hover.wav")), 0.5f);
optionalControlState.SetValue(p.Identity, (p.Instance.IsActive, p.Instance.IsHover));
}
public void OnRender(in ControlParams p)
{
(ControlTree tree, Walgelijk.Onion.Layout.LayoutQueue layout, Input input, GameState state, Node node, ControlInstance instance) = p;
var t = node.GetAnimationTime();
var anim = instance.Animations;
var renderedRect = instance.Rects.Rendered;
var fg = p.Theme.Foreground[instance.State];
Draw.Colour = fg.Color;
Draw.Texture = fg.Texture;
Draw.OutlineColour = p.Theme.OutlineColour[instance.State];
Draw.OutlineWidth = p.Theme.OutlineWidth[instance.State];
anim.AnimateRect(ref instance.Rects.Rendered, t);
anim.AnimateColour(ref Draw.Colour, t);
Draw.Quad(instance.Rects.Rendered, 0, p.Theme.Rounding);
Draw.ResetTexture();
Draw.Colour = Colors.White;
anim.AnimateColour(ref Draw.Colour, t);
var imgRect = new Rect(renderedRect.MinX, renderedRect.MinY, renderedRect.MinX + renderedRect.Height, renderedRect.MinY + renderedRect.Height);
imgRect = imgRect.Expand(-instance.Theme.Padding);
Draw.Image(img, imgRect, ImageContainmentMode.Stretch);
Draw.Font = p.Theme.Font;
Draw.Colour = p.Theme.Text[instance.State];
anim.AnimateColour(ref Draw.Colour, t);
if (anim.ShouldRenderText(t))
{
var ratio = renderedRect.Area / instance.Rects.ComputedGlobal.Area;
Draw.Text(instance.Name,
new Vector2(renderedRect.MinX + renderedRect.Height + instance.Theme.Padding, (renderedRect.MaxY + renderedRect.MinY) / 2),
new Vector2(ratio),
HorizontalTextAlign.Left, VerticalTextAlign.Middle, renderedRect.Width);
}
}
public void OnEnd(in ControlParams p)
{
}
}