diff --git a/internal/driver/glfw/window.go b/internal/driver/glfw/window.go index d1039f1938..b37c5872e3 100644 --- a/internal/driver/glfw/window.go +++ b/internal/driver/glfw/window.go @@ -825,7 +825,7 @@ func (w *window) waitForDoubleTap(co fyne.CanvasObject, ev *fyne.PointEvent) { } func (w *window) mouseScrolled(viewport *glfw.Window, xoff float64, yoff float64) { - co, _, _ := w.findObjectAtPositionMatching(w.canvas, w.mousePos, func(object fyne.CanvasObject) bool { + co, pos, _ := w.findObjectAtPositionMatching(w.canvas, w.mousePos, func(object fyne.CanvasObject) bool { _, ok := object.(fyne.Scrollable) return ok }) @@ -838,6 +838,8 @@ func (w *window) mouseScrolled(viewport *glfw.Window, xoff float64, yoff float64 } ev := &fyne.ScrollEvent{} ev.Scrolled = fyne.NewDelta(float32(xoff)*scrollSpeed, float32(yoff)*scrollSpeed) + ev.Position = pos + ev.AbsolutePosition = w.mousePos wid.Scrolled(ev) } } diff --git a/internal/driver/glfw/window_test.go b/internal/driver/glfw/window_test.go index 2f216cec2c..934b03a557 100644 --- a/internal/driver/glfw/window_test.go +++ b/internal/driver/glfw/window_test.go @@ -534,6 +534,22 @@ func TestWindow_HoverableOnDragging(t *testing.T) { assert.NotNil(t, dh.popMouseOutEvent()) } +func TestWindow_Scrolled(t *testing.T) { + w := createWindow("Test").(*window) + o := &scrollable{Rectangle: canvas.NewRectangle(color.White)} + o.SetMinSize(fyne.NewSize(100, 100)) + w.SetContent(o) + + w.mousePos = fyne.NewPos(50, 60) + w.mouseScrolled(w.viewport, 10, 10) + w.waitForEvents() + + if e, _ := o.popScrollEvent().(*fyne.ScrollEvent); assert.NotNil(t, e, "scroll event") { + assert.Equal(t, fyne.NewPos(50, 60), e.AbsolutePosition) + assert.Equal(t, fyne.NewPos(46, 56), e.Position) + } +} + func TestWindow_Tapped(t *testing.T) { w := createWindow("Test").(*window) rect := canvas.NewRectangle(color.White) @@ -1305,6 +1321,22 @@ func (ts *typedShortcutable) TypedShortcut(s fyne.Shortcut) { ts.capturedShortcuts = append(ts.capturedShortcuts, s) } +var _ fyne.Draggable = (*draggable)(nil) + +type scrollable struct { + *canvas.Rectangle + events []interface{} +} + +func (s *scrollable) Scrolled(e *fyne.ScrollEvent) { + s.events = append(s.events, e) +} + +func (s *scrollable) popScrollEvent() (e interface{}) { + e, s.events = pop(s.events) + return +} + // // Test helper //