Browse Source

Fixed bug with multi-touch in Viewport when drag is blocked and made some methods const

tags/2021-05-28
ed 8 years ago
parent
commit
0747a7067b
2 changed files with 21 additions and 8 deletions
  1. +2
    -2
      modules/juce_gui_basics/components/juce_Component.h
  2. +19
    -6
      modules/juce_gui_basics/layout/juce_Viewport.cpp

+ 2
- 2
modules/juce_gui_basics/components/juce_Component.h View File

@@ -2234,12 +2234,12 @@ public:
Viewport with drag-to-scroll functionality enabled. This is useful for Components such as sliders that Viewport with drag-to-scroll functionality enabled. This is useful for Components such as sliders that
should not move their parent Viewport when dragged. should not move their parent Viewport when dragged.
*/ */
void setViewportIgnoreDragFlag (bool ignoreDrag) { flags.viewportIgnoreDragFlag = ignoreDrag; };
void setViewportIgnoreDragFlag (bool ignoreDrag) noexcept { flags.viewportIgnoreDragFlag = ignoreDrag; };
/** Retrieves the current state of the Viewport drag-to-scroll functionality flag. /** Retrieves the current state of the Viewport drag-to-scroll functionality flag.
@see setViewportIgnoreDragFlag @see setViewportIgnoreDragFlag
*/ */
bool getViewportIgnoreDragFlag() { return flags.viewportIgnoreDragFlag; }
bool getViewportIgnoreDragFlag() const noexcept { return flags.viewportIgnoreDragFlag; }
//============================================================================== //==============================================================================
// These methods are deprecated - use localPointToGlobal, getLocalPoint, getLocalPoint, etc instead. // These methods are deprecated - use localPointToGlobal, getLocalPoint, getLocalPoint, etc instead.


+ 19
- 6
modules/juce_gui_basics/layout/juce_Viewport.cpp View File

@@ -193,7 +193,7 @@ struct Viewport::DragToScrollListener : private MouseListener,
private ViewportDragPosition::Listener private ViewportDragPosition::Listener
{ {
DragToScrollListener (Viewport& v) DragToScrollListener (Viewport& v)
: viewport (v), numTouches (0), isDragging (false)
: viewport (v), numTouches (0), isDragging (false), isViewportDragBlocked (false)
{ {
viewport.contentHolder.addMouseListener (this, true); viewport.contentHolder.addMouseListener (this, true);
offsetX.addListener (this); offsetX.addListener (this);
@@ -213,16 +213,15 @@ struct Viewport::DragToScrollListener : private MouseListener,
void mouseDown (const MouseEvent& e) override void mouseDown (const MouseEvent& e) override
{ {
for (auto c = e.eventComponent; c != nullptr && c != &viewport; c = c->getParentComponent())
if (c->getViewportIgnoreDragFlag())
return;
if (doesMouseEventComponentBlockViewportDrag (e.eventComponent))
isViewportDragBlocked = true;
++numTouches; ++numTouches;
} }
void mouseDrag (const MouseEvent& e) override void mouseDrag (const MouseEvent& e) override
{ {
if (numTouches == 1)
if (numTouches == 1 && ! isViewportDragBlocked)
{ {
Point<float> totalOffset = e.getOffsetFromDragStart().toFloat(); Point<float> totalOffset = e.getOffsetFromDragStart().toFloat();
@@ -245,8 +244,11 @@ struct Viewport::DragToScrollListener : private MouseListener,
} }
} }
void mouseUp (const MouseEvent&) override
void mouseUp (const MouseEvent& e) override
{ {
if (doesMouseEventComponentBlockViewportDrag (e.eventComponent))
isViewportDragBlocked = false;
if (--numTouches <= 0) if (--numTouches <= 0)
{ {
offsetX.endDrag(); offsetX.endDrag();
@@ -256,12 +258,23 @@ struct Viewport::DragToScrollListener : private MouseListener,
} }
} }
bool doesMouseEventComponentBlockViewportDrag (const Component* eventComp)
{
for (auto c = eventComp; c != nullptr && c != &viewport; c = c->getParentComponent())
if (c->getViewportIgnoreDragFlag())
return true;
return false;
}
Viewport& viewport; Viewport& viewport;
ViewportDragPosition offsetX, offsetY; ViewportDragPosition offsetX, offsetY;
Point<int> originalViewPos; Point<int> originalViewPos;
int numTouches; int numTouches;
bool isDragging; bool isDragging;
bool isViewportDragBlocked;
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DragToScrollListener) JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DragToScrollListener)
}; };


Loading…
Cancel
Save