main_flex.go 1.4 KB

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