Conversation
Until now a mouse click was the only way to make a reference-vector item current in the Avalonia detail view: Tab skipped the items and landed on the row's hover-hidden "+" launcher, so Backspace/Delete, the context-menu key and Move Left/Right all needed the mouse first. The WinForms VectorReferenceView is incomplete in its own way (tabbing in selects nothing, and its bare arrows reorder on reorderable rows while they navigate on possibility rows), so the target is better than it, not parity. A row's items now cost exactly one Tab stop, always the first item: the WinForms launcher drops its selection whenever focus leaves the row, so a remembered position has no precedent, and one rule with no exceptions is the easier one to predict. The "+" launcher and configure gear stay their own stops after the items. From a focused item, Left/Right step between items, Home/End jump to the ends, and Ctrl+Left/Right move the item on a row that can reorder, through the same edit-context move and immediate commit the item menu uses. The arrows and the chord follow the visual side on a mirrored row. Enter does nothing on an item, by decision. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
NUnit Tests 1 files ± 0 1 suites ±0 12m 45s ⏱️ + 4m 14s Results for commit 8b77496. ± Comparison against base commit 9607242. This pull request removes 1 and adds 13 tests. Note that renamed tests count towards both.♻️ This comment has been updated with latest results. |
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## main #1160 +/- ##
=======================================
Coverage 38.99% 38.99%
=======================================
Files 1520 1520
Lines 352711 352746 +35
Branches 40681 40693 +12
=======================================
+ Hits 137532 137568 +36
+ Misses 185883 185882 -1
Partials 29296 29296
🚀 New features to boost your workflow:
|
The read-only reference-vector row now wires two teardown entries: the item's select handler and the row's item-key handler, which every row gets so keyboard navigation works on read-only rows too. The handler count test still asserted one and failed #1160's first CI run. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
thejambi
approved these changes
Sep 25, 2026
thejambi
left a comment
Contributor
There was a problem hiding this comment.
@thejambi made 1 comment.
Reviewable status: 0 of 4 files reviewed, all discussions resolved.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Start here:
Src/Common/FwAvalonia/Detail/FwFieldControls.cs, theFwReferenceVectorFielditem loop and the key handler right after it. The other two files are tests.Tab now enters a reference-vector row at its first item, Left/Right and Home/End move between the items, and Ctrl+Left/Right move the current item on a row that can reorder. Until now a mouse click was the only way to make an item current: Tab skipped the items and landed on the hover-hidden "+" launcher, so Backspace/Delete, the context-menu key and Move Left/Right all needed the mouse first. This closes the follow-up agreed on #1133.
The question a reviewer arrives with is whether this collides with #1152, which turned retypable-row items into editors. It does not: the Tab-stop rule is
retypable || index == 0, so every editor on a retypable row stays its own stop, and aTextBoxmarks the arrow keys handled before the row's handler sees them. The question worth your time is the Tab-order contract itself.Where to look
ReferenceVectorKeyboardTests.TryMoveReferenceItemseam and immediate commit the item menu uses; read-only and non-reorderable rows stay inert.FlowDirection, so a mirrored row still moves toward the side the key names.Deliberately not here
Verification. Merges into main on top of #1152. Build with the comment and token hygiene gates; the keyboard, menu-request, tab-navigation, focus-memory and retypable-item fixtures, 90 tests. Manual pass in Sena 3: Tab entry, arrows, Home/End, Ctrl+Right on a subentry with focus following it, Backspace, Shift+F10, and the Environments row. Not run: the full FwAvaloniaTests suite.
Next: approve, or say whether Tab should remember the last item instead of entering at the first.
Reading this a year from now -- start here
The reasoning for this branch was worked out in conversation and in the LT-22691 working notes rather than in documents on the branch, so it is recorded here. The code says what the row does; these sections say why it does it that way and what was rejected.
Decisions, and why
One Tab stop per row, always the first item. The WinForms
VectorReferenceLauncherdestroys the view's selection inOnLeave, and tabbing back in selects nothing, so there was no precedent for a remembered position. A row revisited minutes or hours later would land somewhere the user no longer expects. One rule with no exceptions is easier to predict, and it is the smallest code: the first chip is marked the stop once, at construction. Provisional pending wider use.The stop is a chip, not a focusable row. A focusable container that forwards focus to an item makes Shift+Tab from the first item land on the container, which forwards straight back to the item.
Left/Right navigate everywhere; Ctrl+Left/Right reorder. In WinForms,
VectorReferenceView.HandleKeyDownmakes the bare arrows reorder on reorderable rows and never navigate,PossibilityVectorReferenceViewblanks that override so the arrows navigate, and collection rows swallow the arrows. One meaning for the bare arrows, with reorder on a chord, keeps the reorder capability without the inconsistency.Physical key resolved through FlowDirection. No row is mirrored today and neither WinForms path is direction-aware, but the text-box arrow code in the same file resolves the physical side against RightToLeft, and the guard is one line.
No Enter activation. Ctrl+Click's default jump has no WinForms keyboard equivalent, and Enter already means commit at the view level.
Paths not taken
DetailHostControl, a WinForms host no headless test drives; a stand-in would only re-testDetailFocusMemory. Verified manually instead.Deferred, and what would unblock it
TextBoxhandles Left/Right/Home/End and Ctrl+arrows itself, so item-to-item movement there is Tab and reorder is menu-only. Unblocked by choosing a chord the editor does not consume, if one is wanted.Evidence
test.ps1 -CommentHygiene -TokenHygiene -SkipNative -TestProject Src/Common/FwAvalonia/FwAvaloniaTests -TestFilter <ReferenceVectorKeyboardTests | DetailMenuRequestTests | DataTreeTabNavigationIntegrationTests | DetailFocusMemoryTests | RetypableVectorItemTests>on the rebased branch: both gates clean, build succeeded, 90 passed, 0 failed.DetailEditingTests,HoverRevealTestsandXmlLayoutImporterMenuBindingTests, all green.git merge-tree) against LT-22672 Allomorphs - Environments inline editing #1152 before it landed showed exactly one conflicting line, the Tab-stop assignment, resolved asretypable || index == 0. The item lookup in the key handler is by reference, so the list's element type changing under LT-22672 Allomorphs - Environments inline editing #1152 needed no other change.Preflight review details
Code Review Summary
Branch: LT-22691i
Base: main
Date: 2026-09-25
Review model: Claude Fable 5.1
Files changed: 3
Overview
Keyboard reach of reference-vector items in the Avalonia detail view (the
DataTreerendering of aDetailModel). Until now a mouse click was the onlyway to make an item of a reference-vector row current: Tab skipped the items and
landed on the row's hover-hidden "+" launcher, so Backspace/Delete, the
context-menu key and Move Left/Right all needed the mouse first. The WinForms
VectorReferenceViewis incomplete in its own way (tabbing in selects nothing;its bare arrows reorder on reorderable rows and navigate on possibility rows),
so the target is better than it, not parity.
The branch makes a row's items exactly one Tab stop (always the first item),
adds Left/Right, Home/End and Ctrl+Left/Right handling on a focused item, and
resolves the physical key through the row's FlowDirection. The analysis found
no Critical or Important issues; the minor findings were fixed or deliberately
routed to manual testing during the author's own review pass, and the manual
pass in Sena 3 was completed by the author.
Contract/API Changes
None.
FwReferenceVectorField's public surface is unchanged; only the chips'IsTabStopvalues and a new private key handler differ.Findings
Critical - Must address before merge
None.
Important - Should address before merge
None.
Minor - Consider
(fixed during review: the arrows and the reorder chord resolve the physical
key through the row's FlowDirection; mirrored-row test added)
e.Source as TextBlockwould silently disable the keys on TextBoxitems after LT-22672 Allomorphs - Environments inline editing #1152 (fixed during review: the pressed item is found by
reference with FindIndex; the LT-22672 Allomorphs - Environments inline editing #1152 merge then needed only the one-line
retypable || index == 0resolution)review: one target index, one FocusItemAt, one Handled)
added)
(resolved by decision: Tab always enters a row at its first item; the WinForms
launcher keeps no selection across focus loss, so there was no precedent;
provisional pending wider use)
No headless test carries focus to the moved item across a re-show(the re-show runs in
DetailHostControl, a WinForms host no headless testdrives; a stand-in would only re-test
DetailFocusMemory; covered by theauthor's manual pass: focus followed the moved item)
Home/End are not claimed by the WinForms host key policy(verifiedin the product by the author: Home and End reach the chips)
Required Validation / Evidence
. est.ps1 -CommentHygiene -TokenHygiene -SkipNative -TestProject Src/Common/FwAvalonia/FwAvaloniaTests -TestFilter <keyboard, menu-request, tab-navigation, focus-memory, retypable-item fixtures>after the rebase ontothe merged LT-22672 Allomorphs - Environments inline editing #1152: both hygiene gates clean, build succeeded, 90 tests passed.
DetailEditingTests,HoverRevealTestsandXmlLayoutImporterMenuBindingTests, all green.Tab on to the launcher and back, arrows and Home/End, Ctrl+Right/Left on a
subentry with focus following the moved item, Ctrl+arrows inert on a
non-reorderable row, Shift+F10 and Backspace on a focused chip, and the
Environments row (chips, launcher, create-on-type picker).
Developer-only ticket question: not applicable, the change is user-visible and
carries LT-22691.
Positive Observations
rule that would have needed maintaining on every selection change.
the input pipeline, in the style of the LT-22688 tab-navigation tests.
Interview Notes
the keyboard".
is provisional pending wider use; the Environments row's item menu is still
absent, which is a separate, already-tracked item and not changed here.
LT-22672 Allomorphs - Environments inline editing #1152 conflict (done); one Tab stop per row; Left/Right navigate, Home/End
jump, Ctrl+Left/Right reorder; no Enter activation; the extra Tab needed to
enter the pane from WinForms is a host-level artifact of the mixed period and
is not this branch's to fix.
In-Review Quality Check
Fixes above were made before the final gate run; the post-rebase run listed
under validation covers all of them.
Suggested Review Focus
FwReferenceVectorFielditem loop:IsTabStopisretypable || index == 0after the LT-22672 Allomorphs - Environments inline editing #1152 merge.then one target; only a focused item answers.
ReferenceVectorKeyboardTests: the Tab-order expectations encode thealways-first rule.
🤖 Generated with Claude Code
This change is