Testing TUI implementation

This commit is contained in:
マリウス 2020-10-16 16:36:44 +01:00
parent 154ea20357
commit 79dfe4ed4a
No known key found for this signature in database
GPG key ID: C228EF0A530AF06F
3 changed files with 261 additions and 0 deletions

125
z/calendar.go Normal file
View file

@ -0,0 +1,125 @@
package z
import (
"fmt"
"time"
"github.com/shopspring/decimal"
)
type Calendar struct {
}
func GetOutputBoxForNumber(number int) (string) {
switch(number) {
case 0: return " "
case 1: return " ▄"
case 2: return "▄▄"
case 3: return "▄█"
case 4: return "██"
}
return " "
}
func GetOutputBarForHours(hours decimal.Decimal) ([]string) {
var bar = []string{
"····",
"····",
"····",
"····",
"····",
"····",
}
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
for i := (len(bar) - 1); i > (len(bar) - 1 - fullparts); i-- {
bar[i] = " " + GetOutputBoxForNumber(4) + " "
}
if(restInt > 0) {
bar[(len(bar) - 1 - fullparts)] = " " + GetOutputBoxForNumber(restInt) + " "
}
return bar
}
func (calendar *Calendar) GetCalendarWeek(timestamp time.Time) (int) {
var _, cw = timestamp.ISOWeek()
return cw
}
// func (calendar *Calendar) GetBufferForWeekCalendar(cw int, data map[string]decimal.Decimal) ([][]string) {
// var output string = ""
// var bars [][]string
// var totalHours = decimal.NewFromInt(0)
// var days = []string{"Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"}
// for _, day := range days {
// hours := data[day]
// totalHours = totalHours.Add(hours)
// bar := GetOutputBarForHours(hours)
// bars = append(bars, bar)
// }
// output = fmt.Sprintf("CW %02d %s H\n", cw, totalHours.StringFixed(2))
// for row := 0; row < len(bars[0]); row++ {
// output = fmt.Sprintf("%s%2d │", output, ((6 - row) * 4))
// for col := 0; col < len(bars); col++ {
// output = fmt.Sprintf("%s%s", output, bars[col][row])
// }
// output = fmt.Sprintf("%s\n", output)
// }
// output = fmt.Sprintf("%s └────────────────────────────\n %s %s %s %s %s %s %s",
// output, days[0], days[1], days[2], days[3], days[4], days[5], days[6])
// return output
// }
func (calendar *Calendar) GetTuiBufferForWeekCalendar(cw int, data map[string]decimal.Decimal) (TuiBuffer) {
var output string = ""
buffer := TuiBuffer{}
var bars [][]string
var totalHours = decimal.NewFromInt(0)
var days = []string{"Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"}
for _, day := range days {
hours := data[day]
totalHours = totalHours.Add(hours)
bar := GetOutputBarForHours(hours)
bars = append(bars, bar)
}
output = fmt.Sprintf("CW %02d %s H\n", cw, totalHours.StringFixed(2))
for row := 0; row < len(bars[0]); row++ {
output = fmt.Sprintf("%s%2d │", output, ((6 - row) * 4))
for col := 0; col < len(bars); col++ {
output = fmt.Sprintf("%s%s", output, bars[col][row])
}
output = fmt.Sprintf("%s\n", output)
}
output = fmt.Sprintf("%s └────────────────────────────\n %s %s %s %s %s %s %s",
output, days[0], days[1], days[2], days[3], days[4], days[5], days[6])
fmt.Printf("%s\n", output)
row := 0
col := 0
for _, chr := range output {
if(chr == '\n') {
row++
col = 0
continue
}
buffer[row][col] = chr
col++
}
return buffer
}

69
z/stats.go Normal file
View file

@ -0,0 +1,69 @@
package z
import (
"os"
"fmt"
"github.com/spf13/cobra"
"github.com/shopspring/decimal"
"github.com/gookit/color"
)
var statsCmd = &cobra.Command{
Use: "stats",
Short: "Display activity statistics",
Long: "Display statistics on all tracked activities.",
Run: func(cmd *cobra.Command, args []string) {
// user := GetCurrentUser()
// entries, err := database.ListEntries(user)
// if err != nil {
// fmt.Printf("%s %+v\n", CharError, err)
// os.Exit(1)
// }
// for _, entry := range entries {
// fmt.Printf("%s\n", entry.GetOutput())
// }
var cal Calendar
var data = make(map[string]decimal.Decimal)
data["Mo"], _ = decimal.NewFromString("15.00")
data["Tu"], _ = decimal.NewFromString("4.0")
data["We"], _ = decimal.NewFromString("10.0")
data["Th"], _ = decimal.NewFromString("1.0")
data["Fr"], _ = decimal.NewFromString("0.0")
data["Sa"], _ = decimal.NewFromString("18.2")
data["Su"], _ = decimal.NewFromString("1.0")
buff := cal.GetTuiBufferForWeekCalendar(1, data)
buff2 := cal.GetTuiBufferForWeekCalendar(2, data)
r := []rune(color.FgLightWhite.Render("A"))
for _, bla := range r {
fmt.Printf("Char: %c", bla)
}
tui := Tui{}
// tui.Init()
fmt.Printf("%s\n", tui.Render(100, 10))
tui.Merge(buff, 0, 0)
tui.Merge(buff2, 0, 48)
fmt.Printf("---\n")
fmt.Printf("%s\n", tui.Render(100, 10))
return
},
}
func init() {
rootCmd.AddCommand(statsCmd)
var err error
database, err = InitDatabase()
if err != nil {
fmt.Printf("%s %+v\n", CharError, err)
os.Exit(1)
}
}

67
z/tui.go Normal file
View file

@ -0,0 +1,67 @@
package z
import (
"fmt"
)
const(
TUI_ROWS = 200
TUI_COLS = 200
)
type TuiBuffer [TUI_ROWS][TUI_COLS]rune
type Tui struct {
Buffer TuiBuffer
}
func (tui *Tui) Init() {
for row := 0; row < TUI_ROWS; row++ {
for col := 0; col < TUI_COLS; col++ {
tui.Buffer[row][col] = 0
}
}
}
func (tui *Tui) Merge(buffer TuiBuffer, x int, y int) (bool) {
inputRow := 0
inputCol := 0
for row := x; row < TUI_ROWS; row++ {
for col := y; col < TUI_COLS; col++ {
if buffer[inputRow][inputCol] != 0 {
tui.Buffer[row][col] = buffer[inputRow][inputCol]
}
inputCol++
}
inputRow++
inputCol = 0
}
return true
}
func (tui *Tui) Render(cols int, rows int) (string) {
var output string = ""
var emptyRow bool = true
for row := 0; row < rows; row++ {
for col := 0; col < cols; col++ {
var chr rune = ' '
if tui.Buffer[row][col] != 0 {
chr = tui.Buffer[row][col]
emptyRow = false
} else {
chr = ' '
}
output = fmt.Sprintf("%s%c", output, chr)
}
if emptyRow == false {
output = fmt.Sprintf("%s\n", output)
emptyRow = true
}
}
return output
}