sshkeeper/internal/tui/layout.go

69 lines
1.2 KiB
Go

package tui
import (
"strings"
"github.com/charmbracelet/x/ansi"
)
const (
minimumTUIWidth = 60
minimumTUIHeight = 16
)
type terminalSizeClass int
const (
sizeBelowFloor terminalSizeClass = iota
sizeNarrow
sizeMedium
sizeWide
)
func classifyTerminal(width, height int) terminalSizeClass {
if width > 0 && height > 0 && (width < minimumTUIWidth || height < minimumTUIHeight) {
return sizeBelowFloor
}
if width >= 100 {
return sizeWide
}
if width >= 70 {
return sizeMedium
}
return sizeNarrow
}
func truncateCells(value string, width int) string {
if width <= 0 {
return ""
}
if ansi.StringWidth(value) <= width {
return value
}
if width == 1 {
return "…"
}
return ansi.Truncate(value, width, "…")
}
func padCells(value string, width int) string {
value = truncateCells(value, width)
missing := width - ansi.StringWidth(value)
if missing > 0 {
value += strings.Repeat(" ", missing)
}
return value
}
func fitLine(value string, width int) string {
return truncateCells(value, width)
}
func minimumSizeView(width int) string {
message := "sshkeeper needs at least 60x16"
if width <= 0 {
return message
}
return truncateCells(message, width)
}