summaryrefslogtreecommitdiffstats
path: root/src/controls
diff options
context:
space:
mode:
Diffstat (limited to 'src/controls')
-rw-r--r--src/controls/Private/ScrollViewHelper.qml48
-rw-r--r--src/controls/ScrollView.qml27
2 files changed, 35 insertions, 40 deletions
diff --git a/src/controls/Private/ScrollViewHelper.qml b/src/controls/Private/ScrollViewHelper.qml
index e63d33ff2..d34aa555b 100644
--- a/src/controls/Private/ScrollViewHelper.qml
+++ b/src/controls/Private/ScrollViewHelper.qml
@@ -44,7 +44,7 @@ import QtQuick.Controls.Private 1.0
\inqmlmodule QtQuick.Controls.Private
*/
Item {
- id: wheelarea
+ id: scrollHelper
property alias horizontalScrollBar: hscrollbar
property alias verticalScrollBar: vscrollbar
@@ -53,8 +53,6 @@ Item {
property int availableWidth
property int contentHeight
property int contentWidth
- property real originX
- property real originY
property bool active
property int horizontalScrollBarPolicy: Qt.ScrollBarAsNeeded
property int verticalScrollBarPolicy: Qt.ScrollBarAsNeeded
@@ -72,12 +70,10 @@ Item {
function doLayout() {
if (!recursionGuard) {
recursionGuard = true
- wheelarea.availableWidth = viewport.width
- wheelarea.availableHeight = viewport.height
- wheelarea.contentWidth = flickableItem !== null ? flickableItem.contentWidth : 0
- wheelarea.contentHeight = flickableItem !== null ? flickableItem.contentHeight : 0
- wheelarea.originX = flickableItem !== null ? flickableItem.originX : 0
- wheelarea.originY = flickableItem !== null ? flickableItem.originY : 0
+ scrollHelper.availableWidth = viewport.width
+ scrollHelper.availableHeight = viewport.height
+ scrollHelper.contentWidth = flickableItem !== null ? flickableItem.contentWidth : 0
+ scrollHelper.contentHeight = flickableItem !== null ? flickableItem.contentHeight : 0
recursionGuard = false
}
}
@@ -92,12 +88,6 @@ Item {
target: flickableItem
onContentWidthChanged: doLayout()
onContentHeightChanged: doLayout()
- onOriginXChanged: doLayout()
- onOriginYChanged: doLayout()
- }
-
- Connections {
- target: flickableItem
onContentXChanged: {
hscrollbar.flash()
vscrollbar.flash()
@@ -123,15 +113,17 @@ Item {
ScrollBar {
id: hscrollbar
+ readonly property int scrollAmount: contentWidth - availableWidth
+ readonly property bool scrollable: scrollAmount > 0
isTransient: !!__panel && !!__panel.isTransient
active: !!__panel && (__panel.sunken || __panel.activeControl !== "none")
enabled: !isTransient || __panel.visible
orientation: Qt.Horizontal
- visible: horizontalScrollBarPolicy == Qt.ScrollBarAsNeeded ? (contentWidth > availableWidth) : horizontalScrollBarPolicy == Qt.ScrollBarAlwaysOn
+ visible: horizontalScrollBarPolicy == Qt.ScrollBarAsNeeded ? scrollable : horizontalScrollBarPolicy == Qt.ScrollBarAlwaysOn
height: visible ? implicitHeight : 0
z: 1
- maximumValue: contentWidth > availableWidth ? originX + contentWidth - availableWidth : 0
- minimumValue: originX
+ maximumValue: scrollable ? scrollAmount : 0
+ minimumValue: 0
anchors.bottom: parent.bottom
anchors.left: parent.left
anchors.right: cornerFill.left
@@ -139,20 +131,20 @@ Item {
anchors.bottomMargin: bottomMargin
onValueChanged: {
if (!blockUpdates) {
- flickableItem.contentX = value
+ flickableItem.contentX = value + flickableItem.originX
}
}
Binding {
target: hscrollbar.__panel
property: "raised"
- value: vscrollbar.active || wheelarea.active
+ value: vscrollbar.active || scrollHelper.active
when: hscrollbar.isTransient
}
Binding {
target: hscrollbar.__panel
property: "visible"
value: true
- when: !hscrollbar.isTransient || wheelarea.active
+ when: !hscrollbar.isTransient || scrollHelper.active
}
function flash() {
if (hscrollbar.isTransient) {
@@ -170,36 +162,38 @@ Item {
ScrollBar {
id: vscrollbar
+ readonly property int scrollAmount: contentHeight - availableHeight
+ readonly property bool scrollable: scrollAmount > 0
isTransient: !!__panel && !!__panel.isTransient
active: !!__panel && (__panel.sunken || __panel.activeControl !== "none")
enabled: !isTransient || __panel.visible
orientation: Qt.Vertical
- visible: verticalScrollBarPolicy == Qt.ScrollBarAsNeeded ? (contentHeight > availableHeight) : verticalScrollBarPolicy == Qt.ScrollBarAlwaysOn
+ visible: verticalScrollBarPolicy === Qt.ScrollBarAsNeeded ? scrollable : verticalScrollBarPolicy === Qt.ScrollBarAlwaysOn
width: visible ? implicitWidth : 0
z: 1
anchors.bottom: cornerFill.top
- maximumValue: contentHeight > availableHeight ? originY + contentHeight - availableHeight + __viewTopMargin : 0
- minimumValue: originY
+ maximumValue: scrollable ? scrollAmount + __viewTopMargin : 0
+ minimumValue: 0
anchors.right: parent.right
anchors.top: parent.top
anchors.topMargin: __scrollBarTopMargin + topMargin
anchors.rightMargin: rightMargin
onValueChanged: {
if (flickableItem && !blockUpdates && enabled) {
- flickableItem.contentY = value
+ flickableItem.contentY = value + flickableItem.originY
}
}
Binding {
target: vscrollbar.__panel
property: "raised"
- value: hscrollbar.active || wheelarea.active
+ value: hscrollbar.active || scrollHelper.active
when: vscrollbar.isTransient
}
Binding {
target: vscrollbar.__panel
property: "visible"
value: true
- when: !vscrollbar.isTransient || wheelarea.active
+ when: !vscrollbar.isTransient || scrollHelper.active
}
function flash() {
if (vscrollbar.isTransient) {
diff --git a/src/controls/ScrollView.qml b/src/controls/ScrollView.qml
index 74d5ee7dd..e6001b041 100644
--- a/src/controls/ScrollView.qml
+++ b/src/controls/ScrollView.qml
@@ -238,13 +238,13 @@ FocusScope {
onContentYChanged: {
scroller.blockUpdates = true
- scroller.verticalScrollBar.value = flickableItem.contentY
+ scroller.verticalScrollBar.value = flickableItem.contentY - flickableItem.originY
scroller.blockUpdates = false
}
onContentXChanged: {
scroller.blockUpdates = true
- scroller.horizontalScrollBar.value = flickableItem.contentX
+ scroller.horizontalScrollBar.value = flickableItem.contentX - flickableItem.originX
scroller.blockUpdates = false
}
@@ -274,11 +274,11 @@ FocusScope {
property bool horizontalRecursionGuard: false
property bool verticalRecursionGuard: false
- horizontalMinimumValue: flickableItem ? flickableItem.originX : 0
- horizontalMaximumValue: flickableItem ? flickableItem.originX + flickableItem.contentWidth - viewport.width : 0
+ horizontalMinimumValue: 0
+ horizontalMaximumValue: flickableItem ? flickableItem.contentWidth - viewport.width : 0
- verticalMinimumValue: flickableItem ? flickableItem.originY : 0
- verticalMaximumValue: flickableItem ? flickableItem.originY + flickableItem.contentHeight - viewport.height + __viewTopMargin : 0
+ verticalMinimumValue: 0
+ verticalMaximumValue: flickableItem ? flickableItem.contentHeight - viewport.height + __viewTopMargin : 0
// The default scroll speed for typical angle-based mouse wheels. The value
// comes originally from QTextEdit, which sets 20px steps by default, as well as
@@ -291,32 +291,33 @@ FocusScope {
onContentYChanged: {
wheelArea.verticalRecursionGuard = true
- wheelArea.verticalValue = flickableItem.contentY
+ wheelArea.verticalValue = flickableItem.contentY - flickableItem.originY
wheelArea.verticalRecursionGuard = false
}
onContentXChanged: {
wheelArea.horizontalRecursionGuard = true
- wheelArea.horizontalValue = flickableItem.contentX
+ wheelArea.horizontalValue = flickableItem.contentX - flickableItem.originX
wheelArea.horizontalRecursionGuard = false
}
}
onVerticalValueChanged: {
if (!verticalRecursionGuard) {
- if (flickableItem.contentY < flickThreshold && verticalDelta > speedThreshold) {
+ var effectiveContentY = flickableItem.contentY - flickableItem.originY
+ if (effectiveContentY < flickThreshold && verticalDelta > speedThreshold) {
flickableItem.flick(ignored, Math.min(maxFlick, acceleration * verticalDelta))
- } else if (flickableItem.contentY > flickableItem.contentHeight
- - flickThreshold - viewport.height && verticalDelta < -speedThreshold) {
+ } else if (effectiveContentY > flickableItem.contentHeight - flickThreshold - viewport.height
+ && verticalDelta < -speedThreshold) {
flickableItem.flick(ignored, Math.max(-maxFlick, acceleration * verticalDelta))
} else {
- flickableItem.contentY = verticalValue
+ flickableItem.contentY = verticalValue + flickableItem.originY
}
}
}
onHorizontalValueChanged: {
if (!horizontalRecursionGuard)
- flickableItem.contentX = horizontalValue
+ flickableItem.contentX = horizontalValue + flickableItem.originX
}
}