Skip to content

fix: Explorer-style tile-pane arrows, Page, and Tab (0.8.4-beta1) - #5

Merged
cursor[bot] merged 2 commits into
mainfrom
cursor/tile-pane-spatial-nav-d4d0
Aug 21, 2026
Merged

fix: Explorer-style tile-pane arrows, Page, and Tab (0.8.4-beta1)#5
cursor[bot] merged 2 commits into
mainfrom
cursor/tile-pane-spatial-nav-d4d0

Conversation

@piranout

Copy link
Copy Markdown
Contributor

What

Keyboard navigation in the tile pane did not match Explorer.

Up/Down used the existing MoveGrid path, which walks a linear NavStop list (headers + tiles) by ±columns. In a wrapping, date-sectioned grid that looks random: short last rows throw the index off, and Down often lands on the next section header instead of the tile in the same column.

PageUp/PageDown were not handled at all, so ListBox default (skip N items / jump to a header) ran.

Tab walked the ribbon (hamburger, command bar, search) and OnEverythingKeyDown selected the first tile when entering the grid. WPF ListBox/TreeView also select the first item on focus.

Fix

  • Extracted TileSpatialNavigation: layout-based 2D pick over wrap + section gaps (headers are not cells).
    • Up/Down: same visual column on the adjacent row. Empty cell (short last row, end of a section): nearest in that column, then nearest in the row. Crossing a date-section header is fine.
    • PageUp/PageDown: scroll one viewport, then the tile in the same column closest to the same viewport Y. Not skip-N-items. After layout, a realized-container refine corrects header-height drift.
  • Left/Right still walk visual order (including headers). Home/End unchanged.
  • Tab / Shift+Tab: KeyboardNavigation.TabNavigation is Once on the folder pane and the tile ListBox, None on the ribbon / status / preview. Search stays on / and Ctrl+F.
  • Tabbing into a pane does not change its selection (LibraryPaneFocus.ShouldKeepExistingSelection + PreviewGotKeyboardFocus). Canvas-click focus (LibraryPaneFocus / ItemsList.Focus() from PR fix: focus the tile pane when clicking its empty canvas (0.8.3-beta1) #4) is unchanged; spatial arrows and Page keys work after that focus.

Version is 0.8.4-beta1 in Aperture.App.csproj. CHANGELOG has ## [0.8.4-beta1].

How to test

  1. dotnet test tests/Aperture.Core.Tests/Aperture.Core.Tests.csprojTileSpatialNavigationTests (same column, page = one viewport, not skip-N) and LibraryPaneFocusTests (canvas claim + Tab must not move selection). Live WPF is not unit-tested.

  2. Manual path (the real check):

    1. Tree arrows keep the selected folder.
    2. Tab to the grid — the selected tile (or none) stays; it must not jump to the first tile.
    3. Up/Down stay in the same visual column, including across a date-section header. A short last row does not jump to a random index or a header.
    4. PageUp/PageDown move ~one screen and keep the same column at ~the same screen Y, at any zoom.
    5. Tab back to the tree — the same folder stays selected.
    6. Ribbon (hamburger / command bar / search) is never a Tab stop. Search is still / and Ctrl+F.
    7. Click the empty tile-pane canvas (PR fix: focus the tile pane when clicking its empty canvas (0.8.3-beta1) #4) — arrows and Page keys still apply to the grid.

Notes

  • No CI/signing rewrite, visibility unchanged.
  • After merge, auto-tag should create v0.8.4-beta1.
Open in Web Open in Cursor 

cursoragent and others added 2 commits August 21, 2026 22:38
Up/Down stay in the same visual column (including across date-section
headers). PageUp/PageDown move one viewport and keep the same column at
the same screen Y. Tab cycles only tree ↔ tile pane and does not change
either selection; the ribbon is not a Tab stop.

Co-authored-by: Paul Smith <piranout@users.noreply.github.com>
The helper prefers the same column when any cell is in it. The old fixture
included a col-3 tile on the previous row, so the expected short-row
fallback never applied.

Co-authored-by: Paul Smith <piranout@users.noreply.github.com>
@cursor
cursor Bot merged commit c85ada4 into main Aug 21, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants