From 8c463a644d8023d4b6f51f712932777e98600c76 Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Thu, 25 Jun 2026 11:25:05 +0300 Subject: Fix bounded ultra visible count for 3r0 --- internal/ui/table_test.go | 18 ++++++++++++++++++ internal/ui/ultra.go | 29 ++++++++++++++++++++++++----- 2 files changed, 42 insertions(+), 5 deletions(-) diff --git a/internal/ui/table_test.go b/internal/ui/table_test.go index 3c7cbd7..a74fcce 100644 --- a/internal/ui/table_test.go +++ b/internal/ui/table_test.go @@ -2978,6 +2978,24 @@ func TestUltraEnsureVisibleOffsets(t *testing.T) { } } +func TestUltraVisibleCountMeasuredStopsAfterViewport(t *testing.T) { + heights := []int{2, 2, 2, 2, 2} + var measured []int + + got := ultraVisibleCountMeasured(len(heights), 0, 5, func(i int) int { + measured = append(measured, i) + return heights[i] + }) + + if got != 2 { + t.Fatalf("visible count = %d, want 2", got) + } + wantMeasured := []int{0, 1, 2} + if !reflect.DeepEqual(measured, wantMeasured) { + t.Fatalf("measured indexes = %v, want %v", measured, wantMeasured) + } +} + func TestUltraBlinkUsesVisibleSelectionAndRendersBlink(t *testing.T) { tmp := t.TempDir() taskPath := setupUltraTaskSet(t, tmp) diff --git a/internal/ui/ultra.go b/internal/ui/ultra.go index 2121aa8..e4f5e17 100644 --- a/internal/ui/ultra.go +++ b/internal/ui/ultra.go @@ -187,8 +187,21 @@ func (m *Model) ultraVisibleCount() int { return 0 } - budget, heights := m.ultraCardMetrics(tasks) - return ultraVisibleCountFrom(heights, m.ultraVisibleStart(len(tasks)), budget) + width := m.ultraRenderWidth() + top := m.ultraStatusLine(m.ultraModeStatus(tasks), width) + bottom := m.ultraStatusLine(m.ultraCursorStatus(tasks), width) + _, overlayHeight := m.ultraOverlay() + + budget := m.ultraCardBudget(top, bottom, overlayHeight) + selected := m.ultraVisibleCursor(tasks) + start := m.ultraVisibleStart(len(tasks)) + return ultraVisibleCountMeasured(len(tasks), start, budget, func(i int) int { + card := m.renderUltraCard(tasks[i], width, i == selected, m.ultraSearchRegex) + if card == "" { + return 0 + } + return lipgloss.Height(card) + }) } func (m *Model) ultraTaskList() []task.Task { @@ -933,14 +946,20 @@ func (m *Model) ultraCardMetrics(tasks []task.Task) (int, []int) { } func ultraVisibleCountFrom(heights []int, start, budget int) int { - if budget <= 0 || start < 0 || start >= len(heights) { + return ultraVisibleCountMeasured(len(heights), start, budget, func(i int) int { + return heights[i] + }) +} + +func ultraVisibleCountMeasured(total, start, budget int, heightAt func(int) int) int { + if budget <= 0 || start < 0 || start >= total { return 0 } used := 0 count := 0 - for i := start; i < len(heights); i++ { - height := heights[i] + for i := start; i < total; i++ { + height := heightAt(i) if height <= 0 { continue } -- cgit v1.2.3