main_flex.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  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.GuildsTree.Toggle:
  36. // The guilds tree is visible if the numbers of items is two.
  37. if mf.GetItemCount() == 2 {
  38. mf.RemoveItem(mf.guildsTree)
  39. if mf.guildsTree.HasFocus() {
  40. app.SetFocus(mf)
  41. }
  42. } else {
  43. mf.init()
  44. app.SetFocus(mf.guildsTree)
  45. }
  46. return nil
  47. case cfg.Keys.GuildsTree.Focus:
  48. app.SetFocus(mf.guildsTree)
  49. return nil
  50. case cfg.Keys.MessagesText.Focus:
  51. app.SetFocus(mf.messagesText)
  52. return nil
  53. case cfg.Keys.MessageInput.Focus:
  54. app.SetFocus(mf.messageInput)
  55. return nil
  56. }
  57. return event
  58. }