feat(ui): Campaign OP slice OP5 — the Chat tab
Binds LayoutDesc 0x2100005C through OP2's template-list mechanism and OP3's per-page OptionPage model: the General Options header + two DualHash-linked opacity sliders (Option_DefaultOpacity_Property 0x10000080 / Option_ActiveOpacity_Property 0x10000081, live-apply on drag through RetailWindowOpacityController, defaults read from the installed DAT's DBProperties collection at DID 0x78000001 via ChatOptionsDatDefaults), and the five per-window text-filter blocks (main window 12 rows minus Gameplay, four floaties 13 rows each — the byte-verified authored order cross-checked against the raw gmChatOptionsUI::InitOptions/AddCheckboxBitfield64Option pseudo-C, not just the research doc's own table) writing AcDream.Core.Chat. ChatWindowState directly, the same state CH6's chat windows already read. AP-195 retired: ported both halves left open at the OP2 re-review — the ALL-set LED media swap (new UiButton.FaceFileOverride, driven by the block-level P0x10000082/P0x10000083 sprites now threaded through ElementInfo/DatWidgetFactory) and the CreateChildren self-sizing tail (UiCheckboxBitfield64.Height grows with its stacked row content; the enclosing ListBox reflows around the block's FINAL height via the new UiTemplateListBox.AddPrebuiltRow, reusing the ListBox's own stacking rather than a third stacking path). AP-187 broadened to cover the main window's own filter (previously only the four floaties) and the new live-editing write path. The main chat window's filter (retail window id 8, ChatWindowState id 0) gains its own settings.json persistence (ChatSettings. ChatWindowMainFilter) alongside the pre-existing floaty 1-4 fields; opacity persistence is now wired on every live slider change, not only through the old dev-scaffold Settings panel. Fixture regeneration (ACDREAM_REGENERATE_UI_FIXTURES=1) picked up the new ElementInfo.LedCheckedSprite/LedUncheckedSprite fields across all 19 committed layout fixtures — purely additive, confirmed against the live installed DAT (0x10000520's own 0x82/0x83 properties resolve to 0x06004D17/0x06004D19 exactly as AP-195 documented). Conformance: FilterRows/FilterBlocks pinned against the byte-verified authored order and ChatWindowState's own default constants; the AP-195 LED swap and self-sizing behavior; the DAT opacity-default extraction against the live installed DAT; live filter/opacity writes reaching ChatWindowState/RetailWindowOpacityController; OnShown re-seed and Reset/Defaults ghosting per the OP4 binding-pattern discipline. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
4798302226
commit
e71e5a9614
52 changed files with 4540 additions and 40 deletions
|
|
@ -198,6 +198,25 @@ public sealed class ElementInfo
|
|||
/// </summary>
|
||||
public List<UiTemplateListEntry> TemplateList = new();
|
||||
|
||||
/// <summary>
|
||||
/// AP-195 (Campaign OP slice OP5): <c>UIOption_CheckboxBitfield64</c>'s block-level
|
||||
/// "all mask bits set" LED media (dat property <c>0x10000082</c>,
|
||||
/// <c>P0x10000082 = 0x06004D17</c> on the authored template consumer
|
||||
/// <c>0x10000520</c>) — retail <c>Refresh @0x004859C0</c> swaps a row's LED to THIS
|
||||
/// sprite when every bit of that row's mask is currently set. 0 when absent.
|
||||
/// Populated the same way as <see cref="TabTable"/>.
|
||||
/// </summary>
|
||||
public uint LedCheckedSprite;
|
||||
|
||||
/// <summary>
|
||||
/// AP-195 counterpart of <see cref="LedCheckedSprite"/>: the "some but not all mask
|
||||
/// bits set" LED media (dat property <c>0x10000083</c>,
|
||||
/// <c>P0x10000083 = 0x06004D19</c>). Retail applies this ONLY while the row is
|
||||
/// checked (any-set) but not fully checked (all-set) — see
|
||||
/// <c>UiCheckboxBitfield64</c>'s own doc for the full any/all-set decode.
|
||||
/// </summary>
|
||||
public uint LedUncheckedSprite;
|
||||
|
||||
/// <summary>
|
||||
/// Element id of this ListBox's linked scrollbar, read from dat property
|
||||
/// <c>0x72</c> (e.g. the Character page's ListBox <c>0x100001FA</c> names
|
||||
|
|
@ -503,6 +522,13 @@ public static class ElementReader
|
|||
// (same doc §10.1 — e.g. Character ListBox 0x100001FA names scrollbar
|
||||
// 0x100001FB).
|
||||
info.ScrollbarElementId = ReadReferencedElementId(info, 0x72u);
|
||||
|
||||
// AP-195: the CheckboxBitfield64 block's own all/partial-set LED media DIDs
|
||||
// (0x10000082/0x10000083 — DataId-kind properties, verified against the
|
||||
// committed options_2100002B.json fixture at element 0x10000520: Kind=2
|
||||
// (DataId), UnsignedValue 100683031/100683033 == 0x06004D17/0x06004D19).
|
||||
info.LedCheckedSprite = ReadReferencedElementId(info, 0x10000082u);
|
||||
info.LedUncheckedSprite = ReadReferencedElementId(info, 0x10000083u);
|
||||
}
|
||||
|
||||
private static List<UiTabTableEntry> ReadTabTable(ElementInfo info)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue