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 }