main_flex.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. package cmd
  2. import (
  3. "log/slog"
  4. "github.com/ayn2op/discordo/internal/constants"
  5. "github.com/gdamore/tcell/v2"
  6. "github.com/rivo/tview"
  7. "github.com/zalando/go-keyring"
  8. )
  9. type MainFlex struct {
  10. *tview.Flex
  11. guildsTree *GuildsTree
  12. messagesText *MessagesText
  13. messageInput *MessageInput
  14. }
  15. func newMainFlex() *MainFlex {
  16. mf := &MainFlex{
  17. Flex: tview.NewFlex(),
  18. guildsTree: newGuildsTree(),
  19. messagesText: newMessagesText(),
  20. messageInput: newMessageInput(),
  21. }
  22. mf.init()
  23. mf.SetInputCapture(mf.onInputCapture)
  24. return mf
  25. }
  26. func (mf *MainFlex) init() {
  27. mf.Clear()
  28. right := tview.NewFlex()
  29. right.SetDirection(tview.FlexRow)
  30. right.AddItem(mf.messagesText, 0, 1, false)
  31. right.AddItem(mf.messageInput, 3, 1, false)
  32. // The guilds tree is always focused first at start-up.
  33. mf.AddItem(mf.guildsTree, 0, 1, true)
  34. mf.AddItem(right, 0, 4, false)
  35. }
  36. func (mf *MainFlex) onInputCapture(event *tcell.EventKey) *tcell.EventKey {
  37. switch event.Name() {
  38. case cfg.Keys.FocusGuildsTree:
  39. app.SetFocus(mf.guildsTree)
  40. return nil
  41. case cfg.Keys.FocusMessagesText:
  42. app.SetFocus(mf.messagesText)
  43. return nil
  44. case cfg.Keys.FocusMessageInput:
  45. app.SetFocus(mf.messageInput)
  46. return nil
  47. case cfg.Keys.Logout:
  48. app.Stop()
  49. if err := keyring.Delete(constants.Name, "token"); err != nil {
  50. slog.Error("failed to delete token from keyring", "err", err)
  51. return nil
  52. }
  53. return nil
  54. case cfg.Keys.ToggleGuildsTree:
  55. // The guilds tree is visible if the numbers of items is two.
  56. if mf.GetItemCount() == 2 {
  57. mf.RemoveItem(mf.guildsTree)
  58. if mf.guildsTree.HasFocus() {
  59. app.SetFocus(mf)
  60. }
  61. } else {
  62. mf.init()
  63. app.SetFocus(mf.guildsTree)
  64. }
  65. return nil
  66. }
  67. return event
  68. }