| @@ -217,6 +217,7 @@ struct Viewport::DragToScrollListener : private MouseListener, | |||
| ~DragToScrollListener() | |||
| { | |||
| viewport.contentHolder.removeMouseListener (this); | |||
| Desktop::getInstance().removeGlobalMouseListener (this); | |||
| } | |||
| void positionChanged (ViewportDragPosition&, double) override | |||
| @@ -227,14 +228,23 @@ struct Viewport::DragToScrollListener : private MouseListener, | |||
| void mouseDown (const MouseEvent&) override | |||
| { | |||
| offsetX.setPosition (offsetX.getPosition()); | |||
| offsetY.setPosition (offsetY.getPosition()); | |||
| ++numTouches; | |||
| if (! isGlobalMouseListener) | |||
| { | |||
| offsetX.setPosition (offsetX.getPosition()); | |||
| offsetY.setPosition (offsetY.getPosition()); | |||
| // switch to a global mouse listener so we still receive mouseUp events | |||
| // if the original event component is deleted | |||
| viewport.contentHolder.removeMouseListener (this); | |||
| Desktop::getInstance().addGlobalMouseListener (this); | |||
| isGlobalMouseListener = true; | |||
| } | |||
| } | |||
| void mouseDrag (const MouseEvent& e) override | |||
| { | |||
| if (numTouches == 1 && ! doesMouseEventComponentBlockViewportDrag (e.eventComponent)) | |||
| if (Desktop::getInstance().getNumDraggingMouseSources() == 1 && ! doesMouseEventComponentBlockViewportDrag (e.eventComponent)) | |||
| { | |||
| auto totalOffset = e.getOffsetFromDragStart().toFloat(); | |||
| @@ -259,13 +269,20 @@ struct Viewport::DragToScrollListener : private MouseListener, | |||
| void mouseUp (const MouseEvent&) override | |||
| { | |||
| if (--numTouches <= 0) | |||
| { | |||
| offsetX.endDrag(); | |||
| offsetY.endDrag(); | |||
| isDragging = false; | |||
| numTouches = 0; | |||
| } | |||
| if (isGlobalMouseListener && Desktop::getInstance().getNumDraggingMouseSources() == 0) | |||
| endDragAndClearGlobalMouseListener(); | |||
| } | |||
| void endDragAndClearGlobalMouseListener() | |||
| { | |||
| offsetX.endDrag(); | |||
| offsetY.endDrag(); | |||
| isDragging = false; | |||
| viewport.contentHolder.addMouseListener (this, true); | |||
| Desktop::getInstance().removeGlobalMouseListener (this); | |||
| isGlobalMouseListener = false; | |||
| } | |||
| bool doesMouseEventComponentBlockViewportDrag (const Component* eventComp) | |||
| @@ -280,8 +297,8 @@ struct Viewport::DragToScrollListener : private MouseListener, | |||
| Viewport& viewport; | |||
| ViewportDragPosition offsetX, offsetY; | |||
| Point<int> originalViewPos; | |||
| int numTouches = 0; | |||
| bool isDragging = false; | |||
| bool isGlobalMouseListener = false; | |||
| JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DragToScrollListener) | |||
| }; | |||