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("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("PiHole", widgets.PiholeStats()), widgets.New("PiHoleBlocked", widgets.PiholeBlocked()), ) } func layout() []container.Option { builder := grid.New() builder.Add( grid.ColWidthFixed(84, grid.RowHeightFixed(44, grid.Widget(widgets.Get["Wifi"], container.BorderTitle("Wifi"), container.Border(linestyle.Light), container.BorderColor(cell.ColorWhite)), ), grid.RowHeightFixed(44, grid.Widget(widgets.Get["NetworkDevices"], container.BorderTitle("Network Devices"), container.Border(linestyle.Light), container.BorderColor(cell.ColorWhite)), ), grid.RowHeightFixed(1, grid.Widget(widgets.Get["empty"]), ), ), grid.ColWidthPerc(20, 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(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.Widget(widgets.Get["PiHole"], container.BorderTitle("pi-hole"), container.Border(linestyle.Light), container.BorderColor(cell.ColorWhite), ), ), grid.RowHeightFixed(25, grid.Widget(widgets.Get["PiHoleBlocked"], container.BorderTitle("pi-hole (Blocked Percent)"), container.Border(linestyle.Light), container.BorderColor(cell.ColorWhite), ), ), grid.RowHeightPerc(85, grid.Widget(widgets.Get["empty"]), ), ), grid.ColWidthPerc(35, grid.RowHeightPerc(25, grid.Widget(widgets.Get["empty"]), ), ), grid.ColWidthPerc(35, grid.RowHeightPerc(25, grid.Widget(widgets.Get["Docker"], container.BorderTitle("Docker"), 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))) }