Files
dotfiles/.config/quickshell/nucleus-shell/modules/components/StyledSlider.qml

119 lines
3.8 KiB
QML

import qs.config
pragma ComponentBehavior: Bound
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
Slider {
id: root
property real trackHeightDiff: 15
property real handleGap: Metrics.spacing(4)
property real trackDotSize: Metrics.iconSize(4)
property real trackNearHandleRadius: Appearance.rounding.unsharpen
property bool useAnim: true
property int iconSize: Appearance.font.size.large
property string icon: ""
Layout.fillWidth: true
implicitWidth: 200
implicitHeight: 40
from: 0
to: 100
value: 0
stepSize: 0
snapMode: stepSize > 0 ? Slider.SnapAlways : Slider.NoSnap
MouseArea {
anchors.fill: parent
onPressed: (mouse) => mouse.accepted = false
cursorShape: root.pressed ? Qt.ClosedHandCursor : Qt.PointingHandCursor
}
MaterialSymbol {
id: icon
icon: root.icon
iconSize: root.iconSize
anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter
anchors.rightMargin: Metrics.margin(16)
}
background: Item {
anchors.verticalCenter: parent.verticalCenter
width: parent.width
height: parent.height
// Filled Left Segment
Rectangle {
anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.left
width: root.handleGap + (root.visualPosition * (root.width - root.handleGap * 2))
- ((root.pressed ? 1.5 : 3) / 2 + root.handleGap)
height: root.height - root.trackHeightDiff
color: Appearance.colors.colPrimary
radius: Metrics.radius("small")
topRightRadius: root.trackNearHandleRadius
bottomRightRadius: root.trackNearHandleRadius
Behavior on width {
enabled: Config.runtime.appearance.animations.enabled
NumberAnimation {
duration: !root.useAnim ? 0 : Metrics.chronoDuration("small")
easing.type: Easing.BezierSpline
easing.bezierCurve: Appearance.animation.curves.expressiveEffects
}
}
}
// Remaining Right Segment
Rectangle {
anchors.verticalCenter: parent.verticalCenter
anchors.right: parent.right
width: root.handleGap + ((1 - root.visualPosition) * (root.width - root.handleGap * 2))
- ((root.pressed ? 1.5 : 3) / 2 + root.handleGap)
height: root.height - root.trackHeightDiff
color: Appearance.colors.colSecondaryContainer
radius: Metrics.radius("small")
topLeftRadius: root.trackNearHandleRadius
bottomLeftRadius: root.trackNearHandleRadius
Behavior on width {
enabled: Config.runtime.appearance.animations.enabled
NumberAnimation {
duration: !root.useAnim ? 0 : Metrics.chronoDuration("small")
easing.type: Easing.BezierSpline
easing.bezierCurve: Appearance.animation.curves.expressiveEffects
}
}
}
}
handle: Rectangle {
width: 5
height: root.height
radius: (width / 2) * Config.runtime.appearance.rounding.factor
x: root.handleGap + (root.visualPosition * (root.width - root.handleGap * 2)) - width / 2
anchors.verticalCenter: parent.verticalCenter
color: Appearance.colors.colPrimary
Behavior on x {
enabled: Config.runtime.appearance.animations.enabled
NumberAnimation {
duration: !root.useAnim ? 0 : Appearance.animation.elementMoveFast.duration
easing.type: Appearance.animation.elementMoveFast.type
easing.bezierCurve: Appearance.animation.elementMoveFast.bezierCurve
}
}
}
}