You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
162 lines
5.8 KiB
162 lines
5.8 KiB
/* |
|
* SPDX-FileCopyrightText: 2016 Marco Martin <mart@kde.org> |
|
* |
|
* SPDX-License-Identifier: LGPL-2.0-or-later |
|
*/ |
|
import QtQuick 2.7 |
|
import QtQuick.Controls 2.0 |
|
import QtQml 2.15 |
|
import org.kde.kirigami 2.9 as Kirigami |
|
|
|
// taken from Kirigami |
|
MouseArea { |
|
id: root |
|
default property Item contentItem |
|
property Flickable flickableItem |
|
clip: true |
|
|
|
property int horizontalScrollBarPolicy: Qt.ScrollBarAlwaysOff |
|
property int verticalScrollBarPolicy: Qt.ScrollBarAsNeeded |
|
property int topPadding: 0 |
|
property int leftPadding: 0 |
|
property int bottomPadding: 0 |
|
property int rightPadding: 0 |
|
property bool canFlickWithMouse: false |
|
|
|
// Note: These are used because RefreshableScrollView overrides right and |
|
// bottom padding properties. |
|
property int rightSpacing: !Kirigami.Settings.hasTransientTouchInput && flickableItem && flickableItem.ScrollBar.vertical && flickableItem.ScrollBar.vertical.visible ? flickableItem.ScrollBar.vertical.width : 0 |
|
property int bottomSpacing: !Kirigami.Settings.hasTransientTouchInput && flickableItem && flickableItem.ScrollBar.horizontal && flickableItem.ScrollBar.horizontal.visible ? flickableItem.ScrollBar.horizontal.height : 0 |
|
|
|
Accessible.onScrollDownAction: flickableItem.Accessible.onScrollDownAction |
|
Accessible.onScrollUpAction: flickableItem.Accessible.onScrollUpAction |
|
|
|
Keys.onUpPressed: scroll(Kirigami.Units.gridUnit * 2) |
|
Keys.onDownPressed: scroll(-Kirigami.Units.gridUnit * 2) |
|
|
|
function scroll(y) { |
|
// Don't scroll if the view isn't scrollable! |
|
if (flickableItem.contentHeight < flickableItem.height + flickableItem.contentY) { |
|
return; |
|
} |
|
const minYExtent = flickableItem.topMargin - flickableItem.originY; |
|
const maxYExtent = flickableItem.height - (flickableItem.contentHeight + flickableItem.bottomMargin + flickableItem.originY); |
|
|
|
flickableItem.contentY = Math.min(-maxYExtent, Math.max(-minYExtent, flickableItem.contentY - y)); |
|
} |
|
|
|
focus: true |
|
|
|
onPressed: mouse.accepted = mouse.source !== Qt.MouseEventNotSynthesized |
|
onVerticalScrollBarPolicyChanged: { |
|
scrollBarCreationTimer.restart(); |
|
} |
|
onHorizontalScrollBarPolicyChanged: { |
|
scrollBarCreationTimer.restart(); |
|
} |
|
|
|
|
|
onContentItemChanged: { |
|
if (contentItem.hasOwnProperty("contentY")) { |
|
flickableItem = contentItem; |
|
if (typeof(flickableItem.keyNavigationEnabled) != "undefined") { |
|
flickableItem.keyNavigationEnabled = true; |
|
flickableItem.keyNavigationWraps = false; |
|
} |
|
contentItem.parent = flickableParent; |
|
} else { |
|
flickableItem = flickableComponent.createObject(flickableParent); |
|
contentItem.parent = flickableItem.contentItem; |
|
} |
|
|
|
flickableItem.anchors.fill = flickableParent; |
|
|
|
scrollBarCreationTimer.restart(); |
|
} |
|
|
|
Binding { |
|
when: !root.canFlickWithMouse |
|
target: root.flickableItem |
|
property: "interactive" |
|
value: Kirigami.Settings.hasTransientTouchInput |
|
restoreMode: Binding.RestoreBinding |
|
} |
|
Timer { |
|
id: scrollBarCreationTimer |
|
interval: 0 |
|
onTriggered: { |
|
//create or destroy the vertical scrollbar |
|
if ((!flickableItem.ScrollBar.vertical) && |
|
verticalScrollBarPolicy != Qt.ScrollBarAlwaysOff) { |
|
flickableItem.ScrollBar.vertical = verticalScrollComponent.createObject(root); |
|
} else if (flickableItem.ScrollBar.vertical && |
|
verticalScrollBarPolicy == Qt.ScrollBarAlwaysOff) { |
|
flickableItem.ScrollBar.vertical.destroy(); |
|
} |
|
|
|
//create or destroy the horizontal scrollbar |
|
if ((!flickableItem.ScrollBar.horizontal) && |
|
horizontalScrollBarPolicy != Qt.ScrollBarAlwaysOff) { |
|
flickableItem.ScrollBar.horizontal = horizontalScrollComponent.createObject(root); |
|
} else if (flickableItem.ScrollBar.horizontal && |
|
horizontalScrollBarPolicy == Qt.ScrollBarAlwaysOff) { |
|
flickableItem.ScrollBar.horizontal.destroy(); |
|
} |
|
} |
|
} |
|
Kirigami.WheelHandler { |
|
id: wheelHandler |
|
target: root.flickableItem |
|
} |
|
Item { |
|
id: flickableParent |
|
clip: true |
|
anchors { |
|
fill: parent |
|
leftMargin: root.leftPadding |
|
topMargin: root.topPadding |
|
rightMargin: root.rightPadding + root.rightSpacing |
|
bottomMargin: root.bottomPadding + root.bottomSpacing |
|
} |
|
} |
|
Component { |
|
id: flickableComponent |
|
Flickable { |
|
anchors { |
|
fill: parent |
|
} |
|
contentWidth: root.contentItem ? root.contentItem.width : 0 |
|
contentHeight: root.contentItem ? root.contentItem.height : 0 |
|
} |
|
} |
|
Component { |
|
id: verticalScrollComponent |
|
ScrollBar { |
|
z: flickableParent.z + 1 |
|
visible: root.verticalScrollBarPolicy != Qt.ScrollBarAlwaysOff && root.contentItem.visible && size < 1 |
|
interactive: !Kirigami.Settings.hasTransientTouchInput |
|
|
|
anchors { |
|
right: parent.right |
|
top: parent.top |
|
bottom: parent.bottom |
|
bottomMargin: root.bottomSpacing |
|
} |
|
} |
|
} |
|
Component { |
|
id: horizontalScrollComponent |
|
ScrollBar { |
|
z: flickableParent.z + 1 |
|
visible: root.horizontalScrollBarPolicy != Qt.ScrollBarAlwaysOff && root.contentItem.visible && size < 1 |
|
interactive: !Kirigami.Settings.hasTransientTouchInput |
|
|
|
anchors { |
|
left: parent.left |
|
right: parent.right |
|
bottom: parent.bottom |
|
rightMargin: root.rightSpacing |
|
} |
|
} |
|
} |
|
}
|
|
|