146 lines
3.6 KiB
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
|
|
}
|