182 lines
4.9 KiB
Go
182 lines
4.9 KiB
Go
package components
|
|
|
|
import (
|
|
"github.com/LazyBachelor/LazyPM/pkg/tui/styles"
|
|
"github.com/charmbracelet/lipgloss"
|
|
)
|
|
|
|
type ViewKind int
|
|
|
|
const (
|
|
ViewIssues ViewKind = iota
|
|
ViewKanban
|
|
)
|
|
|
|
type ShortItem struct {
|
|
Key string
|
|
Desc string
|
|
}
|
|
|
|
type FullRow struct {
|
|
LeftKey string
|
|
LeftDesc string
|
|
RightKey string
|
|
RightDesc string
|
|
}
|
|
|
|
|
|
type HelpBarConfig struct {
|
|
ShortItems []ShortItem
|
|
FullRows []FullRow
|
|
}
|
|
|
|
|
|
type HelpBar struct {
|
|
view ViewKind
|
|
config HelpBarConfig
|
|
showAll bool
|
|
width int
|
|
}
|
|
|
|
|
|
func NewHelpBar(view ViewKind) HelpBar {
|
|
return HelpBar{view: view, config: helpBarConfig(view)}
|
|
}
|
|
|
|
func (h *HelpBar) SetWidth(width int) {
|
|
h.width = width
|
|
}
|
|
|
|
|
|
func (h HelpBar) View() string {
|
|
if h.width == 0 {
|
|
return ""
|
|
}
|
|
if h.showAll {
|
|
return h.fullHelp()
|
|
}
|
|
return h.shortHelp()
|
|
}
|
|
|
|
func (h HelpBar) shortHelp() string {
|
|
keys := make([]string, 0, len(h.config.ShortItems))
|
|
for _, item := range h.config.ShortItems {
|
|
keys = append(keys, styles.HighlightKey(item.Key)+" "+item.Desc)
|
|
}
|
|
content := lipgloss.JoinHorizontal(lipgloss.Left, keys...)
|
|
return lipgloss.NewStyle().
|
|
Border(lipgloss.Border{Top: "─"}, true, false, false, false).
|
|
BorderForeground(styles.SecondaryBorder).
|
|
Padding(0, 1).
|
|
Width(h.width).
|
|
Render(content)
|
|
}
|
|
|
|
func (h HelpBar) fullHelp() string {
|
|
keyStyle := lipgloss.NewStyle().Width(8).Align(lipgloss.Right)
|
|
descStyle := lipgloss.NewStyle().Width(12)
|
|
|
|
renderHelpItem := func(key, desc string) string {
|
|
return lipgloss.JoinHorizontal(
|
|
lipgloss.Left,
|
|
keyStyle.Render(styles.HighlightKey(key)),
|
|
" ",
|
|
descStyle.Render(desc),
|
|
)
|
|
}
|
|
|
|
renderRow := func(leftKey, leftDesc, rightKey, rightDesc string) string {
|
|
leftItem := renderHelpItem(leftKey, leftDesc)
|
|
rightItem := renderHelpItem(rightKey, rightDesc)
|
|
return lipgloss.JoinHorizontal(lipgloss.Left, leftItem, " ", rightItem)
|
|
}
|
|
|
|
rows := make([]string, 0, len(h.config.FullRows))
|
|
for _, r := range h.config.FullRows {
|
|
rows = append(rows, renderRow(r.LeftKey, r.LeftDesc, r.RightKey, r.RightDesc))
|
|
}
|
|
content := lipgloss.JoinVertical(lipgloss.Left, rows...)
|
|
return lipgloss.NewStyle().
|
|
Border(lipgloss.Border{Top: "─"}, true, false, false, false).
|
|
BorderForeground(styles.SecondaryBorder).
|
|
Padding(0, 1).
|
|
Width(h.width).
|
|
Render(content)
|
|
}
|
|
|
|
func (h HelpBar) Height() int {
|
|
if h.width == 0 {
|
|
return 0
|
|
}
|
|
return lipgloss.Height(h.View())
|
|
}
|
|
|
|
|
|
func (h HelpBar) IsExpanded() bool {
|
|
return h.showAll
|
|
}
|
|
|
|
func (h *HelpBar) ToggleHelp() {
|
|
h.showAll = !h.showAll
|
|
}
|
|
|
|
func helpBarConfig(view ViewKind) HelpBarConfig {
|
|
switch view {
|
|
case ViewIssues:
|
|
return HelpBarConfig{
|
|
ShortItems: []ShortItem{
|
|
{Key: "tab", Desc: "switch"},
|
|
{Key: "k", Desc: "kanban"},
|
|
{Key: "↑/k", Desc: "up"},
|
|
{Key: "↓/j", Desc: "down"},
|
|
{Key: "pgup/pgdn", Desc: "page"},
|
|
{Key: "a", Desc: "add"},
|
|
{Key: "e/d/s/p/t", Desc: "edit"},
|
|
{Key: "x", Desc: "delete"},
|
|
{Key: "q", Desc: "quit"},
|
|
{Key: "?", Desc: "help"},
|
|
},
|
|
FullRows: []FullRow{
|
|
{LeftKey: "tab", LeftDesc: "switch window", RightKey: "↑/k", RightDesc: "up"},
|
|
{LeftKey: "enter", LeftDesc: "view issue", RightKey: "↓/j", RightDesc: "down"},
|
|
{LeftKey: "pgup", LeftDesc: "page up", RightKey: "pgdn", RightDesc: "page down"},
|
|
{LeftKey: "b", LeftDesc: "back to list", RightKey: "a", RightDesc: "add issue"},
|
|
{LeftKey: "e", LeftDesc: "edit title", RightKey: "d", RightDesc: "edit description"},
|
|
{LeftKey: "s", LeftDesc: "change status", RightKey: "p", RightDesc: "change priority"},
|
|
{LeftKey: "t", LeftDesc: "change type", RightKey: "x", RightDesc: "delete issue"},
|
|
{LeftKey: "2", LeftDesc: "kanban", RightKey: "q", RightDesc: "quit"},
|
|
{LeftKey: "?", LeftDesc: "help", RightKey: "", RightDesc: ""},
|
|
},
|
|
}
|
|
case ViewKanban:
|
|
return HelpBarConfig{
|
|
ShortItems: []ShortItem{
|
|
{Key: "1", Desc: "issues"},
|
|
{Key: "↑/k", Desc: "up"},
|
|
{Key: "↓/j", Desc: "down"},
|
|
{Key: "pgup/pgdn", Desc: "page"},
|
|
{Key: "h/l", Desc: "column"},
|
|
{Key: "←/→", Desc: "move"},
|
|
{Key: "a", Desc: "add"},
|
|
{Key: "e/d/s/p/t", Desc: "edit"},
|
|
{Key: "x", Desc: "delete"},
|
|
{Key: "q", Desc: "quit"},
|
|
{Key: "?", Desc: "help"},
|
|
},
|
|
FullRows: []FullRow{
|
|
{LeftKey: "1", LeftDesc: "issues", RightKey: "↑/k", RightDesc: "up"},
|
|
{LeftKey: "enter", LeftDesc: "view issue", RightKey: "↓/j", RightDesc: "down"},
|
|
{LeftKey: "pgup", LeftDesc: "page up", RightKey: "pgdn", RightDesc: "page down"},
|
|
{LeftKey: "h/l", LeftDesc: "switch column", RightKey: "←/→", RightDesc: "move issue"},
|
|
{LeftKey: "b", LeftDesc: "back to list", RightKey: "a", RightDesc: "add issue"},
|
|
{LeftKey: "e", LeftDesc: "edit title", RightKey: "d", RightDesc: "edit description"},
|
|
{LeftKey: "s", LeftDesc: "change status", RightKey: "p", RightDesc: "change priority"},
|
|
{LeftKey: "t", LeftDesc: "change type", RightKey: "x", RightDesc: "delete issue"},
|
|
{LeftKey: "q", LeftDesc: "quit", RightKey: "?", RightDesc: "help"},
|
|
},
|
|
}
|
|
default:
|
|
return HelpBarConfig{}
|
|
}
|
|
}
|