void Scrollbar::startTimerIfNeeded(double delay) { // Don't do anything for the thumb. if (m_pressedPart == ThumbPart) return; // Handle the track. We halt track scrolling once the thumb is level // with us. if ((m_pressedPart == BackTrackPart || m_pressedPart == ForwardTrackPart) && thumbUnderMouse(this)) { setNeedsPaintInvalidation(); setHoveredPart(ThumbPart); return; } // We can't scroll if we've hit the beginning or end. ScrollDirectionPhysical dir = pressedPartScrollDirectionPhysical(); if (dir == ScrollUp || dir == ScrollLeft) { if (m_currentPos == 0) return; } else { if (m_currentPos == maximum()) return; } m_scrollTimer.startOneShot(delay, BLINK_FROM_HERE); }
void Scrollbar::autoscrollPressedPart(double delay) { // Don't do anything for the thumb or if nothing was pressed. if (m_pressedPart == ThumbPart || m_pressedPart == NoPart) return; // Handle the track. if ((m_pressedPart == BackTrackPart || m_pressedPart == ForwardTrackPart) && thumbUnderMouse(this)) { setNeedsPaintInvalidation(); setHoveredPart(ThumbPart); return; } // Handle the arrows and track. if (m_scrollableArea && m_scrollableArea->userScroll(pressedPartScrollDirectionPhysical(), pressedPartScrollGranularity()).didScroll) startTimerIfNeeded(delay); }
bool Scrollbar::gestureEvent(const PlatformGestureEvent& evt) { switch (evt.type()) { case PlatformEvent::GestureTapDown: setPressedPart(theme()->hitTest(this, evt.position())); m_pressedPos = orientation() == HorizontalScrollbar ? convertFromContainingWindow(evt.position()).x() : convertFromContainingWindow(evt.position()).y(); return true; case PlatformEvent::GestureTapDownCancel: case PlatformEvent::GestureScrollBegin: if (m_pressedPart != ThumbPart) return false; m_scrollPos = m_pressedPos; return true; case PlatformEvent::GestureScrollUpdate: if (m_pressedPart != ThumbPart) return false; m_scrollPos += orientation() == HorizontalScrollbar ? evt.deltaX() : evt.deltaY(); moveThumb(m_scrollPos, false); return true; case PlatformEvent::GestureScrollEnd: case PlatformEvent::GestureLongPress: case PlatformEvent::GestureFlingStart: m_scrollPos = 0; m_pressedPos = 0; setPressedPart(NoPart); return false; case PlatformEvent::GestureTap: { if (m_pressedPart != ThumbPart && m_pressedPart != NoPart && m_scrollableArea && m_scrollableArea->userScroll(pressedPartScrollDirectionPhysical(), pressedPartScrollGranularity()).didScroll) { return true; } m_scrollPos = 0; m_pressedPos = 0; setPressedPart(NoPart); return false; } default: // By default, we assume that gestures don't deselect the scrollbar. return true; } }
bool Scrollbar::gestureEvent(const PlatformGestureEvent& evt, bool* shouldUpdateCapture) { DCHECK(shouldUpdateCapture); switch (evt.type()) { case PlatformEvent::GestureTapDown: setPressedPart(theme().hitTest(*this, evt.position())); m_pressedPos = orientation() == HorizontalScrollbar ? convertFromRootFrame(evt.position()).x() : convertFromRootFrame(evt.position()).y(); *shouldUpdateCapture = true; return true; case PlatformEvent::GestureTapDownCancel: if (m_pressedPart != ThumbPart) return false; m_scrollPos = m_pressedPos; return true; case PlatformEvent::GestureScrollBegin: switch (evt.source()) { case PlatformGestureSourceTouchpad: // Update the state on GSB for touchpad since GestureTapDown // is not generated by that device. Touchscreen uses the tap down // gesture since the scrollbar enters a visual active state. *shouldUpdateCapture = true; setPressedPart(NoPart); m_pressedPos = 0; return true; case PlatformGestureSourceTouchscreen: if (m_pressedPart != ThumbPart) return false; m_scrollPos = m_pressedPos; return true; default: ASSERT_NOT_REACHED(); return true; } break; case PlatformEvent::GestureScrollUpdate: switch (evt.source()) { case PlatformGestureSourceTouchpad: { FloatSize delta(-evt.deltaX(), -evt.deltaY()); if (m_scrollableArea && m_scrollableArea->userScroll(evt.deltaUnits(), delta) .didScroll()) { return true; } return false; } case PlatformGestureSourceTouchscreen: if (m_pressedPart != ThumbPart) return false; m_scrollPos += orientation() == HorizontalScrollbar ? evt.deltaX() : evt.deltaY(); moveThumb(m_scrollPos, false); return true; default: ASSERT_NOT_REACHED(); return true; } break; case PlatformEvent::GestureScrollEnd: case PlatformEvent::GestureLongPress: case PlatformEvent::GestureFlingStart: m_scrollPos = 0; m_pressedPos = 0; setPressedPart(NoPart); return false; case PlatformEvent::GestureTap: { if (m_pressedPart != ThumbPart && m_pressedPart != NoPart && m_scrollableArea && m_scrollableArea ->userScroll( pressedPartScrollGranularity(), toScrollDelta(pressedPartScrollDirectionPhysical(), 1)) .didScroll()) { return true; } m_scrollPos = 0; m_pressedPos = 0; setPressedPart(NoPart); return false; } default: // By default, we assume that gestures don't deselect the scrollbar. return true; } }