mirror of
https://github.com/end-4/dots-hyprland.git
synced 2026-06-05 23:09:26 -05:00
54 lines
2.1 KiB
QML
54 lines
2.1 KiB
QML
import QtQuick
|
|
import QtQuick.Controls
|
|
import qs.modules.common
|
|
|
|
Flickable {
|
|
id: root
|
|
maximumFlickVelocity: 3500
|
|
boundsBehavior: Flickable.DragOverBounds
|
|
|
|
property real touchpadScrollFactor: Config?.options.interactions.scrolling.touchpadScrollFactor ?? 100
|
|
property real mouseScrollFactor: Config?.options.interactions.scrolling.mouseScrollFactor ?? 50
|
|
property real mouseScrollDeltaThreshold: Config?.options.interactions.scrolling.mouseScrollDeltaThreshold ?? 120
|
|
// Accumulated scroll destination so wheel deltas stack while animating
|
|
property real scrollTargetY: 0
|
|
|
|
ScrollBar.vertical: StyledScrollBar {}
|
|
|
|
MouseArea {
|
|
visible: Config?.options.interactions.scrolling.fasterTouchpadScroll
|
|
anchors.fill: parent
|
|
acceptedButtons: Qt.NoButton
|
|
onWheel: function(wheelEvent) {
|
|
const delta = wheelEvent.angleDelta.y / root.mouseScrollDeltaThreshold;
|
|
// The angleDelta.y of a touchpad is usually small and continuous,
|
|
// while that of a mouse wheel is typically in multiples of ±120.
|
|
var scrollFactor = Math.abs(wheelEvent.angleDelta.y) >= root.mouseScrollDeltaThreshold ? root.mouseScrollFactor : root.touchpadScrollFactor;
|
|
|
|
const maxY = Math.max(0, root.contentHeight - root.height);
|
|
const base = scrollAnim.running ? root.scrollTargetY : root.contentY;
|
|
var targetY = Math.max(0, Math.min(base - delta * scrollFactor, maxY));
|
|
|
|
root.scrollTargetY = targetY;
|
|
root.contentY = targetY;
|
|
wheelEvent.accepted = true;
|
|
}
|
|
}
|
|
|
|
Behavior on contentY {
|
|
NumberAnimation {
|
|
id: scrollAnim
|
|
duration: Appearance.animation.scroll.duration
|
|
easing.type: Appearance.animation.scroll.type
|
|
easing.bezierCurve: Appearance.animation.scroll.bezierCurve
|
|
}
|
|
}
|
|
|
|
// Keep target synced when not animating (e.g., drag/flick or programmatic changes)
|
|
onContentYChanged: {
|
|
if (!scrollAnim.running) {
|
|
root.scrollTargetY = root.contentY;
|
|
}
|
|
}
|
|
}
|