diff options
| author | historia <[not public]> | 2026-06-25 15:40:48 -0400 |
|---|---|---|
| committer | historia <[not public]> | 2026-06-25 15:40:48 -0400 |
| commit | abd612c15799f604e671e83dc7c410ed2b44185f (patch) | |
| tree | 0597ca92350de73aac2a7cf26b2f2d6595dac0cc /internal/ui/bar.go | |
| parent | 2725e2927a1595c7b100d942d1f14146252adeb7 (diff) | |
| download | thehouseoficarus-abd612c15799f604e671e83dc7c410ed2b44185f.tar.gz | |
slop refactor
Diffstat (limited to 'internal/ui/bar.go')
| -rw-r--r-- | internal/ui/bar.go | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/internal/ui/bar.go b/internal/ui/bar.go new file mode 100644 index 0000000..c1abce9 --- /dev/null +++ b/internal/ui/bar.go @@ -0,0 +1,110 @@ +package ui + +import ( + "math" + "strings" + + "thehouseoficarus/internal/color" +) + +type BarStyle struct { + FilledColor int + EmptyColor int + EmptyDim bool +} + +func RenderBar(current, max, width int, unicode bool) string { + if max <= 0 { + max = 1 + } + if current < 0 { + current = 0 + } + if current > max { + current = max + } + filled := int(math.Round(float64(current) * float64(width) / float64(max))) + if filled > width { + filled = width + } + if filled < 0 { + filled = 0 + } + + fillRune, emptyRune := barRunes(unicode) + return strings.Repeat(fillRune, filled) + strings.Repeat(emptyRune, width-filled) +} + +func RenderBarF(current, max float64, width int, unicode bool) string { + if max <= 0 { + max = 1 + } + ratio := current / max + if ratio > 1 { + ratio = 1 + } + if ratio < 0 { + ratio = 0 + } + filled := int(math.Round(ratio * float64(width))) + if filled > width { + filled = width + } + if filled < 0 { + filled = 0 + } + + fillRune, emptyRune := barRunes(unicode) + return strings.Repeat(fillRune, filled) + strings.Repeat(emptyRune, width-filled) +} + +func RenderColoredBar(current, max, width int, unicode bool, style *BarStyle, mode string) string { + if max <= 0 { + max = 1 + } + if current < 0 { + current = 0 + } + if current > max { + current = max + } + filled := int(math.Round(float64(current) * float64(width) / float64(max))) + if filled > width { + filled = width + } + if filled < 0 { + filled = 0 + } + + fillRune, emptyRune := barRunes(unicode) + fillStr := strings.Repeat(fillRune, filled) + emptyStr := strings.Repeat(emptyRune, width-filled) + + if style != nil && mode != "none" && mode != "" { + if style.FilledColor >= 0 { + fillStr = color.Render(mode, color.ColorSpec{Fg: style.FilledColor}, fillStr) + } + if style.EmptyColor >= 0 { + spec := color.ColorSpec{Fg: style.EmptyColor} + if style.EmptyDim { + spec.Dim = true + } + emptyStr = color.Render(mode, spec, emptyStr) + } + } + + return fillStr + emptyStr +} + +func barRunes(unicode bool) (fill, empty string) { + return BarRunes(unicode) +} + +// BarRunes returns the fill and empty runes used for progress bars, selecting +// Unicode block characters when unicode is true and ASCII otherwise. +func BarRunes(unicode bool) (fill, empty string) { + if unicode { + return "█", "░" + } + return "#", "." +} |
