forked from Shinonome/dots-hyprland
106 lines
2.9 KiB
QML
106 lines
2.9 KiB
QML
pragma ComponentBehavior: Bound
|
|
import QtQuick
|
|
import QtQuick.Controls
|
|
import QtQuick.Layouts
|
|
import Quickshell.Widgets
|
|
import qs.modules.common
|
|
import qs.modules.common.widgets
|
|
|
|
Slider {
|
|
id: root
|
|
|
|
property real trackWidth: 4
|
|
property string tooltipContent: `${Math.round(value * 100)}`
|
|
property bool scrollable: false
|
|
stepSize: 0.02
|
|
leftPadding: 0
|
|
rightPadding: 0
|
|
|
|
implicitHeight: handle.implicitHeight
|
|
|
|
Behavior on value { // This makes the adjusted value (like volume) shift smoothly
|
|
SmoothedAnimation {
|
|
velocity: Looks.transition.velocity
|
|
}
|
|
}
|
|
|
|
background: MouseArea {
|
|
id: background
|
|
anchors.fill: parent
|
|
|
|
onWheel: (event) => {
|
|
if (!root.scrollable) {
|
|
event.accepted = false;
|
|
return;
|
|
}
|
|
if (event.angleDelta.y > 0) {
|
|
root.value = Math.min(root.value + root.stepSize, 1)
|
|
root.moved()
|
|
} else {
|
|
root.value = Math.max(root.value - root.stepSize, 0)
|
|
root.moved()
|
|
}
|
|
}
|
|
|
|
Rectangle {
|
|
id: trackHighlight
|
|
anchors {
|
|
left: parent.left
|
|
verticalCenter: parent.verticalCenter
|
|
}
|
|
topLeftRadius: root.trackWidth / 2
|
|
bottomLeftRadius: root.trackWidth / 2
|
|
color: Looks.colors.accent
|
|
implicitHeight: root.trackWidth
|
|
width: background.width * root.visualPosition
|
|
}
|
|
|
|
Rectangle {
|
|
id: trackTrough
|
|
anchors {
|
|
right: parent.right
|
|
verticalCenter: parent.verticalCenter
|
|
}
|
|
topRightRadius: root.trackWidth / 2
|
|
bottomRightRadius: root.trackWidth / 2
|
|
color: Looks.colors.controlBg
|
|
implicitHeight: root.trackWidth
|
|
width: background.width * (1 - root.visualPosition)
|
|
}
|
|
}
|
|
|
|
handle: Circle {
|
|
id: handle
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
x: (diameter / 2) + root.visualPosition * (root.width - diameter) - (diameter / 2)
|
|
diameter: 20
|
|
color: Looks.colors.controlFg
|
|
|
|
MouseArea {
|
|
id: handleMouseArea
|
|
anchors.fill: parent
|
|
hoverEnabled: true
|
|
acceptedButtons: Qt.NoButton
|
|
}
|
|
|
|
Circle {
|
|
anchors.centerIn: parent
|
|
diameter: root.pressed ? 10 : handleMouseArea.containsMouse ? 14 : 12
|
|
color: Looks.colors.accent
|
|
|
|
Behavior on diameter {
|
|
animation: Looks.transition.enter.createObject(this)
|
|
}
|
|
}
|
|
|
|
WToolTip {
|
|
id: tooltip
|
|
extraVisibleCondition: root.pressed
|
|
text: root.tooltipContent
|
|
font.pixelSize: Looks.font.pixelSize.larger
|
|
verticalPadding: 3
|
|
horizontalPadding: 8
|
|
}
|
|
}
|
|
}
|