| Checkboxes/toggles render as grey squares | Referenced an engine style name that doesn't exist in THIS engine (FAppStyle::Get(), "ToggleButton" — absent in UnrealEngine-Angelscript 5.7.4). Slate falls back to a default-constructed style, silently — no warning, no ensure. | Never trust an engine style name from memory/tutorials — verify it exists in this engine's style set, or register your own (that's why CkDebugger.ToggleChip exists in Source/CkEcsDebugger/Public/CkEcsDebugger/Styles/CkDebuggerStyle.cpp). |
| Chips / SVG icons stretch to the column width | SVerticalBox/SHorizontalBox slots default to HAlign_Fill/VAlign_Fill; an AutoWidth column is sized by its WIDEST child (e.g. a group label), so every narrower sibling — and the SVG inside it — stretches to match. | Set HAlign_Left (or the intent) explicitly on slots inside auto-sized columns. Exemplar + in-code note: CkDebuggerPanel_EntityList.cpp Build_FeatureRail chip slots. |
| Panel/cards flicker on every refresh | ClearChildren() + recreate per refresh tick — Slate loses widget state, hover, and paint continuity. Bonus trap: rebuilding from a sort with unstable ordering (TArray::Sort on equal keys) reorders visually every tick even with a cache. | Stable-identity contract: key→widget cache, mutate the existing widgets in place (SetText, attribute lambdas), re-slot ONLY when the key set or order actually changes, and make sort tie-breaks deterministic. Exemplar: Archetypes page card cache (Pages/CkDebuggerPage_Archetypes.cpp). |
| Rows/values lag or never update | Static FText captured at construction. | Bind attributes (.Text_Lambda) reading live state; the row is built once, the lambdas track. Inspector rows: FCkInspectorWidgetBuilder already does this — call RequestRebuild() only on STRUCTURAL change. |
| Debug draws (gizmos, boxes, strings) blink | One-frame DrawDebug* (Duration 0) re-issued from a refresh-GATED Slate tick — when FCkDebuggerRefreshGate caps below frame rate, the draw is absent on uncapped frames. | Persistent selection visuals = retained PMG entities moved per tick (Source/CkDebuggerCommon/Public/CkDebuggerCommon/Markers/CkDebug_PmgGizmoSet.{h,cpp}). Transient hover affordances = immediate-mode draw from an ungated tick (picker hover box). Never one-frame draws from a gated path. |
| PMG shape outlines vanish / stay behind when the shape moves | Assumed outlines re-draw per tick. They don't — InDrawLines=true outlines are baked as a second procmesh section (FProcessor_Pmg_DebugShape_BakeLines, alpha forced 1), which is exactly why they're flicker-free AND move with the shape. | Use InDrawLines=true freely on moving debug solids. Do NOT use PMG Create_Pivot for live gizmos — Composite children bake world transforms at setup; moving the parent moves nothing. |
| SVG icons render but can't be tinted / tint looks wrong | Colored source SVGs fight ColorAndOpacity. | Author glyphs monochrome white; tint via SImage::ColorAndOpacity. Icons auto-register from Resources/Icons/** as CkDebugger.Icon.<BaseName> (CkDebuggerStyle.cpp CreateIconBrushes); resolve via FCkDebuggerStyle::Get_IconBrush(FName) — unknown id = no-brush, check for nullptr. |