← board

feature: Eliah component palette — registry-driven (visual + non-visual tray)

Goal

Drive the designer palette from a component registry, not a hardcoded list. A component is any registered TComponent with published RTTI — visual widgets and non-visual libraries wrapped as components are the same thing.

Why

"Components are either GUI elements or libraries wrapped as components." Wrapping a library (JSON client, data source, timer) as a published TComponent + RegisterClass should make it appear in the palette with zero IDE special-casing. The Create(AOwner) virtual-ctor model (just landed) is the foundation.

Scope

Dependency note

Instantiating a dropped component via its real virtual ctor wants urgent/bug-metaclass-new-getclass-vmt fixed (metaclass Create(AOwner) with a canonical VMT). Until then, the designer can keep its current doc-model instantiation for visual widgets; the registry-driven palette + non-visual tray can land independently of that.

Acceptance

The palette is populated from the registry (adding a RegisterClass'd component makes it appear, no IDE edit); dropping a visual component places it on the form; dropping a non-visual one adds a tray icon; the inspector edits both via RTTI. gui_suite + garin green; screenshot of palette + a non-visual tray item.

Log

Progress 2026-06-24 — registry surface + registry-driven palette DONE

Remaining (keeps this ticket open)

Progress 2026-06-24 (cont.) — non-visual tray DONE

Non-visual components now drop into a Delphi-style icon tray along the form bottom (commit c706b1c):

Remaining (keeps this ticket open)

Progress 2026-06-24 (cont. 2) — grouping, inspector, property bag

Acceptance MET

Palette is registry-populated; visual drops to canvas, non-visual to the tray; inspector edits both (modelled fields + bag props). Screenshot shows the tray.

Remaining polish (low priority — could split to a follow-up)

DONE 2026-06-24 (commit 65a8276)

RTTI-driven inspector landed: the extra-property section walks the registered class's published props via GetPropList (GetClass('T'+KindName)), so every published data property shows (Interval, Enabled, …) with its bag value, editable

M4 complete. Palette is registry-driven (visual + non-visual, grouped); visual drops to canvas, non-visual to a bottom tray; the inspector edits both via modelled rows + RTTI-listed published props.

Deferred (not needed for M4; open a fresh ticket if ever wanted): generic non-visual class storage — the tray is proven with TTimer/TMenu (fixed docmodel kinds); supporting arbitrary registered non-visual components would want class-name node storage instead of an enum kind. Speculative; no current demand.