76 lines
1.3 KiB
Go
76 lines
1.3 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 wrapCells(value string, width int) []string {
|
|
if width <= 0 {
|
|
return []string{""}
|
|
}
|
|
return strings.Split(ansi.Wrap(value, width, ""), "\n")
|
|
}
|
|
|
|
func minimumSizeView(width int) string {
|
|
message := "sshkeeper needs at least 60x16"
|
|
if width <= 0 {
|
|
return message
|
|
}
|
|
return truncateCells(message, width)
|
|
}
|