main_flex.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  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. if mf.GetItemCount() == 2 {
  49. app.SetFocus(mf.guildsTree)
  50. }
  51. return nil
  52. case cfg.Keys.MessagesText.Focus:
  53. app.SetFocus(mf.messagesText)
  54. return nil
  55. case cfg.Keys.MessageInput.Focus:
  56. app.SetFocus(mf.messageInput)
  57. return nil
  58. }
  59. return event
  60. }