feat(vtank): slice 7 fix round B item 5 — Meta tab down to VTank's real 5 controls, rule editor as a popup

VTank's own Meta tab (docs/research/vtank-kb/08-ui-views.md §1 "Tab: Meta")
is only 5 controls: the lstMetaRules grid, cmdMetaCreate ("Create"), a bold
"Current State:" caption, and a SETTABLE cmbMetaCurrentState choice — no
profile toolbar, no "Enable Meta" checkbox, no inline editor at all.

- Removed from the Meta tab entirely: the profile menu/name-draft field/
  New/CopyTo/Clear/Delete row (Profiles already carries the Meta combo/
  CopyTo/Delete) and the "Enable Meta" toggle (already on Options) — same
  accepted-regression shape as fix round A's Macro/Nav CopyTo-name-field
  loss (no Profiles-tab equivalent exists for these, and VTank's own tab
  has none either).
- Moved the inline State/Condition/Action editor (fields, condition/action
  menus, numeric steppers, Apply/Remove/MoveUp/MoveDown) into a new popup,
  mosstank-metaeditor.xml, registered the same StartVisible=true/
  ShowInSidePanel=false way as the buff picker. Opened by a grid text-cell
  click (SelectMetaRule, still populating the draft via SelectMetaRuleCore)
  or the tab's own "Create" button (CreateMetaRule — new, distinct from the
  still-existing AddMetaRule the tests call directly); Apply and Cancel
  (HideMetaEditor) both close it. DeleteMetaRuleAt/MoveMetaRuleUpAt/
  MoveMetaRuleDownAt call SelectMetaRuleCore directly and do NOT open the
  popup.
- "Add" -> "Create": CreateMetaRule adds a default rule (delegating to the
  existing AddMetaRuleCore) and opens the editor so it isn't left silently
  default-valued.
- Added the settable current-state menu: MetaCurrentStateNames/
  SelectedMetaCurrentState/SetMetaCurrentState expose MetaEngine's own
  already-public States/Transition(string) — choosing a state here forces
  the live engine into it, matching VTank's own manual override.
- The grid returns to VTank's full-width 856x116 proportion (848x116 here)
  now nothing else shares the tab.
- Bold text isn't representable in the plain retail UI font (0x40000000 has
  no bold face); "Current State:" uses the same bright caption color other
  tab headers use instead — documented in mosstank.xml's own comment, not
  silently dropped.

New tests: MetaEditorPopupOpensOnCellClickOrCreateAndClosesOnApplyOrCancel,
MetaCurrentStateMenuForcesTheLiveEngineIntoTheChosenState. Both mutation-
checked: commenting out SelectMetaRule's `_metaEditorVisible = true` turned
the first red ("Expected: True, Actual: False"); commenting out
SetMetaCurrentState's `_meta.Transition(value)` turned the second red
("Expected: Hunt, Actual: Default"). Restoring both turns them green.

EveryInteractiveControlDeclaresARealHandlerBinding's pinned control count:
186 -> 166 (-7 controls removed for good, -14 moved into the new popup file
this scan doesn't cover, +1 the new current-state menu).
SecondaryPopupPanelsFitTheirOwnBoundsAndEveryBindingResolves gained
mosstank-metaeditor.xml (630x236... — 630x160, corrected below).

tests/AcDream.Plugins.MossTank.Tests: 665/665 (was 663/663, +2 new tests).
tests/AcDream.App.Tests --filter Markup|Plugin|UiMenu|Slider: 276/3 skipped/279 (unchanged).

Screenshot with at least two rules (item 17) is owed with the round's other
live captures.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
Erik 2026-09-07 12:05:27 +02:00
parent 897e262eda
commit 06c9b95222
6 changed files with 238 additions and 81 deletions

View file

@ -216,6 +216,13 @@ internal sealed partial class MossTankPanel
private int _metaNumber;
private int _metaSecondaryNumber;
private string _metaNotice = "Add a rule or select one to edit.";
// Fix round B item 5: the rule editor (State/Condition/Action drafts,
// Apply/Remove/Move) moved off the Meta tab into its own popup
// (mosstank-metaeditor.xml), opened by a grid text-cell click or the
// tab's own "Create" button, closed by the popup's own Apply/Cancel —
// same StartVisible=true/ShowInSidePanel=false pattern as the buff
// picker (MossTankPlugin.cs).
private bool _metaEditorVisible;
private bool _applyingProfileOptions;
private bool _initialized;
private bool _firstRunGuidancePending;
@ -982,7 +989,30 @@ internal sealed partial class MossTankPanel
_meta.SetEnabled(!_meta.Enabled);
_combatSettings.MetaState = _meta.CurrentState;
};
public Action<int> SelectMetaRule => SelectMetaRuleCore;
// Fix round B item 5: clicking a State/Condition/Action grid cell opens
// the rule editor popup (SelectMetaRuleCore alone still populates the
// draft fields for DeleteMetaRuleAt/MoveMetaRuleUpAt/MoveMetaRuleDownAt,
// which call it directly and must NOT pop the editor open).
public Action<int> SelectMetaRule => row =>
{
SelectMetaRuleCore(row);
_metaEditorVisible = true;
};
public bool MetaEditorVisible => _metaEditorVisible;
public Action HideMetaEditor => () => _metaEditorVisible = false;
// VTank's own cmbMetaCurrentState (docs/research/vtank-kb/08-ui-views.md
// §1 "Tab: Meta") is a SETTABLE current-state choice, not a read-only
// label — MetaEngine.Transition(string) and .States already existed
// (used internally for state-machine transitions), so this just exposes
// them: choosing a state here forces the live engine into it, exactly
// like retail's own manual state override.
public IReadOnlyList<string> MetaCurrentStateNames => _meta.States.ToArray();
public string SelectedMetaCurrentState => _meta.CurrentState;
public Action<string> SetMetaCurrentState => value =>
{
_meta.Transition(value);
_combatSettings.MetaState = _meta.CurrentState;
};
public Action<string> SelectMetaCondition => value =>
{
if (Enum.TryParse(value, ignoreCase: true, out MetaConditionKind parsed))
@ -1005,7 +1035,22 @@ internal sealed partial class MossTankPanel
public Action MetaSecondaryNumberDown => () => _metaSecondaryNumber--;
public Action MetaSecondaryNumberUp => () => _metaSecondaryNumber++;
public Action AddMetaRule => AddMetaRuleCore;
public Action ApplyMetaRule => ApplyMetaRuleCore;
// The Meta tab's own "Create" button (VTank's cmdMetaCreate, renamed
// from "Add" — item 5): appends a default rule exactly like AddMetaRule
// and immediately opens the editor popup so the new rule isn't left
// silently default-valued in the grid.
public Action CreateMetaRule => () =>
{
AddMetaRuleCore();
_metaEditorVisible = true;
};
// Apply/Cancel both close the popup (item 5) — Apply persists first,
// Cancel (HideMetaEditor) discards the in-progress draft.
public Action ApplyMetaRule => () =>
{
ApplyMetaRuleCore();
_metaEditorVisible = false;
};
public Action RemoveMetaRule => RemoveMetaRuleCore;
public Action MoveMetaRuleUp => () => MoveMetaRule(-1);
public Action MoveMetaRuleDown => () => MoveMetaRule(1);

View file

@ -113,6 +113,17 @@ public sealed class MossTankPlugin : IAcDreamPlugin
},
Path.Combine(directory, "mosstank-buffpicker.xml"),
_panel);
// Fix round B item 5: the Meta tab's inline rule editor moved to its
// own popup, same StartVisible=true/ShowInSidePanel=false pattern
// as the three panels above.
_host.Ui.AddPanel(
new PluginPanelDescriptor("meta-editor", "MossTank Meta Rule Editor")
{
StartVisible = true,
ShowInSidePanel = false,
},
Path.Combine(directory, "mosstank-metaeditor.xml"),
_panel);
_commandRegistration = _host.Commands.Register(
"vt",

View file

@ -0,0 +1,73 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Meta rule editor popup — Campaign VT slice 7 fix round B item 5. VTank's
own Meta tab (docs/research/vtank-kb/08-ui-views.md §1 "Tab: Meta") is
only 5 controls: the lstMetaRules grid, "Create", a bold "Current State:"
caption, and a settable cmbMetaCurrentState choice — no inline editor at
all. MossTank's previous inline State/Condition/Action editor (fields,
menus, numeric steppers, Apply/Add/Remove/Move) sat below the grid on the
Meta tab itself; this pulls that whole editor into its own popup, same
top-level plugin-panel pattern as mosstank-buffpicker.xml (StartVisible=
true, ShowInSidePanel=false, this panel's own visible="{MetaEditorVisible}"
is the SAME flag a grid text-cell click (State/Condition/Action columns)
or the tab's own "Create" button sets, and this popup's own Apply/Cancel
clear.
Remove/MoveUp/MoveDown stay here (not just in the grid's own delete/move
icon columns) as a convenience while a rule is already open for editing —
VTank's KB gives no ground truth for its own editing surface (not
documented in the tab tables at all), so this is MossTank's own design,
not a retail transcription.
-->
<panel x="300" y="380" w="630" h="160" title="MossTank Meta Rule Editor"
visible="{MetaEditorVisible}" resize="none">
<field x="4" y="8" w="118" h="21" text="{MetaStateDraft}"
onchange="{SetMetaStateDraft}" onsubmit="{SetMetaStateDraft}"
maxlength="64" clearonsubmit="false" background="#E6000000"
color="#FFE8DEC3" tooltip="State in which this meta rule is evaluated." />
<menu x="128" y="8" w="244" h="21" items="{MetaConditionNames}"
selected="{SelectedMetaCondition}" onchange="{SelectMetaCondition}"
rows="12" openupward="false" tooltip="Choose the rule condition." />
<menu x="378" y="8" w="204" h="21" items="{MetaActionNames}"
selected="{SelectedMetaAction}" onchange="{SelectMetaAction}"
rows="10" openupward="false" tooltip="Choose the action performed when the condition matches." />
<field x="4" y="34" w="244" h="21" text="{MetaConditionTextDraft}"
onchange="{SetMetaConditionTextDraft}"
onsubmit="{SetMetaConditionTextDraft}" maxlength="256"
clearonsubmit="false" background="#E6000000" color="#FFE8DEC3"
tooltip="Condition text or UtilityBelt-compatible expression." />
<field x="254" y="34" w="244" h="21" text="{MetaActionTextDraft}"
onchange="{SetMetaActionTextDraft}"
onsubmit="{SetMetaActionTextDraft}" maxlength="256"
clearonsubmit="false" background="#E6000000" color="#FFE8DEC3"
tooltip="Primary action argument or expression." />
<field x="504" y="34" w="110" h="21" text="{MetaSecondaryTextDraft}"
onchange="{SetMetaSecondaryTextDraft}"
onsubmit="{SetMetaSecondaryTextDraft}" maxlength="128"
clearonsubmit="false" background="#E6000000" color="#FFE8DEC3"
tooltip="Secondary action argument." />
<label x="4" y="64" w="60" h="16" text="{MetaNumberLabel}" color="#FFC7B98F" />
<button x="70" y="59" w="28" h="21" text="-" onclick="{MetaNumberDown}"
tooltip="Decrease the primary numeric argument." />
<button x="104" y="59" w="28" h="21" text="+" onclick="{MetaNumberUp}"
tooltip="Increase the primary numeric argument." />
<label x="144" y="64" w="76" h="16" text="{MetaSecondaryNumberLabel}"
color="#FFC7B98F" />
<button x="224" y="59" w="28" h="21" text="-"
onclick="{MetaSecondaryNumberDown}" tooltip="Decrease the secondary numeric argument." />
<button x="258" y="59" w="28" h="21" text="+"
onclick="{MetaSecondaryNumberUp}" tooltip="Increase the secondary numeric argument." />
<label x="306" y="64" w="200" h="16" text="{MetaStatus}" color="#FFC7B98F" />
<button x="4" y="90" w="80" h="22" text="Apply" onclick="{ApplyMetaRule}" />
<button x="90" y="90" w="80" h="22" text="Remove" onclick="{RemoveMetaRule}" />
<button x="176" y="90" w="28" h="22" icon="0x060028FC" iconkind="did"
onclick="{MoveMetaRuleUp}" tooltip="Move the selected meta rule up." />
<button x="210" y="90" w="28" h="22" icon="0x060028FD" iconkind="did"
onclick="{MoveMetaRuleDown}" tooltip="Move the selected meta rule down." />
<button x="250" y="90" w="80" h="22" text="Cancel" onclick="{HideMetaEditor}" />
<label x="4" y="120" w="600" h="16" text="{MetaNotice}" color="#FF9B9072" />
</panel>

View file

@ -638,36 +638,31 @@
</group>
<!-- Meta: ordered VTank state-machine rules. Rules fire once per state
entry; transitions/call/return use the live MetaEngine. The rules
list is VTank's own 6-column lstMetaRules grid (Campaign VT S7.6,
docs/research/vtank-kb/08-ui-views.md §1 "Tab: Meta";
PluginCore.cs:2218-2247 — col 0 delete, cols 1/2 move up/down, cols
3-5 State/Condition/Action open the rule editor below). PITCH:
delete/move 16+7=23 each, State 150+7=157, Condition/Action share
the remainder ("*"). -->
entry; transitions/call/return use the live MetaEngine. VTank's own
Meta tab (docs/research/vtank-kb/08-ui-views.md §1 "Tab: Meta") is
only 5 controls: lstMetaRules, cmdMetaCreate ("Create"),
lblmetacurrentstate (bold "Current State:"), and the SETTABLE
cmbMetaCurrentState choice — no profile toolbar, no "Enable Meta"
checkbox, no inline editor. Fix round B item 5: the profile toolbar
(menu/name-draft/New/CopyTo/Clear/Delete — Profiles already has the
Meta combo/CopyTo/Delete, item 5's own directive) and "Enable Meta"
(already on Options) are REMOVED to match; the inline State/
Condition/Action editor moves to its own popup
(mosstank-metaeditor.xml, opened by a grid text-cell click or
"Create", exactly like the buff picker). Macro/Nav's own New/Clear
precedent (fix round A) — losing an in-UI control that has no
Profiles-tab equivalent is a real, accepted regression, not an
oversight. "Add" is renamed "Create" (CreateMetaRule: adds a default
rule AND opens the editor, unlike the still-existing AddMetaRule
used directly by tests). The grid returns to VTank's full-width
856x116 proportion (848x116 here) now that nothing else needs to
share the tab; PITCH unchanged: delete/move 16+7=23 each, State
150+7=157, Condition/Action share the remainder ("*"). Bold text
isn't representable in the plain retail UI font (0x40000000 has no
bold face) — "Current State:" uses the same bright caption color
other tab headers do instead. -->
<group x="8" y="42" w="848" h="194" visible="{MetaVisible}">
<menu x="4" y="0" w="132" h="21" items="{MetaProfileNames}"
selected="{SelectedMetaProfile}" onchange="{SelectMetaProfile}"
rows="7" openupward="false" tooltip="Select the active meta profile." />
<field x="142" y="0" w="116" h="21" text="{MetaProfileNameDraft}"
onchange="{SetMetaProfileNameDraft}"
onsubmit="{CreateNamedMetaProfile}" maxlength="64"
clearonsubmit="false" background="#E6000000" color="#FFE8DEC3"
tooltip="Name a new or copied meta profile." />
<button x="264" y="0" w="44" h="21" text="New"
onclick="{CreateMetaProfile}" />
<button x="314" y="0" w="58" h="21" text="CopyTo"
onclick="{CopyMetaProfile}" />
<button x="378" y="0" w="48" h="21" text="Clear"
onclick="{ClearMetaProfile}" />
<button x="428" y="0" w="66" h="21" text="Delete"
onclick="{DeleteMetaProfile}"
tooltip="Delete the selected named Meta profile's real .af file. Not available for By char." />
<toggle x="500" y="2" w="112" h="20" text="Enable Meta"
checked="{MetaEnabled}" onclick="{ToggleMeta}" />
<label x="620" y="4" text="{MetaStateText}" color="#FFE8DEC3" />
<list x="4" y="26" w="776" h="68" rowheight="17"
<list x="4" y="16" w="840" h="116" rowheight="17"
selected="{SelectedMetaRuleIndex}" onchange="{SelectMetaRule}"
tooltip="Click State/Condition/Action to edit; delete/move-up/move-down cells act immediately.">
<column type="text" width="23" items="{MetaDeleteColumn}" onclick="{DeleteMetaRuleAt}" />
@ -678,56 +673,14 @@
<column type="text" width="*" items="{MetaActionColumn}" onclick="{SelectMetaRule}" />
</list>
<field x="4" y="100" w="118" h="21" text="{MetaStateDraft}"
onchange="{SetMetaStateDraft}" onsubmit="{SetMetaStateDraft}"
maxlength="64" clearonsubmit="false" background="#E6000000"
color="#FFE8DEC3" tooltip="State in which this meta rule is evaluated." />
<menu x="128" y="100" w="244" h="21" items="{MetaConditionNames}"
selected="{SelectedMetaCondition}" onchange="{SelectMetaCondition}"
rows="12" openupward="true" tooltip="Choose the rule condition." />
<menu x="378" y="100" w="204" h="21" items="{MetaActionNames}"
selected="{SelectedMetaAction}" onchange="{SelectMetaAction}"
rows="10" openupward="true" tooltip="Choose the action performed when the condition matches." />
<label x="4" y="136" w="136" h="16" text="Current State:" color="#FFE8DEC3" />
<menu x="140" y="136" w="120" h="16" items="{MetaCurrentStateNames}"
selected="{SelectedMetaCurrentState}" onchange="{SetMetaCurrentState}"
rows="8" openupward="true"
tooltip="Force the live Meta engine into a state directly." />
<button x="462" y="136" w="50" h="16" text="Create" onclick="{CreateMetaRule}" />
<field x="4" y="126" w="244" h="21" text="{MetaConditionTextDraft}"
onchange="{SetMetaConditionTextDraft}"
onsubmit="{SetMetaConditionTextDraft}" maxlength="256"
clearonsubmit="false" background="#E6000000" color="#FFE8DEC3"
tooltip="Condition text or UtilityBelt-compatible expression." />
<field x="254" y="126" w="244" h="21" text="{MetaActionTextDraft}"
onchange="{SetMetaActionTextDraft}"
onsubmit="{SetMetaActionTextDraft}" maxlength="256"
clearonsubmit="false" background="#E6000000" color="#FFE8DEC3"
tooltip="Primary action argument or expression." />
<field x="504" y="126" w="160" h="21" text="{MetaSecondaryTextDraft}"
onchange="{SetMetaSecondaryTextDraft}"
onsubmit="{SetMetaSecondaryTextDraft}" maxlength="128"
clearonsubmit="false" background="#E6000000" color="#FFE8DEC3"
tooltip="Secondary action argument." />
<label x="4" y="156" text="{MetaNumberLabel}" color="#FFC7B98F" />
<button x="70" y="151" w="28" h="21" text="-" onclick="{MetaNumberDown}"
tooltip="Decrease the primary numeric argument." />
<button x="104" y="151" w="28" h="21" text="+" onclick="{MetaNumberUp}"
tooltip="Increase the primary numeric argument." />
<label x="144" y="156" text="{MetaSecondaryNumberLabel}"
color="#FFC7B98F" />
<button x="224" y="151" w="28" h="21" text="-"
onclick="{MetaSecondaryNumberDown}" tooltip="Decrease the secondary numeric argument." />
<button x="258" y="151" w="28" h="21" text="+"
onclick="{MetaSecondaryNumberUp}" tooltip="Increase the secondary numeric argument." />
<button x="306" y="151" w="52" h="21" text="Apply"
onclick="{ApplyMetaRule}" />
<button x="364" y="151" w="44" h="21" text="Add"
onclick="{AddMetaRule}" />
<button x="414" y="151" w="62" h="21" text="Remove"
onclick="{RemoveMetaRule}" />
<button x="482" y="151" w="28" h="21" icon="0x060028FC" iconkind="did"
onclick="{MoveMetaRuleUp}" tooltip="Move the selected meta rule up." />
<button x="516" y="151" w="28" h="21" icon="0x060028FD" iconkind="did"
onclick="{MoveMetaRuleDown}" tooltip="Move the selected meta rule down." />
<label x="558" y="156" text="{MetaStatus}" color="#FFC7B98F" />
<label x="4" y="178" w="500" h="16" text="{MetaNotice}" color="#FF9B9072" />
<label x="4" y="178" w="500" h="16" text="{MetaStatus}" color="#FFC7B98F" />
</group>
</panel>

