| @@ -217,6 +217,7 @@ struct Viewport::DragToScrollListener : private MouseListener, | |||||
| ~DragToScrollListener() | ~DragToScrollListener() | ||||
| { | { | ||||
| viewport.contentHolder.removeMouseListener (this); | viewport.contentHolder.removeMouseListener (this); | ||||
| Desktop::getInstance().removeGlobalMouseListener (this); | |||||
| } | } | ||||
| void positionChanged (ViewportDragPosition&, double) override | void positionChanged (ViewportDragPosition&, double) override | ||||
| @@ -227,14 +228,23 @@ struct Viewport::DragToScrollListener : private MouseListener, | |||||
| void mouseDown (const MouseEvent&) override | 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 | 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(); | auto totalOffset = e.getOffsetFromDragStart().toFloat(); | ||||
| @@ -259,13 +269,20 @@ struct Viewport::DragToScrollListener : private MouseListener, | |||||
| void mouseUp (const MouseEvent&) override | 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) | bool doesMouseEventComponentBlockViewportDrag (const Component* eventComp) | ||||
| @@ -280,8 +297,8 @@ struct Viewport::DragToScrollListener : private MouseListener, | |||||
| Viewport& viewport; | Viewport& viewport; | ||||
| ViewportDragPosition offsetX, offsetY; | ViewportDragPosition offsetX, offsetY; | ||||
| Point<int> originalViewPos; | Point<int> originalViewPos; | ||||
| int numTouches = 0; | |||||
| bool isDragging = false; | bool isDragging = false; | ||||
| bool isGlobalMouseListener = false; | |||||
| JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DragToScrollListener) | JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DragToScrollListener) | ||||
| }; | }; | ||||