attachments_picker.go 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. package chat
  2. import (
  3. "github.com/ayn2op/discordo/internal/config"
  4. "github.com/ayn2op/tview"
  5. "github.com/ayn2op/tview/help"
  6. "github.com/ayn2op/tview/keybind"
  7. "github.com/ayn2op/tview/picker"
  8. )
  9. type attachmentItem struct {
  10. label string
  11. open func()
  12. }
  13. type attachmentsPicker struct {
  14. *picker.Model
  15. cfg *config.Config
  16. chatView *Model
  17. items []attachmentItem
  18. browseMode bool
  19. }
  20. var _ help.KeyMap = (*attachmentsPicker)(nil)
  21. func newAttachmentsPicker(cfg *config.Config, chatView *Model) *attachmentsPicker {
  22. ap := &attachmentsPicker{
  23. Model: picker.NewModel(),
  24. cfg: cfg,
  25. chatView: chatView,
  26. }
  27. ConfigurePicker(ap.Model, cfg, "Attachments")
  28. return ap
  29. }
  30. func (ap *attachmentsPicker) SetItems(items []attachmentItem) {
  31. ap.items = items
  32. pickerItems := make(picker.Items, 0, len(items))
  33. for i, item := range items {
  34. pickerItems = append(pickerItems, picker.Item{
  35. Text: item.label,
  36. FilterText: item.label,
  37. Reference: i,
  38. })
  39. }
  40. ap.Model.SetItems(pickerItems)
  41. }
  42. func (ap *attachmentsPicker) close() {
  43. ap.chatView.RemoveLayer(attachmentsListLayerName)
  44. ap.chatView.app.SetFocus(ap.chatView.messagesList)
  45. }
  46. func (ap *attachmentsPicker) resetBrowse() { ap.browseMode = false }
  47. func (ap *attachmentsPicker) HandleEvent(event tview.Event) tview.Command {
  48. switch event := event.(type) {
  49. case *tview.KeyEvent:
  50. if cmd, handled := pickerBrowseHandleKey(event, &ap.browseMode, ap.Model, func() { ap.close() }); handled {
  51. return cmd
  52. }
  53. case *picker.SelectedEvent:
  54. index, ok := event.Reference.(int)
  55. if !ok {
  56. return nil
  57. }
  58. if index < 0 || index >= len(ap.items) {
  59. return nil
  60. }
  61. ap.items[index].open()
  62. ap.close()
  63. return nil
  64. case *picker.CancelEvent:
  65. ap.close()
  66. return nil
  67. }
  68. return ap.Model.HandleEvent(event)
  69. }
  70. func (ap *attachmentsPicker) ShortHelp() []keybind.Keybind {
  71. cfg := ap.cfg.Keybinds.Picker
  72. return []keybind.Keybind{cfg.Up.Keybind, cfg.Down.Keybind, cfg.Select.Keybind, cfg.Cancel.Keybind}
  73. }
  74. func (ap *attachmentsPicker) FullHelp() [][]keybind.Keybind {
  75. cfg := ap.cfg.Keybinds.Picker
  76. return [][]keybind.Keybind{
  77. {cfg.Up.Keybind, cfg.Down.Keybind, cfg.Top.Keybind, cfg.Bottom.Keybind},
  78. {cfg.Select.Keybind, cfg.Cancel.Keybind},
  79. }
  80. }