delegate.go 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. package list
  2. import (
  3. "github.com/charmbracelet/bubbles/key"
  4. "github.com/charmbracelet/bubbles/list"
  5. tea "github.com/charmbracelet/bubbletea"
  6. )
  7. func newItemDelegate(keys *delegateKeyMap) list.DefaultDelegate {
  8. d := list.NewDefaultDelegate()
  9. d.UpdateFunc = func(msg tea.Msg, m *list.Model) tea.Cmd {
  10. var title string
  11. if i, ok := m.SelectedItem().(Item); ok {
  12. title = i.Title()
  13. } else {
  14. return nil
  15. }
  16. switch msg := msg.(type) {
  17. case tea.KeyMsg:
  18. switch {
  19. case key.Matches(msg, keys.choose):
  20. return m.NewStatusMessage(statusMessageStyle("You chose " + title))
  21. case key.Matches(msg, keys.remove):
  22. index := m.Index()
  23. m.RemoveItem(index)
  24. if len(m.Items()) == 0 {
  25. keys.remove.SetEnabled(false)
  26. }
  27. return m.NewStatusMessage(statusMessageStyle("Deleted " + title))
  28. }
  29. }
  30. return nil
  31. }
  32. help := []key.Binding{keys.choose, keys.remove}
  33. d.ShortHelpFunc = func() []key.Binding {
  34. return help
  35. }
  36. d.FullHelpFunc = func() [][]key.Binding {
  37. return [][]key.Binding{help}
  38. }
  39. return d
  40. }
  41. type delegateKeyMap struct {
  42. choose key.Binding
  43. remove key.Binding
  44. }
  45. // Additional short help entries. This satisfies the help.KeyMap interface and
  46. // is entirely optional.
  47. func (d delegateKeyMap) ShortHelp() []key.Binding {
  48. return []key.Binding{
  49. d.choose,
  50. d.remove,
  51. }
  52. }
  53. // Additional full help entries. This satisfies the help.KeyMap interface and
  54. // is entirely optional.
  55. func (d delegateKeyMap) FullHelp() [][]key.Binding {
  56. return [][]key.Binding{
  57. {
  58. d.choose,
  59. d.remove,
  60. },
  61. }
  62. }
  63. func newDelegateKeyMap() *delegateKeyMap {
  64. return &delegateKeyMap{
  65. choose: key.NewBinding(
  66. key.WithKeys("enter"),
  67. key.WithHelp("enter", "choose"),
  68. ),
  69. remove: key.NewBinding(
  70. key.WithKeys("x", "backspace"),
  71. key.WithHelp("x", "delete"),
  72. ),
  73. }
  74. }