summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-06-25 11:25:05 +0300
committerPaul Buetow <paul@buetow.org>2026-06-25 11:25:05 +0300
commit8c463a644d8023d4b6f51f712932777e98600c76 (patch)
treee268f3be62d19a9147f6dc7f3bf2b7c91c97c650
parent51a875e4d665c51e031259d48c9e6c723dafbcef (diff)
Fix bounded ultra visible count for 3r0
-rw-r--r--internal/ui/table_test.go18
-rw-r--r--internal/ui/ultra.go29
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
}