feat(ui): finish retail toolbar controls

Discover all seven panel launchers from their DAT panel-id attributes, route mounted panels through event-driven retained window state, and ghost unavailable panels. Port Use and Examine selection/target behavior with exact Appraise dispatch and retail cursor modes.

Co-Authored-By: Codex <codex@openai.com>
This commit is contained in:
Erik 2026-07-11 12:11:53 +02:00
parent 21fefce0e0
commit d3d1c895a0
19 changed files with 478 additions and 72 deletions

View file

@ -157,6 +157,33 @@ public sealed class CursorFeedbackControllerTests
Assert.Equal(CursorFeedbackKind.TargetPending, c.Update(root).Kind);
}
[Fact]
public void GenericUseAndExamineModes_driveRetailGlobalCursors()
{
var objects = SeedTargetObjects();
var interaction = new ItemInteractionController(
objects,
playerGuid: () => Player,
sendUse: null,
sendUseWithTarget: null,
sendWield: null,
sendDrop: null);
var c = new CursorFeedbackController(interaction);
Assert.True(interaction.UseSelectedOrEnterMode(0));
Assert.Equal(RetailGlobalCursorKind.Use,
c.Resolve(new CursorFeedbackSnapshot()).GlobalKind);
Assert.Equal(RetailGlobalCursorKind.UseFound,
c.Resolve(new CursorFeedbackSnapshot(HoverTargetGuid: Target)).GlobalKind);
interaction.CancelTargetMode();
Assert.True(interaction.ExamineSelectedOrEnterMode(0));
Assert.Equal(RetailGlobalCursorKind.Examine,
c.Resolve(new CursorFeedbackSnapshot()).GlobalKind);
Assert.Equal(RetailGlobalCursorKind.ExamineFound,
c.Resolve(new CursorFeedbackSnapshot(HoverTargetGuid: Target)).GlobalKind);
}
public static TheoryData<CursorFeedbackSnapshot, RetailGlobalCursorKind> GlobalCursorCases => new()
{
{ new(), RetailGlobalCursorKind.Default },