bubbles/progress/progress.go

64 lines
1.6 KiB
Go
Raw Normal View History

2020-11-04 16:42:44 +03:00
package progress
import (
"strings"
"github.com/lucasb-eyer/go-colorful"
"github.com/muesli/termenv"
)
type Model struct {
// Left side color of progress bar. By default, it's #00dbde
StartColor colorful.Color
// Left side color of progress bar. By default, it's #fc00ff
EndColor colorful.Color
2020-11-05 14:41:53 +03:00
// Width of progress bar in symbols.
Width int
2020-11-04 16:42:44 +03:00
// filament rune of done part of progress bar. it's █ by default
FilamentSymbol rune
// empty rune of pending part of progress bar. it's ░ by default
EmptySymbol rune
// if true, gradient will be setted from start to end of filled part. Instead, it'll work
// on all proggress bar length
FullGradientMode bool
}
// NewModel returns a model with default values.
func NewModel() Model {
2020-11-04 16:42:44 +03:00
startColor, _ := colorful.Hex("#00dbde")
endColor, _ := colorful.Hex("#fc00ff")
return Model{
2020-11-04 16:42:44 +03:00
StartColor: startColor,
EndColor: endColor,
Width: 40,
2020-11-04 16:42:44 +03:00
FilamentSymbol: '█',
EmptySymbol: '░',
}
}
func (m *Model) View(percent float64) string {
ramp := make([]string, int(float64(m.Width)*percent))
2020-11-04 16:42:44 +03:00
for i := 0; i < len(ramp); i++ {
2020-11-05 14:41:53 +03:00
gradientPart := float64(m.Width)
2020-11-04 16:42:44 +03:00
if m.FullGradientMode {
gradientPart = float64(len(ramp))
}
percent := float64(i) / gradientPart
c := m.StartColor.BlendLuv(m.EndColor, percent)
ramp[i] = c.Hex()
}
var fullCells string
for i := 0; i < len(ramp); i++ {
fullCells += termenv.String(string(m.FilamentSymbol)).Foreground(termenv.ColorProfile().Color(ramp[i])).String()
}
2020-11-05 14:41:53 +03:00
fullCells += strings.Repeat(string(m.EmptySymbol), m.Width-len(ramp))
2020-11-04 16:42:44 +03:00
return fullCells
}