1
0
Fork 0
mirror of https://github.com/juce-framework/JUCE.git synced 2026-01-10 23:44:24 +00:00

Make Viewport::DragToScrollListener more robust and able to cope with the deletion of the original mouseDown event component

This commit is contained in:
ed 2018-04-12 11:05:29 +01:00
parent 6dbb975c01
commit 45698e40b2

View file

@ -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)
};