Browse Source

Viewport: Stop ongoing physical drag upon user interaction

An animated drag operation will now stop if the user interacts with
the content area again before the animation is finished. It is also
stopped if the user interacts with the scrollbars.
pull/22/head
attila Attila Szarvas 3 years ago
parent
commit
27924e4996
2 changed files with 24 additions and 5 deletions
  1. +22
    -5
      modules/juce_gui_basics/layout/juce_Viewport.cpp
  2. +2
    -0
      modules/juce_gui_basics/layout/juce_Viewport.h

+ 22
- 5
modules/juce_gui_basics/layout/juce_Viewport.cpp View File

@@ -61,6 +61,12 @@ struct Viewport::DragToScrollListener : private MouseListener,
Desktop::getInstance().removeGlobalMouseListener (this);
}
void stopOngoingAnimation()
{
offsetX.setPosition (offsetX.getPosition());
offsetY.setPosition (offsetY.getPosition());
}
void positionChanged (ViewportDragPosition&, double) override
{
viewport.setViewPosition (originalViewPos - Point<int> ((int) offsetX.getPosition(),
@@ -119,9 +125,11 @@ struct Viewport::DragToScrollListener : private MouseListener,
void endDragAndClearGlobalMouseListener()
{
offsetX.endDrag();
offsetY.endDrag();
isDragging = false;
if (std::exchange (isDragging, false) == true)
{
offsetX.endDrag();
offsetY.endDrag();
}
viewport.contentHolder.addMouseListener (this, true);
Desktop::getInstance().removeGlobalMouseListener (this);
@@ -229,6 +237,8 @@ void Viewport::recreateScrollbars()
getVerticalScrollBar().addListener (this);
getHorizontalScrollBar().addListener (this);
getVerticalScrollBar().addMouseListener (this, true);
getHorizontalScrollBar().addMouseListener (this, true);
resized();
}
@@ -531,8 +541,15 @@ void Viewport::scrollBarMoved (ScrollBar* scrollBarThatHasMoved, double newRange
void Viewport::mouseWheelMove (const MouseEvent& e, const MouseWheelDetails& wheel)
{
if (! useMouseWheelMoveIfNeeded (e, wheel))
Component::mouseWheelMove (e, wheel);
if (e.eventComponent == this)
if (! useMouseWheelMoveIfNeeded (e, wheel))
Component::mouseWheelMove (e, wheel);
}
void Viewport::mouseDown (const MouseEvent& e)
{
if (e.eventComponent == horizontalScrollBar.get() || e.eventComponent == verticalScrollBar.get())
dragToScrollListener->stopOngoingAnimation();
}
static int rescaleMouseWheelDistance (float distance, int singleStepSize) noexcept


+ 2
- 0
modules/juce_gui_basics/layout/juce_Viewport.h View File

@@ -318,6 +318,8 @@ public:
/** @internal */
void mouseWheelMove (const MouseEvent&, const MouseWheelDetails&) override;
/** @internal */
void mouseDown (const MouseEvent& e) override;
/** @internal */
bool keyPressed (const KeyPress&) override;
/** @internal */
void componentMovedOrResized (Component&, bool wasMoved, bool wasResized) override;


Loading…
Cancel
Save