tvxwidgets/gauge_um.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

155 lines
3.7 KiB
Go

package tvxwidgets
import (
"fmt"
"github.com/gdamore/tcell/v2"
"github.com/rivo/tview"
)
// UtilModeGauge represents utilisation mode gauge permitive.
type UtilModeGauge struct {
*tview.Box
// pc percentage value
pc float64
// warn percentage value
warnPc float64
// critical percentage value
critPc float64
// okColor ok color
okColor tcell.Color
// warnColor warning block color
warnColor tcell.Color
// critColor critical block color
critColor tcell.Color
// emptyColor empty block color
emptyColor tcell.Color
// label prints label on the left of the gauge
label string
// labelColor label and percentage text color
labelColor tcell.Color
}
// NewUtilModeGauge returns new utilisation mode gauge permitive.
func NewUtilModeGauge() *UtilModeGauge {
gauge := &UtilModeGauge{
Box: tview.NewBox(),
pc: gaugeMinPc,
warnPc: gaugeWarnPc,
critPc: gaugeCritPc,
warnColor: tcell.ColorOrange,
critColor: tcell.ColorRed,
okColor: tcell.ColorGreen,
emptyColor: tcell.ColorWhite,
labelColor: tview.Styles.PrimaryTextColor,
label: "",
}
return gauge
}
// SetLabel sets label for this primitive.
func (g *UtilModeGauge) SetLabel(label string) {
g.label = label
}
// SetLabelColor sets label text color.
func (g *UtilModeGauge) SetLabelColor(color tcell.Color) {
g.labelColor = color
}
// Focus is called when this primitive receives focus.
func (g *UtilModeGauge) Focus(delegate func(p tview.Primitive)) { //nolint:revive
}
// HasFocus returns whether or not this primitive has focus.
func (g *UtilModeGauge) HasFocus() bool {
return g.Box.HasFocus()
}
// GetRect return primitive current rect.
func (g *UtilModeGauge) GetRect() (int, int, int, int) {
return g.Box.GetRect()
}
// SetRect sets rect for this primitive.
func (g *UtilModeGauge) SetRect(x, y, width, height int) {
g.Box.SetRect(x, y, width, height)
}
// SetValue update the gauge progress.
func (g *UtilModeGauge) SetValue(value float64) {
if value <= float64(gaugeMaxPc) {
g.pc = value
}
}
// GetValue returns current gauge value.
func (g *UtilModeGauge) GetValue() float64 {
return g.pc
}
// Draw draws this primitive onto the screen.
func (g *UtilModeGauge) Draw(screen tcell.Screen) {
g.Box.DrawForSubclass(screen, g)
x, y, width, height := g.Box.GetInnerRect()
labelPCWidth := 7
labelWidth := len(g.label)
barWidth := width - labelPCWidth - labelWidth
for i := 0; i < barWidth; i++ {
for j := 0; j < height; j++ {
value := float64(i * 100 / barWidth)
color := g.getBarColor(value)
if value > g.pc {
color = g.emptyColor
}
tview.Print(screen, prgCell, x+labelWidth+i, y+j, 1, tview.AlignCenter, color)
}
}
// draw label
tY := y + (height / emptySpaceParts)
if labelWidth > 0 {
tview.Print(screen, g.label, x, tY, labelWidth, tview.AlignLeft, g.labelColor)
}
// draw percentage text
tview.Print(screen, fmt.Sprintf("%6.2f%%", g.pc),
x+barWidth+labelWidth,
tY,
labelPCWidth,
tview.AlignLeft,
tview.Styles.PrimaryTextColor)
}
// SetWarnPercentage sets warning percentage start range.
func (g *UtilModeGauge) SetWarnPercentage(percentage float64) {
if percentage > 0 && percentage < 100 {
g.warnPc = percentage
}
}
// SetCritPercentage sets critical percentage start range.
func (g *UtilModeGauge) SetCritPercentage(percentage float64) {
if percentage > 0 && percentage < 100 && percentage > g.warnPc {
g.critPc = percentage
}
}
func (g *UtilModeGauge) getBarColor(percentage float64) tcell.Color {
if percentage < g.warnPc {
return g.okColor
} else if percentage < g.critPc {
return g.warnColor
}
return g.critColor
}
// SetEmptyColor sets empty gauge color.
func (g *UtilModeGauge) SetEmptyColor(color tcell.Color) {
g.emptyColor = color
}