fix(ui): complete Shift+click selection with virtual scrolling (#1428) #1499
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.
Summary
Completes the fix for #1428 - Shift+click doesn't select multiple items in tables
Building on the partial implementation from commit 427b37c, this PR addresses the TODO mentioned by @gustavo-iniguez-goya:
Root Cause
The existing implementation stored viewport row indices (0 to maxRowsInViewport-1) for Shift+click selection. When the user scrolled between the first click and the Shift+click, these indices became meaningless because the viewport now showed different database rows.
Solution
Store absolute database row indices instead of viewport indices:
vScrollBar.value() + viewport_row_viewportToAbsoluteRow()helper methodFetch rows directly from database for the selection range:
getRowsInRange(startRow, endRow, trackingCol)toGenericTableModelUpdated selection handling:
mousePressEventnow stores absolute row positionshandleShiftPressed()uses database query instead of trying to read from viewportExample Flow
_first_row_selected = 4(absolute)_last_row_selected = 110(absolute = 100 + 10)handleShiftPressed()callsmodel.getRowsInRange(4, 110, trackingCol)_rows_selectionTest Plan
🤖 Generated with Claude Code