package main import ( "ArinDash/util" "ArinDash/widgets" "context" "github.com/mum4k/termdash" "github.com/mum4k/termdash/align" "github.com/mum4k/termdash/cell" "github.com/mum4k/termdash/container" "github.com/mum4k/termdash/container/grid" "github.com/mum4k/termdash/keyboard" "github.com/mum4k/termdash/linestyle" "github.com/mum4k/termdash/terminal/tcell" "github.com/mum4k/termdash/terminal/terminalapi" "github.com/mum4k/termdash/widgets/textinput" ) const rootID = "root" func quitter(cancel context.CancelFunc) func(k *terminalapi.Keyboard) { quitter := func(k *terminalapi.Keyboard) { if k.Key == keyboard.KeyEsc || k.Key == keyboard.KeyCtrlC { cancel() } } return quitter } func initWidgets(ctx context.Context, term *tcell.Terminal) { var titleUpdate = make(chan string) widgets.Create(ctx, term, widgets.New("Clock", widgets.Clock()), widgets.New("Date", widgets.Date()), widgets.New("Calendar", widgets.Calendar()), widgets.New("CalendarEvents", widgets.CalendarEvents()), widgets.New("YearMood", widgets.YearMood()), widgets.New("Weather", widgets.Weather()), widgets.New("ChangeTitle", widgets.TextInput(titleUpdate, textinput.Label("Update Title: "), textinput.PlaceHolder("New Title"))), widgets.New("Wifi", widgets.WifiQRCode()), widgets.New("NetworkDevices", widgets.NetworkDevices()), widgets.New("Docker", widgets.DockerList()), widgets.New("HTTPProber", widgets.HTTPProber()), widgets.New("PiHole", widgets.PiholeStats()), widgets.New("PiHoleBlocked", widgets.PiholeBlocked()), widgets.New("NinaWarnings", widgets.NinaWarnings()), widgets.New("News", widgets.News()), widgets.New("Zukitchi", widgets.Zukitchi()), ) } func layout() []container.Option { builder := grid.New() builder.Add( grid.ColWidthFixed(84, grid.RowHeightFixed(21, grid.ColWidthFixed(38, grid.RowHeightFixed(20, grid.Widget(widgets.Get["Wifi"], container.BorderTitle("Wifi"), container.Border(linestyle.Light), container.BorderColor(cell.ColorWhite), container.PaddingLeft(1), container.PaddingTop(1), ), ), ), grid.ColWidthFixed(20, grid.Widget(widgets.Get["NetworkDevices"], container.BorderTitle("Network Devices"), container.Border(linestyle.Light), container.BorderColor(cell.ColorWhite), container.PaddingLeft(1), container.PaddingTop(1), ), ), ), grid.RowHeightFixed(25, grid.RowHeightFixed(19, grid.Widget(widgets.Get["HTTPProber"], container.BorderTitle("Website Status"), container.Border(linestyle.Light), container.BorderColor(cell.ColorWhite), container.PaddingLeft(1), container.PaddingTop(1), ), ), grid.RowHeightFixed(40, grid.Widget(widgets.Get["Docker"], container.BorderTitle("Docker"), container.Border(linestyle.Light), container.BorderColor(cell.ColorWhite), container.PaddingLeft(1), container.PaddingTop(1), ), ), ), ), grid.ColWidthPerc(62, grid.RowHeightFixed(40, grid.ColWidthFixed(40, grid.RowHeightFixed(8, grid.Widget(widgets.Get["Clock"], container.AlignHorizontal(align.HorizontalCenter), container.BorderTitle("Time"), container.Border(linestyle.Light), container.BorderColor(cell.ColorWhite), ), ), grid.RowHeightFixed(13, grid.Widget(widgets.Get["PiHole"], container.BorderTitle("pi-hole"), container.Border(linestyle.Light), container.BorderColor(cell.ColorWhite), container.PaddingLeft(1), container.PaddingTop(1), ), ), grid.RowHeightFixed(38, grid.Widget(widgets.Get["PiHoleBlocked"], container.BorderTitle("pi-hole (Blocked Percent)"), container.Border(linestyle.Light), container.BorderColor(cell.ColorWhite), ), ), ), grid.ColWidthFixed(26, grid.RowHeightFixed(21, grid.Widget(widgets.Get["Calendar"], container.BorderTitle("Calendar"), container.Border(linestyle.Light), container.BorderColor(cell.ColorWhite), container.PaddingLeft(1), container.PaddingTop(1), ), ), grid.RowHeightFixed(25, grid.Widget(widgets.Get["empty"], container.Border(linestyle.Light), container.BorderColor(cell.ColorGreen), ), ), ), grid.ColWidthFixed(25, grid.RowHeightFixed(21, grid.Widget(widgets.Get["CalendarEvents"], container.BorderTitle("Events"), container.Border(linestyle.Light), container.BorderColor(cell.ColorWhite), container.PaddingLeft(1), container.PaddingTop(1), ), ), grid.RowHeightFixed(11, grid.Widget(widgets.Get["Weather"], container.BorderTitle("Weather"), container.Border(linestyle.Light), container.BorderColor(cell.ColorWhite), container.PaddingLeft(1), ), ), grid.RowHeightFixed(85, grid.Widget(widgets.Get["empty"], container.Border(linestyle.Light), container.BorderColor(cell.ColorWhite), ), ), ), ), grid.RowHeightFixed(20, grid.RowHeightFixed(20, grid.Widget(widgets.Get["News"], container.BorderTitle("News"), container.Border(linestyle.Light), container.BorderColor(cell.ColorWhite), container.PaddingLeft(1), container.PaddingTop(1), ), ), grid.RowHeightFixed(20, grid.Widget(widgets.Get["NinaWarnings"], container.BorderTitle("BBK Warnings"), container.Border(linestyle.Light), container.BorderColor(cell.ColorWhite), container.PaddingLeft(1), container.PaddingTop(1), ), ), ), ), grid.ColWidthPerc(35, grid.RowHeightFixed(21, grid.Widget(widgets.Get["Zukitchi"], container.Border(linestyle.Light), container.BorderColor(cell.ColorWhite), container.PaddingTop(1), container.PaddingLeft(1), ), ), grid.RowHeightFixed(39, grid.Widget(widgets.Get["YearMood"], container.BorderTitle("Every Day Mood"), container.Border(linestyle.Light), container.BorderColor(cell.ColorWhite), container.PaddingTop(1), ), ), grid.RowHeightFixed(85, grid.Widget(widgets.Get["empty"], container.Border(linestyle.Light), container.BorderColor(cell.ColorWhite), ), ), ), ) return util.PanicOnErrorWithResult(builder.Build()) } func main() { term := util.PanicOnErrorWithResult(tcell.New(tcell.ColorMode(terminalapi.ColorMode256))) defer term.Close() ctx, cancel := context.WithCancel(context.Background()) initWidgets(ctx, term) rootContainer := util.PanicOnErrorWithResult(container.New(term, container.ID(rootID))) util.PanicOnError(rootContainer.Update(rootID, layout()...)) util.PanicOnError(termdash.Run(ctx, term, rootContainer, termdash.KeyboardSubscriber(quitter(cancel)), termdash.RedrawInterval(util.RedrawInterval))) }