Warning, /plasma/plasma-mobile/lookandfeel/contents/systemdialog/private/ScrollView.qml is written in an unsupported language. File is not indexed.
0001 /*
0002 * SPDX-FileCopyrightText: 2016 Marco Martin <mart@kde.org>
0003 *
0004 * SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 import QtQuick 2.7
0007 import QtQuick.Controls 2.0
0008 import QtQml 2.15
0009 import org.kde.kirigami 2.9 as Kirigami
0010
0011 // taken from Kirigami
0012 MouseArea {
0013 id: root
0014 default property Item contentItem
0015 property Flickable flickableItem
0016 clip: true
0017
0018 property int horizontalScrollBarPolicy: Qt.ScrollBarAlwaysOff
0019 property int verticalScrollBarPolicy: Qt.ScrollBarAsNeeded
0020 property int topPadding: 0
0021 property int leftPadding: 0
0022 property int bottomPadding: 0
0023 property int rightPadding: 0
0024 property bool canFlickWithMouse: false
0025
0026 // Note: These are used because RefreshableScrollView overrides right and
0027 // bottom padding properties.
0028 property int rightSpacing: !Kirigami.Settings.hasTransientTouchInput && flickableItem && flickableItem.ScrollBar.vertical && flickableItem.ScrollBar.vertical.visible ? flickableItem.ScrollBar.vertical.width : 0
0029 property int bottomSpacing: !Kirigami.Settings.hasTransientTouchInput && flickableItem && flickableItem.ScrollBar.horizontal && flickableItem.ScrollBar.horizontal.visible ? flickableItem.ScrollBar.horizontal.height : 0
0030
0031 Accessible.onScrollDownAction: flickableItem.Accessible.onScrollDownAction
0032 Accessible.onScrollUpAction: flickableItem.Accessible.onScrollUpAction
0033
0034 Keys.onUpPressed: scroll(Kirigami.Units.gridUnit * 2)
0035 Keys.onDownPressed: scroll(-Kirigami.Units.gridUnit * 2)
0036
0037 function scroll(y) {
0038 // Don't scroll if the view isn't scrollable!
0039 if (flickableItem.contentHeight < flickableItem.height + flickableItem.contentY) {
0040 return;
0041 }
0042 const minYExtent = flickableItem.topMargin - flickableItem.originY;
0043 const maxYExtent = flickableItem.height - (flickableItem.contentHeight + flickableItem.bottomMargin + flickableItem.originY);
0044
0045 flickableItem.contentY = Math.min(-maxYExtent, Math.max(-minYExtent, flickableItem.contentY - y));
0046 }
0047
0048 focus: true
0049
0050 onPressed: mouse => { mouse.accepted = mouse.source !== Qt.MouseEventNotSynthesized; }
0051 onVerticalScrollBarPolicyChanged: {
0052 scrollBarCreationTimer.restart();
0053 }
0054 onHorizontalScrollBarPolicyChanged: {
0055 scrollBarCreationTimer.restart();
0056 }
0057
0058
0059 onContentItemChanged: {
0060 if (contentItem.hasOwnProperty("contentY")) {
0061 flickableItem = contentItem;
0062 if (typeof(flickableItem.keyNavigationEnabled) != "undefined") {
0063 flickableItem.keyNavigationEnabled = true;
0064 flickableItem.keyNavigationWraps = false;
0065 }
0066 contentItem.parent = flickableParent;
0067 } else {
0068 flickableItem = flickableComponent.createObject(flickableParent);
0069 contentItem.parent = flickableItem.contentItem;
0070 }
0071
0072 flickableItem.anchors.fill = flickableParent;
0073
0074 scrollBarCreationTimer.restart();
0075 }
0076
0077 Binding {
0078 when: !root.canFlickWithMouse
0079 target: root.flickableItem
0080 property: "interactive"
0081 value: Kirigami.Settings.hasTransientTouchInput
0082 restoreMode: Binding.RestoreBinding
0083 }
0084 Timer {
0085 id: scrollBarCreationTimer
0086 interval: 0
0087 onTriggered: {
0088 //create or destroy the vertical scrollbar
0089 if ((!flickableItem.ScrollBar.vertical) &&
0090 verticalScrollBarPolicy != Qt.ScrollBarAlwaysOff) {
0091 flickableItem.ScrollBar.vertical = verticalScrollComponent.createObject(root);
0092 } else if (flickableItem.ScrollBar.vertical &&
0093 verticalScrollBarPolicy == Qt.ScrollBarAlwaysOff) {
0094 flickableItem.ScrollBar.vertical.destroy();
0095 }
0096
0097 //create or destroy the horizontal scrollbar
0098 if ((!flickableItem.ScrollBar.horizontal) &&
0099 horizontalScrollBarPolicy != Qt.ScrollBarAlwaysOff) {
0100 flickableItem.ScrollBar.horizontal = horizontalScrollComponent.createObject(root);
0101 } else if (flickableItem.ScrollBar.horizontal &&
0102 horizontalScrollBarPolicy == Qt.ScrollBarAlwaysOff) {
0103 flickableItem.ScrollBar.horizontal.destroy();
0104 }
0105 }
0106 }
0107 Kirigami.WheelHandler {
0108 id: wheelHandler
0109 target: root.flickableItem
0110 }
0111 Item {
0112 id: flickableParent
0113 clip: true
0114 anchors {
0115 fill: parent
0116 leftMargin: root.leftPadding
0117 topMargin: root.topPadding
0118 rightMargin: root.rightPadding + root.rightSpacing
0119 bottomMargin: root.bottomPadding + root.bottomSpacing
0120 }
0121 }
0122 Component {
0123 id: flickableComponent
0124 Flickable {
0125 anchors {
0126 fill: parent
0127 }
0128 contentWidth: root.contentItem ? root.contentItem.width : 0
0129 contentHeight: root.contentItem ? root.contentItem.height : 0
0130 }
0131 }
0132 Component {
0133 id: verticalScrollComponent
0134 ScrollBar {
0135 z: flickableParent.z + 1
0136 visible: root.verticalScrollBarPolicy != Qt.ScrollBarAlwaysOff && root.contentItem.visible && size < 1
0137 interactive: !Kirigami.Settings.hasTransientTouchInput
0138
0139 anchors {
0140 right: parent.right
0141 top: parent.top
0142 bottom: parent.bottom
0143 bottomMargin: root.bottomSpacing
0144 }
0145 }
0146 }
0147 Component {
0148 id: horizontalScrollComponent
0149 ScrollBar {
0150 z: flickableParent.z + 1
0151 visible: root.horizontalScrollBarPolicy != Qt.ScrollBarAlwaysOff && root.contentItem.visible && size < 1
0152 interactive: !Kirigami.Settings.hasTransientTouchInput
0153
0154 anchors {
0155 left: parent.left
0156 right: parent.right
0157 bottom: parent.bottom
0158 rightMargin: root.rightSpacing
0159 }
0160 }
0161 }
0162 }