diff --git a/main.go b/main.go index 26d2ec8..06a6d49 100644 --- a/main.go +++ b/main.go @@ -34,6 +34,7 @@ func initWidgets(ctx context.Context, term *tcell.Terminal) { widgets.Create(ctx, term, widgets.New("Clock", widgets.Clock()), widgets.New("Date", widgets.Date()), + widgets.New("Calendar", widgets.Calendar()), widgets.New("ChangeTitle", widgets.TextInput(titleUpdate, textinput.Label("Update Title: "), textinput.PlaceHolder("New Title"))), widgets.New("Wifi", widgets.WifiQRCode()), widgets.New("NetworkDevices", widgets.NetworkDevices()), @@ -73,15 +74,7 @@ func layout() []container.Option { container.BorderColor(cell.ColorWhite), ), ), - grid.RowHeightFixed(3, - grid.Widget(widgets.Get["Date"], - container.AlignHorizontal(align.HorizontalCenter), - container.BorderTitle("Date"), - container.Border(linestyle.Light), - container.BorderColor(cell.ColorWhite), - ), - ), - grid.RowHeightFixed(8, + grid.RowHeightFixed(11, grid.Widget(widgets.Get["PiHole"], container.BorderTitle("pi-hole"), container.Border(linestyle.Light), @@ -99,7 +92,18 @@ func layout() []container.Option { grid.Widget(widgets.Get["empty"]), ), ), - grid.ColWidthPerc(35, + grid.ColWidthPerc(10, + grid.RowHeightFixed(19, + grid.Widget(widgets.Get["Calendar"], + container.BorderTitle("Calendar"), + container.Border(linestyle.Light), + container.BorderColor(cell.ColorWhite)), + ), + grid.RowHeightPerc(25, + grid.Widget(widgets.Get["empty"]), + ), + ), + grid.ColWidthPerc(25, grid.RowHeightPerc(25, grid.Widget(widgets.Get["empty"]), ), diff --git a/widgets/calendar.go b/widgets/calendar.go new file mode 100644 index 0000000..383747d --- /dev/null +++ b/widgets/calendar.go @@ -0,0 +1,145 @@ +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 { + + 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", time.Now().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(widget); err != nil { + return err + } + if err := createLowerBorder(widget); err != nil { + return err + } + return nil + }) + + return widget +} + +func createTableForMonth(widget *text.Text) error { + table := make([]int, 0) + now := time.Now() + firstMonthday := time.Date(now.Year(), now.Month(), 1, 0, 0, 0, 0, time.UTC) + for range (firstMonthday.Weekday() + 6) % 7 { + table = append(table, 0) + } + + for { + day := firstMonthday.Day() + table = append(table, day) + firstMonthday = firstMonthday.AddDate(0, 0, 1) + if firstMonthday.Month() != now.Month() { + break + } + } + remainingDays := 8 - 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("|"); err != nil { + return err + } + if field == 0 { + str = fmt.Sprintf(" ") + } else { + str = fmt.Sprintf("%2d", field) + } + var color text.WriteOption + if field == now.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"); 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 +}