package help import ( "fmt" "git.brettb.xyz/goinv/client/internal/ui/style" "git.brettb.xyz/goinv/client/internal/ui/utils" "github.com/gdamore/tcell/v2" "github.com/rivo/tview" ) type Help struct { *tview.Box title string layout *tview.Flex } func NewHelp(appName string, appVersion string) *Help { help := &Help{ Box: tview.NewBox(), title: "help", } headerColor := style.HelpHeaderFgColor fgColor := style.FgColor bgColor := style.BgColor borderColor := style.BorderColor keyinfo := tview.NewTable() keyinfo.SetBackgroundColor(bgColor) keyinfo.SetFixed(1, 1) keyinfo.SetSelectable(false, false) appinfo := tview.NewTextView(). SetDynamicColors(true). SetWrap(true). SetTextAlign(tview.AlignLeft) appinfo.SetBackgroundColor(bgColor) appInfoText := fmt.Sprintf("%s %s - (C) 2024 Brett Bender", appName, appVersion) appinfo.SetText(appInfoText) appinfo.SetTextColor(headerColor) rowIndex := 0 colIndex := 0 needInit := true maxRowIndex := len(utils.UIKeyBindings) / 2 for i := 0; i < len(utils.UIKeyBindings); i++ { if i >= maxRowIndex { if needInit { colIndex = 2 rowIndex = 0 needInit = false } } keyinfo.SetCell(rowIndex, colIndex, tview.NewTableCell(fmt.Sprintf("%s:", utils.UIKeyBindings[i].Label())). SetAlign(tview.AlignRight). SetBackgroundColor(bgColor). SetSelectable(true).SetTextColor(headerColor)) keyinfo.SetCell(rowIndex, colIndex+1, tview.NewTableCell(utils.UIKeyBindings[i].Description()). SetAlign(tview.AlignLeft). SetBackgroundColor(bgColor). SetSelectable(true). SetTextColor(fgColor)) rowIndex++ } mlayout := tview.NewFlex().SetDirection(tview.FlexRow) mlayout.AddItem(appinfo, 1, 0, false) mlayout.AddItem(utils.EmptyBoxSpace(bgColor), 1, 0, false) mlayout.AddItem(keyinfo, 0, 1, false) mlayout.AddItem(utils.EmptyBoxSpace(bgColor), 1, 0, false) help.layout = tview.NewFlex().SetDirection(tview.FlexColumn) help.layout.AddItem(utils.EmptyBoxSpace(bgColor), 1, 0, false) help.layout.AddItem(mlayout, 0, 1, false) help.layout.AddItem(utils.EmptyBoxSpace(bgColor), 1, 0, false) help.layout.SetBorder(true) help.layout.SetBackgroundColor(bgColor) help.layout.SetBorderColor(borderColor) return help } func (help *Help) GetTitle() string { return help.title } func (help *Help) HasFocus() bool { return utils.CheckFocus(help.Box, help.layout) } func (help *Help) Focus(delegate func(tview.Primitive)) { delegate(help.layout) } func (help *Help) Draw(screen tcell.Screen) { x, y, width, height := help.Box.GetInnerRect() if height <= 3 { return } help.Box.DrawForSubclass(screen, help) help.layout.SetRect(x, y, width, height) help.layout.Draw(screen) }