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
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
+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 {