keys.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. package models
  2. import (
  3. "github.com/charmbracelet/bubbles/v2/key"
  4. )
  5. type KeyMap struct {
  6. Select,
  7. Next,
  8. Previous,
  9. Tab,
  10. Close key.Binding
  11. isAPIKeyHelp bool
  12. isAPIKeyValid bool
  13. }
  14. func DefaultKeyMap() KeyMap {
  15. return KeyMap{
  16. Select: key.NewBinding(
  17. key.WithKeys("enter", "ctrl+y"),
  18. key.WithHelp("enter", "confirm"),
  19. ),
  20. Next: key.NewBinding(
  21. key.WithKeys("down", "ctrl+n"),
  22. key.WithHelp("↓", "next item"),
  23. ),
  24. Previous: key.NewBinding(
  25. key.WithKeys("up", "ctrl+p"),
  26. key.WithHelp("↑", "previous item"),
  27. ),
  28. Tab: key.NewBinding(
  29. key.WithKeys("tab"),
  30. key.WithHelp("tab", "toggle type"),
  31. ),
  32. Close: key.NewBinding(
  33. key.WithKeys("esc"),
  34. key.WithHelp("esc", "cancel"),
  35. ),
  36. }
  37. }
  38. // KeyBindings implements layout.KeyMapProvider
  39. func (k KeyMap) KeyBindings() []key.Binding {
  40. return []key.Binding{
  41. k.Select,
  42. k.Next,
  43. k.Previous,
  44. k.Tab,
  45. k.Close,
  46. }
  47. }
  48. // FullHelp implements help.KeyMap.
  49. func (k KeyMap) FullHelp() [][]key.Binding {
  50. m := [][]key.Binding{}
  51. slice := k.KeyBindings()
  52. for i := 0; i < len(slice); i += 4 {
  53. end := min(i+4, len(slice))
  54. m = append(m, slice[i:end])
  55. }
  56. return m
  57. }
  58. // ShortHelp implements help.KeyMap.
  59. func (k KeyMap) ShortHelp() []key.Binding {
  60. if k.isAPIKeyHelp && !k.isAPIKeyValid {
  61. return []key.Binding{
  62. k.Close,
  63. }
  64. } else if k.isAPIKeyValid {
  65. return []key.Binding{
  66. k.Select,
  67. }
  68. }
  69. return []key.Binding{
  70. key.NewBinding(
  71. key.WithKeys("down", "up"),
  72. key.WithHelp("↑↓", "choose"),
  73. ),
  74. k.Tab,
  75. k.Select,
  76. k.Close,
  77. }
  78. }