summaryrefslogtreecommitdiffstats
path: root/framework/qml
diff options
context:
space:
mode:
Diffstat (limited to 'framework/qml')
-rw-r--r--framework/qml/ListView.qml29
-rw-r--r--framework/qml/ScrollHelper.qml96
2 files changed, 99 insertions, 26 deletions
diff --git a/framework/qml/ListView.qml b/framework/qml/ListView.qml
index f137d03e..161fe48e 100644
--- a/framework/qml/ListView.qml
+++ b/framework/qml/ListView.qml
@@ -19,37 +19,14 @@
19 19
20import QtQuick 2.7 20import QtQuick 2.7
21import QtQuick.Controls 2 21import QtQuick.Controls 2
22import org.kube.framework 1.0 as Kube
22 23
23ListView { 24ListView {
24 id: root 25 id: root
25 property var focusProxy: root
26 26
27 /* 27 Kube.ScrollHelper {
28 * The MouseArea + interactive: false + maximumFlickVelocity are required 28 flickable: root
29 * to fix scrolling for desktop systems where we don't want flicking behaviour.
30 *
31 * See also:
32 * ScrollView.qml in qtquickcontrols
33 * qquickwheelarea.cpp in qtquickcontrols
34 */
35 MouseArea {
36 anchors.fill: root 29 anchors.fill: root
37 propagateComposedEvents: true
38
39 onWheel: {
40 //Some trackpads (mine) emit 0 events in between that we can safely ignore.
41 if (wheel.pixelDelta.y) {
42 //120 is apparently the factor used in windows(https://chromium.googlesource.com/chromium/src/+/70763eb93a32555910a3b4269aeec51252ab9ec6/ui/events/event.cc)
43 listView.flick(0, wheel.pixelDelta.y * 120)
44 } else if (wheel.angleDelta.y) {
45 //Arbitrary but this seems to work for me...
46 listView.flick(0, wheel.angleDelta.y * 10)
47 }
48 }
49 } 30 }
50 interactive: false
51 maximumFlickVelocity: 100000
52
53 boundsBehavior: Flickable.StopAtBounds
54} 31}
55 32
diff --git a/framework/qml/ScrollHelper.qml b/framework/qml/ScrollHelper.qml
new file mode 100644
index 00000000..b2f91201
--- /dev/null
+++ b/framework/qml/ScrollHelper.qml
@@ -0,0 +1,96 @@
1/*
2 * Copyright (C) 2016 Michael Bohlender, <michael.bohlender@kdemail.net>
3 * Copyright (C) 2017 Christian Mollekopf, <mollekopf@kolabsystems.com>
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 */
19
20import QtQuick 2.7
21import QtQuick.Controls 2
22import org.kube.framework 1.0 as Kube
23
24/*
25* The MouseArea + interactive: false + maximumFlickVelocity are required
26* to fix scrolling for desktop systems where we don't want flicking behaviour.
27*
28* See also:
29* ScrollView.qml in qtquickcontrols
30* qquickwheelarea.cpp in qtquickcontrols
31*/
32MouseArea {
33 id: root
34 propagateComposedEvents: true
35
36 property Flickable flickable
37
38 //Place the mouse area under the flickable
39 z: -1
40 onFlickableChanged: {
41 flickable.interactive = false
42 flickable.maximumFlickVelocity = 100000
43 flickable.boundsBehavior = Flickable.StopAtBounds
44 root.parent = flickable
45 }
46
47 function calculateNewPosition(flickableItem, wheel) {
48 //Nothing to scroll
49 if (flickableItem.contentHeight < flickableItem.height) {
50 return flickableItem.contentY;
51 }
52 //Ignore 0 events (happens at least with Christians trackpad)
53 if (wheel.pixelDelta.y == 0 && wheel.angleDelta.y == 0) {
54 return flickableItem.contentY;
55 }
56 //pixelDelta seems to be the same as angleDelta/8
57 var pixelDelta = wheel.pixelDelta.y != 0 ? wheel.pixelDelta.y : wheel.angleDelta.y / 8
58
59 var y = pixelDelta
60 if (!y) {
61 return flickableItem.contentY;
62 }
63
64 var minYExtent = flickableItem.originY + flickableItem.topMargin;
65 var maxYExtent = (flickableItem.contentHeight + flickableItem.bottomMargin + flickableItem.originY) - flickableItem.height;
66
67 if (typeof(flickableItem.headerItem) !== "undefined" && flickableItem.headerItem) {
68 minYExtent += flickableItem.headerItem.height
69 }
70
71 //Avoid overscrolling
72 return Math.max(minYExtent, Math.min(maxYExtent, flickableItem.contentY - y));
73 }
74
75 onWheel: {
76 var newPos = calculateNewPosition(flickable, wheel);
77 // console.warn("Delta: ", wheel.pixelDelta.y);
78 // console.warn("Old position: ", flickable.contentY);
79 // console.warn("New position: ", newPos);
80
81 // Show the scrollbars
82 flickable.flick(0, 0);
83 flickable.contentY = newPos;
84 cancelFlickStateTimer.start()
85 }
86
87
88 Timer {
89 id: cancelFlickStateTimer
90 //How long the scrollbar will remain visible
91 interval: 500
92 // Hide the scrollbars
93 onTriggered: listView.cancelFlick();
94 }
95}
96