search_picker.go 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  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. }
  15. var _ help.KeyMap = (*searchPicker)(nil)
  16. func newSearchPicker(cfg *config.Config, chatView *Model) *searchPicker {
  17. sp := &searchPicker{picker.NewModel(), chatView}
  18. ConfigurePicker(sp.Model, cfg, "Search")
  19. return sp
  20. }
  21. func (sp *searchPicker) HandleEvent(event tview.Event) tview.Command {
  22. switch event := event.(type) {
  23. case *picker.SelectedEvent:
  24. messageIndex, ok := event.Reference.(int)
  25. if !ok {
  26. return nil
  27. }
  28. sp.chatView.closeSearch()
  29. sp.chatView.messagesList.SetCursor(messageIndex)
  30. return tview.SetFocus(sp.chatView.messagesList)
  31. case *picker.CancelEvent:
  32. sp.chatView.closeSearch()
  33. return nil
  34. }
  35. return sp.Model.HandleEvent(event)
  36. }
  37. func (sp *searchPicker) update() {
  38. messages := sp.chatView.messagesList.messages
  39. items := make(picker.Items, 0, len(messages))
  40. for i, msg := range messages {
  41. text := msg.Author.DisplayOrUsername() + ": " + msg.Content
  42. if len(text) > 120 {
  43. text = text[:120] + "..."
  44. }
  45. items = append(items, picker.Item{
  46. Text: text,
  47. FilterText: fmt.Sprintf("%s %s", msg.Author.DisplayOrUsername(), msg.Content),
  48. Reference: i,
  49. })
  50. }
  51. sp.Model.SetItems(items)
  52. }
  53. func (sp *searchPicker) ShortHelp() []keybind.Keybind {
  54. cfg := sp.chatView.cfg.Keybinds.Picker
  55. return []keybind.Keybind{cfg.Up.Keybind, cfg.Down.Keybind, cfg.Select.Keybind, cfg.Cancel.Keybind}
  56. }
  57. func (sp *searchPicker) FullHelp() [][]keybind.Keybind {
  58. cfg := sp.chatView.cfg.Keybinds.Picker
  59. return [][]keybind.Keybind{
  60. {cfg.Up.Keybind, cfg.Down.Keybind, cfg.Top.Keybind, cfg.Bottom.Keybind},
  61. {cfg.Select.Keybind, cfg.Cancel.Keybind},
  62. }
  63. }