You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
latte-dock/declarativeimports/abilities/definition/ParabolicEffect.qml

83 lines
2.7 KiB
QML

/*
SPDX-FileCopyrightText: 2020 Michail Vourlakos <mvourlakos@gmail.com>
SPDX-License-Identifier: GPL-2.0-or-later
*/
import QtQuick 2.0
import org.kde.plasma.plasmoid 2.0
import org.kde.plasma.core 2.0 as PlasmaCore
import "./paraboliceffect" as ParabolicEffectTypes
Item {
property bool isEnabled: false
property bool restoreZoomIsBlocked: false
property int spread: 3
property ParabolicEffectTypes.Factor factor: ParabolicEffectTypes.Factor{
zoom: 1.6
maxZoom: 1.6
marginThicknessZoomInPercentage: 1.0
}
readonly property ParabolicEffectTypes.PrivateProperties _privates: ParabolicEffectTypes.PrivateProperties {
directRenderingEnabled: false
}
property Item currentParabolicItem: null
signal sglClearZoom();
signal sglUpdateLowerItemScale(int delegateIndex, variant newScales);
signal sglUpdateHigherItemScale(int delegateIndex, variant newScales);
readonly property int _spreadSteps: (spread - 1) / 2
function applyParabolicEffect(itemIndex, itemMousePosition, itemLength) {
var percentage = Math.max(0, Math.min(1, itemMousePosition / itemLength));
//! left scales
var leftScales = [];
for (var i=_spreadSteps; i>=1; --i) {
leftScales.push(scaleForItem(1-percentage, i, _spreadSteps));
}
leftScales.push(1); //! clearing
//! right scales
var rightScales = [];
for (var j=_spreadSteps; j>=1; --j) {
rightScales.push(scaleForItem(percentage, j, _spreadSteps));
}
rightScales.push(1); //! clearing
var reversed = Qt.application.layoutDirection === Qt.RightToLeft && (plasmoid.formFactor === PlasmaCore.Types.Horizontal);
if (reversed) {
var temp = leftScales;
leftScales = rightScales;
rightScales = temp;
}
sglUpdateHigherItemScale(itemIndex+1, rightScales);
sglUpdateLowerItemScale(itemIndex-1, leftScales);
return {leftScale:leftScales[0], rightScale:rightScales[0]};
}
function scaleForItem(mousePosPercentage, itemIndex, itemsCount) {
//! split x axis to different slices and find for the current slice its minimum and maximum x values
var xSliceLength = 1/itemsCount;
var minX = (itemIndex-1) * xSliceLength;
var maxX = itemIndex * xSliceLength;
//! use minimum and maximum values in order to adjust mousePorPercentage and provide the current x for that slice
var curX = minX + (maxX-minX) * mousePosPercentage;
return 1+scaleLinear(curX);
}
function scaleLinear(x) {
//! just a simple linear function y=a*x where [a = maxZoom - 1]
return (factor.zoom - 1) * x;
}
}