Warning, /plasma/qqc2-breeze-style/style/impl/SliderHandle.qml is written in an unsupported language. File is not indexed.
0001 /* SPDX-FileCopyrightText: 2020 Noah Davis <noahadvs@gmail.com>
0002 * SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0003 */
0004
0005 import QtQuick
0006 import QtQuick.Templates as T
0007 import org.kde.kirigami as Kirigami
0008
0009 import "." as Impl
0010
0011 Rectangle {
0012 id: root
0013
0014 property T.Control control: root.parent
0015 property real position: control.position
0016 property real visualPosition: control.visualPosition
0017 property bool hovered: control.hovered
0018 property bool pressed: control.pressed
0019 property bool visualFocus: control.visualFocus
0020
0021 property bool usePreciseHandle: false
0022
0023 implicitWidth: implicitHeight
0024 implicitHeight: Impl.Units.inlineControlHeight
0025
0026 // It's not necessary here. Not sure if it would swap leftPadding with
0027 // rightPadding in the x position calculation, but there's no risk to
0028 // being safe here.
0029 LayoutMirroring.enabled: false
0030
0031 // It's necessary to use x and y positions instead of anchors so that the handle position can be dragged
0032 x: {
0033 let xPos = 0
0034 if (control.horizontal) {
0035 xPos = root.visualPosition * (control.availableWidth - width)
0036 } else {
0037 xPos = (control.availableWidth - width) / 2
0038 }
0039 return xPos + control.leftPadding
0040 }
0041 y: {
0042 let yPos = 0
0043 if (control.vertical) {
0044 yPos = root.visualPosition * (control.availableHeight - height)
0045 } else {
0046 yPos = (control.availableHeight - height) / 2
0047 }
0048 return yPos + control.topPadding
0049 }
0050
0051 rotation: root.vertical && usePreciseHandle ? -90 : 0
0052
0053 radius: height / 2
0054 color: Kirigami.Theme.backgroundColor
0055 border {
0056 width: Impl.Units.smallBorder
0057 color: root.pressed || root.visualFocus || root.hovered ? Kirigami.Theme.focusColor : Impl.Theme.separatorColor()
0058 }
0059
0060 Behavior on border.color {
0061 enabled: root.pressed || root.visualFocus || root.hovered
0062 ColorAnimation {
0063 duration: Kirigami.Units.shortDuration
0064 easing.type: Easing.OutCubic
0065 }
0066 }
0067
0068 Behavior on x {
0069 enabled: root.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 y {
0077 enabled: root.loaded && !Kirigami.Settings.hasTransientTouchInput
0078 SmoothedAnimation {
0079 duration: Kirigami.Units.longDuration
0080 velocity: 800
0081 }
0082 }
0083
0084 SmallBoxShadow {
0085 id: shadow
0086 opacity: root.pressed ? 0 : 1
0087 visible: control.enabled
0088 radius: parent.radius
0089 }
0090
0091 FocusRect {
0092 baseRadius: root.radius
0093 visible: root.visualFocus
0094 }
0095
0096 // Prevents animations from running when loaded
0097 // HACK: for some reason, this won't work without a 1ms timer
0098 property bool loaded: false
0099 Timer {
0100 id: awfulHackTimer
0101 interval: 1
0102 onTriggered: root.loaded = true
0103 }
0104 Component.onCompleted: {
0105 awfulHackTimer.start()
0106 }
0107 }