63 {
64 KConfigGroup config = KSharedConfig::openConfig()->group("");
65 int sensitivity = config.readEntry("KineticScrollingSensitivity", 75);
66 bool enabled = config.readEntry("KineticScrollingEnabled", true);
67 bool hideScrollBars = config.readEntry("KineticScrollingHideScrollbar", false);
68 float resistanceCoefficient = config.readEntry("KineticScrollingResistanceCoefficient", 10.0f);
69 float dragVelocitySmoothFactor = config.readEntry("KineticScrollingDragVelocitySmoothingFactor", 1.0f);
70 float minimumVelocity = config.readEntry("KineticScrollingMinimumVelocity", 0.0f);
71 float axisLockThresh = config.readEntry("KineticScrollingAxisLockThreshold", 1.0f);
72 float maximumClickThroughVelocity = config.readEntry("KineticScrollingMaxClickThroughVelocity", 0.0f);
73 float flickAccelerationFactor = config.readEntry("KineticScrollingFlickAccelerationFactor", 1.5f);
74 float overshootDragResistanceFactor = config.readEntry("KineticScrollingOvershotDragResistanceFactor", 0.1f);
75 float overshootDragDistanceFactor = config.readEntry("KineticScrollingOvershootDragDistanceFactor", 0.3f);
76 float overshootScrollDistanceFactor = config.readEntry("KineticScrollingOvershootScrollDistanceFactor", 0.1f);
77 float overshootScrollTime = config.readEntry("KineticScrollingOvershootScrollTime", 0.4f);
79
80 if (enabled && scrollArea) {
81 if (hideScrollBars) {
82 scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarPolicy::ScrollBarAlwaysOff);
83 scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarPolicy::ScrollBarAlwaysOff);
84 } else if (gestureType != QScroller::TouchGesture) {
85 auto *filter = new KisKineticScrollerEventFilter(gestureType, scrollArea);
86 scrollArea->horizontalScrollBar()->installEventFilter(filter);
87 scrollArea->verticalScrollBar()->installEventFilter(filter);
88 }
89
90 QAbstractItemView *itemView = qobject_cast<QAbstractItemView *>(scrollArea);
91 if (itemView) {
92 itemView->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);
93 }
94
95 QScroller *scroller = QScroller::scroller(scrollArea);
96 QScroller::grabGesture(scrollArea, gestureType);
97
98 QScrollerProperties properties;
99
100
101
102
103
104 const float mm = 0.001f;
105 const float resistance = 1.0f - (sensitivity / 100.0f);
106 float mousePressEventDelay = config.readEntry("KineticScrollingMousePressDelay", 1.0f - 0.75f * resistance);
107
108
109
110#ifdef Q_OS_ANDROID
111 int maxDelayMs =
112 QAndroidJniObject::callStaticMethod<jint>("org/krita/android/MainActivity", "getLongPressTimeout", "()I");
113#else
114 int maxDelayMs = qApp->styleHints()->mousePressAndHoldInterval();
115#endif
116 float maxDelay = float(maxDelayMs) / 1000.0f;
117 if (mousePressEventDelay > maxDelay) {
118 mousePressEventDelay = maxDelay;
119 }
120
121 properties.setScrollMetric(QScrollerProperties::DragStartDistance, resistance * resistanceCoefficient * mm);
122 properties.setScrollMetric(QScrollerProperties::DragVelocitySmoothingFactor, dragVelocitySmoothFactor);
123 properties.setScrollMetric(QScrollerProperties::MinimumVelocity, minimumVelocity);
124 properties.setScrollMetric(QScrollerProperties::AxisLockThreshold, axisLockThresh);
125 properties.setScrollMetric(QScrollerProperties::MaximumClickThroughVelocity, maximumClickThroughVelocity);
126 properties.setScrollMetric(QScrollerProperties::MousePressEventDelay, mousePressEventDelay);
127 properties.setScrollMetric(QScrollerProperties::AcceleratingFlickSpeedupFactor, flickAccelerationFactor);
128
129 properties.setScrollMetric(QScrollerProperties::VerticalOvershootPolicy, QScrollerProperties::OvershootAlwaysOn);
130 properties.setScrollMetric(QScrollerProperties::OvershootDragResistanceFactor, overshootDragResistanceFactor);
131 properties.setScrollMetric(QScrollerProperties::OvershootDragDistanceFactor, overshootDragDistanceFactor);
132 properties.setScrollMetric(QScrollerProperties::OvershootScrollDistanceFactor, overshootScrollDistanceFactor);
133 properties.setScrollMetric(QScrollerProperties::OvershootScrollTime, overshootScrollTime);
134
135 scroller->setScrollerProperties(properties);
136
137 return scroller;
138 }
139
140 return nullptr;
141}