docs(quest): QT5 is specified — and it is the Journal panel, not a contract one

Measuring the host layout rather than assuming changed what this slice is.
gmContractsUI is not a panel of its own: it is tab 1 of a THREE-tab "Journal"
panel at gmPanelUI slot 25, beside a notes page and a page list. Building it as
a standalone window would have produced something retail does not have, and
the mistake would only have surfaced at a visual gate.

The other two tabs are out of scope, so the expected intermediate state is a
panel with two dead tabs — recorded here so it is not filed as a defect.

Everything else the page needs is now measured out of the dats: every authored
label, the per-row child ids RefreshContractListbox writes, and the list's
scrollbar link. The list is a UiTemplateListBox, the widget OP2 already built,
so the page is binding work rather than new widget work.

LayoutDump --props now resolves StringInfo through DatStringResolver instead of
printing the type name, which is how the labels were read at all.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Erik 2026-08-21 14:56:46 +02:00
parent ef6b7310c5
commit fac2dc7248
2 changed files with 70 additions and 5 deletions

View file

@ -163,6 +163,8 @@ if (findAt >= 0)
}
}
var stringResolver = new DatStringResolver(adapter);
ElementInfo? root = ids.Length > 1
? LayoutImporter.ImportInfos(adapter, ids[0], ids[1])
: LayoutImporter.ImportInfos(adapter, ids[0]);
@ -326,13 +328,25 @@ void Print(ElementInfo e, int depth)
.OrderBy(kv => kv.Key)
.Select(kv => $"0x{kv.Key:X2}={Describe(kv.Value)}"));
static string Describe(UiPropertyValue v) => v.Kind switch
string Describe(UiPropertyValue v) => v.Kind switch
{
UiPropertyKind.Bool => v.BoolValue.ToString(),
UiPropertyKind.Integer => v.IntegerValue.ToString(),
UiPropertyKind.Enum => $"0x{v.UnsignedValue:X}",
// An authored StringInfo is a table id + string id, which says
// nothing on its own -- resolve it, because "what does this
// label SAY?" is the whole reason to dump properties.
UiPropertyKind.StringInfo => DescribeString(v.StringInfoValue),
_ => v.Kind.ToString(),
};
string DescribeString(UiStringInfoValue info)
{
string? resolved = stringResolver.Resolve(info.TableId, info.StringId);
return !string.IsNullOrEmpty(resolved)
? $"\"{resolved}\""
: $"StringInfo(table=0x{info.TableId:X8}, id={info.StringId})";
}
Console.WriteLine($"{pad} state {stateId}: props {ids}");
}
}