diff --git a/modules/juce_gui_basics/layout/juce_Viewport.cpp b/modules/juce_gui_basics/layout/juce_Viewport.cpp index 4fdca1af22..ad9d1ea7e4 100644 --- a/modules/juce_gui_basics/layout/juce_Viewport.cpp +++ b/modules/juce_gui_basics/layout/juce_Viewport.cpp @@ -22,19 +22,7 @@ ============================================================================== */ -Viewport::Viewport (const String& name) - : Component (name), - scrollBarThickness (0), - singleStepX (16), - singleStepY (16), - showHScrollbar (true), - showVScrollbar (true), - deleteContent (true), - customScrollBarThickness (false), - allowScrollingWithoutScrollbarV (false), - allowScrollingWithoutScrollbarH (false), - verticalScrollBar (true), - horizontalScrollBar (false) +Viewport::Viewport (const String& name) : Component (name) { // content holder is used to clip the contents so they don't overlap the scrollbars addAndMakeVisible (contentHolder); @@ -104,14 +92,18 @@ void Viewport::setViewedComponent (Component* const newViewedComponent, const bo } } -int Viewport::getMaximumVisibleWidth() const { return contentHolder.getWidth(); } -int Viewport::getMaximumVisibleHeight() const { return contentHolder.getHeight(); } +int Viewport::getMaximumVisibleWidth() const { return contentHolder.getWidth(); } +int Viewport::getMaximumVisibleHeight() const { return contentHolder.getHeight(); } + +bool Viewport::canScrollVertically() const noexcept { return contentComp->getY() < 0 || contentComp->getBottom() > getHeight(); } +bool Viewport::canScrollHorizontally() const noexcept { return contentComp->getX() < 0 || contentComp->getRight() > getWidth(); } Point Viewport::viewportPosToCompPos (Point pos) const { jassert (contentComp != nullptr); - Rectangle contentBounds = contentHolder.getLocalArea (contentComp, contentComp->getLocalBounds()); + auto contentBounds = contentHolder.getLocalArea (contentComp, contentComp->getLocalBounds()); + Point p (jmax (jmin (0, contentHolder.getWidth() - contentBounds.getWidth()), jmin (0, -(pos.x))), jmax (jmin (0, contentHolder.getHeight() - contentBounds.getHeight()), jmin (0, -(pos.y)))); @@ -121,7 +113,7 @@ Point Viewport::viewportPosToCompPos (Point pos) const void Viewport::setViewPosition (const int xPixelsOffset, const int yPixelsOffset) { - setViewPosition (Point (xPixelsOffset, yPixelsOffset)); + setViewPosition ({ xPixelsOffset, yPixelsOffset }); } void Viewport::setViewPosition (Point newPosition) @@ -143,7 +135,7 @@ bool Viewport::autoScroll (const int mouseX, const int mouseY, const int activeB { int dx = 0, dy = 0; - if (horizontalScrollBar.isVisible() || contentComp->getX() < 0 || contentComp->getRight() > getWidth()) + if (horizontalScrollBar.isVisible() || canScrollHorizontally()) { if (mouseX < activeBorderThickness) dx = activeBorderThickness - mouseX; @@ -156,7 +148,7 @@ bool Viewport::autoScroll (const int mouseX, const int mouseY, const int activeB dx = jmin (dx, maximumSpeed, -contentComp->getX()); } - if (verticalScrollBar.isVisible() || contentComp->getY() < 0 || contentComp->getBottom() > getHeight()) + if (verticalScrollBar.isVisible() || canScrollVertically()) { if (mouseY < activeBorderThickness) dy = activeBorderThickness - mouseY; @@ -192,8 +184,7 @@ typedef AnimatedPosition Vie struct Viewport::DragToScrollListener : private MouseListener, private ViewportDragPosition::Listener { - DragToScrollListener (Viewport& v) - : viewport (v), numTouches (0), isDragging (false), isViewportDragBlocked (false) + DragToScrollListener (Viewport& v) : viewport (v) { viewport.contentHolder.addMouseListener (this, true); offsetX.addListener (this); @@ -270,10 +261,9 @@ struct Viewport::DragToScrollListener : private MouseListener, Viewport& viewport; ViewportDragPosition offsetX, offsetY; Point originalViewPos; - int numTouches; - bool isDragging; - - bool isViewportDragBlocked; + int numTouches = 0; + bool isDragging = false; + bool isViewportDragBlocked = false; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DragToScrollListener) }; @@ -317,7 +307,7 @@ void Viewport::resized() //============================================================================== void Viewport::updateVisibleArea() { - const int scrollbarWidth = getScrollBarThickness(); + auto scrollbarWidth = getScrollBarThickness(); const bool canShowAnyBars = getWidth() > scrollbarWidth && getHeight() > scrollbarWidth; const bool canShowHBar = showHScrollbar && canShowAnyBars; const bool canShowVBar = showVScrollbar && canShowAnyBars; @@ -358,7 +348,7 @@ void Viewport::updateVisibleArea() break; } - const Rectangle oldContentBounds (contentComp->getBounds()); + auto oldContentBounds = contentComp->getBounds(); contentHolder.setBounds (contentArea); // If the content has changed its size, that might affect our scrollbars, so go round again and re-caclulate.. @@ -370,7 +360,7 @@ void Viewport::updateVisibleArea() if (contentComp != nullptr) contentBounds = contentHolder.getLocalArea (contentComp, contentComp->getLocalBounds()); - Point visibleOrigin (-contentBounds.getPosition()); + auto visibleOrigin = -contentBounds.getPosition(); horizontalScrollBar.setBounds (0, contentArea.getHeight(), contentArea.getWidth(), scrollbarWidth); horizontalScrollBar.setRangeLimits (0.0, contentBounds.getWidth()); @@ -396,7 +386,7 @@ void Viewport::updateVisibleArea() if (contentComp != nullptr) { - const Point newContentCompPos (viewportPosToCompPos (visibleOrigin)); + auto newContentCompPos = viewportPosToCompPos (visibleOrigin); if (contentComp->getBounds().getPosition() != newContentCompPos) { @@ -517,10 +507,10 @@ bool Viewport::useMouseWheelMoveIfNeeded (const MouseEvent& e, const MouseWheelD if (canScrollHorz || canScrollVert) { - const int deltaX = rescaleMouseWheelDistance (wheel.deltaX, singleStepX); - const int deltaY = rescaleMouseWheelDistance (wheel.deltaY, singleStepY); + auto deltaX = rescaleMouseWheelDistance (wheel.deltaX, singleStepX); + auto deltaY = rescaleMouseWheelDistance (wheel.deltaY, singleStepY); - Point pos (getViewPosition()); + auto pos = getViewPosition(); if (deltaX != 0 && deltaY != 0 && canScrollHorz && canScrollVert) { diff --git a/modules/juce_gui_basics/layout/juce_Viewport.h b/modules/juce_gui_basics/layout/juce_Viewport.h index b31f74d0ca..3bcf5afa07 100644 --- a/modules/juce_gui_basics/layout/juce_Viewport.h +++ b/modules/juce_gui_basics/layout/juce_Viewport.h @@ -211,15 +211,12 @@ public: bool isHorizontalScrollBarShown() const noexcept { return showHScrollbar; } /** Changes the width of the scrollbars. - If this isn't specified, the default width from the LookAndFeel class will be used. - @see LookAndFeel::getDefaultScrollbarWidth */ void setScrollBarThickness (int thickness); /** Returns the thickness of the scrollbars. - @see setScrollBarThickness */ int getScrollBarThickness() const; @@ -239,6 +236,15 @@ public: */ ScrollBar* getHorizontalScrollBar() noexcept { return &horizontalScrollBar; } + /** True if there's any off-screen content that could be scrolled vertically, + or false if everything is currently visible. + */ + bool canScrollVertically() const noexcept; + + /** True if there's any off-screen content that could be scrolled horizontally, + or false if everything is currently visible. + */ + bool canScrollHorizontally() const noexcept; /** Enables or disables drag-to-scroll functionality in the viewport. */ void setScrollOnDragEnabled (bool shouldScrollOnDrag); @@ -271,15 +277,15 @@ public: private: //============================================================================== + ScrollBar verticalScrollBar { true }, horizontalScrollBar { false }; + Component contentHolder; WeakReference contentComp; Rectangle lastVisibleArea; - int scrollBarThickness; - int singleStepX, singleStepY; - bool showHScrollbar, showVScrollbar, deleteContent; - bool customScrollBarThickness; - bool allowScrollingWithoutScrollbarV, allowScrollingWithoutScrollbarH; - Component contentHolder; - ScrollBar verticalScrollBar, horizontalScrollBar; + int scrollBarThickness = 0; + int singleStepX = 16, singleStepY = 16; + bool showHScrollbar = true, showVScrollbar = true, deleteContent = true; + bool customScrollBarThickness = false; + bool allowScrollingWithoutScrollbarV = false, allowScrollingWithoutScrollbarH = false; struct DragToScrollListener; friend struct DragToScrollListener;