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:
parent
897e262eda
commit
06c9b95222
6 changed files with 238 additions and 81 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
73
src/AcDream.Plugins.MossTank/mosstank-metaeditor.xml
Normal file
73
src/AcDream.Plugins.MossTank/mosstank-metaeditor.xml
Normal 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>
|
||||
|
|
@ -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>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue