diff --git a/components/containers/StyledFlickable.qml b/components/containers/StyledFlickable.qml index b792e583..5411c4e1 100644 --- a/components/containers/StyledFlickable.qml +++ b/components/containers/StyledFlickable.qml @@ -4,11 +4,28 @@ import qs.components Flickable { id: root + property bool doneFakeFlick + maximumFlickVelocity: 3000 rebound: Transition { + onRunningChanged: { + if (!running && !root.doneFakeFlick) { + root.doneFakeFlick = true; + root.flick(1, 1); + root.flick(-1, -1); + Qt.callLater(() => root.cancelFlick()); + } + } + Anim { properties: "x,y" } } + + Timer { + running: root.doneFakeFlick + interval: 10 + onTriggered: root.doneFakeFlick = false + } } diff --git a/components/containers/StyledListView.qml b/components/containers/StyledListView.qml index 8b5a4401..484421e5 100644 --- a/components/containers/StyledListView.qml +++ b/components/containers/StyledListView.qml @@ -4,11 +4,28 @@ import qs.components ListView { id: root + property bool doneFakeFlick + maximumFlickVelocity: 3000 rebound: Transition { + onRunningChanged: { + if (!running && !root.doneFakeFlick) { + root.doneFakeFlick = true; + root.flick(1, 1); + root.flick(-1, -1); + Qt.callLater(() => root.cancelFlick()); + } + } + Anim { properties: "x,y" } } + + Timer { + running: root.doneFakeFlick + interval: 10 + onTriggered: root.doneFakeFlick = false + } } diff --git a/modules/nexus/navpane/NavLocations.qml b/modules/nexus/navpane/NavLocations.qml index 605b4ca4..83bdabb1 100644 --- a/modules/nexus/navpane/NavLocations.qml +++ b/modules/nexus/navpane/NavLocations.qml @@ -14,12 +14,23 @@ StyledFlickable { required property NexusState nState - property real topFadeOpacity: visibleArea.yPosition > 0 ? 0 : 1 - property real bottomFadeOpacity: visibleArea.yPosition + visibleArea.heightRatio < 1 ? 0 : 1 + property real topFadeOpacity: fadeShouldBeActive(true) ? 0 : 1 + property real bottomFadeOpacity: fadeShouldBeActive(false) ? 0 : 1 + + function fadeShouldBeActive(isStart: bool): bool { + // When content is smaller than flickable size, hide fade when rebound starts + if (contentHeight + topMargin + bottomMargin < height && rebound.running && ((isStart ? verticalOvershoot > 0 : verticalOvershoot < 0))) + return false; + + if (isStart) + return visibleArea.yPosition > 0; + return visibleArea.yPosition + visibleArea.heightRatio < 1; + } topMargin: Tokens.padding.large bottomMargin: Tokens.padding.large contentHeight: content.implicitHeight + flickableDirection: Flickable.VerticalFlick layer.enabled: true layer.effect: Mask {