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 }