View file

@ -208,7 +208,19 @@ public sealed class MossTankMarkupContractTests
// S7.6 replaced the Meta tab's single-column rules list with
// VTank's own 6-column lstMetaRules grid (+6: the list itself was
// already counted, now 6 <column> children) — net 180 -> 186.
Assert.Equal(186, controls.Length);
// Fix round B item 5: VTank's real Meta tab is only 5 controls (the
// grid, "Create", a caption, and the settable current-state menu —
// docs/research/vtank-kb/08-ui-views.md §1). Removed entirely (no
// Profiles-tab equivalent, or already on Options): the profile
// toolbar (menu/name-draft/New/CopyTo/Clear/Delete, 6) and "Enable
// Meta" (1) — 7 controls gone for good. Moved into
// mosstank-metaeditor.xml (a separate file this test doesn't scan):
// the State/Condition/Action editor (2 fields + 2 menus + 1 field
// for state + 1 secondary-text field + 4 numeric-stepper buttons +
// Apply/Remove/MoveUp/MoveDown, 14). "Add" is renamed "Create" and
// stays in place (same slot, no count change). Added: the settable
// cmbMetaCurrentState menu (+1). Net 186 -> 166 (-7 -14 +1).
Assert.Equal(166, controls.Length);
foreach (XElement control in controls)
{
@ -422,6 +434,7 @@ public sealed class MossTankMarkupContractTests
[InlineData("mosstank-advanced.xml", 392f, 300f)]
[InlineData("mosstank-loot-editor.xml", 268f, 300f)]
[InlineData("mosstank-buffpicker.xml", 268f, 236f)]
[InlineData("mosstank-metaeditor.xml", 630f, 160f)]
public void SecondaryPopupPanelsFitTheirOwnBoundsAndEveryBindingResolves(
string fileName, float expectedWidth, float expectedHeight)
{

View file

@ -2082,6 +2082,68 @@ public sealed class MossTankPanelTests
Assert.Equal(["Hunt"], panel.MetaStateColumn);
}
[Fact]
public void MetaEditorPopupOpensOnCellClickOrCreateAndClosesOnApplyOrCancel()
{
// Fix round B item 5: the inline State/Condition/Action editor moved
// off the Meta tab into its own popup (mosstank-metaeditor.xml),
// gated by MetaEditorVisible. A grid text-cell click
// (SelectMetaRule, the row-int overload the <column onclick> uses)
// opens it; the tab's own "Create" button (CreateMetaRule) opens it
// too; Apply and Cancel both close it. DeleteMetaRuleAt/
// MoveMetaRuleUpAt/MoveMetaRuleDownAt call SelectMetaRuleCore
// directly (not through the SelectMetaRule wrapper) and must NOT
// pop the editor open.
var panel = new MossTankPanel(new FakeHost(new FakeAutomation()));
Assert.False(panel.MetaEditorVisible);
panel.CreateMetaRule();
Assert.True(panel.MetaEditorVisible);
Assert.Single(panel.MetaRows);
panel.HideMetaEditor();
Assert.False(panel.MetaEditorVisible);
panel.SelectMetaRule(0);
Assert.True(panel.MetaEditorVisible);
panel.ApplyMetaRule();
Assert.False(panel.MetaEditorVisible);
panel.SelectMetaRule(0);
Assert.True(panel.MetaEditorVisible);
panel.HideMetaEditor();
Assert.False(panel.MetaEditorVisible);
panel.DeleteMetaRuleAt(0);
Assert.False(panel.MetaEditorVisible);
}
[Fact]
public void MetaCurrentStateMenuForcesTheLiveEngineIntoTheChosenState()
{
// VTank's own cmbMetaCurrentState (docs/research/vtank-kb/
// 08-ui-views.md §1 "Tab: Meta") is settable, not a read-only
// label — choosing a state here must force the live MetaEngine
// into it via MetaEngine.Transition, the same primitive
// vtsetmetastate[]/SetMetaState rules already use.
var panel = new MossTankPanel(new FakeHost(new FakeAutomation()));
panel.SetMetaStateDraft(MetaEngine.DefaultState);
panel.SelectMetaAction(nameof(MetaActionKind.ChatCommand));
panel.SetMetaActionTextDraft("/mt hi");
panel.AddMetaRule();
panel.SetMetaStateDraft("Hunt");
panel.AddMetaRule();
Assert.Contains("Hunt", panel.MetaCurrentStateNames);
Assert.Equal(MetaEngine.DefaultState, panel.SelectedMetaCurrentState);
panel.SetMetaCurrentState("Hunt");
Assert.Equal("Hunt", panel.SelectedMetaCurrentState);
Assert.Equal("Hunt", panel.MetaState);
}
[Fact]
public void MetaProfilesAreIndependentDurableDocuments()
{