feat(D.2b): UiMeter vital bar + fill-geometry tests
Adds UiMeter, the horizontal vital-bar widget for the D.2b retail-look UI toolkit. Solid-color fill for Spec 1; the retail orb sprite + scissor crop path is reserved for a later sub-phase. Five unit tests (1 Fact + 4 Theory) cover half-fill geometry and clamping at -1/0/1/2 fractions. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
0bf790c8bf
commit
064ef41ce4
2 changed files with 65 additions and 0 deletions
40
src/AcDream.App/UI/UiMeter.cs
Normal file
40
src/AcDream.App/UI/UiMeter.cs
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
using System.Numerics;
|
||||
|
||||
namespace AcDream.App.UI;
|
||||
|
||||
/// <summary>
|
||||
/// A horizontal vital bar: an empty background rect with a partial-width
|
||||
/// fill. <see cref="Fill"/> returns 0..1 (or null = no data → empty bar).
|
||||
/// Solid-color for Spec 1; the retail orb sprite + scissor crop is a later
|
||||
/// sub-phase.
|
||||
/// </summary>
|
||||
public sealed class UiMeter : UiElement
|
||||
{
|
||||
/// <summary>Fill fraction provider; a null result draws an empty bar.</summary>
|
||||
public Func<float?> Fill { get; set; } = () => 0f;
|
||||
public Vector4 BarColor { get; set; } = new(1f, 0f, 0f, 1f);
|
||||
public Vector4 BgColor { get; set; } = new(0f, 0f, 0f, 0.5f);
|
||||
|
||||
public UiMeter() { ClickThrough = true; }
|
||||
|
||||
/// <summary>Clamp <paramref name="pct"/> to [0,1] and return the fill rect
|
||||
/// (local px) for a bar of <paramref name="w"/> x <paramref name="h"/>.</summary>
|
||||
public static (float x, float y, float w, float h) ComputeFillRect(
|
||||
float pct, float w, float h)
|
||||
{
|
||||
if (pct < 0f) pct = 0f;
|
||||
if (pct > 1f) pct = 1f;
|
||||
return (0f, 0f, w * pct, h);
|
||||
}
|
||||
|
||||
protected override void OnDraw(UiRenderContext ctx)
|
||||
{
|
||||
ctx.DrawRect(0, 0, Width, Height, BgColor);
|
||||
float? pct = Fill();
|
||||
if (pct is float p)
|
||||
{
|
||||
var (fx, fy, fw, fh) = ComputeFillRect(p, Width, Height);
|
||||
if (fw > 0f) ctx.DrawRect(fx, fy, fw, fh, BarColor);
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue