From 14443e5c27e7a00392ff65174fce295a85b5d6d5 Mon Sep 17 00:00:00 2001 From: Erik Date: Sat, 20 Jun 2026 18:52:49 +0200 Subject: [PATCH] =?UTF-8?q?fix(ui):=20D.2b=20=E2=80=94=20collapsed=20toolb?= =?UTF-8?q?ar=20left=20black=20pillars=20+=20draggable=20below=20the=20bar?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two bugs from the visual gate, same dump-confirmed cause: row 2 is an 11-element band (left edge-piece 0x100006B6 + 9 slots 0x100006B7..BF + right edge-piece 0x100006C0, all at content-y 90), but SecondRow hid only the 9 slots — so the two edge-pieces kept drawing as black pillars below the collapsed bar. And toolbarRoot (ClickThrough=false, full height) still caught clicks below the collapsed frame → walked up to the Draggable frame → phantom window-move. Fix: SecondRow now hides the full band (B6..C0); toolbarRoot.ClickThrough=true so its children (slots/indicators) still get hits children-first but its empty/below regions fall through (no phantom drag) — same pattern as the chat content panel. The slots are edge-flag 0 = Left|Top fixed, so nothing reflows. Build green. Co-Authored-By: Claude Opus 4.8 (1M context) --- src/AcDream.App/Rendering/GameWindow.cs | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/AcDream.App/Rendering/GameWindow.cs b/src/AcDream.App/Rendering/GameWindow.cs index 1eaf9497..bba630e7 100644 --- a/src/AcDream.App/Rendering/GameWindow.cs +++ b/src/AcDream.App/Rendering/GameWindow.cs @@ -2062,8 +2062,13 @@ public sealed class GameWindow : IDisposable // not reflow. (Width is fixed so the horizontal anchors are inert but harmless.) toolbarRoot.Anchors = AcDream.App.UI.AnchorEdges.Left | AcDream.App.UI.AnchorEdges.Top | AcDream.App.UI.AnchorEdges.Right; - // The frame is the draggable window; the content itself is not. - toolbarRoot.ClickThrough = false; + // The frame is the draggable window; the content itself is not. ClickThrough so the + // content panel never CLAIMS a hit — its behavioral children (slots, indicators) are + // hit children-first, and its empty areas fall through to the frame (move). Critically, + // when collapsed the row-2 band is hidden, so below the collapsed frame the content has + // no visible/hit children and ClickThrough lets clicks fall through (no phantom + // window-drag from where row 2 used to be). Same pattern as the chat content panel. + toolbarRoot.ClickThrough = true; toolbarRoot.Draggable = false; toolbarRoot.Resizable = false; toolbarFrame.AddChild(toolbarRoot); @@ -2071,10 +2076,16 @@ public sealed class GameWindow : IDisposable // Collapse-to-one-row: the frame's bottom edge snaps between a one-row (row 2 hidden) // and two-row height. CollapsedHeight is computed from the layout (just above row 2), // so there's no magic constant. Bottom-edge only; default expanded. + // The full row-2 band (all at content-y 90, toolbar dump 0x21000016): a 6px left + // edge-piece (0x100006B6) + the 9 slots (0x100006B7..BF) + an 8px right edge-piece + // (0x100006C0). Hide ALL 11 when collapsed — hiding only the 9 slots leaves the two + // edge-pieces drawing as black pillars below the bar. uint[] row2Ids = { + 0x100006B6u, 0x100006B7u, 0x100006B8u, 0x100006B9u, 0x100006BAu, 0x100006BBu, 0x100006BCu, 0x100006BDu, 0x100006BEu, 0x100006BFu, + 0x100006C0u, }; var toolbarRow2 = new System.Collections.Generic.List(); float minRow2Top = float.MaxValue;