keys.go 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. package filepicker
  2. import (
  3. "github.com/charmbracelet/bubbles/v2/key"
  4. )
  5. // KeyMap defines keyboard bindings for dialog management.
  6. type KeyMap struct {
  7. Select,
  8. Down,
  9. Up,
  10. Forward,
  11. Backward,
  12. Close key.Binding
  13. }
  14. func DefaultKeyMap() KeyMap {
  15. return KeyMap{
  16. Select: key.NewBinding(
  17. key.WithKeys("enter"),
  18. key.WithHelp("enter", "accept"),
  19. ),
  20. Down: key.NewBinding(
  21. key.WithKeys("down", "j"),
  22. key.WithHelp("down/j", "move down"),
  23. ),
  24. Up: key.NewBinding(
  25. key.WithKeys("up", "k"),
  26. key.WithHelp("up/k", "move up"),
  27. ),
  28. Forward: key.NewBinding(
  29. key.WithKeys("right", "l"),
  30. key.WithHelp("right/l", "move forward"),
  31. ),
  32. Backward: key.NewBinding(
  33. key.WithKeys("left", "h"),
  34. key.WithHelp("left/h", "move backward"),
  35. ),
  36. Close: key.NewBinding(
  37. key.WithKeys("esc", "alt+esc"),
  38. key.WithHelp("esc", "close/exit"),
  39. ),
  40. }
  41. }
  42. // KeyBindings implements layout.KeyMapProvider
  43. func (k KeyMap) KeyBindings() []key.Binding {
  44. return []key.Binding{
  45. k.Select,
  46. k.Down,
  47. k.Up,
  48. k.Forward,
  49. k.Backward,
  50. k.Close,
  51. }
  52. }
  53. // FullHelp implements help.KeyMap.
  54. func (k KeyMap) FullHelp() [][]key.Binding {
  55. m := [][]key.Binding{}
  56. slice := k.KeyBindings()
  57. for i := 0; i < len(slice); i += 4 {
  58. end := min(i+4, len(slice))
  59. m = append(m, slice[i:end])
  60. }
  61. return m
  62. }
  63. // ShortHelp implements help.KeyMap.
  64. func (k KeyMap) ShortHelp() []key.Binding {
  65. return []key.Binding{
  66. key.NewBinding(
  67. key.WithKeys("right", "l", "left", "h", "up", "k", "down", "j"),
  68. key.WithHelp("↑↓←→", "navigate"),
  69. ),
  70. k.Select,
  71. k.Close,
  72. }
  73. }