Replace string element render types with RenderCommandType enum, decompose UI elements (Button, CheckBox, chrome) into drawing primitives via ToPrimitives(), emit per-element commands on flush, and move composite into IRenderSource.

This commit is contained in:
Stone_Red
2026-06-16 01:11:01 +02:00
parent 1355fa06b8
commit e90e9ab163
16 changed files with 850 additions and 187 deletions
+70
View File
@@ -1,3 +1,5 @@
using RemSox.UI.GUI.Rendering;
using System.Drawing;
namespace RemSox.UI.GUI.UIEelements.Controls;
@@ -28,6 +30,74 @@ public class CheckBox() : Control("CheckBox")
set => SetProperty(nameof(TextColor), ref field, value);
} = Color.White;
public override IEnumerable<RenderCommand> ToPrimitives(int windowId)
{
int boxSize = Size.Height;
// Checkbox box background
yield return new RenderCommand
{
WindowId = windowId,
ElementId = PrimitiveId(0),
Type = RenderCommandType.DrawFilledRect,
Position = Position,
Properties = new Dictionary<string, object?>
{
["Color"] = BackgroundColor,
["Size"] = new Size(boxSize, boxSize),
}
};
// Checkbox box border
yield return new RenderCommand
{
WindowId = windowId,
ElementId = PrimitiveId(1),
Type = RenderCommandType.DrawRectBorder,
Position = Position,
Properties = new Dictionary<string, object?>
{
["Color"] = Color.DarkGray,
["Size"] = new Size(boxSize, boxSize),
}
};
// Check mark (filled inner rect)
if (IsChecked)
{
yield return new RenderCommand
{
WindowId = windowId,
ElementId = PrimitiveId(2),
Type = RenderCommandType.DrawFilledRect,
Position = new Point(Position.X + 3, Position.Y + 3),
Properties = new Dictionary<string, object?>
{
["Color"] = Color.Black,
["Size"] = new Size(boxSize - 6, boxSize - 6),
}
};
}
// Label text
if (!string.IsNullOrEmpty(Text))
{
yield return new RenderCommand
{
WindowId = windowId,
ElementId = PrimitiveId(3),
Type = RenderCommandType.DrawText,
Position = new Point(Position.X + boxSize + 5, Position.Y - 2),
Properties = new Dictionary<string, object?>
{
["Color"] = TextColor,
["Content"] = Text,
["FontSize"] = boxSize,
}
};
}
}
public override void HandleMouseEvent(MouseEvent mouseEvent)
{
if (mouseEvent.Type == MouseEventType.ButtonDown && mouseEvent.Button == MouseButton.Left)