121 lines
2.3 KiB
Go
121 lines
2.3 KiB
Go
|
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
|
||
|
}
|