Add Calendar widget to display the monthly calendar and integrate it into the layout
This commit is contained in:
parent
ec85f87377
commit
a0be24b074
24
main.go
24
main.go
@ -34,6 +34,7 @@ func initWidgets(ctx context.Context, term *tcell.Terminal) {
|
|||||||
widgets.Create(ctx, term,
|
widgets.Create(ctx, term,
|
||||||
widgets.New("Clock", widgets.Clock()),
|
widgets.New("Clock", widgets.Clock()),
|
||||||
widgets.New("Date", widgets.Date()),
|
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("ChangeTitle", widgets.TextInput(titleUpdate, textinput.Label("Update Title: "), textinput.PlaceHolder("New Title"))),
|
||||||
widgets.New("Wifi", widgets.WifiQRCode()),
|
widgets.New("Wifi", widgets.WifiQRCode()),
|
||||||
widgets.New("NetworkDevices", widgets.NetworkDevices()),
|
widgets.New("NetworkDevices", widgets.NetworkDevices()),
|
||||||
@ -73,15 +74,7 @@ func layout() []container.Option {
|
|||||||
container.BorderColor(cell.ColorWhite),
|
container.BorderColor(cell.ColorWhite),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
grid.RowHeightFixed(3,
|
grid.RowHeightFixed(11,
|
||||||
grid.Widget(widgets.Get["Date"],
|
|
||||||
container.AlignHorizontal(align.HorizontalCenter),
|
|
||||||
container.BorderTitle("Date"),
|
|
||||||
container.Border(linestyle.Light),
|
|
||||||
container.BorderColor(cell.ColorWhite),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
grid.RowHeightFixed(8,
|
|
||||||
grid.Widget(widgets.Get["PiHole"],
|
grid.Widget(widgets.Get["PiHole"],
|
||||||
container.BorderTitle("pi-hole"),
|
container.BorderTitle("pi-hole"),
|
||||||
container.Border(linestyle.Light),
|
container.Border(linestyle.Light),
|
||||||
@ -99,7 +92,18 @@ func layout() []container.Option {
|
|||||||
grid.Widget(widgets.Get["empty"]),
|
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.RowHeightPerc(25,
|
||||||
grid.Widget(widgets.Get["empty"]),
|
grid.Widget(widgets.Get["empty"]),
|
||||||
),
|
),
|
||||||
|
|||||||
145
widgets/calendar.go
Normal file
145
widgets/calendar.go
Normal file
@ -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
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user