search_picker.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package chat
  2. import (
  3. "fmt"
  4. "github.com/ayn2op/discordo/internal/config"
  5. "github.com/ayn2op/tview"
  6. "github.com/ayn2op/tview/help"
  7. "github.com/ayn2op/tview/keybind"
  8. "github.com/ayn2op/tview/picker"
  9. )
  10. const searchPickerLayerName = "searchPicker"
  11. type searchPicker struct {
  12. *picker.Model
  13. chatView *Model
  14. browseMode bool
  15. }
  16. var _ help.KeyMap = (*searchPicker)(nil)
  17. func newSearchPicker(cfg *config.Config, chatView *Model) *searchPicker {
  18. sp := &searchPicker{Model: picker.NewModel(), chatView: chatView}
  19. ConfigurePicker(sp.Model, cfg, "Search")
  20. return sp
  21. }
  22. func (sp *searchPicker) resetBrowse() { sp.browseMode = false }
  23. func (sp *searchPicker) HandleEvent(event tview.Event) tview.Command {
  24. switch event := event.(type) {
  25. case *tview.KeyEvent:
  26. if cmd, handled := pickerBrowseHandleKey(event, &sp.browseMode, sp.Model, func() { sp.chatView.closeSearch() }); handled {
  27. return cmd
  28. }
  29. case *picker.SelectedEvent:
  30. messageIndex, ok := event.Reference.(int)
  31. if !ok {
  32. return nil
  33. }
  34. sp.chatView.closeSearch()
  35. sp.chatView.messagesList.SetCursor(messageIndex)
  36. return tview.SetFocus(sp.chatView.messagesList)
  37. case *picker.CancelEvent:
  38. sp.chatView.closeSearch()
  39. return nil
  40. }
  41. return sp.Model.HandleEvent(event)
  42. }
  43. func (sp *searchPicker) update() {
  44. messages := sp.chatView.messagesList.messages
  45. items := make(picker.Items, 0, len(messages))
  46. for i, msg := range messages {
  47. text := msg.Author.DisplayOrUsername() + ": " + msg.Content
  48. if len(text) > 120 {
  49. text = text[:120] + "..."
  50. }
  51. items = append(items, picker.Item{
  52. Text: text,
  53. FilterText: fmt.Sprintf("%s %s", msg.Author.DisplayOrUsername(), msg.Content),
  54. Reference: i,
  55. })
  56. }
  57. sp.Model.SetItems(items)
  58. }
  59. func (sp *searchPicker) ShortHelp() []keybind.Keybind {
  60. cfg := sp.chatView.cfg.Keybinds.Picker
  61. return []keybind.Keybind{cfg.Up.Keybind, cfg.Down.Keybind, cfg.Select.Keybind, cfg.Cancel.Keybind}
  62. }
  63. func (sp *searchPicker) FullHelp() [][]keybind.Keybind {
  64. cfg := sp.chatView.cfg.Keybinds.Picker
  65. return [][]keybind.Keybind{
  66. {cfg.Up.Keybind, cfg.Down.Keybind, cfg.Top.Keybind, cfg.Bottom.Keybind},
  67. {cfg.Select.Keybind, cfg.Cancel.Keybind},
  68. }
  69. }