fix: friends list live Online/Offline status - authored row state
machine + UiText per-state string swap (user retail gate) The state side already worked (FriendsState replaces the full entry and bumps Revision on 0x0021 OnlineStatus updates; the parser reads full FriendData for every update type). The UI side had two gaps, exposed by the installed-DAT row-template probe (template layout 0x2100005D root 0x10000519): - The row authors TWO cells: the LEFT name text 0x1000051A whose Online (0x10000054) / Offline (0x10000055) PassToChildren states cascade into the RIGHT status grandchild 0x1000051F, which authors per-state 'Online'/'Offline' strings AND per-state colors (retail's green Online). The controller's FindDeepest binding wrote the NAME into the STATUS cell (the deepest text IS the status grandchild) and never flipped the state machine - so the status column never showed or updated anything. - UiText had no per-state authored-string swap: ApplyDatState switched sprite + color per state but never the 0x17 string. Ported now (second consumer of the mechanism after the powerbar caption): DatWidgetFactory pre-resolves each state's authored string; TrySetRetailState swaps the line, colored by the SAME state's authored 0x1B. SocialFriendsPageController now binds the name to its own cell and flips the authored Online/Offline state per friend on every Revision-driven rebuild - the cascade renders the status cell exactly as retail's gmFriendsUI does, green Online included. App suite 4,989/3 skips (new per-state swap conformance test). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
1390f9477d
commit
e449c75e9f
5 changed files with 150 additions and 3 deletions
|
|
@ -293,6 +293,15 @@ public sealed class UiText : UiElement, IUiDatStateful
|
|||
|
||||
public override string ActiveCursorStateName => _activeDatStateName;
|
||||
|
||||
private Dictionary<uint, string>? _authoredStateStrings;
|
||||
|
||||
/// <summary>Per-state authored strings (dat property 0x17 on the
|
||||
/// element's OWN states, resolved at build by DatWidgetFactory).
|
||||
/// <see cref="TrySetRetailState"/> swaps the displayed line when the
|
||||
/// incoming state authors one — retail's state-cascade text swap.</summary>
|
||||
internal void SetAuthoredStateStrings(Dictionary<uint, string> strings)
|
||||
=> _authoredStateStrings = strings;
|
||||
|
||||
internal void ConfigureDatState(ElementInfo info)
|
||||
{
|
||||
_datInfo = info;
|
||||
|
|
@ -356,6 +365,18 @@ public sealed class UiText : UiElement, IUiDatStateful
|
|||
&& TryColor(color, out Vector4 resolvedColor))
|
||||
DefaultColor = resolvedColor;
|
||||
|
||||
// Retail's state cascade also swaps the element's AUTHORED string
|
||||
// when the incoming state carries its own 0x17 (the friends row's
|
||||
// status cell: 'Online'/'Offline' with per-state colors). Resolved
|
||||
// at build by DatWidgetFactory; single-line — no per-state multiline
|
||||
// template exists in the authored set today. DefaultColor is read
|
||||
// per call so THIS state's 0x1B (applied just above) colors it.
|
||||
if (_authoredStateStrings is { } stateStrings
|
||||
&& stateStrings.TryGetValue(stateId, out string? authoredLine))
|
||||
{
|
||||
LinesProvider = () => [new Line(authoredLine, DefaultColor)];
|
||||
}
|
||||
|
||||
if (propagate && state?.PassToChildren == true)
|
||||
{
|
||||
foreach (UiElement child in Children)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue