Warning, /pim/kube/framework/qml/ScrollHelper.qml is written in an unsupported language. File is not indexed.
0001 /* 0002 * Copyright (C) 2016 Michael Bohlender, <michael.bohlender@kdemail.net> 0003 * Copyright (C) 2017 Christian Mollekopf, <mollekopf@kolabsystems.com> 0004 * 0005 * This program is free software; you can redistribute it and/or modify 0006 * it under the terms of the GNU General Public License as published by 0007 * the Free Software Foundation; either version 2 of the License, or 0008 * (at your option) any later version. 0009 * 0010 * This program is distributed in the hope that it will be useful, 0011 * but WITHOUT ANY WARRANTY; without even the implied warranty of 0012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 0013 * GNU General Public License for more details. 0014 * 0015 * You should have received a copy of the GNU General Public License along 0016 * with this program; if not, write to the Free Software Foundation, Inc., 0017 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 0018 */ 0019 0020 import QtQuick 2.7 0021 import QtQuick.Controls 2 0022 0023 /* 0024 * The MouseArea + interactive: false + maximumFlickVelocity are required 0025 * to fix scrolling for desktop systems where we don't want flicking behaviour. 0026 * 0027 * See also: 0028 * ScrollView.qml in qtquickcontrols 0029 * qquickwheelarea.cpp in qtquickcontrols 0030 */ 0031 MouseArea { 0032 id: root 0033 propagateComposedEvents: true 0034 0035 property Flickable flickable 0036 0037 //Place the mouse area under the flickable 0038 z: -1 0039 onFlickableChanged: { 0040 flickable.interactive = false 0041 flickable.maximumFlickVelocity = 100000 0042 flickable.boundsBehavior = Flickable.StopAtBounds 0043 root.parent = flickable 0044 } 0045 0046 function scrollByPixelDelta(flickableItem, pixelDelta) { 0047 if (!pixelDelta) { 0048 return flickableItem.contentY; 0049 } 0050 0051 var minYExtent = flickableItem.originY + flickableItem.topMargin; 0052 var maxYExtent = (flickableItem.contentHeight + flickableItem.bottomMargin + flickableItem.originY) - flickableItem.height; 0053 0054 if (typeof(flickableItem.headerItem) !== "undefined" && flickableItem.headerItem) { 0055 minYExtent += flickableItem.headerItem.height 0056 } 0057 0058 //Avoid overscrolling 0059 return Math.max(minYExtent, Math.min(maxYExtent, flickableItem.contentY - pixelDelta)); 0060 } 0061 0062 function calculateNewPosition(flickableItem, wheel) { 0063 //Nothing to scroll 0064 if (flickableItem.contentHeight < flickableItem.height) { 0065 return flickableItem.contentY; 0066 } 0067 //Ignore 0 events (happens at least with Christians trackpad) 0068 if (wheel.pixelDelta.y == 0 && wheel.angleDelta.y == 0) { 0069 return flickableItem.contentY; 0070 } 0071 //pixelDelta seems to be the same as angleDelta/8 0072 var pixelDelta = 0 0073 //The pixelDelta is a smaller number if both are provided, so pixelDelta can be 0 while angleDelta is still something. So we check the angleDelta 0074 if (wheel.angleDelta.y) { 0075 var wheelScrollLines = 3 //Default value of QApplication wheelScrollLines property 0076 var pixelPerLine = 20 //Default value in Qt, originally comes from QTextEdit 0077 var ticks = (wheel.angleDelta.y / 8) / 15.0 //Divide by 8 gives us pixels typically come in 15pixel steps. 0078 pixelDelta = ticks * pixelPerLine * wheelScrollLines 0079 } else { 0080 pixelDelta = wheel.pixelDelta.y 0081 } 0082 0083 return scrollByPixelDelta(flickableItem, pixelDelta); 0084 } 0085 0086 function scrollDown() { 0087 flickable.flick(0, 0); 0088 flickable.contentY = scrollByPixelDelta(flickable, -60); //3 lines * 20 pixels 0089 } 0090 0091 function scrollUp() { 0092 flickable.flick(0, 0); 0093 flickable.contentY = scrollByPixelDelta(flickable, 60); //3 lines * 20 pixels 0094 } 0095 0096 onWheel: { 0097 var newPos = calculateNewPosition(flickable, wheel); 0098 // console.warn("Delta: ", wheel.pixelDelta.y); 0099 // console.warn("Old position: ", flickable.contentY); 0100 // console.warn("New position: ", newPos); 0101 0102 // Show the scrollbars 0103 flickable.flick(0, 0); 0104 //Workaround because we seem to break this but rely on it in ConversationListView 0105 flickable.movementStarted(); 0106 flickable.contentY = newPos; 0107 cancelFlickStateTimer.start() 0108 } 0109 0110 0111 Timer { 0112 id: cancelFlickStateTimer 0113 //How long the scrollbar will remain visible 0114 interval: 500 0115 // Hide the scrollbars 0116 onTriggered: flickable.cancelFlick(); 0117 } 0118 } 0119