feat(D.2b): scrollable retail chat window (read-only foundation)
Add UiChatView, a transcript widget for the retail-look UI: renders the ChatVM tail bottom-pinned (newest at the bottom, like retail) with mouse-wheel scrollback and whole-line vertical clipping so text stays inside the frame. Hosted in a draggable/resizable UiNineSlicePanel and wired into the UiHost next to the vitals window, fed by a dedicated ChatVM (200-line tail) over the same live ChatLog. Per-ChatKind colour palette (speech white, tells magenta, channels blue, system yellow, emotes grey, combat orange). This is the read-only foundation. The next sub-step adds glScissor clipping + word-wrap, drag-to-select, and Ctrl+C copy -- the last needs a CapturesPointerDrag opt-out on UiElement so an interior drag selects text instead of moving the window (today an interior drag still moves the window, same as the vitals panel). Tests: UiChatView.ClampScroll (pin-to-bottom, cap-at-overflow, never-negative). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
1453ff7da2
commit
ada863980c
3 changed files with 169 additions and 0 deletions
28
tests/AcDream.App.Tests/UI/UiChatViewTests.cs
Normal file
28
tests/AcDream.App.Tests/UI/UiChatViewTests.cs
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
using AcDream.App.UI;
|
||||
|
||||
namespace AcDream.App.Tests.UI;
|
||||
|
||||
public class UiChatViewTests
|
||||
{
|
||||
[Fact]
|
||||
public void ClampScroll_PinsToZero_WhenContentFitsView()
|
||||
{
|
||||
// 5 lines of content in a taller view → nothing to scroll, pinned at 0.
|
||||
Assert.Equal(0f, UiChatView.ClampScroll(50f, contentHeight: 80f, viewHeight: 200f));
|
||||
Assert.Equal(0f, UiChatView.ClampScroll(0f, contentHeight: 80f, viewHeight: 200f));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ClampScroll_CapsAtContentMinusView_WhenOverflowing()
|
||||
{
|
||||
// Content 500, view 200 → max scrollback is 300px (oldest line at top).
|
||||
Assert.Equal(300f, UiChatView.ClampScroll(1000f, contentHeight: 500f, viewHeight: 200f));
|
||||
Assert.Equal(120f, UiChatView.ClampScroll(120f, contentHeight: 500f, viewHeight: 200f));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ClampScroll_NeverNegative()
|
||||
{
|
||||
Assert.Equal(0f, UiChatView.ClampScroll(-50f, contentHeight: 500f, viewHeight: 200f));
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue