My mirror of the Barnard terminal client for Mumble.
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

172 lignes
4.2 KiB

  1. package main
  2. import (
  3. "fmt"
  4. "strings"
  5. "time"
  6. "github.com/kennygrant/sanitize"
  7. "layeh.com/barnard/uiterm"
  8. "layeh.com/gumble/gumble"
  9. )
  10. const (
  11. uiViewLogo = "logo"
  12. uiViewTop = "top"
  13. uiViewStatus = "status"
  14. uiViewInput = "input"
  15. uiViewInputStatus = "inputstatus"
  16. uiViewOutput = "output"
  17. uiViewTree = "tree"
  18. )
  19. func esc(str string) string {
  20. return sanitize.HTML(str)
  21. }
  22. func (b *Barnard) UpdateInputStatus(status string) {
  23. b.UiInputStatus.Text = status
  24. b.UiTree.Rebuild()
  25. b.Ui.Refresh()
  26. }
  27. func (b *Barnard) AddOutputLine(line string) {
  28. now := time.Now()
  29. b.UiOutput.AddLine(fmt.Sprintf("[%02d:%02d:%02d] %s", now.Hour(), now.Minute(), now.Second(), line))
  30. }
  31. func (b *Barnard) AddOutputMessage(sender *gumble.User, message string) {
  32. if sender == nil {
  33. b.AddOutputLine(message)
  34. } else {
  35. b.AddOutputLine(fmt.Sprintf("%s: %s", sender.Name, strings.TrimSpace(esc(message))))
  36. }
  37. }
  38. func (b *Barnard) OnVoiceToggle(ui *uiterm.Ui, key uiterm.Key) {
  39. if b.UiStatus.Text == " Tx " {
  40. b.UiStatus.Text = " Idle "
  41. b.UiStatus.Fg = uiterm.ColorBlack
  42. b.UiStatus.Bg = uiterm.ColorWhite
  43. b.Stream.StopSource()
  44. } else {
  45. b.UiStatus.Fg = uiterm.ColorWhite | uiterm.AttrBold
  46. b.UiStatus.Bg = uiterm.ColorRed
  47. b.UiStatus.Text = " Tx "
  48. b.Stream.StartSource()
  49. }
  50. ui.Refresh()
  51. }
  52. func (b *Barnard) OnQuitPress(ui *uiterm.Ui, key uiterm.Key) {
  53. b.Client.Disconnect()
  54. b.Ui.Close()
  55. }
  56. func (b *Barnard) OnClearPress(ui *uiterm.Ui, key uiterm.Key) {
  57. b.UiOutput.Clear()
  58. }
  59. func (b *Barnard) OnScrollOutputUp(ui *uiterm.Ui, key uiterm.Key) {
  60. b.UiOutput.ScrollUp()
  61. }
  62. func (b *Barnard) OnScrollOutputDown(ui *uiterm.Ui, key uiterm.Key) {
  63. b.UiOutput.ScrollDown()
  64. }
  65. func (b *Barnard) OnScrollOutputTop(ui *uiterm.Ui, key uiterm.Key) {
  66. b.UiOutput.ScrollTop()
  67. }
  68. func (b *Barnard) OnScrollOutputBottom(ui *uiterm.Ui, key uiterm.Key) {
  69. b.UiOutput.ScrollBottom()
  70. }
  71. func (b *Barnard) OnFocusPress(ui *uiterm.Ui, key uiterm.Key) {
  72. active := b.Ui.Active()
  73. if active == uiViewInput {
  74. b.Ui.SetActive(uiViewTree)
  75. } else if active == uiViewTree {
  76. b.Ui.SetActive(uiViewInput)
  77. }
  78. }
  79. func (b *Barnard) OnTextInput(ui *uiterm.Ui, textbox *uiterm.Textbox, text string) {
  80. if text == "" {
  81. return
  82. }
  83. if b.Client != nil && b.Client.Self != nil {
  84. b.Client.Self.Channel.Send(text, false)
  85. b.AddOutputMessage(b.Client.Self, text)
  86. }
  87. }
  88. func (b *Barnard) OnUiInitialize(ui *uiterm.Ui) {
  89. ui.Add(uiViewLogo, &uiterm.Label{
  90. Text: " barnard ",
  91. Fg: uiterm.ColorWhite | uiterm.AttrBold,
  92. Bg: uiterm.ColorMagenta,
  93. })
  94. ui.Add(uiViewTop, &uiterm.Label{
  95. Fg: uiterm.ColorWhite,
  96. Bg: uiterm.ColorBlue,
  97. })
  98. b.UiStatus = uiterm.Label{
  99. Text: " Idle ",
  100. Fg: uiterm.ColorBlack,
  101. Bg: uiterm.ColorWhite,
  102. }
  103. ui.Add(uiViewStatus, &b.UiStatus)
  104. b.UiInput = uiterm.Textbox{
  105. Fg: uiterm.ColorWhite,
  106. Bg: uiterm.ColorBlack,
  107. Input: b.OnTextInput,
  108. }
  109. ui.Add(uiViewInput, &b.UiInput)
  110. b.UiInputStatus = uiterm.Label{
  111. Fg: uiterm.ColorBlack,
  112. Bg: uiterm.ColorWhite,
  113. }
  114. ui.Add(uiViewInputStatus, &b.UiInputStatus)
  115. b.UiOutput = uiterm.Textview{
  116. Fg: uiterm.ColorWhite,
  117. Bg: uiterm.ColorBlack,
  118. }
  119. ui.Add(uiViewOutput, &b.UiOutput)
  120. b.UiTree = uiterm.Tree{
  121. Generator: b.TreeItem,
  122. Listener: b.TreeItemSelect,
  123. Fg: uiterm.ColorWhite,
  124. Bg: uiterm.ColorBlack,
  125. }
  126. ui.Add(uiViewTree, &b.UiTree)
  127. b.Ui.AddKeyListener(b.OnFocusPress, uiterm.KeyTab)
  128. b.Ui.AddKeyListener(b.OnVoiceToggle, uiterm.KeyF1)
  129. b.Ui.AddKeyListener(b.OnQuitPress, uiterm.KeyF10)
  130. b.Ui.AddKeyListener(b.OnClearPress, uiterm.KeyCtrlL)
  131. b.Ui.AddKeyListener(b.OnScrollOutputUp, uiterm.KeyPgup)
  132. b.Ui.AddKeyListener(b.OnScrollOutputDown, uiterm.KeyPgdn)
  133. b.Ui.AddKeyListener(b.OnScrollOutputTop, uiterm.KeyHome)
  134. b.Ui.AddKeyListener(b.OnScrollOutputBottom, uiterm.KeyEnd)
  135. b.start()
  136. }
  137. func (b *Barnard) OnUiResize(ui *uiterm.Ui, width, height int) {
  138. ui.SetBounds(uiViewLogo, 0, 0, 9, 1)
  139. ui.SetBounds(uiViewTop, 9, 0, width-6, 1)
  140. ui.SetBounds(uiViewStatus, width-6, 0, width, 1)
  141. ui.SetBounds(uiViewInput, 0, height-1, width, height)
  142. ui.SetBounds(uiViewInputStatus, 0, height-2, width, height-1)
  143. ui.SetBounds(uiViewOutput, 0, 1, width-20, height-2)
  144. ui.SetBounds(uiViewTree, width-20, 1, width, height-2)
  145. }