mirror of
https://github.com/navidys/tvxwidgets.git
synced 2025-04-30 13:48:57 +08:00
135 lines
3.2 KiB
Go
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
|
|
}
|