aboutsummaryrefslogtreecommitdiff
path: root/internal/ui/bar.go
diff options
context:
space:
mode:
authorhistoria <[not public]>2026-06-25 15:40:48 -0400
committerhistoria <[not public]>2026-06-25 15:40:48 -0400
commitabd612c15799f604e671e83dc7c410ed2b44185f (patch)
tree0597ca92350de73aac2a7cf26b2f2d6595dac0cc /internal/ui/bar.go
parent2725e2927a1595c7b100d942d1f14146252adeb7 (diff)
downloadthehouseoficarus-abd612c15799f604e671e83dc7c410ed2b44185f.tar.gz
slop refactor
Diffstat (limited to 'internal/ui/bar.go')
-rw-r--r--internal/ui/bar.go110
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 "#", "."
+}