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