diff options
| author | Laurens Duin <85798751+Laurens256@users.noreply.github.com> | 2025-08-05 08:04:53 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-08-05 16:04:53 +1000 |
| commit | 9ada66a78ea58d8b498f1dd26bf0783e1a442c51 (patch) | |
| tree | 60963034cc340b64cf25a63b3ce43483f5eb8d63 /components/controls/FilledSlider.qml | |
| parent | launcher: allow wallpaper switch when exactly 2 wallpapers (#343) (diff) | |
| download | caelestia-shell-9ada66a78ea58d8b498f1dd26bf0783e1a442c51.tar.gz caelestia-shell-9ada66a78ea58d8b498f1dd26bf0783e1a442c51.tar.bz2 caelestia-shell-9ada66a78ea58d8b498f1dd26bf0783e1a442c51.zip | |
bar/popouts: add audio device switcher (#319)
* feat: basic audio switcher
* feat: replace VerticalSlider with StyledSlider
* fix: styling
* fix: formatting
* chore: make sound icons consistent, change slider styling
* feat: styled slider component variants
* chore: cleanup
* chore: cleanup
* fix: pr fixes
* fix: remove redundant code
* chore: remove old code
* fix: controls styling
* fixes
* more tweaks
* radiobtn: add interaction stuff
Anim slider
---------
Co-authored-by: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com>
Diffstat (limited to 'components/controls/FilledSlider.qml')
| -rw-r--r-- | components/controls/FilledSlider.qml | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/components/controls/FilledSlider.qml b/components/controls/FilledSlider.qml new file mode 100644 index 0000000..8d0e547 --- /dev/null +++ b/components/controls/FilledSlider.qml @@ -0,0 +1,137 @@ +import ".." +import "../effects" +import qs.services +import qs.config +import QtQuick +import QtQuick.Controls + +Slider { + id: root + + required property string icon + property real oldValue + + orientation: Qt.Vertical + + background: StyledRect { + color: Colours.alpha(Colours.palette.m3surfaceContainer, true) + radius: Appearance.rounding.full + + StyledRect { + anchors.left: parent.left + anchors.right: parent.right + + y: root.handle.y + implicitHeight: parent.height - y + + color: Colours.alpha(Colours.palette.m3secondary, true) + radius: parent.radius + } + } + + handle: Item { + id: handle + + property bool moving + + y: root.visualPosition * (root.availableHeight - height) + implicitWidth: root.width + implicitHeight: root.width + + Elevation { + anchors.fill: parent + radius: rect.radius + level: handleInteraction.containsMouse ? 2 : 1 + } + + StyledRect { + id: rect + + anchors.fill: parent + + color: Colours.alpha(Colours.palette.m3inverseSurface, true) + radius: Appearance.rounding.full + + MouseArea { + id: handleInteraction + + anchors.fill: parent + hoverEnabled: true + cursorShape: Qt.PointingHandCursor + acceptedButtons: Qt.NoButton + } + + MaterialIcon { + id: icon + + property bool moving: handle.moving + + function update(): void { + animate = !moving; + text = moving ? Qt.binding(() => Math.round(root.value * 100)) : Qt.binding(() => root.icon); + font.pointSize = moving ? Appearance.font.size.small : Appearance.font.size.larger; + font.family = moving ? Appearance.font.family.sans : Appearance.font.family.material; + } + + animate: true + text: root.icon + color: Colours.palette.m3inverseOnSurface + anchors.centerIn: parent + + Behavior on moving { + SequentialAnimation { + NumberAnimation { + target: icon + property: "scale" + from: 1 + to: 0 + duration: Appearance.anim.durations.normal / 2 + easing.type: Easing.BezierSpline + easing.bezierCurve: Appearance.anim.curves.standardAccel + } + ScriptAction { + script: icon.update() + } + NumberAnimation { + target: icon + property: "scale" + from: 0 + to: 1 + duration: Appearance.anim.durations.normal / 2 + easing.type: Easing.BezierSpline + easing.bezierCurve: Appearance.anim.curves.standardDecel + } + } + } + } + } + } + + onPressedChanged: handle.moving = pressed + + onValueChanged: { + if (Math.abs(value - oldValue) < 0.01) + return; + oldValue = value; + handle.moving = true; + stateChangeDelay.restart(); + } + + Timer { + id: stateChangeDelay + + interval: 500 + onTriggered: { + if (!root.pressed) + handle.moving = false; + } + } + + Behavior on value { + NumberAnimation { + duration: Appearance.anim.durations.large + easing.type: Easing.BezierSpline + easing.bezierCurve: Appearance.anim.curves.standard + } + } +} |