Browse Source

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

tags/2021-05-28
ed 7 years ago
parent
commit
45698e40b2
1 changed files with 29 additions and 12 deletions
  1. +29
    -12
      modules/juce_gui_basics/layout/juce_Viewport.cpp

+ 29
- 12
modules/juce_gui_basics/layout/juce_Viewport.cpp View File

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


Loading…
Cancel
Save