search_picker.go 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  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. return pickerShortHelp(sp.chatView.cfg.Keybinds.Picker)
  61. }
  62. func (sp *searchPicker) FullHelp() [][]keybind.Keybind {
  63. return pickerFullHelp(sp.chatView.cfg.Keybinds.Picker)
  64. }