fix: social panel completion batch (user gate 2026-08-13, "fix all")
One user-ordered batch across the FA social panel + world selection.
Every root cause was probe-proven before the fix (new
ProbeSocialClickRouting in SocialPanelLiveMountProbeTests - production
window mount + real UiRoot hit-tests + a synthetic click):
1. STUCK CHECKBOXES (fellowship x4, allegiance x1, "always checked /
can't change any options"): the authored checkboxes carry DAT
ToggleBehavior, so UiButton SELF-FLIPS Selected at MouseUp - the old
handlers read the flipped value and wrote the ORIGINAL back, snapping
every click to where it started (the probe recorded (id, oldValue)).
Fix: SuppressSelfToggle (the CH6a/b mirror discipline) + derive the
next value from the STORE; the per-tick seeding mirrors it back.
2. UNCLICKABLE ROSTER ROWS ("only get the move window cursor"): the row
name text is display-text ClickThrough=true, which the hit-test walk
skips regardless of HandlesClick - the wired OnClick was unreachable.
Fix: UiText.OnClick assignment now clears ClickThrough (central,
documented); the stats text gains the same select handler so most of
the row's width selects the fellow.
3. TRUNCATED EMPTY-STATE ("You do not belong... To create MISSING"):
the authored string resolves COMPLETE (three sentences) but embedded
'\n's rendered as one clipped line. DatWidgetFactory now splits
authored strings into one Line per newline, with the provider still
re-reading DefaultColor live (the state-color contract - caught by
BuildText_AuthoredLineTracksStateFontColor).
4. FELLOW NAMES WHITE (user-directed): the AD-82 invented leader-gold +
selection-blue tints are deleted; names always white (register row
narrowed).
5. ALLEGIANCE HEADER LABELS: bare "0"/"0" -> "Followers: N" / "Rank: [N]"
(user-specified format; the full retail StringInfo composition stays
AD-85's gap), monarch block matching.
6. FRIENDS/SQUELCH LIVE (AD-79 mostly retired): Add friend (name box ->
0x0018, retail clears the box - Request_AddFriend @0x0048D240),
Remove (row-click selection -> 0x0017), Appear Offline (CharacterOption
0x27 via the immediate 0x0005 auto-save, ACE pushes FriendStatusChanged
to your friend-of list), Squelch Character/Account add-by-name
(0x0058 guid0/type AllChannels + 0x0059) and Remove for the selected
row. The wire beneath (builders, WorldSession sends, Runtime commands,
parsers) existed end-to-end since J4.1/FA1 - this is panel wiring only
(docs/research/2026-08-13-social-wire-completion.md, committed here).
Send Tell stays inert (not in the order; AD-79's remainder).
7. WORLD SELF-SELECTION ("clicking my own char should select myself"):
retail has NO self-exclusion (CPhysicsPart::Draw @0x0050D823 arms
every physobj; RecvNotice_SmartBoxObjectFound @0x004E5BAE selects
unconditionally) - the includeSelf gate was an unregistered
divergence, now removed on both the left-click and right-click paths.
Element roles were probe-measured, never guessed (Add 0x10000514 /
Remove 0x10000515 / Send Tell 0x10000516 / Appear Offline 0x1000052C /
name field 0x1000051B; Squelch: field 0x10000540, Remove 0x10000547,
Squelch Character 0x1000054B, Squelch Account 0x1000054C).
Register: AD-79 mostly retired, AD-82 narrowed. Known remainder, filed
not hidden: the fellowship page's authored 600px content vs the 362px
viewport leaves Dismiss/Assign-Leader below the fold until the window is
resized taller (probe-measured; candidate follow-up).
Tests: Checkbox_Click fact rewritten to the mirror contract (both
directions), monarch-followers label updated, includeSelf expectation
updated, probe extended (click routing, synthetic click, action-widget
role dump). App suite 4,976/3 skips.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
ec2a7b0cce
commit
72ceddce2e
15 changed files with 1018 additions and 65 deletions
|
|
@ -2861,7 +2861,33 @@ public sealed class RetailUiRuntime : IDisposable
|
|||
ShowConfirmation: (message, completed) => ShowConfirmation(message, completed)),
|
||||
Friends: _bindings.Social.Friends,
|
||||
Squelch: _bindings.Social.Squelch,
|
||||
TemplateResolver: TemplateResolver);
|
||||
TemplateResolver: TemplateResolver,
|
||||
// 2026-08-13 (AD-79 retirement): the wire beneath every one of
|
||||
// these commands shipped with J4.1/FA1 — builders, WorldSession
|
||||
// sends, router registrations, inbound parsers (see
|
||||
// docs/research/2026-08-13-social-wire-completion.md §4); the
|
||||
// panel publishes onto the SAME bus every other surface uses.
|
||||
FriendsActions: new Layout.SocialFriendsPageController.Actions(
|
||||
AddFriend: name => _bindings.Options.CommandBus().Publish(
|
||||
new AddFriendRuntimeCmd(name)),
|
||||
RemoveFriend: guid => _bindings.Options.CommandBus().Publish(
|
||||
new RemoveFriendRuntimeCmd(guid)),
|
||||
CurrentAppearOffline: () => _bindings.Options.CurrentCharacterOption(
|
||||
(uint)CharacterOptionId.AppearOffline),
|
||||
SetAppearOffline: value => _bindings.Options.CommandBus().Publish(
|
||||
new SetSingleCharacterOptionRuntimeCmd(
|
||||
(uint)CharacterOptionId.AppearOffline, value))),
|
||||
SquelchActions: new Layout.SocialSquelchPageController.Actions(
|
||||
// Character scope, guid 0 (ACE name-looks-up), AllChannels —
|
||||
// research §1.5's exact retail body.
|
||||
SquelchCharacter: name => _bindings.Options.CommandBus().Publish(
|
||||
new ModifyCharacterSquelchRuntimeCmd(true, 0u, name, 1u)),
|
||||
SquelchAccount: name => _bindings.Options.CommandBus().Publish(
|
||||
new ModifyAccountSquelchRuntimeCmd(true, name)),
|
||||
RemoveCharacterSquelch: (guid, name) => _bindings.Options.CommandBus().Publish(
|
||||
new ModifyCharacterSquelchRuntimeCmd(false, guid, name, 1u)),
|
||||
RemoveAccountSquelch: name => _bindings.Options.CommandBus().Publish(
|
||||
new ModifyAccountSquelchRuntimeCmd(false, name))));
|
||||
|
||||
// A second DatLock scope (MountOptionsPanel's own precedent, above):
|
||||
// SocialFellowshipPageController.Bind resolves the Open/Close
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue