Skip to content

feat(search): virtualise results with ItemsRepeater + WrapLayout (#679)#680

Merged
astar-development-jb merged 6 commits into
mainfrom
feature/679-itemsrepeater-wraplayout
Jun 22, 2026
Merged

feat(search): virtualise results with ItemsRepeater + WrapLayout (#679)#680
astar-development-jb merged 6 commits into
mainfrom
feature/679-itemsrepeater-wraplayout

Conversation

@jaybarden1

Copy link
Copy Markdown
Contributor

Summary

  • Replace ItemsControl + WrapPanel with ItemsRepeater + WrapLayout — only visible cards are realised, off-screen cards do not hold live containers
  • Wire thumbnail deferred loading to ItemsRepeater.ElementPrepared / ElementClearing in code-behind (replacing ContainerPrepared / ContainerClearing)
  • Add Avalonia.Controls.ItemsRepeater v12.0.0 to central package management and project reference
  • Bump application version 0.27.00.28.0 (feature)

Closes #679

Test plan

  • dotnet clean && dotnet build --no-restore — zero errors, zero warnings ✅
  • dotnet test --no-build — 2476 passed, 0 failed, 1 skipped (pre-existing) ✅
  • Card layout (180 px wide wrapping rows) visually identical to previous layout
  • Scroll through >100 results and confirm off-screen cards are not held in memory (check via Avalonia DevTools element count)
  • Thumbnails load when cards scroll into view; cancel fires when scrolled out

🤖 Generated with Claude Code

jaybarden1 and others added 5 commits June 22, 2026 19:30
…#677)

4 compile errors expected — IsCapped, CappedNoticeText, CancelThumbnailLoad not yet implemented.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add IsCapped / CappedNoticeText to SyncedFileSearchViewModel; results
  capped at 500 with localised notice when limit is hit
- Replace WrapPanel with VirtualizingStackPanel in SyncedFileSearchView
  so only visible containers incur layout/render cost
- Defer thumbnail loading to ContainerPrepared; cancel on ContainerClearing
  via CancellationTokenSource in SyncedFileResultViewModel
- Bump ApplicationVersion 0.26.0 → 0.27.0

Closes #677

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…#677)

500-result cap bounds render cost without requiring layout change.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replace ItemsControl + WrapPanel with ItemsRepeater + WrapLayout so only
visible cards are realised. Wire thumbnail load/cancel to ElementPrepared
and ElementClearing. Add Avalonia.Controls.ItemsRepeater 12.0.0 package.

Closes #679

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@jaybarden1 jaybarden1 requested a review from a team June 22, 2026 19:28
@astar-development-jb astar-development-jb enabled auto-merge (squash) June 22, 2026 19:28
@astar-development-jb astar-development-jb merged commit 5e6d291 into main Jun 22, 2026
5 checks passed
@astar-development-jb astar-development-jb deleted the feature/679-itemsrepeater-wraplayout branch June 22, 2026 19:30
astar-development-jb pushed a commit that referenced this pull request Jun 22, 2026
… (#681)

Replace ItemsControl + WrapPanel with ItemsRepeater + WrapLayout so only
visible cards are realised. Wire thumbnail load/cancel to ElementPrepared
and ElementClearing. Re-applies changes reverted from PR #680.

Closes #679

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
astar-development-jb pushed a commit that referenced this pull request Jun 22, 2026
* feat(search): virtualise results with ItemsRepeater + WrapLayout (#679)

Replace ItemsControl + WrapPanel with ItemsRepeater + WrapLayout so only
visible cards are realised. Wire thumbnail load/cancel to ElementPrepared
and ElementClearing. Re-applies changes reverted from PR #680.

Closes #679

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat(search): show loading indicator while categories fetch in search view

Search view now renders immediately on navigation; the tags/categories
section displays "Loading categories..." while GetDistinctTagNamesAsync
is in-flight instead of flashing the "no classifications" message.

IsLoadingTags and ShowNoClassificationsHint are set atomically inside
dispatcher.Post so the UI never sees a transient incorrect state.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
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.

perf(search): virtualise search results with ItemsRepeater + WrapLayout

3 participants