/* SPDX-FileCopyrightText: 2020 Michail Vourlakos 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; } }