main_flex.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. package cmd
  2. import (
  3. "github.com/gdamore/tcell/v2"
  4. "github.com/rivo/tview"
  5. )
  6. type Mode uint
  7. const (
  8. ModeNormal Mode = iota
  9. ModeInsert
  10. )
  11. type MainFlex struct {
  12. *tview.Flex
  13. mode Mode
  14. guildsTree *GuildsTree
  15. messagesText *MessagesText
  16. messageInput *MessageInput
  17. }
  18. func newMainFlex() *MainFlex {
  19. mf := &MainFlex{
  20. Flex: tview.NewFlex(),
  21. mode: ModeNormal,
  22. guildsTree: newGuildsTree(),
  23. messagesText: newMessagesText(),
  24. messageInput: newMessageInput(),
  25. }
  26. app.SetBeforeDrawFunc(func(screen tcell.Screen) bool {
  27. switch mf.mode {
  28. case ModeNormal:
  29. mf.messageInput.SetBorderAttributes(tcell.AttrNone)
  30. case ModeInsert:
  31. mf.messageInput.SetBorderAttributes(tcell.AttrDim)
  32. }
  33. return false
  34. })
  35. mf.init()
  36. mf.SetInputCapture(mf.onInputCapture)
  37. return mf
  38. }
  39. func (mf *MainFlex) init() {
  40. mf.Clear()
  41. right := tview.NewFlex()
  42. right.SetDirection(tview.FlexRow)
  43. right.AddItem(mf.messagesText, 0, 1, false)
  44. right.AddItem(mf.messageInput, 3, 1, false)
  45. // The guilds tree is always focused first at start-up.
  46. mf.AddItem(mf.guildsTree, 0, 1, true)
  47. mf.AddItem(right, 0, 4, false)
  48. }
  49. func (mf *MainFlex) onInputCapture(event *tcell.EventKey) *tcell.EventKey {
  50. switch mf.mode {
  51. case ModeNormal:
  52. switch event.Name() {
  53. case cfg.Keys.Normal.InsertMode:
  54. mf.mode = ModeInsert
  55. app.SetFocus(mf.messageInput)
  56. return nil
  57. case cfg.Keys.Normal.FocusGuildsTree:
  58. app.SetFocus(mf.guildsTree)
  59. return nil
  60. case cfg.Keys.Normal.FocusMessagesText:
  61. app.SetFocus(mf.messagesText)
  62. return nil
  63. case cfg.Keys.Normal.ToggleGuildsTree:
  64. // The guilds tree is visible if the numbers of items is two.
  65. if mf.GetItemCount() == 2 {
  66. mf.RemoveItem(mf.guildsTree)
  67. if mf.guildsTree.HasFocus() {
  68. app.SetFocus(mf)
  69. }
  70. } else {
  71. mf.init()
  72. app.SetFocus(mf.guildsTree)
  73. }
  74. return nil
  75. }
  76. // do not propagate event to the children if the message input is focused in normal mode.
  77. if mf.messageInput.HasFocus() {
  78. return nil
  79. }
  80. case ModeInsert:
  81. switch event.Name() {
  82. case cfg.Keys.Insert.NormalMode:
  83. mf.mode = ModeNormal
  84. return nil
  85. }
  86. if !mf.messageInput.HasFocus() {
  87. return nil
  88. }
  89. }
  90. return event
  91. }