Skip to content

Commit

Permalink
Merge pull request #2248 from s77rt/fix-2235
Browse files Browse the repository at this point in the history
Fixed: Tapped being triggered after Drag
  • Loading branch information
andydotxyz committed May 24, 2021
2 parents 8864cb4 + 9ce2455 commit 89dce21
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 3 deletions.
6 changes: 3 additions & 3 deletions internal/driver/glfw/window.go
Expand Up @@ -627,7 +627,7 @@ func (w *window) mouseMoved(viewport *glfw.Window, xpos float64, ypos float64) {
}
}

if mouseButton != 0 && !mouseDragStarted {
if mouseButton != 0 && mouseButton != desktop.MouseButtonSecondary && !mouseDragStarted {
obj, pos, _ := w.findObjectAtPositionMatching(w.canvas, previousPos, func(object fyne.CanvasObject) bool {
_, ok := object.(fyne.Draggable)
return ok
Expand Down Expand Up @@ -686,7 +686,7 @@ func (w *window) mouseMoved(viewport *glfw.Window, xpos float64, ypos float64) {
mouseDraggedOffset := w.mouseDraggedOffset
mouseDragPos := w.mouseDragPos
w.mouseLock.RUnlock()
if mouseDragged != nil && mouseButton > 0 {
if mouseDragged != nil && mouseButton > 0 && mouseButton != desktop.MouseButtonSecondary {
draggedObjDelta := mouseDraggedObjStart.Subtract(mouseDragged.(fyne.CanvasObject).Position())
ev := new(fyne.DragEvent)
ev.AbsolutePosition = mousePos
Expand Down Expand Up @@ -827,7 +827,7 @@ func (w *window) mouseClicked(_ *glfw.Window, btn glfw.MouseButton, action glfw.
}

// Check for double click/tap on left mouse button
if action == glfw.Release && button == desktop.MouseButtonPrimary {
if action == glfw.Release && button == desktop.MouseButtonPrimary && !mouseDragStarted {
w.mouseClickedHandleTapDoubleTap(co, ev)
}
}
Expand Down
49 changes: 49 additions & 0 deletions internal/driver/glfw/window_test.go
Expand Up @@ -325,6 +325,30 @@ func TestWindow_HandleDragging(t *testing.T) {
assert.Nil(t, d1.popDragEvent())
assert.Nil(t, d2.popDragEvent())

// no drag event on secondary mouseDown
w.mouseClicked(w.viewport, glfw.MouseButton2, glfw.Press, 0)
w.WaitForEvents()
assert.Nil(t, d1.popDragEvent())
assert.Nil(t, d2.popDragEvent())

// no drag start and no drag event with pressed secondary mouse button
w.mouseMoved(w.viewport, 8, 8)
w.WaitForEvents()
assert.Nil(t, d1.popDragEvent())
assert.Nil(t, d2.popDragEvent())

// no drag end event on secondary mouseUp
w.mouseClicked(w.viewport, glfw.MouseButton2, glfw.Release, 0)
w.WaitForEvents()
assert.Nil(t, d1.popDragEndEvent())
assert.Nil(t, d2.popDragEndEvent())

// no drag event in simple move
w.mouseMoved(w.viewport, 9, 9)
w.WaitForEvents()
assert.Nil(t, d1.popDragEvent())
assert.Nil(t, d2.popDragEvent())

// no drag event on mouseDown
w.mouseClicked(w.viewport, glfw.MouseButton1, glfw.Press, 0)
w.WaitForEvents()
Expand Down Expand Up @@ -575,6 +599,25 @@ func TestWindow_HoverableOnDragging(t *testing.T) {
assert.NotNil(t, dh.popMouseOutEvent())
}

func TestWindow_DragEndWithoutTappedEvent(t *testing.T) {
w := createWindow("Test").(*window)
do := &draggableTappableObject{Rectangle: canvas.NewRectangle(color.White)}
do.SetMinSize(fyne.NewSize(10, 10))
w.SetContent(do)

repaintWindow(w)
require.Equal(t, fyne.NewPos(4, 4), do.Position())

w.mouseMoved(w.viewport, 9, 9)
w.mouseClicked(w.viewport, glfw.MouseButton1, glfw.Press, 0)
w.mouseMoved(w.viewport, 8, 8)
w.mouseClicked(w.viewport, glfw.MouseButton1, glfw.Release, 0)

w.WaitForEvents()

assert.Nil(t, do.popTapEvent())
}

func TestWindow_Scrolled(t *testing.T) {
w := createWindow("Test").(*window)
o := &scrollable{Rectangle: canvas.NewRectangle(color.White)}
Expand Down Expand Up @@ -1328,6 +1371,12 @@ func (t *tappable) popSecondaryTapEvent() (e interface{}) {
return
}

type draggableTappableObject struct {
*canvas.Rectangle
draggable
tappable
}

var _ fyne.Focusable = (*focusable)(nil)
var _ fyne.Disableable = (*focusable)(nil)

Expand Down

0 comments on commit 89dce21

Please sign in to comment.