14#include <QTabletEvent>
18 , lastKnownPosition(0,0)
19 , accelerationAccumulator(0,0)
20 , scrollSubPixelAccumulator(0.0f)
21 , zoomThreshold(0.75f)
22 , wheelOverscrollSensitivity(1.0f)
23 , catchTeleportCorrection(false)
32 setOrientation(orientation);
41 float barPositionNormalized = (float)(
value() - minimum()) / (
float)(maximum() + pageStep() - minimum());
42 QPoint
barPosition = orientation() == Qt::Horizontal ?
43 QPoint(barPositionNormalized * width() * devicePixelRatio(), 0) :
44 QPoint(0, barPositionNormalized * height() * devicePixelRatio());
61 QRect windowRect = window()->geometry();
63 const int windowWidth = windowRect.width();
64 const int windowHeight = windowRect.height();
65 const int windowX = windowRect.x();
66 const int windowY = windowRect.y();
67 const bool xWrap =
true;
68 const bool yWrap =
true;
70 if (!windowRect.contains(mouseCoord)) {
71 int x = mouseCoord.x();
72 int y = mouseCoord.y();
74 if (x < windowX && xWrap ) {
75 x += (windowWidth - 2);
76 }
else if (x > (windowX + windowWidth) && xWrap ) {
77 x -= (windowWidth - 2);
80 if (y < windowY && yWrap) {
81 y += (windowHeight - 2);
82 }
else if (y > (windowY + windowHeight) && yWrap) {
83 y -= (windowHeight - 2);
97 const qreal sliderMovementPix = (orientation() == Qt::Horizontal) ? accel.x() * devicePixelRatio() : accel.y() * devicePixelRatio();
98 const qreal zoomMovementPix = (orientation() == Qt::Horizontal) ? -accel.y() : -accel.x();
99 const qreal documentLength = maximum() - minimum() + pageStep();
100 const qreal widgetLength = (orientation() == Qt::Horizontal) ? width() * devicePixelRatio() : height() * devicePixelRatio();
101 const qreal widgetThickness = (orientation() == Qt::Horizontal) ? height() * devicePixelRatio() : width() * devicePixelRatio();
103 const QVector2D perpendicularDirection = (orientation() == Qt::Horizontal) ? QVector2D(0, 1) : QVector2D(1, 0);
104 const float perpendicularity = QVector2D::dotProduct(perpendicularDirection.normalized(),
accelerationAccumulator.normalized());
107 zoom(qreal(zoomMovementPix) / qreal(widgetThickness * 2));
108 }
else if (sliderMovementPix != 0) {
109 const int currentPosition = sliderPosition();
124 if ( event->type() == QTabletEvent::TabletMove && isSliderDown() ) {
125 QPoint globalMouseCoord = mapToGlobal(event->pos());
137 if (event->type() == QTabletEvent::TabletPress) {
138 QPoint globalMouseCoord = mapToGlobal(event->pos());
142 }
else if(event->type() == QTabletEvent::TabletRelease) {
143 setSliderDown(
false);
146 QScrollBar::tabletEvent(event);
153 QScrollBar::mousePressEvent(event);
157 QPoint worldPosition = mapToGlobal(event->pos());
160 setCursor(Qt::BlankCursor);
166 QPoint globalMouseCoord = mapToGlobal(event->pos());
189 if (maximum() == minimum()) {
190 Q_EMIT sliderReleased();
192 const QPoint maximumCoordinates = mapToGlobal(QPoint(width() * devicePixelRatio(), height() * devicePixelRatio()));
193 const QPoint minimumCoordinates = mapToGlobal(QPoint(0,0));
195 QPoint cursorPosition = QPoint(
196 qMax(minimumCoordinates.x(), qMin(maximumCoordinates.x(), desiredCoordinates.x())),
197 qMax(minimumCoordinates.y(), qMin(maximumCoordinates.y(), desiredCoordinates.y()))
200 setCursor(Qt::ArrowCursor);
201 QScrollBar::mouseReleaseEvent(event);
205 const int delta = (
event->angleDelta().y() / 8) * singleStep() * -1;
206 const int currentPosition = sliderPosition();
208 if (currentPosition + delta > maximum() || currentPosition + delta < minimum()){
212 QScrollBar::wheelEvent(event);
float value(const T *src, size_t ch)
bool scrollbarZoomEnabled(bool defaultValue=false) const
T kisGrowRect(const T &rect, U offset)