commit c5e30f9
Hubert Hirtz
·
2020-11-07 11:57:38 +0000 UTC
parent cd53306
Scroll wheel support
3 files changed,
+132,
-88
M
app.go
+117,
-82
1@@ -228,20 +228,13 @@ func (app *App) handleIRCEvent(ev irc.Event) {
2 }
3 }
4
5-func (app *App) handleUIEvent(ev tcell.Event) {
6- switch ev := ev.(type) {
7- case *tcell.EventResize:
8- app.win.Resize()
9- case *tcell.EventPaste:
10- app.pasting = ev.Start()
11- case *tcell.EventKey:
12- switch ev.Key() {
13- case tcell.KeyCtrlC:
14- app.win.Exit()
15- case tcell.KeyCtrlL:
16- app.win.Resize()
17- case tcell.KeyCtrlU, tcell.KeyPgUp:
18- app.win.ScrollUp()
19+func (app *App) handleMouseEvent(ev *tcell.EventMouse) {
20+ x, _ := ev.Position()
21+ if ev.Buttons()&tcell.WheelUp != 0 {
22+ if x < app.cfg.ChanColWidth {
23+ // TODO scroll chan list
24+ } else {
25+ app.win.ScrollUpBy(4)
26 if app.s == nil {
27 return
28 }
29@@ -253,81 +246,123 @@ func (app *App) handleUIEvent(ev tcell.Event) {
30 }
31 app.s.RequestHistory(buffer, at)
32 }
33- case tcell.KeyCtrlD, tcell.KeyPgDn:
34- app.win.ScrollDown()
35- case tcell.KeyCtrlN:
36- app.win.NextBuffer()
37- case tcell.KeyCtrlP:
38- app.win.PreviousBuffer()
39- case tcell.KeyRight:
40- if ev.Modifiers() == tcell.ModAlt {
41- app.win.NextBuffer()
42- app.updatePrompt()
43- } else {
44- app.win.InputRight()
45- }
46- case tcell.KeyLeft:
47- if ev.Modifiers() == tcell.ModAlt {
48- app.win.PreviousBuffer()
49- app.updatePrompt()
50- } else {
51- app.win.InputLeft()
52- }
53- case tcell.KeyUp:
54- if ev.Modifiers() == tcell.ModAlt {
55- app.win.PreviousBuffer()
56- } else {
57- app.win.InputUp()
58+ }
59+ }
60+ if ev.Buttons()&tcell.WheelDown != 0 {
61+ if x < app.cfg.ChanColWidth {
62+ // TODO scroll chan list
63+ } else {
64+ app.win.ScrollDownBy(4)
65+ }
66+ }
67+}
68+
69+func (app *App) handleKeyEvent(ev *tcell.EventKey) {
70+ switch ev.Key() {
71+ case tcell.KeyCtrlC:
72+ app.win.Exit()
73+ case tcell.KeyCtrlL:
74+ app.win.Resize()
75+ case tcell.KeyCtrlU, tcell.KeyPgUp:
76+ app.win.ScrollUp()
77+ if app.s == nil {
78+ return
79+ }
80+ buffer := app.win.CurrentBuffer()
81+ if app.win.IsAtTop() && buffer != Home {
82+ at := time.Now()
83+ if t := app.win.CurrentBufferOldestTime(); t != nil {
84+ at = *t
85 }
86+ app.s.RequestHistory(buffer, at)
87+ }
88+ case tcell.KeyCtrlD, tcell.KeyPgDn:
89+ app.win.ScrollDown()
90+ case tcell.KeyCtrlN:
91+ app.win.NextBuffer()
92+ case tcell.KeyCtrlP:
93+ app.win.PreviousBuffer()
94+ case tcell.KeyRight:
95+ if ev.Modifiers() == tcell.ModAlt {
96+ app.win.NextBuffer()
97 app.updatePrompt()
98- case tcell.KeyDown:
99- if ev.Modifiers() == tcell.ModAlt {
100- app.win.NextBuffer()
101- } else {
102- app.win.InputDown()
103- }
104+ } else {
105+ app.win.InputRight()
106+ }
107+ case tcell.KeyLeft:
108+ if ev.Modifiers() == tcell.ModAlt {
109+ app.win.PreviousBuffer()
110 app.updatePrompt()
111- case tcell.KeyHome:
112- app.win.InputHome()
113- case tcell.KeyEnd:
114- app.win.InputEnd()
115- case tcell.KeyBackspace2:
116- ok := app.win.InputBackspace()
117- if ok {
118- app.typing()
119- app.updatePrompt()
120- }
121- case tcell.KeyDelete:
122- ok := app.win.InputDelete()
123- if ok {
124- app.typing()
125- app.updatePrompt()
126- }
127- case tcell.KeyTab:
128- ok := app.win.InputAutoComplete()
129- if ok {
130- app.typing()
131- }
132- case tcell.KeyCR, tcell.KeyLF:
133- buffer := app.win.CurrentBuffer()
134- input := app.win.InputEnter()
135- err := app.handleInput(buffer, input)
136- if err != nil {
137- app.win.AddLine(app.win.CurrentBuffer(), false, ui.Line{
138- At: time.Now(),
139- Head: "!!",
140- HeadColor: ui.ColorRed,
141- Body: fmt.Sprintf("%q: %s", input, err),
142- })
143- }
144+ } else {
145+ app.win.InputLeft()
146+ }
147+ case tcell.KeyUp:
148+ if ev.Modifiers() == tcell.ModAlt {
149+ app.win.PreviousBuffer()
150+ } else {
151+ app.win.InputUp()
152+ }
153+ app.updatePrompt()
154+ case tcell.KeyDown:
155+ if ev.Modifiers() == tcell.ModAlt {
156+ app.win.NextBuffer()
157+ } else {
158+ app.win.InputDown()
159+ }
160+ app.updatePrompt()
161+ case tcell.KeyHome:
162+ app.win.InputHome()
163+ case tcell.KeyEnd:
164+ app.win.InputEnd()
165+ case tcell.KeyBackspace2:
166+ ok := app.win.InputBackspace()
167+ if ok {
168+ app.typing()
169 app.updatePrompt()
170- case tcell.KeyRune:
171- app.win.InputRune(ev.Rune())
172+ }
173+ case tcell.KeyDelete:
174+ ok := app.win.InputDelete()
175+ if ok {
176 app.typing()
177 app.updatePrompt()
178- default:
179- return
180 }
181+ case tcell.KeyTab:
182+ ok := app.win.InputAutoComplete()
183+ if ok {
184+ app.typing()
185+ }
186+ case tcell.KeyCR, tcell.KeyLF:
187+ buffer := app.win.CurrentBuffer()
188+ input := app.win.InputEnter()
189+ err := app.handleInput(buffer, input)
190+ if err != nil {
191+ app.win.AddLine(app.win.CurrentBuffer(), false, ui.Line{
192+ At: time.Now(),
193+ Head: "!!",
194+ HeadColor: ui.ColorRed,
195+ Body: fmt.Sprintf("%q: %s", input, err),
196+ })
197+ }
198+ app.updatePrompt()
199+ case tcell.KeyRune:
200+ app.win.InputRune(ev.Rune())
201+ app.typing()
202+ app.updatePrompt()
203+ default:
204+ return
205+ }
206+}
207+
208+func (app *App) handleUIEvent(ev tcell.Event) {
209+ switch ev := ev.(type) {
210+ case *tcell.EventResize:
211+ app.win.Resize()
212+ case *tcell.EventPaste:
213+ app.pasting = ev.Start()
214+ case *tcell.EventMouse:
215+ app.handleMouseEvent(ev)
216+ case *tcell.EventKey:
217+ app.handleKeyEvent(ev)
218 default:
219 return
220 }
+4,
-4
1@@ -303,17 +303,17 @@ func (bs *BufferList) CurrentOldestTime() (t *time.Time) {
2 return
3 }
4
5-func (bs *BufferList) ScrollUp() {
6+func (bs *BufferList) ScrollUp(n int) {
7 b := &bs.list[bs.current]
8 if b.isAtTop {
9 return
10 }
11- b.scrollAmt += bs.tlHeight / 2
12+ b.scrollAmt += n
13 }
14
15-func (bs *BufferList) ScrollDown() {
16+func (bs *BufferList) ScrollDown(n int) {
17 b := &bs.list[bs.current]
18- b.scrollAmt -= bs.tlHeight / 2
19+ b.scrollAmt -= n
20
21 if b.scrollAmt < 0 {
22 b.scrollAmt = 0
M
ui/ui.go
+11,
-2
1@@ -39,6 +39,7 @@ func New(config Config) (ui *UI, err error) {
2 if err != nil {
3 return
4 }
5+ ui.screen.EnableMouse()
6 ui.screen.EnablePaste()
7
8 w, h := ui.screen.Size()
9@@ -90,11 +91,19 @@ func (ui *UI) PreviousBuffer() {
10 }
11
12 func (ui *UI) ScrollUp() {
13- ui.bs.ScrollUp()
14+ ui.bs.ScrollUp(ui.bs.tlHeight / 2)
15 }
16
17 func (ui *UI) ScrollDown() {
18- ui.bs.ScrollDown()
19+ ui.bs.ScrollDown(ui.bs.tlHeight / 2)
20+}
21+
22+func (ui *UI) ScrollUpBy(n int) {
23+ ui.bs.ScrollUp(n)
24+}
25+
26+func (ui *UI) ScrollDownBy(n int) {
27+ ui.bs.ScrollDown(n)
28 }
29
30 func (ui *UI) IsAtTop() bool {