tvxwidgets/gauge_pm.go
Navid Yaghoobi 36e3d86da4 golangci-lint update 1.56.2
Signed-off-by: Navid Yaghoobi <navidys@fedoraproject.org>
2024-03-05 21:56:13 +11:00

135 lines
3.2 KiB
Go

package tvxwidgets
import (
"fmt"
"github.com/gdamore/tcell/v2"
"github.com/rivo/tview"
)
// PercentageModeGauge represents percentage mode gauge permitive.
type PercentageModeGauge struct {
*tview.Box
// maxValue value
maxValue int
// value is current value
value int
// pgBgColor: progress block background color
pgBgColor tcell.Color
}
// NewPercentageModeGauge returns new percentage mode gauge permitive.
func NewPercentageModeGauge() *PercentageModeGauge {
gauge := &PercentageModeGauge{
Box: tview.NewBox(),
value: 0,
pgBgColor: tcell.ColorBlue,
}
return gauge
}
// Draw draws this primitive onto the screen.
func (g *PercentageModeGauge) Draw(screen tcell.Screen) {
g.Box.DrawForSubclass(screen, g)
if g.maxValue == 0 {
return
}
x, y, width, height := g.Box.GetInnerRect()
pcWidth := 3
pc := g.value * gaugeMaxPc / g.maxValue
pcString := fmt.Sprintf("%d%%", pc)
tW := width - pcWidth
tX := x + (tW / emptySpaceParts)
tY := y + height/emptySpaceParts
prgBlock := g.progressBlock(width)
style := tcell.StyleDefault.Background(g.pgBgColor).Foreground(tview.Styles.PrimaryTextColor)
for i := 0; i < height; i++ {
for j := 0; j < prgBlock; j++ {
screen.SetContent(x+j, y+i, ' ', nil, style)
}
}
// print percentage in middle of box
pcRune := []rune(pcString)
for j := 0; j < len(pcRune); j++ {
style = tcell.StyleDefault.Background(tview.Styles.PrimitiveBackgroundColor).Foreground(tview.Styles.PrimaryTextColor)
if x+prgBlock >= tX+j {
style = tcell.StyleDefault.Background(g.pgBgColor).Foreground(tview.Styles.PrimaryTextColor)
}
for i := 0; i < height; i++ {
screen.SetContent(tX+j, y+i, ' ', nil, style)
}
screen.SetContent(tX+j, tY, pcRune[j], nil, style)
}
}
// Focus is called when this primitive receives focus.
func (g *PercentageModeGauge) Focus(delegate func(p tview.Primitive)) { //nolint:revive
}
// HasFocus returns whether or not this primitive has focus.
func (g *PercentageModeGauge) HasFocus() bool {
return g.Box.HasFocus()
}
// GetRect return primitive current rect.
func (g *PercentageModeGauge) GetRect() (int, int, int, int) {
return g.Box.GetRect()
}
// SetRect sets rect for this primitive.
func (g *PercentageModeGauge) SetRect(x, y, width, height int) {
g.Box.SetRect(x, y, width, height)
}
// SetPgBgColor sets progress block background color.
func (g *PercentageModeGauge) SetPgBgColor(color tcell.Color) {
g.pgBgColor = color
}
// SetValue update the gauge progress.
func (g *PercentageModeGauge) SetValue(value int) {
if value <= g.maxValue {
g.value = value
}
}
// GetValue returns current gauge value.
func (g *PercentageModeGauge) GetValue() int {
return g.value
}
// SetMaxValue set maximum allows value for the gauge.
func (g *PercentageModeGauge) SetMaxValue(value int) {
if value > 0 {
g.maxValue = value
}
}
// GetMaxValue returns maximum allows value for the gauge.
func (g *PercentageModeGauge) GetMaxValue() int {
return g.maxValue
}
// Reset resets the gauge counter (set to 0).
func (g *PercentageModeGauge) Reset() {
g.value = 0
}
func (g *PercentageModeGauge) progressBlock(max int) int {
if g.maxValue == 0 {
return g.maxValue
}
pc := g.value * gaugeMaxPc / g.maxValue
value := pc * max / gaugeMaxPc
return value
}