main_flex.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. package cmd
  2. import (
  3. "log"
  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. log.Fatal(err)
  51. }
  52. return nil
  53. case cfg.Keys.ToggleGuildsTree:
  54. // The guilds tree is visible if the numbers of items is two.
  55. if mf.GetItemCount() == 2 {
  56. mf.RemoveItem(mf.guildsTree)
  57. if mf.guildsTree.HasFocus() {
  58. app.SetFocus(mf)
  59. }
  60. } else {
  61. mf.init()
  62. app.SetFocus(mf.guildsTree)
  63. }
  64. return nil
  65. }
  66. return event
  67. }