main_flex.go 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. package main
  2. import (
  3. "github.com/ayn2op/discordo/internal/config"
  4. "github.com/gdamore/tcell/v2"
  5. "github.com/rivo/tview"
  6. )
  7. type MainFlex struct {
  8. *tview.Flex
  9. guildsTree *GuildsTree
  10. messagesText *MessagesText
  11. messageInput *MessageInput
  12. }
  13. func newMainFlex() *MainFlex {
  14. mf := &MainFlex{
  15. Flex: tview.NewFlex(),
  16. guildsTree: newGuildsTree(),
  17. messagesText: newMessagesText(),
  18. messageInput: newMessageInput(),
  19. }
  20. mf.init()
  21. mf.SetInputCapture(mf.onInputCapture)
  22. return mf
  23. }
  24. func (mf *MainFlex) init() {
  25. mf.Clear()
  26. right := tview.NewFlex()
  27. right.SetDirection(tview.FlexRow)
  28. right.AddItem(mf.messagesText, 0, 1, false)
  29. right.AddItem(mf.messageInput, 3, 1, false)
  30. // The guilds tree is always focused first at start-up.
  31. mf.AddItem(mf.guildsTree, 0, 1, true)
  32. mf.AddItem(right, 0, 4, false)
  33. }
  34. func (mf *MainFlex) onInputCapture(event *tcell.EventKey) *tcell.EventKey {
  35. switch event.Name() {
  36. case config.Current.Keys.GuildsTree.Toggle:
  37. // The guilds tree is visible if the numbers of items is two.
  38. if mf.GetItemCount() == 2 {
  39. mf.RemoveItem(mf.guildsTree)
  40. if mf.guildsTree.HasFocus() {
  41. app.SetFocus(mf)
  42. }
  43. } else {
  44. mf.init()
  45. app.SetFocus(mf.guildsTree)
  46. }
  47. return nil
  48. case config.Current.Keys.GuildsTree.Focus:
  49. app.SetFocus(mf.guildsTree)
  50. return nil
  51. case config.Current.Keys.MessagesText.Focus:
  52. app.SetFocus(mf.messagesText)
  53. return nil
  54. case config.Current.Keys.MessageInput.Focus:
  55. app.SetFocus(mf.messageInput)
  56. return nil
  57. }
  58. return event
  59. }