attachments_picker.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  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. return pickerShortHelp(ap.cfg.Keybinds.Picker)
  72. }
  73. func (ap *attachmentsPicker) FullHelp() [][]keybind.Keybind {
  74. return pickerFullHelp(ap.cfg.Keybinds.Picker)
  75. }