Implemented new Tui module
This commit is contained in:
parent
d1c0f10097
commit
0b4839278c
1 changed files with 110 additions and 0 deletions
110
z/tui.go
Normal file
110
z/tui.go
Normal file
|
@ -0,0 +1,110 @@
|
||||||
|
package z
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"math"
|
||||||
|
"github.com/gookit/color"
|
||||||
|
"github.com/shopspring/decimal"
|
||||||
|
)
|
||||||
|
|
||||||
|
func GetOutputBoxForNumber(number int, clr (func(...interface {}) string) ) (string) {
|
||||||
|
switch(number) {
|
||||||
|
case 0: return clr(" ")
|
||||||
|
case 1: return clr(" ▄")
|
||||||
|
case 2: return clr("▄▄")
|
||||||
|
case 3: return clr("▄█")
|
||||||
|
case 4: return clr("██")
|
||||||
|
}
|
||||||
|
|
||||||
|
return clr(" ")
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetOutputBarForHours(hours decimal.Decimal, stats []Statistic) ([]string) {
|
||||||
|
var bar = []string{
|
||||||
|
color.FgGray.Render("····"),
|
||||||
|
color.FgGray.Render("····"),
|
||||||
|
color.FgGray.Render("····"),
|
||||||
|
color.FgGray.Render("····"),
|
||||||
|
color.FgGray.Render("····"),
|
||||||
|
color.FgGray.Render("····"),
|
||||||
|
}
|
||||||
|
|
||||||
|
hoursInt := int((hours.Round(0)).IntPart())
|
||||||
|
rest := ((hours.Round(0)).Mod(decimal.NewFromInt(4))).Round(0)
|
||||||
|
restInt := int(rest.IntPart())
|
||||||
|
|
||||||
|
divisible := hoursInt - restInt
|
||||||
|
fullparts := divisible / 4
|
||||||
|
|
||||||
|
colorsFull := make(map[int](func(...interface {}) string))
|
||||||
|
colorsFullIdx := 0
|
||||||
|
|
||||||
|
colorFraction := color.FgWhite.Render
|
||||||
|
colorFractionPrevAmount := 0.0
|
||||||
|
|
||||||
|
for _, stat := range stats {
|
||||||
|
statHoursInt, _ := stat.Hours.Float64()
|
||||||
|
statRest := (stat.Hours.Round(0)).Mod(decimal.NewFromInt(4))
|
||||||
|
statRestFloat, _ := statRest.Float64()
|
||||||
|
|
||||||
|
if statRestFloat > colorFractionPrevAmount {
|
||||||
|
colorFractionPrevAmount = statRestFloat
|
||||||
|
colorFraction = stat.Color
|
||||||
|
}
|
||||||
|
|
||||||
|
fullColoredParts := int(math.Round(statHoursInt) / 4)
|
||||||
|
|
||||||
|
if fullColoredParts == 0 && statHoursInt > colorFractionPrevAmount {
|
||||||
|
colorFractionPrevAmount = statHoursInt
|
||||||
|
colorFraction = stat.Color
|
||||||
|
}
|
||||||
|
|
||||||
|
for i := 0; i < fullColoredParts; i++ {
|
||||||
|
colorsFull[colorsFullIdx] = stat.Color
|
||||||
|
colorsFullIdx++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
iColor := 0
|
||||||
|
for i := (len(bar) - 1); i > (len(bar) - 1 - fullparts); i-- {
|
||||||
|
if iColor < colorsFullIdx {
|
||||||
|
bar[i] = " " + GetOutputBoxForNumber(4, colorsFull[iColor]) + " "
|
||||||
|
iColor++
|
||||||
|
} else {
|
||||||
|
bar[i] = " " + GetOutputBoxForNumber(4, colorFraction) + " "
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(restInt > 0) {
|
||||||
|
bar[(len(bar) - 1 - fullparts)] = " " + GetOutputBoxForNumber(restInt, colorFraction) + " "
|
||||||
|
}
|
||||||
|
|
||||||
|
return bar
|
||||||
|
}
|
||||||
|
|
||||||
|
func OutputAppendRight(leftStr string, rightStr string, pad int) (string) {
|
||||||
|
var output string = ""
|
||||||
|
var rpos int = 0
|
||||||
|
|
||||||
|
left := []rune(leftStr)
|
||||||
|
leftLen := len(left)
|
||||||
|
right := []rune(rightStr)
|
||||||
|
rightLen := len(right)
|
||||||
|
|
||||||
|
for lpos := 0; lpos < leftLen; lpos++ {
|
||||||
|
if left[lpos] == '\n' || lpos == (leftLen - 1) {
|
||||||
|
output = fmt.Sprintf("%s%*s", output, pad, "")
|
||||||
|
for rpos = rpos; rpos < rightLen; rpos++ {
|
||||||
|
output = fmt.Sprintf("%s%c", output, right[rpos])
|
||||||
|
if right[rpos] == '\n' {
|
||||||
|
rpos++
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
output = fmt.Sprintf("%s%c", output, left[lpos])
|
||||||
|
}
|
||||||
|
|
||||||
|
return output
|
||||||
|
}
|
Loading…
Reference in a new issue