attachments_picker.go 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  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. }
  19. var _ help.KeyMap = (*attachmentsPicker)(nil)
  20. func newAttachmentsPicker(cfg *config.Config, chatView *Model) *attachmentsPicker {
  21. ap := &attachmentsPicker{
  22. Model: picker.NewModel(),
  23. cfg: cfg,
  24. chatView: chatView,
  25. }
  26. ConfigurePicker(ap.Model, cfg, "Attachments")
  27. return ap
  28. }
  29. func (ap *attachmentsPicker) SetItems(items []attachmentItem) {
  30. ap.items = items
  31. pickerItems := make(picker.Items, 0, len(items))
  32. for i, item := range items {
  33. pickerItems = append(pickerItems, picker.Item{
  34. Text: item.label,
  35. FilterText: item.label,
  36. Reference: i,
  37. })
  38. }
  39. ap.Model.SetItems(pickerItems)
  40. }
  41. func (ap *attachmentsPicker) close() {
  42. ap.chatView.RemoveLayer(attachmentsListLayerName)
  43. ap.chatView.app.SetFocus(ap.chatView.messagesList)
  44. }
  45. func (ap *attachmentsPicker) HandleEvent(event tview.Event) tview.Command {
  46. switch event := event.(type) {
  47. case *picker.SelectedEvent:
  48. index, ok := event.Reference.(int)
  49. if !ok {
  50. return nil
  51. }
  52. if index < 0 || index >= len(ap.items) {
  53. return nil
  54. }
  55. ap.items[index].open()
  56. ap.close()
  57. return nil
  58. case *picker.CancelEvent:
  59. ap.close()
  60. return nil
  61. }
  62. return ap.Model.HandleEvent(event)
  63. }
  64. func (ap *attachmentsPicker) ShortHelp() []keybind.Keybind {
  65. cfg := ap.cfg.Keybinds.Picker
  66. return []keybind.Keybind{cfg.Up.Keybind, cfg.Down.Keybind, cfg.Select.Keybind, cfg.Cancel.Keybind}
  67. }
  68. func (ap *attachmentsPicker) FullHelp() [][]keybind.Keybind {
  69. cfg := ap.cfg.Keybinds.Picker
  70. return [][]keybind.Keybind{
  71. {cfg.Up.Keybind, cfg.Down.Keybind, cfg.Top.Keybind, cfg.Bottom.Keybind},
  72. {cfg.Select.Keybind, cfg.Cancel.Keybind},
  73. }
  74. }