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 "#", "." }