Warning, /plasma/qqc2-breeze-style/style/impl/SliderGroove.qml is written in an unsupported language. File is not indexed.

0001 /* SPDX-FileCopyrightText: 2017 The Qt Company Ltd.
0002  * SPDX-FileCopyrightText: 2020 Noah Davis <noahadvs@gmail.com>
0003  * SPDX-License-Identifier: LGPL-3.0-only OR GPL-2.0-or-later OR LicenseRef-KDE-Accepted-LGPL OR LicenseRef-KFQF-Accepted-GPL
0004  */
0005 
0006 import QtQuick
0007 import QtQuick.Templates as Templates
0008 import org.kde.kirigami as Kirigami
0009 
0010 import "." as Impl
0011 
0012 Rectangle {
0013     id: root
0014 
0015     property Templates.Control control
0016     property real startPosition: isRangeSlider ? control.first.position : 0
0017     property real endPosition: isRangeSlider ? control.second.position : control.position
0018 
0019     readonly property bool isRangeSlider: control instanceof Templates.RangeSlider
0020 
0021     readonly property real handleWidth: isRangeSlider ? control.first.handle.width ?? 0 : control.handle.width ?? 0
0022     readonly property real handleHeight: isRangeSlider ? control.first.handle.height ?? 0 : control.handle.height ?? 0
0023     readonly property real secondHandleWidth: isRangeSlider ? control.second.handle.width ?? 0 : handleWidth
0024     readonly property real secondHandleHeight: isRangeSlider ? control.second.handle.height ?? 0 : handleHeight
0025 
0026     readonly property bool horizontal: root.control.horizontal
0027     readonly property bool vertical: root.control.vertical
0028 
0029 
0030     //NOTE: Manually setting x,y,width,height because that's what the Basic, Fusion and Material QQC2 styles do.
0031     // Inset would be more idiomatic for QQC2, but this is easier to deal with for now since the behavior is expected by app devs.
0032 
0033     x: control.leftPadding + (root.horizontal ?
0034         (control.mirrored ? root.secondHandleWidth/2 : root.handleWidth/2) - radius
0035         : (control.availableWidth - width) / 2)
0036     y: control.topPadding + (root.vertical ? root.secondHandleHeight/2 - radius : (control.availableHeight - height) / 2)
0037 
0038     implicitWidth: root.horizontal ? 200 : Impl.Units.grooveHeight
0039     implicitHeight: root.vertical ? 200 : Impl.Units.grooveHeight
0040 
0041     width: root.horizontal ? control.availableWidth - root.handleWidth/2 - secondHandleWidth/2 + Impl.Units.grooveHeight : implicitWidth
0042     height: root.vertical ? control.availableHeight - root.handleHeight/2 - secondHandleHeight/2 + Impl.Units.grooveHeight : implicitHeight
0043 
0044     radius: Impl.Units.grooveHeight/2
0045     color: Kirigami.Theme.backgroundColor
0046     border {
0047         width: Impl.Units.smallBorder
0048         color: Impl.Theme.separatorColor()
0049     }
0050 
0051     Rectangle {
0052         id: fill
0053         anchors {
0054             fill: parent
0055             leftMargin: root.horizontal ? root.startPosition * parent.width - (root.startPosition * Impl.Units.grooveHeight) : 0
0056             rightMargin: root.horizontal ? (1-root.endPosition) * parent.width - ((1-root.endPosition) * Impl.Units.grooveHeight) : 0
0057             topMargin: root.vertical ? (1-root.endPosition) * parent.height - ((1-root.endPosition) * Impl.Units.grooveHeight) : 0
0058             bottomMargin: root.vertical ? root.startPosition * parent.height - (root.startPosition * Impl.Units.grooveHeight) : 0
0059         }
0060 
0061         radius: parent.radius
0062         color: Kirigami.Theme.alternateBackgroundColor
0063         border {
0064             width: Impl.Units.smallBorder
0065             color: Kirigami.Theme.focusColor
0066         }
0067 
0068         Behavior on anchors.leftMargin {
0069             enabled: fill.loaded && !Kirigami.Settings.hasTransientTouchInput
0070             SmoothedAnimation {
0071                 duration: Kirigami.Units.longDuration
0072                 velocity: 800
0073                 //SmoothedAnimations have a hardcoded InOutQuad easing
0074             }
0075         }
0076         Behavior on anchors.rightMargin {
0077             enabled: fill.loaded && !Kirigami.Settings.hasTransientTouchInput
0078             SmoothedAnimation {
0079                 duration: Kirigami.Units.longDuration
0080                 velocity: 800
0081             }
0082         }
0083         Behavior on anchors.topMargin {
0084             enabled: fill.loaded && !Kirigami.Settings.hasTransientTouchInput
0085             SmoothedAnimation {
0086                 duration: Kirigami.Units.longDuration
0087                 velocity: 800
0088             }
0089         }
0090         Behavior on anchors.bottomMargin {
0091             enabled: fill.loaded && !Kirigami.Settings.hasTransientTouchInput
0092             SmoothedAnimation {
0093                 duration: Kirigami.Units.longDuration
0094                 velocity: 800
0095             }
0096         }
0097 
0098         // Prevents animations from running when loaded
0099         // HACK: for some reason, this won't work without a 1ms timer
0100         property bool loaded: false
0101         Timer {
0102             id: awfulHackTimer
0103             interval: 1
0104             onTriggered: fill.loaded = true
0105         }
0106         Component.onCompleted: {
0107             awfulHackTimer.start()
0108         }
0109     }
0110 
0111     //NOTE: this code has problems when large from/to ranges are used.
0112     // Keeping it here to work on it later.
0113     /*
0114     Loader {
0115         id: tickmarkLoader
0116         visible: root.control.stepSize > 0
0117         active: visible
0118         anchors {
0119             left: root.horizontal ? parent.left : parent.right
0120             top: root.vertical ? parent.top : parent.bottom
0121             leftMargin: root.horizontal ? parent.radius : Impl.Units.smallBorder
0122             topMargin: root.vertical ? parent.radius : Impl.Units.smallBorder
0123         }
0124         width: root.vertical ? implicitWidth : root.width - parent.radius
0125         height: root.horizontal ? implicitHeight : root.height - parent.radius
0126         sourceComponent: markGridComponent
0127     }
0128 
0129     Loader {
0130         id: tickmarkLoader2
0131         visible: tickmarkLoader.visible
0132         active: visible
0133         anchors {
0134             left: parent.left
0135             top: parent.top
0136             leftMargin: root.horizontal ? parent.radius : -width - Impl.Units.smallBorder
0137             topMargin: root.vertical ? parent.radius : -height - Impl.Units.smallBorder
0138         }
0139         width: tickmarkLoader.width
0140         height: tickmarkLoader.height
0141         sourceComponent: markGridComponent
0142     }
0143 
0144     Component {
0145         id: markGridComponent
0146         Grid {
0147             id: markGrid
0148             rows: root.vertical ? markRepeater.model : 1
0149             columns: root.horizontal ? markRepeater.model : 1
0150             spacing: (root.vertical ? height/(markRepeater.model-1) : width/(markRepeater.model-1)) - Impl.Units.smallBorder*2
0151             Repeater {
0152                 id: markRepeater
0153                 model: (root.control.to - root.control.from)/root.control.stepSize + 1
0154                 delegate: Rectangle {
0155                     implicitWidth: root.vertical ? root.x - Impl.Units.smallBorder : Impl.Units.smallBorder
0156                     implicitHeight: root.horizontal ? root.y - Impl.Units.smallBorder : Impl.Units.smallBorder
0157                     color: (root.horizontal && x >= fill.x && x <= fill.x + fill.width)
0158                         || (root.vertical && y >= fill.y && y <= fill.y + fill.height)
0159                         ? Kirigami.Theme.focusColor
0160                         : Impl.Theme.separatorColor()
0161                 }
0162             }
0163         }
0164     }*/
0165 }