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:
Erik 2026-08-11 06:25:59 +02:00
parent 4798302226
commit e71e5a9614
52 changed files with 4540 additions and 40 deletions

File diff suppressed because one or more lines are too long

View file

@ -1,6 +1,6 @@
# Campaign OP connected-gate test script
**Status:** OP3, OP4, and OP7 sections. Later slices (OP5-6, OP8) append
**Status:** OP3, OP4, OP5, and OP7 sections. Later slices (OP6, OP8) append
their own sections here as they land; the campaign's OP9 closeout gate is
this document complete plus every slice code-complete.
@ -363,6 +363,152 @@ TrySetOption` seam every other Options-panel consumer already uses.
---
## OP5 — the Chat tab
The Chat tab (`0x2100005C`) has six sections: **General Options** (the two
linked window-opacity sliders) and five per-window text-filter blocks — the
**Main Chat Window** (12 checkboxes, no "Gameplay" row) and four **Floaty
Chat Window 1-4** blocks (13 checkboxes each). All five blocks write
`AcDream.Core.Chat.ChatWindowState` directly — the SAME state CH6's floating
chat windows already read when deciding which lines to show.
### Opening the tab
1. **Open the Options panel (F11) and click the Chat tab.** Six group
headers appear top-to-bottom: **General Options**, **Main Chat Window**,
**Floaty Chat Window 1**, **Floaty Chat Window 2**, **Floaty Chat Window
3**, **Floaty Chat Window 4**. Under General Options, two horizontal
sliders; the second one has "Transparent"/"Opaque" range captions at its
ends. Under each window section, a block of checkboxes with labels
(Gameplay, Combat, Magic, Area Speech, Tells, Allegiance, Fellowship,
General, Trade, LFG, Roleplay, Society, Error) — the Main Chat Window
block is missing the **Gameplay** row (12 rows, not 13); every floaty
block has all 13.
2. **Scroll the list.** All six sections are reachable; the block heights
visibly differ from a flat 100px box — each block is exactly tall enough
to show all of its own rows with no clipping and no dead space below the
last row (AP-195's self-sizing).
3. **Look closely at a row whose mask covers MULTIPLE underlying message
types** (Gameplay, Combat, Allegiance, or Fellowship — the composite-mask
rows per the research doc) versus a single-bit row (e.g. "Error" or
"General"). If your character's chat history has caused a PARTIAL match
on one of those composite rows (some but not all of its underlying types
currently enabled), the checkbox's own LED art should look visibly
different (dimmer/"ghosted") from a row that is FULLY on — this is
AP-195's LED media swap. On a fresh character every row is likely either
fully on or fully off, so this may not be observable without deliberately
creating a partial-match state via repeated single clicks inside a
composite row's underlying bits (not directly clickable per-bit through
this UI — a visual nice-to-have to note, not a blocking check).
### Opacity sliders — live drag, linked, never clamping
4. **Drag the FIRST slider (Default Opacity) most of the way to the right**
while the Options panel itself is NOT focused/hovered by your mouse (so
you can see another registered window, e.g. the toolbar or a floating
chat window, at its UNFOCUSED opacity). Watch that OTHER window's
transparency change LIVE, continuously, as you drag — not just on
release. This is retail's `SetCurrentValue -> Apply(1)` immediate-apply
semantic.
5. **Drag the first slider (Default) ABOVE the second slider's (Active)
current position.** Retail's link drags the SECOND slider's thumb UP to
match — watch it move on its own as you drag the first. Neither slider
should ever let Default end up above Active.
6. **Drag the second slider (Active) BELOW the first slider's (Default)
current position.** The first slider's thumb should get dragged DOWN to
match, symmetric to step 5.
7. **Focus a chat window (click into its text entry) and watch its opacity
change to the Active value; click away and watch it ease back toward
Default.** (The easing itself is AP-190's existing behavior, not new to
this slice — this step just confirms the sliders are actually driving
the SAME live opacity controller every other window already uses.)
### Filter checkboxes — live routing, per-window independence
8. **Open a floating chat window (Alt+1 through Alt+4, or the toolbar
indicator buttons) and uncheck "Combat" in that SAME window's filter
block on the Chat tab** (e.g. Floaty Chat Window 1's block if you opened
window 1). Trigger a combat message (attack a monster, or have someone
attack you) — it should STOP appearing in that floating window while
still appearing in the MAIN chat window (whose own filter is untouched).
Re-check the box — combat messages resume in that window.
9. **Uncheck a filter row in the MAIN CHAT WINDOW's own block** (e.g.
"Trade") and generate a matching message (a `/trade` broadcast, or
whatever is easiest to trigger). It should stop appearing in the main
window specifically, while a floating window with Trade still checked
keeps showing it — proving the main window's filter is genuinely
consulted now (CH6a/b's own fixed bug: broadcast lines used to
short-circuit true for the main window regardless of its filter).
10. **Verify the five blocks are independent**: toggling a row in Floaty
Chat Window 2's block must not affect Floaty Chat Window 1, 3, 4, or the
Main window's own same-named row.
### Apply/Reset/Defaults
11. **Toggle a couple of filter checkboxes AND drag both opacity sliders,
then click Reset.** Every row you touched (checkboxes, both sliders)
reverts to its value from the last Apply/OnShown — filter writes revert
live (you should see the reverted checkbox state immediately, and the
corresponding message routing revert too).
12. **Click Defaults.** The two opacity sliders jump to their DAT-extracted
values (0.5 default / 1.0 active — the same values you'd see on a
NEVER-touched install) LIVE; every filter block reverts to its OWN
window's retail default (Main: 0xFBFFFFFF's rows — everything checked
except Error; each floaty: its own narrower default set, per the
research doc's table) — Apply/Reset light up afterward if anything
actually changed (Defaults never commits by itself).
13. **Switch to another tab (e.g. Gameplay) without clicking Apply after an
edit.** Uncommitted slider/checkbox edits silently revert — switching
tabs is a Reset, not a save. Switch back to Chat and confirm the
reverted state (both the slider positions AND the filter checkboxes).
### Persistence — local-only, survives relog AND relaunch
14. **Set a distinctive combination** (e.g. Default Opacity ~30%, Active
Opacity ~90%, Main window's "LFG" row OFF, Floaty 3's "Fellowship" row
OFF) and click Apply (or just leave the panel open — filter writes and
slider drags apply live and persist to `settings.json` on every change,
not just on Apply).
15. **Fully relaunch the client** (close the window, start a new process;
a simple relog is not required since this is LOCAL-only state, unlike
the Character tab's server-authoritative rows). Reopen the Options
panel's Chat tab — the two sliders should read back at your set values,
and the Main/Floaty-3 checkboxes should read back unchecked for the
rows you turned off. **This is expected to be LOCAL-only persistence**:
retail's own wire mechanism for this data (the `0x1000008C`
GameplayOptions blob) is explicitly out of scope for this campaign
(register row AP-187, broadened at this slice — the blob stays
unsent); acdream persists through `settings.json` instead, which is
why a relaunch (not a server round trip) is the correct way to prove
it survived.
### What to report
- Any section/row/label missing, or the Main window showing a Gameplay row
(or a floaty missing one).
- A slider that does not apply live while dragging, or that lets Default
end up above Active (or vice versa) after a drag.
- A filter checkbox whose toggle does not change live message routing in
the window it belongs to, or that leaks into a DIFFERENT window.
- Reset/Defaults not behaving as described in 11-12.
- Any block whose height looks clipped or has a large empty gap below its
last row (a self-sizing regression).
- Any setting that reverts to default after a full relaunch (a persistence
regression) — remember this is local-only, so a SERVER-side relog is not
the right test here (see item 15's note).
### Explicitly NOT in scope for this gate
- Config tab content — OP6.
- The retail `0x1000008C` wire format for this same data — explicitly
deferred (see the plan's "What is explicitly OUT of scope" section and
this slice's own register citation).
- The composite-mask LED "partial vs full" visual distinction (step 3) is a
nice-to-have confirmation, not a blocking pass/fail item — it requires a
specific partial-match state that a fresh character is unlikely to be in.
---
## OP7 — headless `characterOptions`
Unlike OP3-OP6, this is not a graphical-client gate: no window is launched.

View file

@ -0,0 +1,92 @@
using AcDream.Content;
using DatReaderWriter.DBObjs;
using DatReaderWriter.Types;
namespace AcDream.App.UI.Layout;
/// <summary>
/// Campaign OP slice OP5: reads the Chat tab's two opacity-slider defaults from the
/// installed DAT's <c>DBProperties</c> collection — retail
/// <c>UIOption::InqDefaultGameplayOptionProperty @0x004ef8d0</c>'s
/// <c>m_propName</c>-bound path, the ONE genuine consumer of that mechanism (the
/// Character tab's 49/50 checkboxes are <c>PlayerOption</c>-bound, not
/// <c>m_propName</c>-bound — see <see cref="CharacterOptionsPageController"/>'s own
/// U1 trace for why THAT tab does not use this seam).
///
/// <para>
/// Byte-verified recipe (<c>DBCache::GetDIDFromEnum @0x00413940</c>): the outer call
/// site is <c>GetDIDFromEnumStatic(&amp;ret, 0x16, 2)</c> — outer arg2 (<c>0x16</c>)
/// feeds the inner function's arg3 (the SUB-MAP lookup key), outer arg3 (<c>2</c>)
/// feeds arg4 (the MASTER-MAP lookup key FIRST). So:
/// <c>master.ClientEnumToID[2] → subMapDid; subMap.ClientEnumToID[0x16] → DID</c> —
/// i.e. <see cref="RetailDataIdResolver.Resolve"/>'s own <c>(enumValue, enumCategory)</c>
/// parameter order is <c>(0x16, 2)</c>, matching
/// <c>RetailUiRuntime.cs</c>'s existing <c>Resolve(dats, 2u, 5u)</c> convention
/// (enumCategory selects the master-map submap FIRST, enumValue indexes it SECOND).
/// Empirically confirmed against the installed DATs: resolves to DID
/// <c>0x78000001</c>, a 3-entry <c>DBProperties</c> —
/// <c>0x1000007F</c> (<c>Bitfield64</c>, the Chat filter blocks' shared
/// <c>m_propName</c> — NOT a per-window default; the five blocks' actual defaults are
/// the literal constants <c>gmChatOptionsUI::InitOptions</c> authors per window,
/// ported verbatim in <c>ChatWindowState</c>/<see cref="ChatOptionsPageController"/>),
/// <c>0x10000080</c> (<c>Float</c>, <c>0.5</c> — <c>Option_DefaultOpacity_Property</c>),
/// <c>0x10000081</c> (<c>Float</c>, <c>1.0</c> — <c>Option_ActiveOpacity_Property</c>).
/// </para>
/// </summary>
public static class ChatOptionsDatDefaults
{
/// <summary>DAT enum-category key for the FIRST (master-map) lookup — see the
/// class doc's byte-verified recipe.</summary>
private const uint EnumCategory = 2u;
/// <summary>DAT enum-value key for the SECOND (sub-map) lookup.</summary>
private const uint EnumValue = 0x16u;
/// <summary><c>Option_DefaultOpacity_Property</c> — the unfocused-window opacity
/// slider's <c>m_propName</c>.</summary>
public const uint DefaultOpacityPropertyId = 0x10000080u;
/// <summary><c>Option_ActiveOpacity_Property</c> — the focused-window opacity
/// slider's <c>m_propName</c>.</summary>
public const uint ActiveOpacityPropertyId = 0x10000081u;
/// <summary>Retail base-constructor fallback (<c>ChatInterface::ChatInterface
/// @0x004F4550</c>) — used only when the DAT read fails (missing DAT entry,
/// corrupt install); the live installed DAT resolves to these exact values today.</summary>
public const float FallbackDefaultOpacity = 0.5f;
public const float FallbackActiveOpacity = 1.0f;
/// <summary>
/// Resolves the two slider defaults from the live DAT. Returns
/// <see langword="false"/> (with both out params set to the retail-constructor
/// fallback) if the DID does not resolve, the <c>DBProperties</c> object is
/// missing, or either property is absent/not a <c>Float</c> — matching this
/// codebase's "degrade to a documented fallback, never invent a value" discipline.
/// </summary>
public static bool TryRead(
IDatReaderWriter dats, out float defaultOpacity, out float activeOpacity)
{
defaultOpacity = FallbackDefaultOpacity;
activeOpacity = FallbackActiveOpacity;
uint did = RetailDataIdResolver.Resolve(dats, EnumValue, EnumCategory);
if (did == 0u || !dats.Portal.TryGet<DBProperties>(did, out DBProperties? props) || props is null)
return false;
bool ok = true;
if (props.Properties.TryGetValue(DefaultOpacityPropertyId, out BaseProperty? d)
&& d is FloatBaseProperty defaultProp)
defaultOpacity = defaultProp.Value;
else
ok = false;
if (props.Properties.TryGetValue(ActiveOpacityPropertyId, out BaseProperty? a)
&& a is FloatBaseProperty activeProp)
activeOpacity = activeProp.Value;
else
ok = false;
return ok;
}
}

View file

@ -0,0 +1,478 @@
using System;
using AcDream.App.UI;
using AcDream.Core.Chat;
namespace AcDream.App.UI.Layout;
/// <summary>
/// Campaign OP slice OP5 (2026-08-11): binds the Chat tab (LayoutDesc
/// <c>0x2100005C</c>, root <c>0x1000050A</c>, ListBox <c>0x1000050D</c>) — retail's
/// <c>gmChatOptionsUI::InitOptions @0x0049FC60</c> — through OP2's template-list
/// mechanism and OP3's per-page <see cref="OptionPage"/> model, exactly like
/// <see cref="CharacterOptionsPageController"/>. Six authored sections, byte-verified
/// end-to-end against <c>docs/research/2026-08-10-options-panel-structure.md</c> §5
/// AND the raw <c>gmChatOptionsUI::InitOptions</c>/<c>AddCheckboxBitfield64Option</c>
/// pseudo-C (research doc's own row table was cross-checked against BOTH the inline
/// main/floaty4 call sites and the shared helper's <c>switch</c> — every mask, header
/// key, separator, and the 12-vs-13-row Gameplay-row gap matched exactly):
///
/// <list type="number">
/// <item><description>General Options — header, then TWO LINKED opacity sliders
/// (<c>Option_DefaultOpacity_Property 0x10000080</c> / <c>Option_ActiveOpacity_Property
/// 0x10000081</c>), then a separator.</description></item>
/// <item><description>Five per-window filter sections (main window id 8, floaties
/// 2-5) — header, one <see cref="UiCheckboxBitfield64"/> block, separator. Main gets
/// 12 rows (no "Gameplay" row); every floaty gets 13.</description></item>
/// </list>
///
/// <para>
/// <b>The one 64-bit register, not 128 bits.</b> Retail's own
/// <c>UIOption_CheckboxBitfield64::AddChild(this, uint64_t mask, uint32_t labelId,
/// uint32_t tooltipId)</c> signature (byte-verified from the pseudo-C function
/// declaration, not just call-site operands) takes exactly ONE 64-bit mask — matching
/// <c>ChatWindowState</c>'s own single-<c>ulong</c>-per-window model (its committed
/// defaults, e.g. main <c>0xFBFFFFFFu</c>, are byte-identical to the research doc's
/// "(high:low)" row/window tables once "high:low" is read as bits[63:32]:bits[31:0] of
/// THAT one register — a BN push-immediate artifact for the 64-bit argument, not a
/// genuine 128-bit two-register value). <see cref="UiCheckboxBitfield64"/>'s own
/// <c>CurrentLow</c>/<c>CurrentHigh</c> pair is exactly that split, so every mask this
/// controller feeds it is produced by <see cref="SplitMask"/> from ONE canonical
/// <see cref="ulong"/> — never independently derived low/high literals.
/// </para>
///
/// <para>
/// <b>Retail window id vs acdream compact id.</b> Retail's <c>SetUserData</c> argument
/// (8 main, 2-5 floaties) is the id <c>PlayerModule::SetChatWindowOption</c> dispatches
/// on; <see cref="ChatWindowState"/> uses its OWN compact <c>0</c>-<c>4</c> range
/// (Campaign CH slice CH6b). <see cref="FilterBlockSpec.CompactWindowId"/> carries the
/// mapping so nothing downstream needs to know retail's raw numbering.
/// </para>
/// </summary>
public static class ChatOptionsPageController
{
/// <summary>Chat page root — <c>gmChatOptionsUI</c> — the STANDALONE
/// <c>0x2100005C</c> layout's own root id. Only present as its own distinct node
/// when <c>0x2100005C</c> is imported directly (e.g.
/// <c>FixtureLoader.LoadOptionsChat()</c>); when mounted through the tab host
/// (<c>0x2100006E</c>/<c>0x2100002B</c>, what <see cref="Bind"/> actually
/// operates on), <c>ElementReader.Merge</c>'s "derived id wins" rule means the
/// PAGE SLOT keeps its own id (<see cref="PageSlotElementId"/>) instead — use
/// that one for any host-tree lookup.</summary>
public const uint RootElementId = 0x1000050Au;
/// <summary>The Chat page's SLOT element within the tab host
/// (<c>OptionsPanelController</c>'s own private <c>ChatPageId</c>) — the id that
/// actually survives base-merge in the host-mounted tree <see cref="Bind"/>
/// operates on. Used to SCOPE the scrollbar lookup below.</summary>
private const uint PageSlotElementId = 0x1000050Cu;
/// <summary>The row ListBox (dat Type 5) — <c>m_pOptionBox</c>.</summary>
public const uint ListBoxElementId = 0x1000050Du;
/// <summary>The ListBox's linked scrollbar — shared with the Config tab (research
/// doc §10.1: both tabs author the SAME scrollbar element id).</summary>
public const uint ScrollbarElementId = 0x10000201u;
private const int HeaderTemplateIndex = 0;
private const int SeparatorTemplateIndex = 1;
private const int UnlabelledSliderTemplateIndex = 3;
private const int LabelledSliderTemplateIndex = 6;
private const int BitfieldTemplateIndex = 8;
private const uint StringTableId = 0x23000003u;
/// <summary>The slider leaf inside either slider row template's subtree.</summary>
private const uint SliderElementId = 0x1000021Cu;
/// <summary>Labelled slider template's low/high range-caption children
/// (research doc §1.5's template array; present only on template idx 6).</summary>
private const uint SliderRangeMinElementId = 0x1000021Eu;
private const uint SliderRangeMaxElementId = 0x1000021Fu;
/// <summary>One authored filter row: its combined 64-bit mask (bits[63:32] =
/// research doc's "high", bits[31:0] = "low") and retail's own
/// <c>ID_ChatOption_TextFilter_*</c> symbol name (used verbatim as the hash key —
/// "Allegience" is retail's OWN misspelling in the symbol; the STRING TABLE value
/// it resolves to is properly spelled "Allegiance", per structure doc §10.4 item 8
/// and §5.2's own footnote).</summary>
public readonly record struct FilterRowSpec(ulong Mask, string RetailLabelKey);
/// <summary>
/// The 13-row authored order, byte-verified against BOTH
/// <c>AddCheckboxBitfield64Option</c>'s shared tail (Combat..Error, always present)
/// and the two inline blocks' own Gameplay-row prefix (main SKIPS it; window 5
/// INCLUDES it) — research doc §5.2. Row 0 (Gameplay) is the one
/// <see cref="FilterBlockSpec.IncludesGameplayRow"/> gates per block.
/// </summary>
public static readonly FilterRowSpec[] FilterRows =
{
new(0x0000000083912021ul, "ID_ChatOption_TextFilter_Gameplay"),
new(0x0000000000600040ul, "ID_ChatOption_TextFilter_Combat"),
new(0x0000000000020080ul, "ID_ChatOption_TextFilter_Magic"),
new(0x0000000000001004ul, "ID_ChatOption_TextFilter_AreaSpeech"),
new(0x0000000000000018ul, "ID_ChatOption_TextFilter_Tells"),
new(0x0000000000040C00ul, "ID_ChatOption_TextFilter_Allegience"), // retail's own misspelling
new(0x0000000000080000ul, "ID_ChatOption_TextFilter_Fellowship"),
new(0x0000000008000000ul, "ID_ChatOption_TextFilter_General"),
new(0x0000000010000000ul, "ID_ChatOption_TextFilter_Trade"),
new(0x0000000020000000ul, "ID_ChatOption_TextFilter_LFG"),
new(0x0000000040000000ul, "ID_ChatOption_TextFilter_Roleplay"),
new(0x0000000100000000ul, "ID_ChatOption_TextFilter_Society"),
new(0x0000000004000000ul, "ID_ChatOption_TextFilter_Error"),
};
/// <summary>One authored per-window filter block/section.</summary>
public readonly record struct FilterBlockSpec(
int RetailWindowId,
int CompactWindowId,
string HeaderKey,
ulong DefaultFilter,
bool IncludesGameplayRow);
/// <summary>
/// The five window sections in authored order — research doc §5/§5.2, byte-
/// verified defaults matching <see cref="ChatWindowState"/>'s own committed
/// constants exactly (both sides derive from the SAME retail literals; this table
/// reuses <see cref="ChatWindowState"/>'s named constants rather than re-declaring
/// them, so the two can never drift).
/// </summary>
public static readonly FilterBlockSpec[] FilterBlocks =
{
new(8, ChatWindowState.MainWindowId, "ID_ChatOption_MainChatWindow_Section",
ChatWindowState.MainWindowDefaultFilter, IncludesGameplayRow: false),
new(2, 1, "ID_ChatOption_FloatyChatWindow1_Section",
ChatWindowState.Floaty1DefaultFilter, IncludesGameplayRow: true),
new(3, 2, "ID_ChatOption_FloatyChatWindow2_Section",
ChatWindowState.Floaty2DefaultFilter, IncludesGameplayRow: true),
new(4, 3, "ID_ChatOption_FloatyChatWindow3_Section",
ChatWindowState.Floaty3DefaultFilter, IncludesGameplayRow: true),
new(5, 4, "ID_ChatOption_FloatyChatWindow4_Section",
ChatWindowState.Floaty4DefaultFilter, IncludesGameplayRow: true),
};
/// <summary>The live read/write seam every row on this page writes/reads
/// through. Opacity routes to <c>RetailWindowOpacityController</c> (AP-190's
/// live per-window fade); filters route to the shared <see cref="ChatWindowState"/>
/// CH6 already consumes. The two DAT-extracted defaults are resolved ONCE by the
/// caller (<c>RetailUiRuntime</c>) — <see cref="ChatOptionsDatDefaults"/> — since
/// they never change within a session.</summary>
public sealed record Bindings(
Func<float> CurrentDefaultOpacity,
Func<float> CurrentActiveOpacity,
Action<float> SetDefaultOpacity,
Action<float> SetActiveOpacity,
float DefaultOpacityDatDefault,
float ActiveOpacityDatDefault,
Func<int, ulong> CurrentFilter,
Action<int, ulong> SetFilter);
/// <summary>
/// Builds the General Options header + 2 sliders + 5 filter sections (header +
/// block each) into <paramref name="layout"/>'s Chat ListBox, links its
/// scrollbar, seeds every row's current/default state, and registers each row
/// into <paramref name="page"/>.
/// </summary>
/// <param name="layout">The already-built Options panel tree — the Chat page's
/// ListBox is a descendant of it via the tab host's page-slot base-merge (same
/// import <see cref="OptionsPanelController.Bind"/> used).</param>
/// <param name="page">The Chat tab's <see cref="OptionPage"/> model
/// (<see cref="OptionsPanelController.ChatPage"/>).</param>
/// <param name="templateResolver">Builds one row template's subtree — wired onto
/// the ListBox's <see cref="UiTemplateListBox.TemplateResolver"/> AND called
/// directly for the five bitfield blocks (bypassing
/// <see cref="UiTemplateListBox.AddItemFromTemplateList"/>'s own resolve step —
/// see <see cref="UiTemplateListBox.AddPrebuiltRow"/> for why).</param>
/// <param name="resolveString">Resolves ONE <c>ID_ChatOption_*</c> string by
/// (table id, hash) — never hard-coded English.</param>
/// <param name="bindings">The live read/write seam for every row.</param>
/// <returns><see langword="false"/> if the Chat page's ListBox did not resolve as
/// a <see cref="UiTemplateListBox"/>.</returns>
public static bool Bind(
ImportedLayout layout,
OptionPage page,
Func<uint, uint, UiElement?> templateResolver,
Func<uint, uint, string?> resolveString,
Bindings bindings)
{
ArgumentNullException.ThrowIfNull(layout);
ArgumentNullException.ThrowIfNull(page);
ArgumentNullException.ThrowIfNull(templateResolver);
ArgumentNullException.ThrowIfNull(resolveString);
ArgumentNullException.ThrowIfNull(bindings);
if (layout.FindElement(ListBoxElementId) is not UiTemplateListBox listBox)
{
Console.WriteLine(
$"[D.2b] ChatOptionsPageController: ListBox 0x{ListBoxElementId:X8} "
+ "not found (or not a UiTemplateListBox) in the built Options panel tree — "
+ "the Chat tab will have no rows.");
return false;
}
listBox.TemplateResolver = templateResolver;
// ScrollbarElementId (0x10000201) is SHARED with the Config tab (research
// doc §10.1 — both tabs author the same scrollbar element id). ImportedLayout's
// FindElement is a flat id->widget dictionary (last-build-wins on a
// collision), so a plain layout.FindElement(ScrollbarElementId) here can
// silently wire THIS scroll model onto Config's own scrollbar instance
// instead of Chat's — scope the search to the Chat page's own subtree
// instead (same "scoped search for a shared id" shape
// OptionsPanelController uses for the Apply/Reset/Defaults buttons). Scoped
// from PageSlotElementId, NOT RootElementId — see that field's own doc for
// why the standalone layout's root id does not survive base-merge here.
UiElement? chatPageSlot = layout.FindElement(PageSlotElementId);
UiElement? scrollbarElement = chatPageSlot is null
? null
: UiElement.FindDescendant(chatPageSlot, ScrollbarElementId);
if (scrollbarElement is UiScrollbar scrollbar)
scrollbar.Model = listBox.Scroll;
else
Console.WriteLine(
$"[D.2b] ChatOptionsPageController: scrollbar 0x{ScrollbarElementId:X8} "
+ $"not found under Chat page slot 0x{PageSlotElementId:X8} — the Chat "
+ "tab's row list will not scroll.");
BuildHeaderRow(listBox, "ID_ChatOption_GeneralOptions_Section", resolveString);
BuildOpacitySliders(listBox, page, resolveString, bindings);
BuildSeparatorRow(listBox);
foreach (FilterBlockSpec spec in FilterBlocks)
{
BuildHeaderRow(listBox, spec.HeaderKey, resolveString);
BuildFilterBlock(listBox, spec, page, templateResolver, resolveString, bindings);
BuildSeparatorRow(listBox);
}
return true;
}
private static void BuildHeaderRow(
UiTemplateListBox listBox, string headerKey, Func<uint, uint, string?> resolveString)
{
if (listBox.AddItemFromTemplateList(HeaderTemplateIndex) is not UiText header)
{
Console.WriteLine(
$"[D.2b] ChatOptionsPageController: header template did not build as "
+ $"UiText for '{headerKey}'.");
return;
}
string? label = resolveString(StringTableId, DatStringResolver.ComputeHash(headerKey));
if (label is null)
{
Console.WriteLine(
$"[D.2b] ChatOptionsPageController: header string '{headerKey}' did not "
+ "resolve from the DAT string table — the row renders with no text rather "
+ "than an invented label.");
return;
}
header.LinesProvider = () => new[] { new UiText.Line(label, header.DefaultColor) };
}
private static void BuildSeparatorRow(UiTemplateListBox listBox)
{
if (listBox.AddItemFromTemplateList(SeparatorTemplateIndex) is null)
Console.WriteLine("[D.2b] ChatOptionsPageController: separator template did not build.");
}
/// <summary>
/// Slider 1 (template idx 3, unlabelled — <c>Option_DefaultOpacity_Property</c>)
/// and slider 2 (template idx 6, labelled with the
/// <c>ID_UI_Value_Transparent</c>/<c>ID_UI_Value_Opaque</c> range captions —
/// <c>Option_ActiveOpacity_Property</c>). Retail's <c>DualHash</c> slider link
/// (research doc §5.1) is ported through <see cref="FloatOptionRow.RefreshFromLink"/>:
/// dragging one applies through <paramref name="bindings"/> (which itself runs
/// <c>ChatOpacityLink</c> and re-applies live), then pushes whatever the OTHER
/// value became onto its own row/slider — raising one drags the other, never
/// clamps.
/// </summary>
private static void BuildOpacitySliders(
UiTemplateListBox listBox,
OptionPage page,
Func<uint, uint, string?> resolveString,
Bindings bindings)
{
UiElement? row1 = listBox.AddItemFromTemplateList(UnlabelledSliderTemplateIndex);
UiScrollbar? slider1 = row1 is null ? null : UiElement.FindDescendant(row1, SliderElementId) as UiScrollbar;
if (slider1 is null)
Console.WriteLine(
"[D.2b] ChatOptionsPageController: default-opacity slider template did not "
+ "build a UiScrollbar leaf.");
UiElement? row2 = listBox.AddItemFromTemplateList(LabelledSliderTemplateIndex);
UiScrollbar? slider2 = row2 is null ? null : UiElement.FindDescendant(row2, SliderElementId) as UiScrollbar;
if (slider2 is null)
Console.WriteLine(
"[D.2b] ChatOptionsPageController: active-opacity slider template did not "
+ "build a UiScrollbar leaf.");
if (row2 is not null)
{
SetRangeLabel(row2, SliderRangeMinElementId, "ID_UI_Value_Transparent", resolveString);
SetRangeLabel(row2, SliderRangeMaxElementId, "ID_UI_Value_Opaque", resolveString);
}
if (slider1 is null || slider2 is null)
return;
float initialDefault = bindings.CurrentDefaultOpacity();
float initialActive = bindings.CurrentActiveOpacity();
slider1.SetScalarPosition(initialDefault);
slider2.SetScalarPosition(initialActive);
FloatOptionRow? defaultRow = null;
FloatOptionRow? activeRow = null;
defaultRow = new FloatOptionRow(
initialDefault,
bindings.DefaultOpacityDatDefault,
apply: value =>
{
bindings.SetDefaultOpacity(value);
activeRow!.RefreshFromLink(bindings.CurrentActiveOpacity());
},
read: bindings.CurrentDefaultOpacity,
refresh: value => slider1.SetScalarPosition(value));
activeRow = new FloatOptionRow(
initialActive,
bindings.ActiveOpacityDatDefault,
apply: value =>
{
bindings.SetActiveOpacity(value);
defaultRow!.RefreshFromLink(bindings.CurrentDefaultOpacity());
},
read: bindings.CurrentActiveOpacity,
refresh: value => slider2.SetScalarPosition(value));
slider1.ScalarChanged = value => defaultRow.SetCurrentValue(value);
slider2.ScalarChanged = value => activeRow.SetCurrentValue(value);
page.Register(defaultRow);
page.Register(activeRow);
}
private static void SetRangeLabel(
UiElement row, uint elementId, string labelKey, Func<uint, uint, string?> resolveString)
{
if (UiElement.FindDescendant(row, elementId) is not UiText text)
return;
string? label = resolveString(StringTableId, DatStringResolver.ComputeHash(labelKey));
if (label is null)
{
Console.WriteLine(
$"[D.2b] ChatOptionsPageController: range label '{labelKey}' did not "
+ "resolve — rendered with no text rather than invented English.");
return;
}
text.LinesProvider = () => new[] { new UiText.Line(label, text.DefaultColor) };
}
/// <summary>
/// One per-window filter block: resolves the block template DIRECTLY through
/// <paramref name="templateResolver"/> (NOT via
/// <see cref="UiTemplateListBox.AddItemFromTemplateList"/> — the block must be
/// fully populated, growing to its final self-sized height (AP-195), BEFORE it is
/// stacked into <paramref name="listBox"/>'s viewport), seeds it with retail's
/// authored window default, adds every authored row (skipping "Gameplay" on the
/// main window per <see cref="FilterBlockSpec.IncludesGameplayRow"/>), THEN inserts
/// it via <see cref="UiTemplateListBox.AddPrebuiltRow"/>.
/// </summary>
private static void BuildFilterBlock(
UiTemplateListBox listBox,
FilterBlockSpec spec,
OptionPage page,
Func<uint, uint, UiElement?> templateResolver,
Func<uint, uint, string?> resolveString,
Bindings bindings)
{
if (BitfieldTemplateIndex >= listBox.Templates.Count)
{
Console.WriteLine(
$"[D.2b] ChatOptionsPageController: bitfield template index "
+ $"{BitfieldTemplateIndex} missing from the Chat ListBox's authored "
+ $"template list — window {spec.RetailWindowId}'s filter block was not built.");
return;
}
UiTemplateListEntry entry = listBox.Templates[BitfieldTemplateIndex];
UiElement? built = templateResolver(entry.TemplateLayoutId, entry.TemplateElementId);
if (built is not UiCheckboxBitfield64 block)
{
Console.WriteLine(
$"[D.2b] ChatOptionsPageController: filter block template did not build as "
+ $"UiCheckboxBitfield64 for window {spec.RetailWindowId}.");
return;
}
// The block resolved fresh through templateResolver above — it needs its
// OWN TemplateResolver wired (a SEPARATE property from the outer
// listBox.TemplateResolver) before AddChild can resolve its per-row
// template (0x10000521), exactly like the outer ListBox's own wiring a
// few lines up in Bind().
block.TemplateResolver = templateResolver;
(ulong defaultLow, ulong defaultHigh) = SplitMask(spec.DefaultFilter);
block.SetDefaultValue(defaultLow, defaultHigh);
for (int i = 0; i < FilterRows.Length; i++)
{
if (i == 0 && !spec.IncludesGameplayRow)
continue; // research doc §5.2: the main window has no Gameplay row.
FilterRowSpec rowSpec = FilterRows[i];
string? label = resolveString(StringTableId, DatStringResolver.ComputeHash(rowSpec.RetailLabelKey));
string? tooltip = resolveString(
StringTableId, DatStringResolver.ComputeHash(rowSpec.RetailLabelKey + "_Desc"));
if (label is null)
Console.WriteLine(
$"[D.2b] ChatOptionsPageController: filter row label "
+ $"'{rowSpec.RetailLabelKey}' did not resolve — row renders with no "
+ "caption rather than invented English.");
(ulong low, ulong high) = SplitMask(rowSpec.Mask);
if (block.AddChild(low, high, label ?? string.Empty, tooltip) is null)
Console.WriteLine(
$"[D.2b] ChatOptionsPageController: filter row '{rowSpec.RetailLabelKey}' "
+ $"did not build for window {spec.RetailWindowId}.");
}
listBox.AddPrebuiltRow(block);
ulong initial = bindings.CurrentFilter(spec.CompactWindowId);
(ulong initialLow, ulong initialHigh) = SplitMask(initial);
block.SetCurrentValue(initialLow, initialHigh); // live seed, not the window default
var row = new BitfieldOptionRow(
initial,
spec.DefaultFilter,
apply: value =>
{
(ulong low, ulong high) = SplitMask(value);
block.SetCurrentValue(low, high);
bindings.SetFilter(spec.CompactWindowId, value);
},
read: () => bindings.CurrentFilter(spec.CompactWindowId),
refresh: value =>
{
(ulong low, ulong high) = SplitMask(value);
block.SetCurrentValue(low, high);
});
block.ValueChanged = (low, high) => row.SetCurrentValue(CombineMask(low, high));
page.Register(row);
}
/// <summary>Splits ONE 64-bit filter value into (bits[31:0], bits[63:32]) —
/// the same split <see cref="UiCheckboxBitfield64"/>'s Low/High pair encodes (see
/// this class's own doc for why that is not a genuine 128-bit value).</summary>
private static (ulong Low, ulong High) SplitMask(ulong combined)
=> (combined & 0xFFFFFFFFul, (combined >> 32) & 0xFFFFFFFFul);
/// <summary>Inverse of <see cref="SplitMask"/>.</summary>
private static ulong CombineMask(ulong low, ulong high)
=> ((high & 0xFFFFFFFFul) << 32) | (low & 0xFFFFFFFFul);
}

View file

@ -159,7 +159,11 @@ public static class DatWidgetFactory
// gmChatOptionsUI::AddCheckboxBitfield64Option call pattern (research doc
// §5.2). AddChild(lowMask, highMask, label, tooltip) resolves that SAME
// template per row instead of synthesizing a fake ElementInfo.
0x10000044u => new UiCheckboxBitfield64(info.TemplateList),
// AP-195 (OP5): the block ALSO authors its own all/partial-set LED media
// (dat properties 0x10000082/0x10000083) directly on this element — thread
// them through so Refresh's ported LED swap has real sprites to apply.
0x10000044u => new UiCheckboxBitfield64(
info.TemplateList, info.LedCheckedSprite, info.LedUncheckedSprite),
_ => new UiDatElement(info, resolve), // generic fallback (incl. Type 3 chrome/containers)
};

View file

@ -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)

View file

@ -168,6 +168,198 @@ public sealed class BoolOptionRow : IOptionRow
}
}
/// <summary>
/// Campaign OP slice OP5: the Chat tab's two linked opacity sliders' leaf —
/// <c>UIOption_Slider</c>'s current/saved/default triple over a <see cref="float"/>,
/// same shape as <see cref="BoolOptionRow"/> (research doc §3.3's leaf semantics apply
/// identically; retail's <c>UIOption_Slider</c> shares the same base <c>UIOption</c>
/// verbs as <c>UIOption_Checkbox</c>, just over a float value). <see cref="SetCurrentValue"/>
/// is what dragging the slider thumb runs — retail's <c>SetCurrentValue → Apply(1)</c>
/// applies LIVE, immediately, on every drag tick (not just mouse-up), which is what
/// makes the two Chat-tab sliders visibly fade windows WHILE dragging rather than only
/// on release.
/// </summary>
public sealed class FloatOptionRow : IOptionRow
{
private readonly Action<float>? _apply;
private readonly Func<float>? _read;
private readonly Action<float>? _refresh;
private Action? _notifyPageOptionChanged;
private float _current;
private float _saved;
private float _default;
/// <param name="read">Re-reads the LIVE value on <see cref="SaveCurrentValue"/>
/// (OnShown/Apply) — same MUST-FIX 1 discipline as <see cref="BoolOptionRow"/>'s
/// own <c>read</c> parameter.</param>
/// <param name="refresh">Pushes a re-read/linked value onto the slider widget
/// WITHOUT invoking <paramref name="apply"/> — used by both the OnShown re-seed
/// AND by <see cref="RefreshFromLink"/> (the linked slider's own drag moving THIS
/// row's value as a side effect, per <c>ChatOpacityLink</c>'s never-clamp-always-
/// drag-the-other invariant).</param>
public FloatOptionRow(
float initial,
float defaultValue,
Action<float>? apply = null,
Func<float>? read = null,
Action<float>? refresh = null)
{
_current = initial;
_saved = initial;
_default = defaultValue;
_apply = apply;
_read = read;
_refresh = refresh;
}
/// <summary>The live value — what the slider thumb currently shows.</summary>
public float Current => _current;
/// <summary>The committed baseline Reset reverts to.</summary>
public float Saved => _saved;
/// <summary>The value Defaults restores (the DAT <c>DBProperties</c>-extracted
/// slider default for the Chat tab's two sliders — U1's
/// <c>InqDefaultGameplayOptionProperty</c> mechanism, this tab's genuine
/// consumer).</summary>
public float DefaultValue => _default;
public bool Changed => _saved != _current;
public void SetDefaultValue(float value) => _default = value;
/// <summary>Retail <c>SetCurrentValue</c> — the drag-tick entry point. Writes
/// <c>m_current</c> and applies it live IMMEDIATELY; does not touch
/// <see cref="Saved"/>.</summary>
public void SetCurrentValue(float value)
{
_current = value;
_apply?.Invoke(value);
_notifyPageOptionChanged?.Invoke();
}
/// <summary>
/// The LINKED slider's own drag already ran <c>ChatOpacityLink</c>'s math and
/// applied the new pair live (a single <c>RetailWindowOpacityController</c> call
/// covers both values) — this pushes the resulting value onto THIS row/widget
/// without re-applying (that would double-fire the live opacity write) but still
/// notifies the page, since the OTHER slider's <c>Changed</c> baseline may now
/// differ too (retail's <c>DualHash</c> link moves both sliders' own
/// <c>m_current</c>).
/// </summary>
public void RefreshFromLink(float value)
{
_current = value;
_refresh?.Invoke(value);
_notifyPageOptionChanged?.Invoke();
}
public void AttachPageNotify(Action notify) => _notifyPageOptionChanged = notify;
public void SaveCurrentValue()
{
if (_read is not null)
{
_current = _read();
_refresh?.Invoke(_current);
}
_saved = _current;
}
public void RestoreSavedValue()
{
_current = _saved;
_apply?.Invoke(_current);
}
public void RestoreDefaultValue()
{
_current = _default;
_apply?.Invoke(_current);
}
}
/// <summary>
/// Campaign OP slice OP5: one of the Chat tab's five per-window text-filter
/// <c>UIOption_CheckboxBitfield64</c> blocks — the current/saved/default triple over
/// the block's combined 64-bit filter value (retail's genuine one-register
/// <c>m_llTextTypeFilter</c> shape; see <c>UiCheckboxBitfield64</c>'s own class doc for
/// why the widget's <c>CurrentLow</c>/<c>CurrentHigh</c> pair is just that ONE 64-bit
/// value split at the 32-bit boundary, not a 128-bit value). Unlike
/// <see cref="BoolOptionRow"/>/<see cref="FloatOptionRow"/>, the WIDGET already IS the
/// live UI for N individual checkboxes and fires <see cref="UiCheckboxBitfield64.ValueChanged"/>
/// on any row toggle — this row wraps that composite value the same way a page needs,
/// translating widget-originated edits into <see cref="AttachPageNotify"/>/
/// <c>bindings.SetFilter</c> and page-originated reverts (Reset/Defaults/OnShown) into
/// <see cref="UiCheckboxBitfield64.SetCurrentValue"/> pushes.
/// </summary>
public sealed class BitfieldOptionRow : IOptionRow
{
private readonly Action<ulong>? _apply;
private readonly Func<ulong>? _read;
private readonly Action<ulong>? _refresh;
private Action? _notifyPageOptionChanged;
private ulong _current;
private ulong _saved;
private ulong _default;
public BitfieldOptionRow(
ulong initial,
ulong defaultValue,
Action<ulong>? apply = null,
Func<ulong>? read = null,
Action<ulong>? refresh = null)
{
_current = initial;
_saved = initial;
_default = defaultValue;
_apply = apply;
_read = read;
_refresh = refresh;
}
public ulong Current => _current;
public ulong Saved => _saved;
public ulong DefaultValue => _default;
public bool Changed => _saved != _current;
public void SetDefaultValue(ulong value) => _default = value;
/// <summary>The widget-originated entry point — wired to
/// <see cref="UiCheckboxBitfield64.ValueChanged"/>, fired the instant a row
/// checkbox toggles (retail's own per-checkbox <c>Apply(1)</c>).</summary>
public void SetCurrentValue(ulong value)
{
_current = value;
_apply?.Invoke(value);
_notifyPageOptionChanged?.Invoke();
}
public void AttachPageNotify(Action notify) => _notifyPageOptionChanged = notify;
public void SaveCurrentValue()
{
if (_read is not null)
{
_current = _read();
_refresh?.Invoke(_current);
}
_saved = _current;
}
public void RestoreSavedValue()
{
_current = _saved;
_apply?.Invoke(_current);
}
public void RestoreDefaultValue()
{
_current = _default;
_apply?.Invoke(_current);
}
}
/// <summary>
/// Retail <c>OptionPage</c>/<c>PlayerOptionPage</c>: a page's registered-option
/// array plus the four verbs (Apply/Reset/Defaults/visibility) with retail's

View file

@ -657,19 +657,18 @@ public sealed class RetailUiRuntime : IDisposable
};
/// <summary>
/// Capture the four floating windows' current text-type filters into
/// the local settings store (research doc §4.4/§6.1 — local-only until
/// CH6f's wire format). No-op when no store was wired.
/// Capture the main window's and four floating windows' current text-type
/// filters into the local settings store (research doc §4.4/§6.1 — local-only
/// until a future retail <c>0x1000008C</c> wire format). No-op when no store was
/// wired.
///
/// <para>
/// CH6a/b REJECT-review NIT 1: unlike window geometry/visibility (which
/// <see cref="_persistence"/> auto-saves on every change), a filter
/// change is only captured here — i.e. only when <see cref="SaveLayout"/>
/// runs, which today is exclusively the explicit <c>/saveautoui</c>
/// command. Harmless in practice (nothing currently mutates a window's
/// filter live — no options UI exists yet), but worth tightening to
/// auto-save-on-change once CH6e/CH6f gives filters a live settings
/// surface a user can actually edit mid-session.
/// CH6a/b REJECT-review NIT 1 — CLOSED by Campaign OP slice OP5: filters are now
/// ALSO captured on every live edit through the Chat tab's five filter blocks
/// (each block's <c>BitfieldOptionRow.apply</c> closure calls this directly), not
/// only when <see cref="SaveLayout"/> runs via the explicit <c>/saveautoui</c>
/// command — OP5 is the "live settings surface a user can actually edit
/// mid-session" this NIT was waiting on.
/// </para>
/// </summary>
private void SaveChatWindowFilters()
@ -679,6 +678,7 @@ public sealed class RetailUiRuntime : IDisposable
ChatSettings current = store.LoadChat();
store.SaveChat(current with
{
ChatWindowMainFilter = windows.GetFilter(ChatWindowState.MainWindowId),
ChatWindow1Filter = windows.GetFilter(1),
ChatWindow2Filter = windows.GetFilter(2),
ChatWindow3Filter = windows.GetFilter(3),
@ -686,6 +686,25 @@ public sealed class RetailUiRuntime : IDisposable
});
}
/// <summary>
/// Campaign OP slice OP5: persists the Chat tab's two opacity-slider values —
/// the "worth tightening to auto-save-on-change" gap
/// <see cref="SaveChatWindowFilters"/>'s own doc flagged before a live options UI
/// existed to edit them. Called from the Chat tab's slider apply closures, so
/// every drag tick is captured (matching the filter blocks' own auto-save-on-
/// change wiring below, not the old "only on /saveautoui" schedule).
/// </summary>
private void SaveChatOpacity()
{
if (_bindings.Chat.Store is not { } store) return;
ChatSettings current = store.LoadChat();
store.SaveChat(current with
{
DefaultOpacity = WindowOpacity.DefaultOpacity,
ActiveOpacity = WindowOpacity.ActiveOpacity,
});
}
public void CloseWindow(string name)
{
if (RetailPanelCatalog.TryGetPanelId(name, out uint panelId))
@ -898,6 +917,16 @@ public sealed class RetailUiRuntime : IDisposable
return;
}
// Campaign OP slice OP5: the main window's own filter (id 0) is now
// user-settable through the Chat tab's main-window filter block
// (research doc §5.2) — seed it from the local store here, the same
// "local-only persistence" leg MountFloatingChatWindows already runs
// for windows 1-4 (research doc §4.4/§6.1 — the retail 0x1000008C
// gameplay-options wire remains explicitly deferred).
if (_bindings.Chat.Store is { } chatStore)
_bindings.Chat.Windows.SetFilter(
ChatWindowState.MainWindowId, chatStore.LoadChat().ChatWindowMainFilter);
ChatWindowController? controller = ChatWindowController.Bind(
info,
layout,
@ -2040,6 +2069,68 @@ public sealed class RetailUiRuntime : IDisposable
Console.WriteLine("[UI] options panel: Character tab rows did not bind.");
}
// Campaign OP slice OP5 (2026-08-11): the Chat tab's 6 headers, 2 linked
// opacity sliders, and 5 per-window filter blocks. Same "runs before
// ActivateTabs, own dat-lock scope" shape as the Character-tab block above.
lock (_bindings.Assets.DatLock)
{
var strings = new DatStringResolver(_bindings.Assets.Dats);
// U1's Chat-tab-specific consumer (this class's own doc trace): the
// two sliders' Defaults values come from the DAT DBProperties
// collection, resolved ONCE — the installed DAT does not change
// within a session.
if (!Layout.ChatOptionsDatDefaults.TryRead(
_bindings.Assets.Dats, out float datDefaultOpacity, out float datActiveOpacity))
{
Console.WriteLine(
"[UI] options panel: Chat tab opacity DAT defaults did not resolve "
+ "(DID 0x78000001) — falling back to retail's ChatInterface base-"
+ "constructor values (0.5/1.0).");
}
bool chatBound = Layout.ChatOptionsPageController.Bind(
layout,
controller.ChatPage,
templateResolver: (templateLayoutId, templateElementId) =>
{
ElementInfo? info = LayoutImporter.ImportInfos(
_bindings.Assets.Dats, templateLayoutId, templateElementId);
return info is null
? null
: LayoutImporter.Build(
info,
_bindings.Assets.ResolveSprite,
_bindings.Assets.DefaultFont,
_bindings.Assets.ResolveFont,
strings.Resolve).Root;
},
resolveString: (tableId, stringId) => strings.Resolve(tableId, stringId),
new Layout.ChatOptionsPageController.Bindings(
CurrentDefaultOpacity: () => WindowOpacity.DefaultOpacity,
CurrentActiveOpacity: () => WindowOpacity.ActiveOpacity,
SetDefaultOpacity: value =>
{
WindowOpacity.SetDefaultOpacity(value);
SaveChatOpacity();
},
SetActiveOpacity: value =>
{
WindowOpacity.SetActiveOpacity(value);
SaveChatOpacity();
},
DefaultOpacityDatDefault: datDefaultOpacity,
ActiveOpacityDatDefault: datActiveOpacity,
CurrentFilter: windowId => _bindings.Chat.Windows.GetFilter(windowId),
SetFilter: (windowId, value) =>
{
_bindings.Chat.Windows.SetFilter(windowId, value);
SaveChatWindowFilters();
}));
if (!chatBound)
Console.WriteLine("[UI] options panel: Chat tab rows did not bind.");
}
controller.ActivateTabs();
RetailWindowHandle handle = RetailWindowFrame.Mount(

View file

@ -116,6 +116,24 @@ public sealed class UiButton : UiElement, IUiGlobalTimeListener, IUiDatStateful
public float FaceWidth { get; set; }
public float FaceHeight { get; set; }
/// <summary>
/// AP-195 (Campaign OP slice OP5): when non-null, drawn as the face media INSTEAD
/// of <see cref="ActiveState"/>'s resolved sprite — a dat RenderSurface id, not a
/// pre-resolved texture handle (resolved through the same <c>_resolve</c> callback
/// as the normal path, so tiling/UV math stays identical). Ports retail
/// <c>UIOption_CheckboxBitfield64::Refresh @0x004859C0</c>'s
/// <c>SetMediaImageForState(indicatorChild, dataId, 1, 6)</c>: the Chat tab's
/// per-window filter rows force their 5-state LED indicator to ONE fixed image
/// (the block-level all/partial-set sprite) regardless of hover/press state,
/// bypassing the checkbox's own per-state media entirely. Null (default) restores
/// the ordinary <see cref="ActiveState"/>-driven lookup — every other button
/// instance in the codebase is unaffected. Same shape as
/// <see cref="Layout.UiDatElement.RuntimeImageTexture"/>, deliberately a DID here
/// (not a texture handle) because the checkbox draw path already resolves its
/// file id through <c>_resolve</c> for correct native-size UV tiling.
/// </summary>
public uint? FaceFileOverride { get; set; }
/// <summary>Additional left inset for left-aligned labels.</summary>
public float LabelOffsetX { get; set; } = 3f;
@ -326,7 +344,7 @@ public sealed class UiButton : UiElement, IUiGlobalTimeListener, IUiDatStateful
}
else
{
uint file = ActiveFile(_mediaInfo);
uint file = FaceFileOverride ?? ActiveFile(_mediaInfo);
if (file != 0)
{
var (tex, tw, th) = _resolve(file);

View file

@ -70,6 +70,19 @@ public sealed class UiCheckboxBitfield64 : UiPanel
/// </summary>
public IReadOnlyList<UiTemplateListEntry> Templates { get; }
/// <summary>
/// AP-195 (Campaign OP slice OP5): block-level "all mask bits set" LED media
/// (dat property <c>0x10000082</c> on THIS element, <c>0x06004D17</c> on the
/// installed DAT). 0 when the authoring template carries none — the LED override
/// is then simply never applied (rows keep their per-row authored art).
/// </summary>
public uint CheckedLedSprite { get; }
/// <summary>AP-195 counterpart of <see cref="CheckedLedSprite"/>: block-level
/// "checked but not every mask bit set" LED media (dat property
/// <c>0x10000083</c>, <c>0x06004D19</c>).</summary>
public uint UncheckedLedSprite { get; }
/// <summary>Same seam as <see cref="UiTemplateListBox.TemplateResolver"/> — a page
/// controller wires this with real DAT access (Campaign OP slice OP5+). Left null
/// by <c>DatWidgetFactory</c> itself.</summary>
@ -84,12 +97,21 @@ public sealed class UiCheckboxBitfield64 : UiPanel
// SpriteResolve (forwarded to each row's built subtree) is inherited from UiPanel —
// same resolver shape, no need to redeclare it.
/// <summary>Fired with the new (low, high) value after any row toggles.</summary>
/// <summary>Fired with the new (low, high) value after any row toggles — a LIVE
/// user edit only (retail's <c>Apply(1)</c> path). NEVER fired by
/// <see cref="SetCurrentValue"/> (the OnShown/Reset/Defaults re-seed path — pushing
/// an externally-sourced value must not loop back into "the user changed this").
/// </summary>
public Action<ulong, ulong>? ValueChanged { get; set; }
public UiCheckboxBitfield64(IReadOnlyList<UiTemplateListEntry> templates)
public UiCheckboxBitfield64(
IReadOnlyList<UiTemplateListEntry> templates,
uint checkedLedSprite = 0u,
uint uncheckedLedSprite = 0u)
{
Templates = templates;
CheckedLedSprite = checkedLedSprite;
UncheckedLedSprite = uncheckedLedSprite;
BackgroundColor = Vector4.Zero;
BorderColor = Vector4.Zero;
}
@ -121,6 +143,24 @@ public sealed class UiCheckboxBitfield64 : UiPanel
ValueChanged?.Invoke(CurrentLow, CurrentHigh);
}
/// <summary>
/// Pushes an externally-sourced (low, high) value onto the widget — the page-model
/// re-seed path (retail's <c>Refresh</c> re-run after
/// <c>OptionPage::RestoreSavedValues</c>/<c>RestoreDefaultValues</c>/the OnShown
/// <c>SaveCurrentValue</c> re-read). Updates <see cref="CurrentLow"/>/
/// <see cref="CurrentHigh"/> and every row's checked state + AP-195 LED media, but
/// deliberately does NOT invoke <see cref="ValueChanged"/> — the caller (an
/// <c>IOptionRow</c> wrapper) already owns whatever notification it needs, and
/// firing here would loop a re-seed back into "the user changed this" (the same
/// live/refresh distinction <c>BoolOptionRow</c>'s <c>refresh</c> delegate makes).
/// </summary>
public void SetCurrentValue(ulong low, ulong high)
{
CurrentLow = low;
CurrentHigh = high;
RefreshRowVisuals();
}
/// <summary>
/// Retail <c>UIOption_CheckboxBitfield64::AddChild(lowMask, highMask, labelId,
/// tooltipId)</c> → <c>CreateChildren</c>'s per-row loop: instantiates the authored
@ -174,7 +214,6 @@ public sealed class UiCheckboxBitfield64 : UiPanel
// replaced by the typed mask closure below: equivalent routing,
// without a stringly attribute round-trip.
checkbox.TooltipText = tooltip;
checkbox.Selected = IsSet(lowMask, highMask);
checkbox.OnClick = () => ToggleRow(lowMask, highMask, checkbox);
row.Left = 0f;
@ -182,7 +221,24 @@ public sealed class UiCheckboxBitfield64 : UiPanel
_contentHeight += row.Height;
base.AddChild(row);
_rows.Add(new Row(lowMask, highMask, label, tooltip, row, checkbox));
// AP-195 self-sizing tail: retail's own CreateChildren ends with
// ResizeTo(GetWidth(), CalculatePaperSize(0, -1)) because
// UIOption_CheckboxBitfield64 IS a UIElement_ListBox (its PostInit
// tail-calls UIElement_Scrollable::PostInit) — the block grows to fit its
// rows instead of keeping its authored 272x100 extent. Width is untouched
// (GetWidth() — the ListBox's own authored column width); only Height
// grows, exactly matching the stacked _contentHeight this class already
// tracks per row. A dedicated ListBox-unification pass (reusing
// UiTemplateListBox's own viewport) remains future work per AP-195's own
// disposition menu; this direct resize is the recorded-rationale half of
// that menu — see UiTemplateListBox.AddPrebuiltRow for how a page
// controller reflows the ENCLOSING ListBox around this widget's now-final
// height instead of the pre-build authored one.
Height = _contentHeight;
var newRow = new Row(lowMask, highMask, label, tooltip, row, checkbox);
_rows.Add(newRow);
ApplyRowVisuals(newRow);
return checkbox;
}
@ -199,18 +255,26 @@ public sealed class UiCheckboxBitfield64 : UiPanel
}
/// <summary>
/// Retail <c>UIOption_CheckboxBitfield64::Refresh @0x004859C0</c>: a row is checked
/// when ANY bit of its mask is set in the current value — NOT when every bit is
/// set. <c>lowHit = current.low &amp; mask.low; highHit = current.high &amp;
/// mask.high; checked = (lowHit | highHit) != 0</c>. This is HALF of Refresh:
/// the same pass also computes the ALL-set predicate to swap each row's LED
/// media between the two authored surfaces (<c>P0x10000082 = 0x06004D17</c> /
/// <c>P0x10000083 = 0x06004D19</c>) — not ported yet, register row AP-195,
/// due with the Chat tab (OP5) alongside the ListBox self-sizing tail.
/// Retail <c>UIOption_CheckboxBitfield64::Refresh @0x004859C0</c>'s ANY-set half:
/// a row is checked when ANY bit of its mask is set in the current value — NOT
/// when every bit is set. <c>lowHit = current.low &amp; mask.low; highHit =
/// current.high &amp; mask.high; checked = (lowHit | highHit) != 0</c>.
/// </summary>
private bool IsSet(ulong lowMask, ulong highMask)
private bool IsAnySet(ulong lowMask, ulong highMask)
=> (CurrentLow & lowMask) != 0 || (CurrentHigh & highMask) != 0;
/// <summary>
/// AP-195: retail <c>Refresh</c>'s ALL-set half, computed by the SAME pass as
/// <see cref="IsAnySet"/> — <c>(current.low &amp; mask.low) == mask.low &amp;&amp;
/// (current.high &amp; mask.high) == mask.high</c>. Drives which of
/// <see cref="CheckedLedSprite"/>/<see cref="UncheckedLedSprite"/> a checked row's
/// LED shows: composite masks (e.g. the Gameplay row's <c>0x83912021</c>, five
/// bits) can be PARTIALLY satisfied — checked (any-set) but not fully (all-set) —
/// which single-bit rows (e.g. "General") can never observably distinguish.
/// </summary>
private bool IsAllSet(ulong lowMask, ulong highMask)
=> (CurrentLow & lowMask) == lowMask && (CurrentHigh & highMask) == highMask;
/// <summary>
/// Retail <c>UIOption_CheckboxBitfield64::ListenToElementMessage @0x00485AE0</c>:
/// <c>BitUtils::SetBitsOnOrOff(&amp;m_current, mask, onOff)</c> — decomp-confirmed
@ -219,7 +283,7 @@ public sealed class UiCheckboxBitfield64 : UiPanel
/// </summary>
private void ToggleRow(ulong lowMask, ulong highMask, UiButton toggle)
{
bool turnOn = !IsSet(lowMask, highMask);
bool turnOn = !IsAnySet(lowMask, highMask);
if (turnOn)
{
CurrentLow |= lowMask;
@ -230,13 +294,37 @@ public sealed class UiCheckboxBitfield64 : UiPanel
CurrentLow &= ~lowMask;
CurrentHigh &= ~highMask;
}
toggle.Selected = turnOn;
ApplyRowVisualsForMask(lowMask, highMask, toggle);
ValueChanged?.Invoke(CurrentLow, CurrentHigh);
}
private void RefreshRowVisuals()
{
foreach (Row row in _rows)
row.Toggle.Selected = IsSet(row.LowMask, row.HighMask);
ApplyRowVisuals(row);
}
private void ApplyRowVisuals(Row row) => ApplyRowVisualsForMask(row.LowMask, row.HighMask, row.Toggle);
/// <summary>
/// One row's complete <c>Refresh</c> visual: the ANY-set checked bool
/// (<see cref="UiButton.Selected"/>, always) plus AP-195's ALL-set-driven LED
/// media swap (<see cref="UiButton.FaceFileOverride"/>) — retail's own gate: the
/// swap ONLY applies while ANY-set is true; a fully-unchecked row keeps its
/// authored per-row art untouched (<c>Refresh @0x004859C0</c>'s
/// <c>if (ebx == 0) { ... media swap ... }</c> branch, where <c>ebx == 0</c> is
/// the ANY-set case per the byte trace in this class's own research citations).
/// </summary>
private void ApplyRowVisualsForMask(ulong lowMask, ulong highMask, UiButton toggle)
{
bool anySet = IsAnySet(lowMask, highMask);
toggle.Selected = anySet;
if (!anySet)
{
toggle.FaceFileOverride = null;
return;
}
uint overrideSprite = IsAllSet(lowMask, highMask) ? CheckedLedSprite : UncheckedLedSprite;
toggle.FaceFileOverride = overrideSprite != 0u ? overrideSprite : null;
}
}

View file

@ -179,6 +179,35 @@ public sealed class UiTemplateListBox : UiDatElement
UiElement? row = resolver(entry.TemplateLayoutId, entry.TemplateElementId);
if (row is null) return null;
return AddPrebuiltRow(row);
}
/// <summary>
/// AP-195 (Campaign OP slice OP5): stacks an ALREADY-BUILT row using the exact
/// same "below the previous row, then grow ContentHeight" placement
/// <see cref="AddItemFromTemplateList"/> uses internally, WITHOUT resolving it
/// through <see cref="TemplateResolver"/> first. For a row whose own final size
/// is not known until AFTER it is fully populated — the Chat tab's five
/// <see cref="UiCheckboxBitfield64"/> filter blocks, which self-size to fit
/// their N rows (retail's own <c>CreateChildren</c> tail,
/// <c>docs/architecture/retail-divergence-register.md</c> AP-195) — a page
/// controller resolves the block directly through the SAME
/// <see cref="TemplateResolver"/> delegate (bypassing
/// <see cref="AddItemFromTemplateList"/>'s own resolve step), calls
/// <c>SetDefaultValue</c> + N <c>AddChild</c> on it (growing its
/// <see cref="UiElement.Height"/> to its final, fully-populated extent), THEN
/// calls this method to insert it. Because the row is placed at its FINAL height
/// instead of its authored pre-build extent, this viewport's own
/// <see cref="UiScrollablePanel.ContentHeight"/> — and every row placed AFTER
/// it — accounts for the real size from the start; no retroactive reflow of
/// already-placed siblings is needed (this class has no such reflow mechanism —
/// each row's <see cref="UiElement.Top"/> is fixed at insertion time). This is
/// literally "reuse UiTemplateListBox's stacking," the disposition AP-195 itself
/// names as an acceptable alternative to a full ListBox-unification pass.
/// </summary>
public UiElement AddPrebuiltRow(UiElement row)
{
ArgumentNullException.ThrowIfNull(row);
UiScrollablePanel viewport = Viewport;
row.Left = 0f;
row.Top = viewport.ContentHeight;

View file

@ -69,6 +69,22 @@ public sealed class ChatWindowState
public const int MinFloatingWindowId = 1;
public const int MaxFloatingWindowId = 4;
/// <summary>
/// Retail's authored per-window text-type filter defaults
/// (<c>gmChatOptionsUI::InitOptions @0x0049FC60</c> /
/// <c>AddCheckboxBitfield64Option @0x0049EDA0</c>'s <c>SetDefaultValue</c> calls,
/// <c>docs/research/2026-08-10-options-panel-structure.md</c> §5.2). Named here
/// (rather than only as the private literals in <see cref="ResetToDefaults"/>)
/// because Campaign OP slice OP5's Chat-tab Defaults button needs the SAME
/// values <see cref="ResetToDefaults"/> seeds — one source, not two independently
/// literal tables that could drift.
/// </summary>
public const ulong MainWindowDefaultFilter = 0xFBFFFFFFul;
public const ulong Floaty1DefaultFilter = 0x0000101Cul;
public const ulong Floaty2DefaultFilter = 0x00040C00ul;
public const ulong Floaty3DefaultFilter = 0x00080000ul;
public const ulong Floaty4DefaultFilter = 0x78000000ul;
/// <summary>
/// Sentinel <c>targetWindowId</c> meaning "broadcast to every window,
/// subject to each window's own filter" — the acdream-internal analogue
@ -108,15 +124,15 @@ public sealed class ChatWindowState
// "everything 0x00-0x1F except 0x1A" (m_oldState 1/8) — genuinely
// consulted for broadcast lines now that BroadcastTargetWindow is
// distinct from MainWindowId (see class doc).
_filters[0] = 0xFBFFFFFFu;
_filters[0] = MainWindowDefaultFilter;
// Speech, Tell, Speech_Direct_Send, Emote (m_oldState 2).
_filters[1] = 0x0000101Cu;
_filters[1] = Floaty1DefaultFilter;
// Social, Social_Send, Allegiance (m_oldState 3).
_filters[2] = 0x00040C00u;
_filters[2] = Floaty2DefaultFilter;
// Fellowship (m_oldState 4).
_filters[3] = 0x00080000u;
_filters[3] = Floaty3DefaultFilter;
// Turbine General/Trade/LFG/Roleplay (m_oldState 5).
_filters[4] = 0x78000000u;
_filters[4] = Floaty4DefaultFilter;
_open[0] = true;
for (int i = MinFloatingWindowId; i <= MaxFloatingWindowId; i++)

View file

@ -62,6 +62,13 @@ public sealed record ChatSettings(
ulong ChatWindow2Filter = 0x00040C00u, // Social, Social_Send, Allegiance
ulong ChatWindow3Filter = 0x00080000u, // Fellowship
ulong ChatWindow4Filter = 0x78000000u, // Turbine General/Trade/LFG/Roleplay
// Campaign OP slice OP5: the MAIN chat window's own filter — CH6a/b's
// ChatWindowState.SetFilter already accepted window id 0 as a real write
// (its class doc: "Retail's main window IS user-settable through the
// options page; only the settings UI to drive this is future work") but
// nothing persisted it until the Chat tab's main-window filter block
// shipped. Default matches ChatWindowState.MainWindowDefaultFilter.
ulong ChatWindowMainFilter = 0xFBFFFFFFu,
// Campaign CH slice CH6c: retail's two GLOBAL window-opacity options
// (Option_DefaultOpacity_Property 0x10000080 / Option_ActiveOpacity_Property
// 0x10000081, docs/research/2026-08-09-chat-retail-window-shell.md §3).

View file

@ -197,6 +197,7 @@ public sealed class SettingsStore
ChatWindow2Filter: ReadULong(chat, "chatWindow2Filter", d.ChatWindow2Filter),
ChatWindow3Filter: ReadULong(chat, "chatWindow3Filter", d.ChatWindow3Filter),
ChatWindow4Filter: ReadULong(chat, "chatWindow4Filter", d.ChatWindow4Filter),
ChatWindowMainFilter: ReadULong(chat, "chatWindowMainFilter", d.ChatWindowMainFilter),
DefaultOpacity: ReadFloat(chat, "defaultOpacity", d.DefaultOpacity),
ActiveOpacity: ReadFloat(chat, "activeOpacity", d.ActiveOpacity));
}
@ -583,6 +584,7 @@ public sealed class SettingsStore
["chatWindow2Filter"] = c.ChatWindow2Filter,
["chatWindow3Filter"] = c.ChatWindow3Filter,
["chatWindow4Filter"] = c.ChatWindow4Filter,
["chatWindowMainFilter"] = c.ChatWindowMainFilter,
["defaultOpacity"] = c.DefaultOpacity,
["filterProfanity"] = c.FilterProfanity,
["fontSize"] = c.FontSize,

View file

@ -0,0 +1,57 @@
using AcDream.App.UI.Layout;
using DatReaderWriter;
using DatReaderWriter.Options;
using Xunit.Sdk;
using SysEnv = System.Environment;
namespace AcDream.App.Tests.UI.Layout;
/// <summary>
/// Campaign OP slice OP5: live-DAT proof that <see cref="ChatOptionsDatDefaults"/>
/// resolves the Chat tab's two opacity-slider defaults from the installed DAT —
/// same pattern as <c>RetailSelectionAssetTests</c> (runs against the real
/// installed <c>client_portal.dat</c>, skips gracefully when none is present, no
/// env-var gate needed since it never writes anything).
/// </summary>
public sealed class ChatOptionsDatDefaultsTests
{
[Fact]
public void InstalledDat_ResolvesTheByteVerifiedSliderDefaults()
{
string datDir = ResolveDatDir();
using var dats = new DatCollection(datDir, DatAccessType.Read);
bool resolved = ChatOptionsDatDefaults.TryRead(
dats, out float defaultOpacity, out float activeOpacity);
// Empirically confirmed against the installed DAT (this slice's own research
// trace): DID 0x78000001, Option_DefaultOpacity_Property = 0.5,
// Option_ActiveOpacity_Property = 1.0 — matching retail's ChatInterface base-
// constructor fallback exactly (a coincidence the fallback documents, not
// something this test relies on to pass).
Assert.True(resolved);
Assert.Equal(0.5f, defaultOpacity);
Assert.Equal(1.0f, activeOpacity);
}
private static string ResolveDatDir()
{
string? configured = SysEnv.GetEnvironmentVariable("ACDREAM_DAT_DIR");
if (!string.IsNullOrWhiteSpace(configured)
&& File.Exists(Path.Combine(configured, "client_portal.dat")))
return configured;
const string installed = @"C:\Turbine\Asheron's Call";
if (File.Exists(Path.Combine(installed, "client_portal.dat")))
return installed;
string conventional = Path.Combine(
SysEnv.GetFolderPath(SysEnv.SpecialFolder.UserProfile),
"Documents",
"Asheron's Call");
if (File.Exists(Path.Combine(conventional, "client_portal.dat")))
return conventional;
throw SkipException.ForSkip("Installed client_portal.dat is required.");
}
}

View file

@ -0,0 +1,607 @@
using System;
using System.Collections.Generic;
using System.Linq;
using AcDream.App.UI;
using AcDream.App.UI.Layout;
using AcDream.Core.Chat;
namespace AcDream.App.Tests.UI.Layout;
/// <summary>
/// Campaign OP slice OP5 (2026-08-11) conformance + behavior tests for
/// <see cref="ChatOptionsPageController"/> — the same hermetic pattern
/// <c>CharacterOptionsPageControllerTests</c> established: pure-data conformance
/// against the byte-verified research doc/decomp tables, then behavioral tests
/// against the committed <c>options_panel_2100006E_1000018D.json</c> +
/// <c>options_2100002B.json</c> fixtures — no live DAT access.
/// </summary>
public sealed class ChatOptionsPageControllerTests
{
// ── Pure data conformance ────────────────────────────────────────────────
[Fact]
public void FilterRows_Has13EntriesInByteVerifiedAuthoredOrder()
{
// docs/research/2026-08-10-options-panel-structure.md §5.2, cross-checked
// against the raw gmChatOptionsUI::InitOptions / AddCheckboxBitfield64Option
// pseudo-C AddChild call sequence (this class's own doc trace).
(ulong Mask, string Key)[] expected =
{
(0x0000000083912021ul, "ID_ChatOption_TextFilter_Gameplay"),
(0x0000000000600040ul, "ID_ChatOption_TextFilter_Combat"),
(0x0000000000020080ul, "ID_ChatOption_TextFilter_Magic"),
(0x0000000000001004ul, "ID_ChatOption_TextFilter_AreaSpeech"),
(0x0000000000000018ul, "ID_ChatOption_TextFilter_Tells"),
(0x0000000000040C00ul, "ID_ChatOption_TextFilter_Allegience"),
(0x0000000000080000ul, "ID_ChatOption_TextFilter_Fellowship"),
(0x0000000008000000ul, "ID_ChatOption_TextFilter_General"),
(0x0000000010000000ul, "ID_ChatOption_TextFilter_Trade"),
(0x0000000020000000ul, "ID_ChatOption_TextFilter_LFG"),
(0x0000000040000000ul, "ID_ChatOption_TextFilter_Roleplay"),
(0x0000000100000000ul, "ID_ChatOption_TextFilter_Society"),
(0x0000000004000000ul, "ID_ChatOption_TextFilter_Error"),
};
Assert.Equal(13, ChatOptionsPageController.FilterRows.Length);
for (int i = 0; i < expected.Length; i++)
{
Assert.Equal(expected[i].Mask, ChatOptionsPageController.FilterRows[i].Mask);
Assert.Equal(expected[i].Key, ChatOptionsPageController.FilterRows[i].RetailLabelKey);
}
}
[Fact]
public void FilterRows_EveryMaskIsPairwiseDistinct_AndNonZero()
{
var masks = ChatOptionsPageController.FilterRows.Select(static r => r.Mask).ToList();
Assert.Equal(masks.Count, masks.Distinct().Count());
Assert.All(masks, m => Assert.NotEqual(0ul, m));
}
[Fact]
public void FilterBlocks_Has5EntriesInAuthoredOrder_WithRetailWindowIds()
{
// Research doc §5: main(8), floaty1(2), floaty2(3), floaty3(4), floaty4(5) —
// authored top-to-bottom order in gmChatOptionsUI::InitOptions.
(int RetailId, int CompactId, string HeaderKey, ulong Default, bool IncludesGameplay)[] expected =
{
(8, ChatWindowState.MainWindowId, "ID_ChatOption_MainChatWindow_Section",
0xFBFFFFFFul, false),
(2, 1, "ID_ChatOption_FloatyChatWindow1_Section", 0x0000101Cul, true),
(3, 2, "ID_ChatOption_FloatyChatWindow2_Section", 0x00040C00ul, true),
(4, 3, "ID_ChatOption_FloatyChatWindow3_Section", 0x00080000ul, true),
(5, 4, "ID_ChatOption_FloatyChatWindow4_Section", 0x78000000ul, true),
};
Assert.Equal(5, ChatOptionsPageController.FilterBlocks.Length);
for (int i = 0; i < expected.Length; i++)
{
ChatOptionsPageController.FilterBlockSpec spec = ChatOptionsPageController.FilterBlocks[i];
Assert.Equal(expected[i].RetailId, spec.RetailWindowId);
Assert.Equal(expected[i].CompactId, spec.CompactWindowId);
Assert.Equal(expected[i].HeaderKey, spec.HeaderKey);
Assert.Equal(expected[i].Default, spec.DefaultFilter);
Assert.Equal(expected[i].IncludesGameplay, spec.IncludesGameplayRow);
}
}
[Fact]
public void FilterBlocks_DefaultsMatchChatWindowStateNamedConstants()
{
// These MUST be the exact same source (ChatWindowState's own constants),
// not two independently-typed literal tables that could drift apart.
Assert.Equal(ChatWindowState.MainWindowDefaultFilter, ChatOptionsPageController.FilterBlocks[0].DefaultFilter);
Assert.Equal(ChatWindowState.Floaty1DefaultFilter, ChatOptionsPageController.FilterBlocks[1].DefaultFilter);
Assert.Equal(ChatWindowState.Floaty2DefaultFilter, ChatOptionsPageController.FilterBlocks[2].DefaultFilter);
Assert.Equal(ChatWindowState.Floaty3DefaultFilter, ChatOptionsPageController.FilterBlocks[3].DefaultFilter);
Assert.Equal(ChatWindowState.Floaty4DefaultFilter, ChatOptionsPageController.FilterBlocks[4].DefaultFilter);
}
// ── Row/header string-hash conformance ───────────────────────────────────
[Theory]
[InlineData("ID_ChatOption_TextFilter_Gameplay")]
[InlineData("ID_ChatOption_TextFilter_Combat")]
[InlineData("ID_ChatOption_TextFilter_Magic")]
[InlineData("ID_ChatOption_TextFilter_AreaSpeech")]
[InlineData("ID_ChatOption_TextFilter_Tells")]
[InlineData("ID_ChatOption_TextFilter_Allegience")]
[InlineData("ID_ChatOption_TextFilter_Fellowship")]
[InlineData("ID_ChatOption_TextFilter_General")]
[InlineData("ID_ChatOption_TextFilter_Trade")]
[InlineData("ID_ChatOption_TextFilter_LFG")]
[InlineData("ID_ChatOption_TextFilter_Roleplay")]
[InlineData("ID_ChatOption_TextFilter_Society")]
[InlineData("ID_ChatOption_TextFilter_Error")]
public void EveryFilterRowKey_IsAuthoredOnTheFilterRowsTable(string key)
{
Assert.Contains(ChatOptionsPageController.FilterRows, r => r.RetailLabelKey == key);
}
// ── Behavioral: built against the committed fixtures ─────────────────────
private static (uint, int, int) NoTex(uint _) => (0, 0, 0);
private static ElementInfo? Find(ElementInfo n, uint id)
{
if (n.Id == id) return n;
foreach (ElementInfo c in n.Children)
{
ElementInfo? f = Find(c, id);
if (f is not null) return f;
}
return null;
}
/// <summary>The same "resolve a row template from the standalone 0x2100002B
/// fixture" resolver <c>CharacterOptionsPageControllerTests</c> uses.</summary>
private static Func<uint, uint, UiElement?> MakeTemplateResolver()
{
ElementInfo panelRoot = FixtureLoader.LoadOptionsPanelInfos();
return (layoutId, elementId) =>
{
if (layoutId != 0x2100002Bu) return null;
ElementInfo? templateInfo = Find(panelRoot, elementId);
return templateInfo is null ? null : LayoutImporter.Build(templateInfo, NoTex, null).Root;
};
}
private sealed class FakeBindings
{
public float DefaultOpacity = 0.5f;
public float ActiveOpacity = 1.0f;
public float DefaultOpacityDatDefault = 0.5f;
public float ActiveOpacityDatDefault = 1.0f;
public List<float> DefaultOpacitySets { get; } = new();
public List<float> ActiveOpacitySets { get; } = new();
public Dictionary<int, ulong> Filters { get; } = new()
{
[ChatWindowState.MainWindowId] = ChatWindowState.MainWindowDefaultFilter,
[1] = ChatWindowState.Floaty1DefaultFilter,
[2] = ChatWindowState.Floaty2DefaultFilter,
[3] = ChatWindowState.Floaty3DefaultFilter,
[4] = ChatWindowState.Floaty4DefaultFilter,
};
public List<(int WindowId, ulong Value)> FilterSets { get; } = new();
public ChatOptionsPageController.Bindings ToBindings() => new(
CurrentDefaultOpacity: () => DefaultOpacity,
CurrentActiveOpacity: () => ActiveOpacity,
SetDefaultOpacity: value =>
{
(DefaultOpacity, ActiveOpacity) = ChatOpacityLinkFor(ActiveOpacity, value, isDefault: true);
DefaultOpacitySets.Add(value);
},
SetActiveOpacity: value =>
{
(DefaultOpacity, ActiveOpacity) = ChatOpacityLinkFor(DefaultOpacity, value, isDefault: false);
ActiveOpacitySets.Add(value);
},
DefaultOpacityDatDefault: DefaultOpacityDatDefault,
ActiveOpacityDatDefault: ActiveOpacityDatDefault,
CurrentFilter: windowId => Filters[windowId],
SetFilter: (windowId, value) =>
{
Filters[windowId] = value;
FilterSets.Add((windowId, value));
});
// Mirrors AcDream.UI.Abstractions.Panels.Settings.ChatOpacityLink's own
// math exactly (the fake stands in for RetailWindowOpacityController,
// which itself just calls that link) — kept local so this test file has
// no cross-project dependency for a two-line clamp/drag rule.
private static (float Default, float Active) ChatOpacityLinkFor(
float other, float value, bool isDefault)
{
value = Math.Clamp(value, 0f, 1f);
if (isDefault)
return (value, other < value ? value : other);
return (other > value ? value : other, value);
}
}
private static (OptionsPanelController Panel, FakeBindings Bindings, bool Bound) BindReal(
Func<uint, uint, string?>? resolveString = null)
{
ImportedLayout layout = FixtureLoader.LoadOptionsPanelHost();
OptionsPanelController controller = OptionsPanelController.Bind(
layout,
new OptionsPanelController.Callbacks(
Toggle: () => { },
RequestExitToCharacterSelection: () => { },
ExitGame: () => { },
UseMouseTurningSettings: () => { },
DisplaySystemMessage: _ => { }))!;
var fakeBindings = new FakeBindings();
bool bound = ChatOptionsPageController.Bind(
layout,
controller.ChatPage,
MakeTemplateResolver(),
resolveString ?? ((_, _) => null),
fakeBindings.ToBindings());
return (controller, fakeBindings, bound);
}
[Fact]
public void Bind_Succeeds_AndRegistersExactlySevenRows()
{
// 2 opacity sliders + 5 filter blocks = 7 IOptionRow registrations
// (each block is ONE composite row, not one row per checkbox).
(OptionsPanelController controller, _, bool bound) = BindReal();
Assert.True(bound);
Assert.Equal(7, controller.ChatPage.Rows.Count);
}
[Fact]
public void Bind_MainWindowBlock_Has12Rows_FloatyBlocks_Have13Rows()
{
ImportedLayout layout = FixtureLoader.LoadOptionsPanelHost();
OptionsPanelController controller = OptionsPanelController.Bind(
layout,
new OptionsPanelController.Callbacks(
Toggle: () => { },
RequestExitToCharacterSelection: () => { },
ExitGame: () => { },
UseMouseTurningSettings: () => { },
DisplaySystemMessage: _ => { }))!;
var fakeBindings = new FakeBindings();
bool bound = ChatOptionsPageController.Bind(
layout, controller.ChatPage, MakeTemplateResolver(), (_, _) => null,
fakeBindings.ToBindings());
Assert.True(bound);
var listBox = Assert.IsType<UiTemplateListBox>(
layout.FindElement(ChatOptionsPageController.ListBoxElementId));
List<UiCheckboxBitfield64> blocks = CollectBlocks(listBox);
Assert.Equal(5, blocks.Count);
Assert.Equal(12, blocks[0].Rows.Count); // main window — no Gameplay row
for (int i = 1; i < 5; i++)
Assert.Equal(13, blocks[i].Rows.Count); // the four floaties
}
[Fact]
public void Bind_FilterBlocks_ResolveTheAP195LedSprites()
{
// AP-195 end-to-end: the regenerated fixture now carries dat properties
// 0x10000082/0x10000083 on template consumer 0x10000520
// (0x06004D17/0x06004D19), and DatWidgetFactory threads them into the
// constructed UiCheckboxBitfield64 — every one of the five blocks shares
// the SAME authored template, so every block resolves the same sprites.
ImportedLayout layout = FixtureLoader.LoadOptionsPanelHost();
OptionsPanelController controller = OptionsPanelController.Bind(
layout,
new OptionsPanelController.Callbacks(
Toggle: () => { },
RequestExitToCharacterSelection: () => { },
ExitGame: () => { },
UseMouseTurningSettings: () => { },
DisplaySystemMessage: _ => { }))!;
var fakeBindings = new FakeBindings();
ChatOptionsPageController.Bind(
layout, controller.ChatPage, MakeTemplateResolver(), (_, _) => null,
fakeBindings.ToBindings());
var listBox = Assert.IsType<UiTemplateListBox>(
layout.FindElement(ChatOptionsPageController.ListBoxElementId));
List<UiCheckboxBitfield64> blocks = CollectBlocks(listBox);
Assert.Equal(5, blocks.Count);
Assert.All(blocks, b =>
{
Assert.Equal(0x06004D17u, b.CheckedLedSprite);
Assert.Equal(0x06004D19u, b.UncheckedLedSprite);
});
}
[Fact]
public void Bind_FilterBlocks_SelfSizeToFitTheirRows()
{
// AP-195's self-sizing tail — the block grows past its authored 272x100
// extent to fit N rows (13 floaty rows * 20px template height > 100).
ImportedLayout layout = FixtureLoader.LoadOptionsPanelHost();
OptionsPanelController controller = OptionsPanelController.Bind(
layout,
new OptionsPanelController.Callbacks(
Toggle: () => { },
RequestExitToCharacterSelection: () => { },
ExitGame: () => { },
UseMouseTurningSettings: () => { },
DisplaySystemMessage: _ => { }))!;
var fakeBindings = new FakeBindings();
ChatOptionsPageController.Bind(
layout, controller.ChatPage, MakeTemplateResolver(), (_, _) => null,
fakeBindings.ToBindings());
var listBox = Assert.IsType<UiTemplateListBox>(
layout.FindElement(ChatOptionsPageController.ListBoxElementId));
List<UiCheckboxBitfield64> blocks = CollectBlocks(listBox);
Assert.All(blocks, b => Assert.True(b.Height > 100f, $"block Height={b.Height}"));
Assert.Equal(272f, blocks[0].Width); // width (GetWidth()) untouched
}
private static List<UiCheckboxBitfield64> CollectBlocks(UiElement root)
{
var found = new List<UiCheckboxBitfield64>();
Walk(root, found);
return found;
static void Walk(UiElement node, List<UiCheckboxBitfield64> acc)
{
if (node is UiCheckboxBitfield64 block) acc.Add(block);
foreach (UiElement child in node.Children) Walk(child, acc);
}
}
[Fact]
public void Bind_SeedsSlidersFromCurrentOpacity_NotTheDatDefault()
{
var fakeBindings = new FakeBindings { DefaultOpacity = 0.25f, ActiveOpacity = 0.75f };
ImportedLayout layout = FixtureLoader.LoadOptionsPanelHost();
OptionsPanelController controller = OptionsPanelController.Bind(
layout,
new OptionsPanelController.Callbacks(
Toggle: () => { },
RequestExitToCharacterSelection: () => { },
ExitGame: () => { },
UseMouseTurningSettings: () => { },
DisplaySystemMessage: _ => { }))!;
bool bound = ChatOptionsPageController.Bind(
layout, controller.ChatPage, MakeTemplateResolver(), (_, _) => null,
fakeBindings.ToBindings());
Assert.True(bound);
var defaultRow = Assert.IsType<FloatOptionRow>(controller.ChatPage.Rows[0]);
var activeRow = Assert.IsType<FloatOptionRow>(controller.ChatPage.Rows[1]);
Assert.Equal(0.25f, defaultRow.Current);
Assert.Equal(0.75f, activeRow.Current);
// Never wrote back just from seeding.
Assert.Empty(fakeBindings.DefaultOpacitySets);
Assert.Empty(fakeBindings.ActiveOpacitySets);
}
[Fact]
public void DraggingDefaultSlider_AppliesLive_AndDragsActiveUp_NeverClamping()
{
var fakeBindings = new FakeBindings { DefaultOpacity = 0.3f, ActiveOpacity = 0.3f };
(OptionsPanelController controller, FakeBindings bindings, bool bound) =
BindRealWith(fakeBindings);
Assert.True(bound);
var defaultRow = Assert.IsType<FloatOptionRow>(controller.ChatPage.Rows[0]);
var activeRow = Assert.IsType<FloatOptionRow>(controller.ChatPage.Rows[1]);
// Raise Default ABOVE the current Active value — retail's link drags
// Active UP to match, never clamps Default down.
defaultRow.SetCurrentValue(0.9f);
Assert.Equal(0.9f, bindings.DefaultOpacity);
Assert.Equal(0.9f, bindings.ActiveOpacity); // dragged up
Assert.Equal(0.9f, defaultRow.Current);
Assert.Equal(0.9f, activeRow.Current); // the OTHER row's own value moved too
Assert.Single(bindings.DefaultOpacitySets);
// Live-apply: Changed reflects immediately (retail's Apply(1) shape).
Assert.True(controller.ChatPage.Changed);
}
[Fact]
public void DraggingActiveSliderBelowDefault_DragsDefaultDown()
{
var fakeBindings = new FakeBindings { DefaultOpacity = 0.6f, ActiveOpacity = 0.6f };
(OptionsPanelController controller, FakeBindings bindings, _) = BindRealWith(fakeBindings);
var defaultRow = Assert.IsType<FloatOptionRow>(controller.ChatPage.Rows[0]);
var activeRow = Assert.IsType<FloatOptionRow>(controller.ChatPage.Rows[1]);
activeRow.SetCurrentValue(0.1f);
Assert.Equal(0.1f, bindings.ActiveOpacity);
Assert.Equal(0.1f, bindings.DefaultOpacity); // dragged down
Assert.Equal(0.1f, defaultRow.Current);
Assert.Equal(0.1f, activeRow.Current);
}
[Fact]
public void OnShown_ReSeedsBothSliders_FromLiveOpacity()
{
var fakeBindings = new FakeBindings { DefaultOpacity = 0.5f, ActiveOpacity = 1.0f };
(OptionsPanelController controller, FakeBindings bindings, _) = BindRealWith(fakeBindings);
bindings.DefaultOpacity = 0.2f;
bindings.ActiveOpacity = 0.9f;
controller.ChatPage.OnShown();
var defaultRow = Assert.IsType<FloatOptionRow>(controller.ChatPage.Rows[0]);
var activeRow = Assert.IsType<FloatOptionRow>(controller.ChatPage.Rows[1]);
Assert.Equal(0.2f, defaultRow.Current);
Assert.Equal(0.2f, defaultRow.Saved);
Assert.Equal(0.9f, activeRow.Current);
Assert.Equal(0.9f, activeRow.Saved);
Assert.False(controller.ChatPage.Changed);
}
[Fact]
public void Defaults_RestoresDatExtractedSliderDefaults()
{
var fakeBindings = new FakeBindings
{
DefaultOpacity = 0.1f,
ActiveOpacity = 0.1f,
DefaultOpacityDatDefault = 0.5f,
ActiveOpacityDatDefault = 1.0f,
};
(OptionsPanelController controller, FakeBindings bindings, _) = BindRealWith(fakeBindings);
controller.ChatPage.Defaults();
var defaultRow = Assert.IsType<FloatOptionRow>(controller.ChatPage.Rows[0]);
var activeRow = Assert.IsType<FloatOptionRow>(controller.ChatPage.Rows[1]);
Assert.Equal(0.5f, defaultRow.Current);
Assert.Equal(1.0f, activeRow.Current);
Assert.Equal(0.5f, bindings.DefaultOpacity);
Assert.Equal(1.0f, bindings.ActiveOpacity);
}
[Fact]
public void CheckingAFilterRow_PublishesSetFilter_ForItsOwnCompactWindowId()
{
var fakeBindings = new FakeBindings();
ImportedLayout layout = FixtureLoader.LoadOptionsPanelHost();
OptionsPanelController controller = OptionsPanelController.Bind(
layout,
new OptionsPanelController.Callbacks(
Toggle: () => { },
RequestExitToCharacterSelection: () => { },
ExitGame: () => { },
UseMouseTurningSettings: () => { },
DisplaySystemMessage: _ => { }))!;
bool bound = ChatOptionsPageController.Bind(
layout, controller.ChatPage, MakeTemplateResolver(), (_, _) => null,
fakeBindings.ToBindings());
Assert.True(bound);
var listBox = Assert.IsType<UiTemplateListBox>(
layout.FindElement(ChatOptionsPageController.ListBoxElementId));
List<UiCheckboxBitfield64> blocks = CollectBlocks(listBox);
UiCheckboxBitfield64 floaty1Block = blocks[1]; // compact window id 1
UiCheckboxBitfield64.Row row = floaty1Block.Rows[0]; // Gameplay (floaty has it)
row.Toggle.OnClick!.Invoke();
var (windowId, value) = Assert.Single(fakeBindings.FilterSets);
Assert.Equal(1, windowId);
Assert.Equal(fakeBindings.Filters[1], value);
}
[Fact]
public void MainWindowBlock_HasNoGameplayRow()
{
var fakeBindings = new FakeBindings();
ImportedLayout layout = FixtureLoader.LoadOptionsPanelHost();
OptionsPanelController controller = OptionsPanelController.Bind(
layout,
new OptionsPanelController.Callbacks(
Toggle: () => { },
RequestExitToCharacterSelection: () => { },
ExitGame: () => { },
UseMouseTurningSettings: () => { },
DisplaySystemMessage: _ => { }))!;
ChatOptionsPageController.Bind(
layout, controller.ChatPage, MakeTemplateResolver(), (_, _) => null,
fakeBindings.ToBindings());
var listBox = Assert.IsType<UiTemplateListBox>(
layout.FindElement(ChatOptionsPageController.ListBoxElementId));
UiCheckboxBitfield64 mainBlock = CollectBlocks(listBox)[0];
Assert.All(mainBlock.Rows, r => Assert.NotEqual("Gameplay", r.Label));
Assert.DoesNotContain(mainBlock.Rows, r => r.LowMask == 0x83912021ul);
}
[Fact]
public void OnShown_ReSeedsFilterBlock_FromLiveChatWindowState()
{
var fakeBindings = new FakeBindings();
(OptionsPanelController controller, FakeBindings bindings, _) = BindRealWith(fakeBindings);
// Simulate the filter having changed behind the panel's back (e.g. a
// future second write path) between mount and the next tab-show.
bindings.Filters[ChatWindowState.MainWindowId] = 0x1ul;
controller.ChatPage.OnShown();
var mainRow = Assert.IsType<BitfieldOptionRow>(controller.ChatPage.Rows[2]); // 2 sliders + main block
Assert.Equal(0x1ul, mainRow.Current);
Assert.Equal(0x1ul, mainRow.Saved);
Assert.False(controller.ChatPage.Changed);
}
[Fact]
public void Reset_RevertsAFilterBlock_ToItsSavedBaseline()
{
var fakeBindings = new FakeBindings();
(OptionsPanelController controller, FakeBindings bindings, _) = BindRealWith(fakeBindings);
var mainRow = Assert.IsType<BitfieldOptionRow>(controller.ChatPage.Rows[2]);
ulong initial = mainRow.Current;
bindings.FilterSets.Clear();
mainRow.SetCurrentValue(0x0ul);
Assert.True(controller.ChatPage.Changed);
controller.ChatPage.Reset();
Assert.Equal(initial, mainRow.Current);
Assert.Contains(bindings.FilterSets, s => s.WindowId == ChatWindowState.MainWindowId && s.Value == initial);
}
[Fact]
public void LabelResolutionFailure_LeavesRowsBuilt_NeverInventsEnglish()
{
(OptionsPanelController controller, _, bool bound) = BindReal(resolveString: (_, _) => null);
Assert.True(bound);
Assert.Equal(7, controller.ChatPage.Rows.Count);
}
[Fact]
public void Bind_MissingListBox_ReturnsFalse_AndDoesNotThrow()
{
var emptyRoot = new ElementInfo { Id = 0, Type = 3 };
ImportedLayout emptyLayout = LayoutImporter.Build(emptyRoot, NoTex, null);
var page = new OptionPage();
bool bound = ChatOptionsPageController.Bind(
emptyLayout, page, MakeTemplateResolver(), (_, _) => null,
new FakeBindings().ToBindings());
Assert.False(bound);
Assert.Empty(page.Rows);
}
[Fact]
public void ScrollbarLinkage_ModelPointsAtTheChatListBoxScroll()
{
ImportedLayout layout = FixtureLoader.LoadOptionsPanelHost();
OptionsPanelController controller = OptionsPanelController.Bind(
layout,
new OptionsPanelController.Callbacks(
Toggle: () => { },
RequestExitToCharacterSelection: () => { },
ExitGame: () => { },
UseMouseTurningSettings: () => { },
DisplaySystemMessage: _ => { }))!;
var fakeBindings = new FakeBindings();
ChatOptionsPageController.Bind(
layout, controller.ChatPage, MakeTemplateResolver(), (_, _) => null,
fakeBindings.ToBindings());
var listBox = Assert.IsType<UiTemplateListBox>(
layout.FindElement(ChatOptionsPageController.ListBoxElementId));
var scrollbar = Assert.IsType<UiScrollbar>(
layout.FindElement(ChatOptionsPageController.ScrollbarElementId));
Assert.Same(listBox.Scroll, scrollbar.Model);
}
private static (OptionsPanelController Panel, FakeBindings Bindings, bool Bound) BindRealWith(
FakeBindings fakeBindings)
{
ImportedLayout layout = FixtureLoader.LoadOptionsPanelHost();
OptionsPanelController controller = OptionsPanelController.Bind(
layout,
new OptionsPanelController.Callbacks(
Toggle: () => { },
RequestExitToCharacterSelection: () => { },
ExitGame: () => { },
UseMouseTurningSettings: () => { },
DisplaySystemMessage: _ => { }))!;
bool bound = ChatOptionsPageController.Bind(
layout, controller.ChatPage, MakeTemplateResolver(), (_, _) => null,
fakeBindings.ToBindings());
return (controller, fakeBindings, bound);
}
}

View file

@ -270,10 +270,11 @@ public class OptionsPanelLayoutConformanceTests
/// containing ONLY the checkbox retail's own CreateChildren looks for
/// (<see cref="UiCheckboxBitfield64.TemplateCheckboxElementId"/>) — proves the
/// widget resolves and stamps that exact id rather than assuming row shape.</summary>
private static UiCheckboxBitfield64 NewBitfieldWithStubTemplate()
private static UiCheckboxBitfield64 NewBitfieldWithStubTemplate(
uint checkedLedSprite = 0u, uint uncheckedLedSprite = 0u)
{
var templates = new[] { new UiTemplateListEntry(0x2100002Bu, 0x10000521u) };
return new UiCheckboxBitfield64(templates)
return new UiCheckboxBitfield64(templates, checkedLedSprite, uncheckedLedSprite)
{
Width = 272f,
TemplateResolver = (layoutId, elementId) =>
@ -359,6 +360,191 @@ public class OptionsPanelLayoutConformanceTests
Assert.Empty(bitfield.Rows);
}
// ── AP-195: LED media swap + self-sizing (Campaign OP slice OP5) ────────
private const uint CheckedLedDid = 0x06004D17u;
private const uint UncheckedLedDid = 0x06004D19u;
[Fact]
public void AddChild_AllMaskBitsSet_AppliesCheckedLedSprite()
{
var bitfield = NewBitfieldWithStubTemplate(CheckedLedDid, UncheckedLedDid);
const ulong combatMask = 0x00000000_00600040ul; // two bits
bitfield.SetDefaultValue(combatMask, 0ul); // BOTH bits already set
UiButton? row = bitfield.AddChild(combatMask, 0ul, "Combat");
Assert.NotNull(row);
Assert.True(row!.Selected);
Assert.Equal(CheckedLedDid, row.FaceFileOverride);
}
[Fact]
public void AddChild_PartialMaskBitsSet_AppliesUncheckedLedSprite()
{
var bitfield = NewBitfieldWithStubTemplate(CheckedLedDid, UncheckedLedDid);
const ulong combatMask = 0x00000000_00600040ul; // two bits
const ulong onlyOneBitOfMask = 0x00000000_00000040ul;
bitfield.SetDefaultValue(onlyOneBitOfMask, 0ul); // checked (any-set) but not all-set
UiButton? row = bitfield.AddChild(combatMask, 0ul, "Combat");
Assert.NotNull(row);
Assert.True(row!.Selected); // any-set half unaffected by AP-195
Assert.Equal(UncheckedLedDid, row.FaceFileOverride);
}
[Fact]
public void AddChild_NoMaskBitsSet_LeavesLedOverrideUnset()
{
var bitfield = NewBitfieldWithStubTemplate(CheckedLedDid, UncheckedLedDid);
bitfield.SetDefaultValue(0ul, 0ul);
UiButton? row = bitfield.AddChild(0x00000000_00600040ul, 0ul, "Combat");
Assert.NotNull(row);
Assert.False(row!.Selected);
Assert.Null(row.FaceFileOverride); // retail's own gate: swap only applies while checked
}
[Fact]
public void ToggleRow_TogglingOff_ClearsLedOverride()
{
var bitfield = NewBitfieldWithStubTemplate(CheckedLedDid, UncheckedLedDid);
const ulong singleBitMask = 0x00000000_00000040ul;
bitfield.SetDefaultValue(singleBitMask, 0ul); // fully set -> checked LED
UiButton row = bitfield.AddChild(singleBitMask, 0ul, "Combat")!;
Assert.Equal(CheckedLedDid, row.FaceFileOverride);
row.OnClick!.Invoke(); // turns OFF (was fully set)
Assert.False(row.Selected);
Assert.Null(row.FaceFileOverride);
}
[Fact]
public void AddChild_MissingLedSprites_LeavesOverrideNull_EvenWhileChecked()
{
// Constructed WITHOUT checkedLedSprite/uncheckedLedSprite (0/0 default) —
// e.g. an authoring gap or a fixture that predates AP-195's properties.
var bitfield = NewBitfieldWithStubTemplate();
const ulong mask = 0x1ul;
bitfield.SetDefaultValue(mask, 0ul);
UiButton? row = bitfield.AddChild(mask, 0ul, "Row");
Assert.NotNull(row);
Assert.True(row!.Selected);
Assert.Null(row.FaceFileOverride);
}
[Fact]
public void AddChild_MultipleRows_SelfSizesHeightToStackedContent()
{
// AP-195's self-sizing tail: retail's ResizeTo(GetWidth(), CalculatePaperSize)
// — the block grows to fit N rows instead of keeping its authored 272x100
// extent. Each stub row template is 14px tall (NewBitfieldWithStubTemplate).
var bitfield = NewBitfieldWithStubTemplate();
bitfield.SetDefaultValue(0ul, 0ul);
Assert.Equal(0f, bitfield.Height);
bitfield.AddChild(0x1ul, 0ul, "Row1");
Assert.Equal(14f, bitfield.Height);
bitfield.AddChild(0x2ul, 0ul, "Row2");
bitfield.AddChild(0x4ul, 0ul, "Row3");
Assert.Equal(42f, bitfield.Height); // 3 * 14
Assert.Equal(272f, bitfield.Width); // Width (GetWidth()) is untouched
}
[Fact]
public void SetCurrentValue_PushesValueAndVisuals_WithoutFiringValueChanged()
{
var bitfield = NewBitfieldWithStubTemplate(CheckedLedDid, UncheckedLedDid);
const ulong mask = 0x1ul;
bitfield.SetDefaultValue(0ul, 0ul); // starts unset
UiButton row = bitfield.AddChild(mask, 0ul, "Row")!;
Assert.False(row.Selected);
bool valueChangedFired = false;
bitfield.ValueChanged += (_, _) => valueChangedFired = true;
bitfield.SetCurrentValue(mask, 0ul); // the OnShown/Reset/Defaults re-seed path
Assert.Equal(mask, bitfield.CurrentLow);
Assert.True(row.Selected);
Assert.Equal(CheckedLedDid, row.FaceFileOverride);
Assert.False(valueChangedFired); // a re-seed must never loop back as "user edited this"
}
// ── UiTemplateListBox.AddPrebuiltRow (AP-195's "reuse the ListBox's own
// stacking" disposition) ──────────────────────────────────────────────
[Fact]
public void AddPrebuiltRow_StacksBelowPreviousContent_UsingTheRowsFinalHeight()
{
ElementInfo panelRoot = FixtureLoader.LoadOptionsPanelInfos();
ElementInfo characterListBoxInfo = Find(FixtureLoader.LoadOptionsCharacterInfos(), 0x100001FAu)!;
var listBox = new UiTemplateListBox(
characterListBoxInfo, NoTex,
characterListBoxInfo.TemplateList, characterListBoxInfo.ScrollbarElementId)
{
TemplateResolver = (layoutId, elementId) =>
{
if (layoutId != 0x2100002Bu) return null;
ElementInfo? templateInfo = Find(panelRoot, elementId);
return templateInfo is null ? null : LayoutImporter.Build(templateInfo, NoTex, null).Root;
},
};
// A first ordinary row via the normal template path (header, 22px).
UiElement? header = listBox.AddItemFromTemplateList(0);
Assert.NotNull(header);
Assert.Equal(22, listBox.ContentHeight);
// A pre-sized row built OUTSIDE the ListBox's own resolve step (the shape a
// self-sizing UiCheckboxBitfield64 block uses) — its height is whatever the
// caller already grew it to BEFORE calling AddPrebuiltRow.
var prebuilt = new UiPanel { Width = 272f, Height = 260f };
UiElement returned = listBox.AddPrebuiltRow(prebuilt);
Assert.Same(prebuilt, returned);
Assert.Equal(22f, prebuilt.Top); // stacked directly below the header row
Assert.Equal(22 + 260, listBox.ContentHeight); // the FINAL 260px height, not a stale one
Assert.Contains(prebuilt, listBox.Children.OfType<UiScrollablePanel>().Single().Children);
}
[Fact]
public void AddPrebuiltRow_SubsequentTemplateRow_StacksAfterThePrebuiltRowsFinalHeight()
{
ElementInfo characterListBoxInfo = Find(FixtureLoader.LoadOptionsCharacterInfos(), 0x100001FAu)!;
var listBox = new UiTemplateListBox(
characterListBoxInfo, NoTex,
characterListBoxInfo.TemplateList, characterListBoxInfo.ScrollbarElementId)
{
TemplateResolver = (layoutId, elementId) =>
{
if (layoutId != 0x2100002Bu) return null;
ElementInfo? templateInfo = Find(FixtureLoader.LoadOptionsPanelInfos(), elementId);
return templateInfo is null ? null : LayoutImporter.Build(templateInfo, NoTex, null).Root;
},
};
var prebuilt = new UiPanel { Width = 272f, Height = 260f };
listBox.AddPrebuiltRow(prebuilt);
Assert.Equal(260, listBox.ContentHeight);
// A separator row added AFTER the prebuilt block must stack below its FINAL
// 260px height, not the block's pre-build authored 100px extent — this is
// exactly the reflow problem AddPrebuiltRow exists to avoid.
UiElement? separator = listBox.AddItemFromTemplateList(1); // separator template
Assert.NotNull(separator);
Assert.Equal(260f, separator!.Top);
}
// ── The template mechanism, exercised end-to-end ────────────────────────
/// <summary>

View file

@ -585,6 +585,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 268435742
},
{
@ -1010,6 +1012,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1109,6 +1113,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1208,11 +1214,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1429,6 +1439,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1645,16 +1657,22 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1766,6 +1784,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2158,10 +2178,14 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}

View file

@ -623,6 +623,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -705,6 +707,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1124,6 +1128,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1206,6 +1212,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1288,6 +1296,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1380,6 +1390,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1462,6 +1474,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1544,6 +1558,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1626,6 +1642,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1708,6 +1726,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1831,6 +1851,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1895,6 +1917,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2018,6 +2042,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2112,6 +2138,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -3311,11 +3339,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 268435474
},
{
@ -3741,6 +3773,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -3840,6 +3874,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -3939,11 +3975,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -4160,6 +4200,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -4376,16 +4418,22 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -4509,6 +4557,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -4603,6 +4653,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -4726,6 +4778,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -5469,11 +5523,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -6525,6 +6583,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -6588,11 +6648,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -6961,11 +7025,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -7060,6 +7128,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -7479,6 +7549,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -7898,6 +7970,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -7980,10 +8054,14 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}

View file

@ -205,6 +205,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -261,6 +263,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -342,6 +346,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -465,6 +471,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -588,6 +596,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -682,6 +692,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -776,6 +788,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1975,16 +1989,22 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 268435474
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2079,6 +2099,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2202,6 +2224,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2296,6 +2320,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2750,6 +2776,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2849,6 +2877,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2948,11 +2978,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -3169,6 +3203,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -3385,11 +3421,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -3513,6 +3553,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -3876,6 +3918,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -5125,6 +5169,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -5177,6 +5223,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -5229,6 +5277,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -5281,16 +5331,22 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -5615,15 +5671,21 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}

View file

@ -446,6 +446,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -490,6 +492,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -572,11 +576,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1309,6 +1317,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1426,6 +1436,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1543,11 +1555,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2097,11 +2113,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2154,6 +2174,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -3689,6 +3711,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -4217,6 +4241,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -4745,6 +4771,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -5273,6 +5301,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -5744,6 +5774,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -5960,11 +5992,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -6532,11 +6568,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -7008,6 +7048,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -7224,11 +7266,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -7796,11 +7842,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -8272,6 +8322,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -8488,11 +8540,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -9060,11 +9116,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -9536,6 +9596,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -9752,11 +9814,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -10324,11 +10390,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -10800,6 +10870,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -11016,11 +11088,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -11588,11 +11664,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -12064,6 +12144,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -12280,11 +12362,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -12852,11 +12938,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -13328,6 +13418,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -13544,11 +13636,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -14116,11 +14212,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -14649,6 +14749,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -15177,6 +15279,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -15648,6 +15752,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -15864,11 +15970,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -16436,11 +16546,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -16969,6 +17083,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -17497,6 +17613,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
@ -17543,11 +17661,15 @@
}
],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -17630,6 +17752,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -17712,6 +17836,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -17835,6 +17961,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -17899,6 +18027,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -17993,6 +18123,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -18087,6 +18219,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -18210,6 +18344,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -18304,6 +18440,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -18427,6 +18565,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -18521,6 +18661,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -18603,6 +18745,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -18747,6 +18891,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -18799,6 +18945,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -18851,6 +18999,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -19126,6 +19276,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -19178,6 +19330,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -19358,6 +19512,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -19410,16 +19566,22 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -19804,6 +19966,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -20299,6 +20463,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -20885,11 +21051,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -21476,11 +21646,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -22096,11 +22270,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -22851,6 +23029,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -23502,6 +23682,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -24153,16 +24335,22 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -24245,6 +24433,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -24327,6 +24517,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -24409,6 +24601,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -24491,6 +24685,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -24573,10 +24769,14 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}

View file

@ -359,5 +359,7 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}

View file

@ -106,6 +106,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -461,6 +463,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -845,6 +849,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1411,10 +1417,14 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}

View file

@ -341,6 +341,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -393,6 +395,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -445,6 +449,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -497,6 +503,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -549,6 +557,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -601,6 +611,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -653,6 +665,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -705,6 +719,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1390,6 +1406,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1507,6 +1525,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1624,11 +1644,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2274,6 +2298,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2391,6 +2417,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2508,16 +2536,22 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -3409,15 +3443,21 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}

View file

@ -516,6 +516,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -713,6 +715,8 @@
"TemplateElementId": 268435752
}
],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 268435748
},
{
@ -1138,6 +1142,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1237,6 +1243,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1336,11 +1344,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1557,6 +1569,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1773,11 +1787,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2210,6 +2228,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 268435751
},
{
@ -2635,6 +2655,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2734,6 +2756,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2833,11 +2857,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -3054,6 +3082,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -3270,16 +3300,22 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -3391,10 +3427,14 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}

View file

@ -545,6 +545,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -742,6 +744,8 @@
"TemplateElementId": 268435752
}
],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 268435748
},
{
@ -1167,6 +1171,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1266,6 +1272,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1365,11 +1373,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1586,6 +1598,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1802,11 +1816,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2239,6 +2257,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 268435751
},
{
@ -2664,6 +2684,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2763,6 +2785,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2862,11 +2886,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -3083,6 +3111,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -3299,16 +3329,22 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -3420,10 +3456,14 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}

View file

@ -117,6 +117,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -617,6 +619,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -972,10 +976,14 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}

View file

@ -234,6 +234,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -357,6 +359,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -451,6 +455,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -574,6 +580,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -668,6 +676,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -720,6 +730,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -843,6 +855,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -887,6 +901,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -981,6 +997,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1376,6 +1394,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1428,6 +1448,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1783,6 +1805,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2067,6 +2091,8 @@
"TemplateElementId": 268436270
}
],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2422,6 +2448,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2777,6 +2805,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -3634,6 +3664,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 268435812
},
{
@ -4059,6 +4091,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -4158,6 +4192,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -4257,11 +4293,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -4478,6 +4518,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -4694,11 +4736,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -5083,6 +5129,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -5165,6 +5213,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -5217,6 +5267,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -5269,6 +5321,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -5321,11 +5375,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -5408,6 +5466,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -5490,6 +5550,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -5572,6 +5634,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -5686,6 +5750,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -5854,6 +5920,8 @@
"TemplateElementId": 268435814
}
],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -6238,6 +6306,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -6622,6 +6692,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -6977,6 +7049,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -7372,11 +7446,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -7772,6 +7850,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -8127,6 +8207,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -8482,11 +8564,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -8713,6 +8799,8 @@
"TemplateElementId": 268436279
}
],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -8765,6 +8853,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -8847,6 +8937,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -8899,6 +8991,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -9399,6 +9493,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -9451,11 +9547,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -9538,6 +9638,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -9620,6 +9722,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -9702,6 +9806,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -9784,6 +9890,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -10321,6 +10429,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -10403,6 +10513,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -10906,6 +11018,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -11005,6 +11119,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -11104,11 +11220,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -11325,6 +11445,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -11541,11 +11663,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -11628,6 +11754,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -11680,6 +11808,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -11732,6 +11862,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -12647,6 +12779,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 268435773
},
{
@ -13101,6 +13235,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -13200,6 +13336,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -13299,11 +13437,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -13520,6 +13662,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -13736,11 +13880,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -14813,6 +14961,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 268436590
},
{
@ -15786,11 +15936,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -15914,6 +16068,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -16008,10 +16164,14 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}

View file

@ -118,10 +118,14 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}

View file

@ -486,6 +486,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1015,10 +1017,14 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}

View file

@ -247,6 +247,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -311,6 +313,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -405,6 +409,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -499,6 +505,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -687,11 +695,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -880,11 +892,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1102,11 +1118,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1324,11 +1344,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1411,6 +1435,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1621,11 +1647,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1708,6 +1738,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1936,11 +1968,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2023,6 +2059,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2105,6 +2143,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2186,6 +2226,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2268,6 +2310,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2350,6 +2394,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2432,6 +2478,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2514,6 +2562,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2608,6 +2658,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2672,6 +2724,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2766,6 +2820,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2860,10 +2916,14 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}

View file

@ -147,6 +147,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -265,6 +267,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -802,6 +806,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1264,6 +1270,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1686,6 +1694,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2108,6 +2118,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2530,6 +2542,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2952,6 +2966,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -3374,6 +3390,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -3448,6 +3466,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -3870,6 +3890,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -4337,11 +4359,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -4764,6 +4790,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -5186,6 +5214,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -5608,6 +5638,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -6030,6 +6062,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -6452,6 +6486,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -6874,6 +6910,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -7296,6 +7334,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -7718,6 +7758,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -8140,6 +8182,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -8562,6 +8606,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -9206,11 +9252,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -9633,6 +9683,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -10055,6 +10107,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -10477,6 +10531,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -10899,6 +10955,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -11321,6 +11379,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -11743,6 +11803,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -12165,11 +12227,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -12594,6 +12660,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -12949,6 +13017,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -13137,11 +13207,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -13564,6 +13638,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -14015,6 +14091,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 268435915
},
{
@ -14440,6 +14518,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -14539,6 +14619,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -14638,11 +14720,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -14859,6 +14945,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -15075,16 +15163,22 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -15625,6 +15719,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -16192,6 +16288,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 268435911
},
{
@ -16646,6 +16744,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -16745,6 +16845,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -16844,11 +16946,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -17065,6 +17171,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -17281,16 +17389,22 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -17343,10 +17457,14 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}

View file

@ -527,11 +527,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -643,6 +647,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1075,15 +1081,21 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}

View file

@ -235,6 +235,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -667,11 +669,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1346,6 +1352,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1972,6 +1980,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2598,6 +2608,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2690,6 +2702,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2742,6 +2756,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2794,6 +2810,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2846,6 +2864,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -3458,20 +3478,28 @@
"TemplateElementId": 268435832
}
],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}

View file

@ -476,6 +476,8 @@
"TemplateElementId": 268435992
}
],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 268435963
},
{
@ -901,6 +903,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1000,6 +1004,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1099,11 +1105,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1320,6 +1330,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1536,11 +1548,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2186,6 +2202,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2303,6 +2321,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2420,11 +2440,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -3070,6 +3094,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -3187,6 +3213,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -3304,11 +3332,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -3954,6 +3986,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -4071,6 +4105,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -4188,15 +4224,21 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}

View file

@ -1028,6 +1028,8 @@
"TemplateElementId": 268436768
}
],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 268435969
},
{
@ -1453,6 +1455,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1552,6 +1556,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1651,11 +1657,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1872,6 +1882,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2088,11 +2100,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2738,6 +2754,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2855,6 +2873,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2972,11 +2992,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -3622,6 +3646,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -3739,6 +3765,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -3856,11 +3884,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -4506,6 +4538,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -4623,6 +4657,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -4740,15 +4776,21 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}

View file

@ -936,6 +936,8 @@
"TemplateElementId": 268436001
}
],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 268435969
},
{
@ -1361,6 +1363,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1460,6 +1464,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1559,11 +1565,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1780,6 +1790,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1996,11 +2008,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2646,6 +2662,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2763,6 +2781,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2880,11 +2900,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -3530,6 +3554,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -3647,6 +3673,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -3764,11 +3792,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -4414,6 +4446,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -4531,6 +4565,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -4648,15 +4684,21 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}

View file

@ -740,6 +740,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -857,6 +859,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -974,11 +978,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1653,6 +1661,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1770,6 +1780,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1887,11 +1899,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2566,6 +2582,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2683,6 +2701,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2800,11 +2820,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -3450,6 +3474,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -3567,6 +3593,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -3684,11 +3712,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -4334,6 +4366,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -4451,6 +4485,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -4568,11 +4604,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -5218,6 +5258,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -5335,6 +5377,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -5452,11 +5496,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -6102,6 +6150,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -6219,6 +6269,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -6336,15 +6388,21 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}

View file

@ -674,6 +674,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1235,6 +1237,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1316,6 +1320,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1397,11 +1403,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1963,6 +1973,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2044,6 +2056,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2125,11 +2139,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2691,6 +2709,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2772,6 +2792,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2853,11 +2875,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2969,6 +2995,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -3457,6 +3485,8 @@
"TemplateElementId": 268435992
}
],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 268435963
},
{
@ -3882,6 +3912,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -3981,6 +4013,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -4080,11 +4114,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -4301,6 +4339,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -4517,11 +4557,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -5167,6 +5211,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -5284,6 +5330,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -5401,11 +5449,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -6051,6 +6103,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -6168,6 +6222,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -6285,11 +6341,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -6935,6 +6995,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -7052,6 +7114,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -7169,16 +7233,22 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -7931,6 +8001,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -8048,6 +8120,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -8165,11 +8239,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -8844,6 +8922,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -8961,6 +9041,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -9078,11 +9160,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -9757,6 +9843,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -9874,6 +9962,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -9991,11 +10081,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -10641,6 +10735,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -10758,6 +10854,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -10875,11 +10973,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -11525,6 +11627,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -11642,6 +11746,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -11759,11 +11865,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -12409,6 +12519,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -12526,6 +12638,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -12643,11 +12757,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -13293,6 +13411,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -13410,6 +13530,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -13527,16 +13649,22 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -14485,6 +14613,8 @@
"TemplateElementId": 268436001
}
],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 268435969
},
{
@ -14910,6 +15040,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -15009,6 +15141,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -15108,11 +15242,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -15329,6 +15467,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -15545,11 +15685,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -16195,6 +16339,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -16312,6 +16458,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -16429,11 +16577,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -17079,6 +17231,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -17196,6 +17350,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -17313,11 +17469,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -17963,6 +18123,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -18080,6 +18242,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -18197,16 +18361,22 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -18768,6 +18938,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -18849,6 +19021,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -18930,11 +19104,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -19975,6 +20153,8 @@
"TemplateElementId": 268436768
}
],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 268435969
},
{
@ -20400,6 +20580,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -20499,6 +20681,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -20598,11 +20782,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -20819,6 +21007,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -21035,11 +21225,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -21685,6 +21879,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -21802,6 +21998,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -21919,11 +22117,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -22569,6 +22771,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -22686,6 +22890,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -22803,11 +23009,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -23453,6 +23663,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -23570,6 +23782,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -23687,16 +23901,22 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
@ -23723,5 +23943,7 @@
}
],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}

View file

@ -458,6 +458,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -880,6 +882,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1302,6 +1306,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1724,6 +1730,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2146,6 +2154,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2568,6 +2578,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2642,6 +2654,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -3064,6 +3078,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -3531,11 +3547,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -3958,6 +3978,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -4380,6 +4402,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -4802,6 +4826,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -5224,6 +5250,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -5646,6 +5674,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -6068,6 +6098,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -6490,6 +6522,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -6912,6 +6946,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -7334,6 +7370,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -7756,6 +7794,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -8400,11 +8440,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -8827,6 +8871,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -9249,6 +9295,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -9671,6 +9719,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -10093,6 +10143,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -10515,6 +10567,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -10937,6 +10991,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -11359,10 +11415,14 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}

View file

@ -1041,6 +1041,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1158,6 +1160,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1210,11 +1214,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1297,6 +1305,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1379,6 +1389,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1461,6 +1473,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1543,6 +1557,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1625,6 +1641,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1707,6 +1725,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1789,6 +1809,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1871,6 +1893,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1965,6 +1989,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2029,6 +2055,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2123,6 +2151,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2217,6 +2247,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2311,6 +2343,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2375,6 +2409,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2469,6 +2505,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2563,10 +2601,14 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}

View file

@ -829,6 +829,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -881,6 +883,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -933,6 +937,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -985,6 +991,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1037,6 +1045,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1101,6 +1111,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1193,6 +1205,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1245,10 +1259,14 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}

View file

@ -396,5 +396,7 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}

View file

@ -920,6 +920,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1001,6 +1003,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1082,11 +1086,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1648,6 +1656,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1729,6 +1739,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1810,11 +1822,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1926,6 +1942,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2484,6 +2502,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 268436118
},
{
@ -2909,6 +2929,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -3008,6 +3030,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -3107,11 +3131,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -3328,6 +3356,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -3544,11 +3574,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -4125,11 +4159,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -4658,11 +4696,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -5191,11 +5233,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -5580,6 +5626,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -5964,6 +6012,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -6425,11 +6475,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -6958,11 +7012,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -7491,11 +7549,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -8024,11 +8086,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -8557,11 +8623,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -9090,11 +9160,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -9623,11 +9697,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -10156,11 +10234,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -10689,11 +10771,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -11222,11 +11308,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -11755,21 +11845,29 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -12311,6 +12409,8 @@
"TemplateElementId": 268436583
}
],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 268436581
},
{
@ -12736,6 +12836,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -12835,6 +12937,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -12934,11 +13038,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -13155,6 +13263,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -13371,16 +13481,22 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
@ -13397,5 +13513,7 @@
}
],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}

View file

@ -117,6 +117,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -169,6 +171,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -591,6 +595,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1013,6 +1019,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1435,6 +1443,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1516,6 +1526,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1938,6 +1950,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2049,6 +2063,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2471,6 +2487,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2651,6 +2669,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -3030,6 +3050,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -3452,6 +3474,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -3563,6 +3587,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -3985,6 +4011,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -4037,6 +4065,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -4089,6 +4119,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -4511,6 +4543,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -4691,6 +4725,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -5113,6 +5149,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -5535,6 +5573,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -5715,6 +5755,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -6137,6 +6179,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -6189,6 +6233,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -6369,6 +6415,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -6834,11 +6882,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -7261,6 +7313,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -7441,6 +7495,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -7863,6 +7919,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -8043,6 +8101,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -8465,6 +8525,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -8517,6 +8579,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -8939,6 +9003,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -9038,6 +9104,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -9460,6 +9528,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -10078,6 +10148,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -10229,6 +10301,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -10281,11 +10355,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -11042,6 +11120,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -11123,6 +11203,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -11340,11 +11422,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -11562,16 +11648,22 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -11994,6 +12086,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -12416,6 +12510,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -12468,10 +12564,14 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}

View file

@ -117,6 +117,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1098,6 +1100,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1552,6 +1556,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1651,6 +1657,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1750,11 +1758,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1971,6 +1983,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2187,11 +2201,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2547,6 +2565,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2902,6 +2922,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -3528,6 +3550,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -4154,6 +4178,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -4780,6 +4806,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -5406,11 +5434,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -6174,6 +6206,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -6800,6 +6834,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -7251,6 +7287,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -7705,6 +7743,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -7804,6 +7844,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -7903,11 +7945,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -8124,6 +8170,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -8340,11 +8388,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -8700,6 +8752,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -9055,6 +9109,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -9681,6 +9737,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -10307,11 +10365,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -10782,6 +10844,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -11252,6 +11316,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -11722,6 +11788,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -12281,6 +12349,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -12735,6 +12805,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -12834,6 +12906,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -12933,11 +13007,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -13154,6 +13232,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -13370,11 +13450,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -14048,6 +14132,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -14165,11 +14251,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -14525,6 +14615,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -14880,6 +14972,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -15506,6 +15600,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -16132,11 +16228,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
@ -16158,6 +16258,8 @@
}
],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -16210,10 +16312,14 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}

View file

@ -527,11 +527,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -643,6 +647,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1075,15 +1081,21 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}

View file

@ -257,6 +257,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -756,6 +758,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -892,6 +896,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -944,6 +950,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -996,6 +1004,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1048,11 +1058,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1189,6 +1203,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1241,6 +1257,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1293,6 +1311,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1345,16 +1365,22 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1437,6 +1463,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1519,6 +1547,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1717,6 +1747,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1769,6 +1801,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1821,6 +1855,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -1873,11 +1909,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2315,6 +2355,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2451,6 +2493,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2503,6 +2547,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2555,6 +2601,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2607,16 +2655,22 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2711,6 +2765,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2775,6 +2831,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2869,6 +2927,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -2963,6 +3023,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -3057,6 +3119,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -3121,6 +3185,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -3215,6 +3281,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -3309,6 +3377,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -3808,6 +3878,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -3944,6 +4016,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -3996,6 +4070,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -4048,6 +4124,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -4100,11 +4178,15 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -4241,6 +4323,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -4293,6 +4377,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -4345,6 +4431,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -4397,16 +4485,22 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -4489,6 +4583,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -4571,6 +4667,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -4653,6 +4751,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -4735,6 +4835,8 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
},
{
@ -4817,10 +4919,14 @@
"Children": [],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}
],
"TabTable": [],
"TemplateList": [],
"LedCheckedSprite": 0,
"LedUncheckedSprite": 0,
"ScrollbarElementId": 0
}

View file

@ -25,6 +25,19 @@ public sealed class ChatWindowStateTests
Assert.Equal(expectedFilter, state.GetFilter(windowId));
}
[Fact]
public void NamedDefaultConstants_MatchTheSameTable()
{
// Campaign OP slice OP5: the named constants ResetToDefaults() itself now
// uses — and that the Chat tab's Defaults button reuses directly — must
// never drift from this table.
Assert.Equal(0xFBFFFFFFu, ChatWindowState.MainWindowDefaultFilter);
Assert.Equal(0x0000101Cu, ChatWindowState.Floaty1DefaultFilter);
Assert.Equal(0x00040C00u, ChatWindowState.Floaty2DefaultFilter);
Assert.Equal(0x00080000u, ChatWindowState.Floaty3DefaultFilter);
Assert.Equal(0x78000000u, ChatWindowState.Floaty4DefaultFilter);
}
[Fact]
public void Defaults_MainWindowIsAlwaysOpen_FloatingWindowsStartClosed()
{

View file

@ -329,6 +329,29 @@ public sealed class SettingsStoreTests : System.IDisposable
Assert.Equal(original.ChatWindow4Filter, loaded.ChatWindow4Filter);
}
// -- Campaign OP slice OP5: main chat window filter round-trip ---------
[Fact]
public void LoadChat_returns_retail_main_window_filter_default_when_file_is_missing()
{
var store = new SettingsStore(_tempPath);
ChatSettings loaded = store.LoadChat();
Assert.Equal(0xFBFFFFFFu, loaded.ChatWindowMainFilter);
}
[Fact]
public void SaveChat_then_LoadChat_round_trips_main_window_filter()
{
var store = new SettingsStore(_tempPath);
var original = ChatSettings.Default with { ChatWindowMainFilter = 0x1ul };
store.SaveChat(original);
ChatSettings loaded = store.LoadChat();
Assert.Equal(original.ChatWindowMainFilter, loaded.ChatWindowMainFilter);
}
// -- Campaign CH slice CH6c: window opacity round-trip -----------------
[Fact]