76 lines
1.3 KiB
Go
76 lines
1.3 KiB
Go
package tui
|
|
|
|
// --- Scroll position calculation ---
|
|
|
|
// AdjustScroll returns new scroll offset keeping cursor visible
|
|
func AdjustScroll(cursor, scroll, visible, total int) int {
|
|
if total <= visible {
|
|
return 0
|
|
}
|
|
if cursor < scroll {
|
|
return cursor
|
|
}
|
|
if cursor >= scroll+visible {
|
|
return cursor - visible + 1
|
|
}
|
|
return scroll
|
|
}
|
|
|
|
// ScrollPercent returns scroll position as 0-100 percentage
|
|
func ScrollPercent(scroll, visible, total int) int {
|
|
if total <= visible {
|
|
return 0
|
|
}
|
|
maxScroll := total - visible
|
|
if maxScroll <= 0 {
|
|
return 0
|
|
}
|
|
pct := (scroll * 100) / maxScroll
|
|
if pct > 100 {
|
|
pct = 100
|
|
}
|
|
if pct < 0 {
|
|
pct = 0
|
|
}
|
|
return pct
|
|
}
|
|
|
|
// --- Clamping utilities ---
|
|
|
|
// ClampScroll ensures scroll offset is within valid range
|
|
func ClampScroll(scroll, visible, total int) int {
|
|
if total <= visible {
|
|
return 0
|
|
}
|
|
maxScroll := total - visible
|
|
if scroll < 0 {
|
|
return 0
|
|
}
|
|
if scroll > maxScroll {
|
|
return maxScroll
|
|
}
|
|
return scroll
|
|
}
|
|
|
|
// ClampCursor ensures cursor is within valid range
|
|
func ClampCursor(cursor, total int) int {
|
|
if total <= 0 {
|
|
return 0
|
|
}
|
|
if cursor < 0 {
|
|
return 0
|
|
}
|
|
if cursor >= total {
|
|
return total - 1
|
|
}
|
|
return cursor
|
|
}
|
|
|
|
// PageDelta returns recommended page scroll amount
|
|
func PageDelta(visible int) int {
|
|
delta := visible / 2
|
|
if delta < 1 {
|
|
delta = 1
|
|
}
|
|
return delta
|
|
} |