ArinDash/widgets/calendar.go

146 lines
3.6 KiB
Go

package widgets
import (
"ArinDash/util"
"context"
"fmt"
"time"
"github.com/mum4k/termdash/cell"
"github.com/mum4k/termdash/terminal/terminalapi"
"github.com/mum4k/termdash/widgetapi"
"github.com/mum4k/termdash/widgets/text"
)
type CalendarOptions struct {
}
func Calendar() CalendarOptions {
widgetOptions["CalendarOptions"] = createCalendar
return CalendarOptions{}
}
func createCalendar(ctx context.Context, _ terminalapi.Terminal, _ interface{}) widgetapi.Widget {
widget := util.PanicOnErrorWithResult(text.New())
go util.Periodic(ctx, 1*time.Hour, func() error {
date := time.Now()
widget.Reset()
if err := widget.Write("┌────────────────────┐\n", text.WriteCellOpts(cell.FgColor(cell.ColorWhite))); err != nil {
return err
}
if err := widget.Write(fmt.Sprintf("│%-20s│\n", date.Format("January 2006")), text.WriteCellOpts(cell.FgColor(cell.ColorWhite))); err != nil {
return err
}
if err := widget.Write("├──┬──┬──┬──┬──┬──┬──┤\n", text.WriteCellOpts(cell.FgColor(cell.ColorWhite))); err != nil {
return err
}
if err := createRow(widget, "Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"); err != nil {
return err
}
if err := createTableForMonth(date, widget); err != nil {
return err
}
if err := createLowerBorder(widget); err != nil {
return err
}
return nil
})
return widget
}
func createTableForMonth(date time.Time, widget *text.Text) error {
table := make([]int, 0)
firstMonthday := time.Date(date.Year(), date.Month(), 1, 0, 0, 0, 0, time.UTC)
for range (firstMonthday.Weekday() + 6) % 7 {
table = append(table, 0)
}
//34
//35
for {
day := firstMonthday.Day()
table = append(table, day)
firstMonthday = firstMonthday.AddDate(0, 0, 1)
if firstMonthday.Month() != date.Month() {
break
}
}
remainingDays := 7 - len(table)%7
for range remainingDays {
table = append(table, 0)
}
for index, field := range table {
if index%7 == 0 {
if err := createMiddle(widget); err != nil {
return err
}
}
var str string
if err := widget.Write("│", text.WriteCellOpts(cell.FgColor(cell.ColorWhite))); err != nil {
return err
}
if field == 0 {
str = fmt.Sprintf(" ")
} else {
str = fmt.Sprintf("%2d", field)
}
var color text.WriteOption
if field == date.Day() {
color = text.WriteCellOpts(cell.FgColor(cell.ColorBlack), cell.BgColor(cell.ColorWhite), cell.Bold())
} else {
color = text.WriteCellOpts(cell.FgColor(cell.ColorWhite), cell.BgColor(cell.ColorDefault))
}
if err := widget.Write(str, color); err != nil {
return err
}
if index%7 == 6 {
if err := widget.Write("│\n", text.WriteCellOpts(cell.FgColor(cell.ColorWhite))); err != nil {
return err
}
}
}
return nil
}
func createLowerBorder(widget *text.Text) error {
result := "└─"
for range 6 {
result += "─┴─"
}
result += "─┘\n"
if err := widget.Write(result, text.WriteCellOpts(cell.FgColor(cell.ColorWhite))); err != nil {
return err
}
return nil
}
func createMiddle(widget *text.Text) error {
result := "├─"
for range 6 {
result += "─┼─"
}
result += "─┤\n"
if err := widget.Write(result, text.WriteCellOpts(cell.FgColor(cell.ColorWhite))); err != nil {
return err
}
return nil
}
func createRow(widget *text.Text, cells ...string) error {
result := "│"
for index, field := range cells {
result += fmt.Sprintf("%2s", field)
if index < len(cells)-1 {
result += "│"
} else {
result += "│\n"
}
}
if err := widget.Write(result, text.WriteCellOpts(cell.FgColor(cell.ColorWhite))); err != nil {
return err
}
return nil
}