mirror of
https://invent.kde.org/marcoa/shift-shell.git
synced 2026-04-27 22:33:08 +00:00
Move from a C++ library + QML plugin to a QML plugin only for simplicity, since the homescreen switching architecture will be done from Plasma, and so use of the shell library only needs to be from QML.
72 lines
2.1 KiB
QML
72 lines
2.1 KiB
QML
/*
|
|
* SPDX-FileCopyrightText: 2013 Canonical Ltd. <legal@canonical.com>
|
|
* SPDX-FileCopyrightText: 2021 Devin Lin <devin@kde.org>
|
|
*
|
|
* SPDX-License-Identifier: GPL-3.0-only
|
|
*/
|
|
|
|
import QtQuick 2.15
|
|
|
|
QtObject {
|
|
id: root
|
|
|
|
property bool zeroVelocityCounts: false
|
|
|
|
property real velocity: 0
|
|
|
|
function changePosition(position) {
|
|
__pushDragEvent(position);
|
|
}
|
|
|
|
function startMeasure(position) {
|
|
__dragEvents = [];
|
|
__pushDragEvent(position);
|
|
}
|
|
|
|
//BEGIN internal
|
|
|
|
property var __dragEvents: []
|
|
property var __dateTime: new function() {
|
|
this.getCurrentTimeMs = function() {return new Date().getTime()}
|
|
}
|
|
|
|
function __updateSpeed() {
|
|
var totalSpeed = 0;
|
|
for (var i = 0; i < __dragEvents.length; i++) {
|
|
totalSpeed += __dragEvents[i][2];
|
|
}
|
|
|
|
if (zeroVelocityCounts || Math.abs(totalSpeed) > 0.001) {
|
|
velocity = totalSpeed / __dragEvents.length * 1000;
|
|
}
|
|
}
|
|
|
|
function __cullOldDragEvents(currentTime) {
|
|
// cull events older than 50 ms but always keep the latest 2 events
|
|
for (var numberOfCulledEvents = 0; numberOfCulledEvents < __dragEvents.length-2; numberOfCulledEvents++) {
|
|
// __dragEvents[numberOfCulledEvents][0] is the dragTime
|
|
if (currentTime - __dragEvents[numberOfCulledEvents][0] <= 50) break;
|
|
}
|
|
|
|
__dragEvents.splice(0, numberOfCulledEvents);
|
|
}
|
|
|
|
function __getEventSpeed(currentTime, position) {
|
|
if (__dragEvents.length != 0) {
|
|
var lastDrag = __dragEvents[__dragEvents.length-1];
|
|
var duration = Math.max(1, currentTime - lastDrag[0]);
|
|
return (position - lastDrag[1]) / duration;
|
|
} else {
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
function __pushDragEvent(position) {
|
|
let currentTime = __dateTime.getCurrentTimeMs();
|
|
__dragEvents.push([currentTime, position, __getEventSpeed(currentTime, position)]);
|
|
__cullOldDragEvents(currentTime);
|
|
__updateSpeed();
|
|
}
|
|
|
|
//END internal
|
|
}
|