feat(ui): FA3 -- mount the social panel shell (Friends/Allegiance/Fellowship/Squelch)
Campaign FA slice FA3: retail's four-tab social panel (LayoutDesc
0x2100006E slot 0x1000018F, RetailPanelCatalog id 12), built on the OP3
OptionsPanelController recipe -- Type-8 tab host, ActivateTabBehavior,
per-page scoped controllers.
- SocialPanelController mounts the tab host and wires the close button;
F3 (ToggleAllegiancePanel) and F4 (ToggleFellowshipPanel) open the
panel and switch to their own tab, sharing the same gmPanelUI
one-active-panel exclusivity every sibling main panel already has.
- The live-DAT tab table CORRECTS the coordinator addendum's x-order
guess: button 0x1000028C ("Allegiance") pairs with page 0x10000291 and
is the authored DEFAULT entry, not Friends -- each button's own page
id and its own P0x57 (matching the F3/F4 ActionMap ids on the
Allegiance/Fellowship pages specifically) both corroborate the real
pairing. See SocialPanelController's class doc for the full table.
- SocialFellowshipPageController swaps the two authored empty/full
frames (0x1000026B/0x10000275) on RuntimeFellowshipState's
IsInFellowship -- both frames' full containment (name box, create
button, checkboxes vs. roster list, six buttons) was confirmed by the
live-mount probe, so a single Visible toggle per frame is the whole
swap (closes lane-A unknown U6).
- SocialAllegiancePageController hides the monarch/patron blocks and
blanks their name text to a literal space when
RuntimeAllegianceState.Snapshot.HasProfile is false, using SCOPED
FindDescendant lookups (the panel authors 0x10000492 twice, once per
block).
- SocialFriendsPageController/SocialSquelchPageController bind their
ListBoxes read-only to RuntimeCommunicationState's existing J4.1
Friends/Squelch owners (names only), rebuilding on revision change.
Their action buttons are honest INERT (D1) -- register row AD-79.
- UiTemplateListBox gains Flush() (lane A/D's "Gap found" prerequisite)
so a poll-and-rebuild list can shrink between refreshes.
- RetailPanelCatalog.SocialPanel = 12, byte-verified from the live slot's
own P0x10000029; listed in Mounted only (no toolbar button -- lane A
§6.1: the open path is keyboard-only).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
b560f415cd
commit
0a9ca2f1f9
12 changed files with 854 additions and 1 deletions
32
src/AcDream.App/UI/Layout/SocialPanelRowText.cs
Normal file
32
src/AcDream.App/UI/Layout/SocialPanelRowText.cs
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
namespace AcDream.App.UI.Layout;
|
||||
|
||||
/// <summary>
|
||||
/// Campaign FA slice FA3: shared row-text lookup for the social panel's
|
||||
/// Friends/Squelch read-only list rows. Both row templates
|
||||
/// (<c>0x2100005D</c>/<c>0x10000519</c> for Friends,
|
||||
/// <c>0x21000060</c>/<c>0x10000541</c> for Squelch — FA3 live-mount probe)
|
||||
/// author the SAME two-deep nested-text shape: a Type-3 row root, one
|
||||
/// Type-0xC text child, and ONE MORE Type-0xC text grandchild at the
|
||||
/// identical rect. Neither <c>gmFriendsUI</c> nor <c>gmSquelchUI</c> is in
|
||||
/// this campaign's decompiled scope (lane A/B/C/D cover only Fellowship/
|
||||
/// Allegiance), so which of the two carries the actual glyph flow is not
|
||||
/// established from retail decomp — the innermost leaf is used here
|
||||
/// (deepest-first is the common "structural wrapper, then label leaf"
|
||||
/// shape elsewhere in this dat format).
|
||||
/// </summary>
|
||||
internal static class SocialPanelRowText
|
||||
{
|
||||
/// <summary>Returns the deepest <see cref="UiText"/> descendant of
|
||||
/// <paramref name="row"/> (pre-order, last match wins), or null if the
|
||||
/// built row contains no text element at all.</summary>
|
||||
public static UiText? FindDeepest(UiElement row)
|
||||
{
|
||||
UiText? found = row as UiText;
|
||||
foreach (UiElement child in row.Children)
|
||||
{
|
||||
if (FindDeepest(child) is { } deeper)
|
||||
found = deeper;
|
||||
}
|
||||
return found;
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue