package ui import ( "fmt" "strconv" "codeflow.dananglin.me.uk/apollo/pelican/internal/board" "github.com/gdamore/tcell/v2" "github.com/rivo/tview" ) type column struct { statusID int cards *tview.List } func (u *UI) newColumn(status board.Status) (column, error) { cardList := tview.NewList() cardList.SetBorder(true) cardList.ShowSecondaryText(false) cardList.SetTitle(" " + status.Name + " ") cardList.SetHighlightFullLine(true) cardList.SetSelectedFocusOnly(true) cardList.SetWrapAround(false) cardList.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey { switch event.Rune() { case 'a': u.pages.ShowPage(addPageName) u.SetFocus(u.addModal) case 'h': u.shiftColumnFocus(shiftLeft) case 'l': u.shiftColumnFocus(shiftRight) case 'j': cur := cardList.GetCurrentItem() if cur == cardList.GetItemCount()-1 { cur = 0 } else { cur++ } cardList.SetCurrentItem(cur) case 'k': cur := cardList.GetCurrentItem() cur-- cardList.SetCurrentItem(cur) case 'm': u.pages.ShowPage(movePageName) u.SetFocus(u.move) } switch event.Key() { case tcell.KeyCtrlQ: u.pages.ShowPage(quitPageName) u.SetFocus(u.quitModal) case tcell.KeyCtrlD: u.pages.ShowPage(deleteCardPageName) u.SetFocus(u.deleteCardModal) } return event }) if status.CardIds != nil && len(status.CardIds) > 0 { cards, err := u.board.CardList(status.CardIds) if err != nil { return column{}, fmt.Errorf("unable to get the card list. %w", err) } for _, c := range cards { id := strconv.Itoa(c.ID) cardList.AddItem(fmt.Sprintf("[%s] %s", id, c.Title), id, 0, nil) } } u.flex.AddItem(cardList, 0, 1, false) c := column{ statusID: status.ID, cards: cardList, } return c, nil } 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) { u.flex.Clear() columns := make([]column, len(statusList)) for i := range statusList { columns[i], _ = u.newColumn(statusList[i]) } u.columns = columns }