fix(ui): port retail window control feedback

Map synthetic move and resize affordances to the exact DAT cursors, make chat top chrome movable, and replace stale primary-panel height caps with a dynamic screen-edge constraint. This keeps the retained wrapper adaptation aligned with retail Dragbar/Resizebar behavior.
This commit is contained in:
Erik 2026-07-17 09:40:08 +02:00
parent 3f3cfdac30
commit 06016014bc
16 changed files with 578 additions and 27 deletions

View file

@ -44,6 +44,81 @@ Copy this block when adding a new issue:
---
## #223 — Primary panel resize stopped before the screen edge
**Status:** DONE — 2026-07-17 (connected visual gate accepted)
**Severity:** MEDIUM
**Filed:** 2026-07-17
**Component:** retained UI / shared main panel / resize constraints
**Description:** The Inventory, Character/Skills, and Spellbook/Components
panel could not be extended vertically to the bottom of the screen. Magic was
not resizable at all, Character carried a fixed 760-pixel maximum, and
Inventory calculated one maximum from its startup position that became stale
after the shared panel moved.
**Root cause / status:** Retail LayoutDesc `0x2100006E` owns one 310x372
`gmPanelUI` host. Its primary children are all authored into the same 300x362
content region with bottom anchoring, while the host exposes a bottom Type-9
vertical Resizebar. acdream imports those children as separate wrappers, so
their mount policies must preserve that one host contract. All three primary
wrappers now expose bottom-only vertical resizing and have no ad-hoc maximum.
The shared mount seam carries a dynamic parent-extent constraint, so pointer
and restored/programmatic sizes use the panel's current position and stop at
the current screen edge.
**Files:** `src/AcDream.App/UI/RetailUiRuntime.cs`;
`src/AcDream.App/UI/Layout/RetailWindowFrame.cs`;
`src/AcDream.App/UI/UiElement.cs`; `src/AcDream.App/UI/UiRoot.cs`;
`src/AcDream.App/UI/RetailWindowManager.cs`.
**Research:**
`docs/research/2026-07-17-retail-shared-main-panel-pseudocode.md`.
**Acceptance:** Move the shared primary panel to more than one vertical
position. In Inventory, Character/Skills, and Spellbook/Components, drag the
bottom resize edge to the bottom of the client. Every panel must reach that
edge without crossing it, and its anchored content must use the added height.
---
## #222 — Window move and resize cursors were missing
**Status:** DONE — 2026-07-17 (connected visual gate accepted)
**Severity:** MEDIUM
**Filed:** 2026-07-17
**Component:** retained UI / cursor feedback / window controls
**Description:** Hovering or operating the retained-window move and resize
regions left the ordinary retail pointer visible. Retail shows a four-way move
cursor and direction-specific horizontal, vertical, and diagonal resize
cursors.
**Root cause / status:** `UiRoot` and `CursorFeedbackController` already
identified the exact active/hovered window-control intent, but
`RetailCursorManager` consumes cursor media rather than the semantic kind. No
media was attached to the semantic result for synthetic wrapper edges or the
IA-12 whole-window drag region. `RetailCursorCatalog` now maps those five
intents to the exact direct DAT cursor surfaces and `(16,16)` hotspots authored
on retail Type-2 Dragbar and Type-9 Resizebar controls. Authored widget media
keeps retail captured/hovered precedence; an active synthetic control holds its
cursor until release.
**Files:** `src/AcDream.App/UI/CursorFeedbackController.cs`;
`src/AcDream.App/UI/RetailCursorCatalog.cs`;
`tests/AcDream.App.Tests/UI/CursorFeedbackControllerTests.cs`;
`tests/AcDream.App.Tests/UI/RetailCursorCatalogTests.cs`.
**Research:**
`docs/research/2026-07-17-retail-window-control-cursor-pseudocode.md`.
**Acceptance:** Hover every enabled window edge/corner and an empty move
region; the correct retail cursor must appear before pressing and remain stable
while dragging outside the original control. Locked or non-resizable windows
must not advertise unavailable operations.
---
## #221 — Primary UI panels retained independent window positions
**Status:** DONE — 2026-07-17
@ -77,12 +152,6 @@ placement and restore-previous behavior.
Inventory, Character/Skills, and Spellbook/Components retain one position
across switching, dragging, closing, and reopening.
**Acceptance:** Open Inventory, move it, then switch directly and after closing
to Character/Skills and Spellbook/Components. Every replacement must open at
the most recently moved main-panel position. Move another panel and repeat in
the opposite direction. Helpful/Harmful effects must not overwrite that
position.
---
## #220 — Local player glides before locomotion animation starts