package ui import ( "fmt" "codeflow.dananglin.me.uk/apollo/canal/internal/board" "github.com/gdamore/tcell/v2" "github.com/rivo/tview" ) type column struct { statusID int statusName string cards *tview.List } func (u *UI) newColumn(statusID int, statusName string) column { cards := tview.NewList() cards.SetBorder(true) cards.ShowSecondaryText(false) cards.SetTitle(" " + statusName + " ") cards.SetHighlightFullLine(true) cards.SetSelectedFocusOnly(true) cards.SetWrapAround(false) cards.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey { switch event.Rune() { case 'q': u.pages.ShowPage(quitPageName) u.SetFocus(u.quit) case 'a': u.pages.ShowPage(addPageName) u.SetFocus(u.add) case 'h': u.shiftColumnFocus(shiftLeft) case 'l': u.shiftColumnFocus(shiftRight) } return event }) c := column{ statusID: statusID, statusName: statusName, cards: cards, } return c } func (u *UI) setColumnFocus() { u.SetFocus(u.columns[u.focusedColumn].cards) } func (u *UI) shiftColumnFocus(s int) { switch s { case shiftRight: if u.focusedColumn == len(u.columns)-1 { u.focusedColumn = 0 } else { u.focusedColumn++ } case shiftLeft: if u.focusedColumn == 0 { u.focusedColumn = len(u.columns) - 1 } else { u.focusedColumn-- } } u.setColumnFocus() } func (u *UI) updateColumns(statusList []board.Status) error { u.flex.Clear() columns := make([]column, len(statusList)) for i := range statusList { columns[i] = u.newColumn(statusList[i].ID, statusList[i].Name) if len(statusList[i].CardIds) > 0 { cards, err := u.board.CardList(statusList[i].CardIds) if err != nil { return fmt.Errorf("unable to get the card list. %w", err) } for _, c := range cards { columns[i].cards.AddItem(fmt.Sprintf("[%d] %s", c.Id(), c.Title), "", 0, nil) } } u.flex.AddItem(columns[i].cards, 0, 1, false) } u.columns = columns return nil }