fix: normalize zoom slider to linear scale

This commit is contained in:
2026-09-30 14:26:59 +02:00
parent 4ebb4ce859
commit d76aaf093b
+13 -5
View File
@@ -13,13 +13,23 @@ import qs.Services
Item {
id: wrapper
readonly property var currentScreen: screens.length > selectedScreenIndex ? screens[selectedScreenIndex] : null
readonly property real maxZoom: 5.0
property int buttonRowHeight: Tokens.padding.large * 3
property bool changesMade: false
readonly property var currentScreen: screens.length > selectedScreenIndex ? screens[selectedScreenIndex] : null
property var screens: []
property int selectedScreenIndex: 0
property bool shouldBeActive: true
function zoomFromSlider(t: real): real {
return 1 / (1 - t * (1 - 1 / maxZoom));
}
function sliderFromZoom(zoom: real): real {
return (1 - 1 / zoom) / (1 - 1 / maxZoom);
}
function applyCrop(): void {
if (!cropRectLoader.item || !currentScreen)
return;
@@ -144,14 +154,12 @@ Item {
Layout.leftMargin: Tokens.padding.small
Layout.preferredHeight: Tokens.padding.medium * 3
Layout.rightMargin: Tokens.padding.small
from: 1.0
implicitHeight: Tokens.padding.small * 3
insetIcon: "crop"
to: 5.0
value: cropRectLoader.item ? cropRectLoader.item.zoom : 1.0
value: cropRectLoader.item ? wrapper.sliderFromZoom(cropRectLoader.item.zoom) : 0
onInteraction: value => {
wrapper.zoomClipRect(1 + (value * 4));
wrapper.zoomClipRect(wrapper.zoomFromSlider(value));
}
onPosChanged: wrapper.changesMade = true