mirror of
https://github.com/belsabbagh/dotfiles.git
synced 2026-04-11 17:47:09 +00:00
139 lines
3.9 KiB
QML
139 lines
3.9 KiB
QML
import qs.config
|
|
import QtQuick
|
|
import QtQuick.Controls
|
|
|
|
Item {
|
|
id: root
|
|
width: 60
|
|
height: 34
|
|
|
|
property bool checked: false
|
|
signal toggled(bool checked)
|
|
|
|
// Colors
|
|
property color trackOn: Appearance.colors.colPrimary
|
|
property color trackOff: Appearance.colors.colLayer2
|
|
property color outline: Appearance.colors.colOutline
|
|
|
|
property color thumbOn: Appearance.colors.colOnPrimary
|
|
property color thumbOff: Appearance.colors.colOnLayer2
|
|
|
|
property color iconOn: Appearance.colors.colPrimary
|
|
property color iconOff: Appearance.colors.colOnPrimary
|
|
|
|
// Dimensions
|
|
property int trackRadius: (height / 2) * Config.runtime.appearance.rounding.factor
|
|
property int thumbSize: height - (checked ? 10 : 14)
|
|
|
|
Behavior on thumbSize {
|
|
enabled: Config.runtime.appearance.animations.enabled
|
|
NumberAnimation {
|
|
duration: Metrics.chronoDuration("normal")
|
|
easing.type: Easing.BezierSpline
|
|
easing.bezierCurve: Appearance.animation.curves.expressiveEffects
|
|
}
|
|
}
|
|
|
|
// TRACK
|
|
Rectangle {
|
|
id: track
|
|
anchors.fill: parent
|
|
radius: trackRadius
|
|
|
|
color: root.checked ? trackOn : trackOff
|
|
border.width: root.checked ? 0 : 2
|
|
border.color: outline
|
|
|
|
Behavior on color {
|
|
enabled: Config.runtime.appearance.animations.enabled
|
|
ColorAnimation {
|
|
duration: Metrics.chronoDuration("normal")
|
|
easing.type: Easing.BezierSpline
|
|
easing.bezierCurve: Appearance.animation.curves.expressiveEffects
|
|
}
|
|
}
|
|
}
|
|
|
|
// THUMB
|
|
Rectangle {
|
|
id: thumb
|
|
width: thumbSize
|
|
height: thumbSize
|
|
radius: (thumbSize / 2) * Config.runtime.appearance.rounding.factor
|
|
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
x: root.checked ? parent.width - width - 6 : 6
|
|
|
|
color: root.checked ? thumbOn : thumbOff
|
|
|
|
Behavior on x {
|
|
enabled: Config.runtime.appearance.animations.enabled
|
|
NumberAnimation {
|
|
duration: Metrics.chronoDuration("small")
|
|
easing.type: Easing.BezierSpline
|
|
easing.bezierCurve: Appearance.animation.curves.expressiveEffects
|
|
}
|
|
}
|
|
|
|
Behavior on color {
|
|
enabled: Config.runtime.appearance.animations.enabled
|
|
ColorAnimation {
|
|
duration: Metrics.chronoDuration("small")
|
|
easing.type: Easing.BezierSpline
|
|
easing.bezierCurve: Appearance.animation.curves.expressiveEffects
|
|
}
|
|
}
|
|
|
|
// ✓ CHECK ICON
|
|
MaterialSymbol {
|
|
anchors.centerIn: parent
|
|
icon: "check"
|
|
iconSize: parent.width * 0.7
|
|
color: iconOn
|
|
|
|
opacity: root.checked ? 1 : 0
|
|
scale: root.checked ? 1 : 0.6
|
|
|
|
Behavior on opacity { NumberAnimation { duration: 120 } }
|
|
|
|
Behavior on scale {
|
|
NumberAnimation {
|
|
duration: 160
|
|
easing.type: Easing.OutBack
|
|
}
|
|
}
|
|
}
|
|
|
|
// ✕ CROSS ICON (more visible)
|
|
MaterialSymbol {
|
|
anchors.centerIn: parent
|
|
icon: "close"
|
|
iconSize: parent.width * 0.72
|
|
color: iconOff
|
|
|
|
opacity: root.checked ? 0 : 1
|
|
scale: root.checked ? 0.6 : 1
|
|
|
|
Behavior on opacity { NumberAnimation { duration: 120 } }
|
|
|
|
Behavior on scale {
|
|
NumberAnimation {
|
|
duration: 160
|
|
easing.type: Easing.OutBack
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
MouseArea {
|
|
anchors.fill: parent
|
|
hoverEnabled: true
|
|
cursorShape: Qt.PointingHandCursor
|
|
|
|
onClicked: {
|
|
root.checked = !root.checked
|
|
root.toggled(root.checked)
|
|
}
|
|
}
|
|
}
|