Files
TheriapolisV3/Theriapolis.Game/CodexUI/Core/CodexWidget.cs
T
Christopher Wiebe b451f83174 Initial commit: Theriapolis baseline at port/godot branch point
Captures the pre-Godot-port state of the codebase. This is the rollback
anchor for the Godot port (M0 of theriapolis-rpg-implementation-plan-godot-port.md).
All Phase 0 through Phase 6.5 work is included; Phase 7 is in flight.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-30 20:40:51 -07:00

48 lines
1.7 KiB
C#

using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
namespace Theriapolis.Game.CodexUI.Core;
/// <summary>
/// Base class for every CodexUI widget. Layout is two-pass:
/// 1. <see cref="Measure"/> — child reports a desired size given an
/// available size envelope.
/// 2. <see cref="Arrange"/> — parent places the child by writing into
/// <see cref="Bounds"/>; the child propagates to its own children.
///
/// Update + Draw run after layout. Hit-testing uses screen-space
/// <see cref="Bounds"/> directly via <see cref="ContainsPoint"/>.
/// </summary>
public abstract class CodexWidget
{
public Rectangle Bounds { get; protected set; }
public bool Visible { get; set; } = true;
public bool Enabled { get; set; } = true;
public CodexWidget? Parent { get; internal set; }
public Point DesiredSize { get; protected set; }
/// <summary>Child reports its preferred size; parent decides whether to honour it.</summary>
public Point Measure(Point available)
{
DesiredSize = MeasureCore(available);
return DesiredSize;
}
/// <summary>Parent commits a final rectangle; child propagates to grandchildren.</summary>
public void Arrange(Rectangle bounds)
{
Bounds = bounds;
ArrangeCore(bounds);
}
protected abstract Point MeasureCore(Point available);
protected abstract void ArrangeCore(Rectangle bounds);
public virtual void Update(GameTime gt, CodexInput input) { }
public virtual void Draw(SpriteBatch sb, GameTime gt) { }
/// <summary>True if a screen-space point lies inside our bounds. Hover-/click-test helper.</summary>
public bool ContainsPoint(Point p) => Bounds.Contains(p);
}