bool PlatformScrollbar::handleMouseMoveEvent(const PlatformMouseEvent& evt) { const QPoint pos = convertFromContainingWindow(evt.pos()); //qDebug() << "PlatformScrollbar::handleMouseMoveEvent" << m_opt.rect << pos << evt.pos(); m_opt.state |= QStyle::State_MouseOver; const QPoint topLeft = m_opt.rect.topLeft(); m_opt.rect.moveTo(QPoint(0, 0)); QStyle::SubControl sc = QApplication::style()->hitTestComplexControl(QStyle::CC_ScrollBar, &m_opt, pos, 0); m_opt.rect.moveTo(topLeft); if (m_pressedPart == QStyle::SC_ScrollBarSlider) { // Drag the thumb. int thumbPos = thumbPosition(); int thumbLen = thumbLength(); int trackLen = trackLength(); int maxPos = trackLen - thumbLen; int delta = 0; if (m_orientation == HorizontalScrollbar) delta = pos.x() - m_pressedPos; else delta = pos.y() - m_pressedPos; if (delta > 0) // The mouse moved down/right. delta = min(maxPos - thumbPos, delta); else if (delta < 0) // The mouse moved up/left. delta = max(-thumbPos, delta); if (delta != 0) { setValue((int)((float)(thumbPos + delta) * (m_totalSize - m_visibleSize) / (trackLen - thumbLen))); m_pressedPos += thumbPosition() - thumbPos; } return true; } if (m_pressedPart != QStyle::SC_None) m_pressedPos = m_orientation == HorizontalScrollbar ? pos.x() : pos.y(); if (sc != m_hoveredPart) { if (m_pressedPart != QStyle::SC_None) { if (sc == m_pressedPart) { // The mouse is moving back over the pressed part. We // need to start up the timer action again. startTimerIfNeeded(cNormalTimerDelay); invalidate(); } else if (m_hoveredPart == m_pressedPart) { // The mouse is leaving the pressed part. Kill our timer // if needed. stopTimerIfNeeded(); invalidate(); } } else { invalidate(); } m_hoveredPart = sc; } return true; }
int PlatformScrollbar::thumbPosition() const { if (isEnabled()) return (int)((float)m_currentPos * (trackLength() - thumbLength()) / (m_totalSize - m_visibleSize)); return 0; }
void ScrollbarThemeComposite::splitTrack(Scrollbar* scrollbar, const IntRect& unconstrainedTrackRect, IntRect& beforeThumbRect, IntRect& thumbRect, IntRect& afterThumbRect) { // This function won't even get called unless we're big enough to have some combination of these three rects where at least // one of them is non-empty. IntRect trackRect = constrainTrackRectToTrackPieces(scrollbar, unconstrainedTrackRect); int thickness = scrollbar->orientation() == HorizontalScrollbar ? scrollbar->height() : scrollbar->width(); int thumbPos = thumbPosition(scrollbar); if (scrollbar->orientation() == HorizontalScrollbar) { thumbRect = IntRect(trackRect.x() + thumbPos, trackRect.y() + (trackRect.height() - thickness) / 2, thumbLength(scrollbar), thickness); beforeThumbRect = IntRect(trackRect.x(), trackRect.y(), thumbPos + thumbRect.width() / 2, trackRect.height()); afterThumbRect = IntRect(trackRect.x() + beforeThumbRect.width(), trackRect.y(), trackRect.right() - beforeThumbRect.right(), trackRect.height()); } else { thumbRect = IntRect(trackRect.x() + (trackRect.width() - thickness) / 2, trackRect.y() + thumbPos, thickness, thumbLength(scrollbar)); beforeThumbRect = IntRect(trackRect.x(), trackRect.y(), trackRect.width(), thumbPos + thumbRect.height() / 2); afterThumbRect = IntRect(trackRect.x(), trackRect.y() + beforeThumbRect.height(), trackRect.width(), trackRect.bottom() - beforeThumbRect.bottom()); } }
int ScrollbarThemeComposite::thumbPosition(Scrollbar* scrollbar) { if (scrollbar->enabled()) return scrollbar->currentPos() * (trackLength(scrollbar) - thumbLength(scrollbar)) / scrollbar->maximum(); return 0; }
bool ScrollbarThemeChromium::hasThumb(Scrollbar* scrollbar) { // This method is just called as a paint-time optimization to see if // painting the thumb can be skipped. We don't have to be exact here. return thumbLength(scrollbar) > 0; }
bool ScrollbarThemeHaiku::hasThumb(Scrollbar* scrollbar) { return scrollbar->enabled() && thumbLength(scrollbar) > 0; }
int ScrollbarTheme::thumbPosition(ScrollbarThemeClient* scrollbar) { if (scrollbar->enabled()) { float size = usedTotalSize(scrollbar) - scrollbar->visibleSize(); // Avoid doing a floating point divide by zero and return 1 when usedTotalSize == visibleSize. if (!size) return 1; float pos = std::max(0.0f, scrollbar->currentPos()) * (trackLength(scrollbar) - thumbLength(scrollbar)) / size; return (pos < 1 && pos > 0) ? 1 : pos; } return 0; }
bool ScrollbarThemeBal::hasThumb(Scrollbar* scrollbar) { return thumbLength(scrollbar) > 0; }
IntRect ScrollbarThemeGtk::thumbRect(Scrollbar* scrollbar, const IntRect& unconstrainedTrackRect) { IntRect trackRect = constrainTrackRectToTrackPieces(scrollbar, unconstrainedTrackRect); int thumbPos = thumbPosition(scrollbar); if (scrollbar->orientation() == HorizontalScrollbar) return IntRect(trackRect.x() + thumbPos, trackRect.y() + (trackRect.height() - m_thumbFatness) / 2, thumbLength(scrollbar), m_thumbFatness); // VerticalScrollbar return IntRect(trackRect.x() + (trackRect.width() - m_thumbFatness) / 2, trackRect.y() + thumbPos, m_thumbFatness, thumbLength(scrollbar)); }
bool ScrollbarThemeOpus::hasThumb(ScrollbarThemeClient* scrollbar) { return thumbLength(scrollbar) > 0; }
int ScrollbarThemeQt::thumbPosition(Scrollbar* scrollbar) { if (scrollbar->enabled()) return (int)((float)scrollbar->currentPos() * (trackLength(scrollbar) - thumbLength(scrollbar)) / scrollbar->maximum()); return 0; }