aboutsummaryrefslogtreecommitdiffstats
path: root/src/quickcontrols/macos/impl/SwitchIndicator.qml
diff options
context:
space:
mode:
Diffstat (limited to 'src/quickcontrols/macos/impl/SwitchIndicator.qml')
-rw-r--r--src/quickcontrols/macos/impl/SwitchIndicator.qml93
1 files changed, 93 insertions, 0 deletions
diff --git a/src/quickcontrols/macos/impl/SwitchIndicator.qml b/src/quickcontrols/macos/impl/SwitchIndicator.qml
new file mode 100644
index 0000000000..33b6f5ca5f
--- /dev/null
+++ b/src/quickcontrols/macos/impl/SwitchIndicator.qml
@@ -0,0 +1,93 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+import QtQuick
+import QtQuick.Templates as T
+
+Rectangle {
+ id: indicator
+ implicitWidth: 38
+ implicitHeight: 22
+ radius: implicitHeight / 2
+
+ required property T.AbstractButton control
+ readonly property real downTintFactor: 1.05
+
+ // For QQuickMacFocusFrame.
+ readonly property real __focusFrameRadius: radius
+
+ color: Qt.styleHints.colorScheme === Qt.Light
+ ? Qt.darker(indicator.control.checked
+ ? indicator.palette.accent : "#d9d6d2", indicator.control.down ? indicator.downTintFactor : 1)
+ : Qt.lighter(indicator.control.checked
+ ? indicator.palette.accent : "#454545", indicator.control.down ? indicator.downTintFactor : 1)
+
+ states: [
+ State {
+ name: "checked"
+ when: indicator.control.checked
+
+ // Do a bit of duplication with the bindings here just so that
+ // we can trigger the property change for the transition. We only
+ // the ColorAnimation to happen when changing checked state.
+ PropertyChanges {
+ target: indicator
+ color: Qt.styleHints.colorScheme === Qt.Light
+ ? indicator.control.checked ? indicator.palette.accent : "#d9d6d2"
+ : indicator.control.checked ? indicator.palette.accent : "#454545"
+ }
+ }
+ ]
+
+ transitions: Transition {
+ ColorAnimation {
+ targets: indicator
+ property: "color"
+ // We try to match the speed of x's SmoothedAnimation below,
+ // and 17 pixels (handle travel distance) / 75 pixels a second = 0.226.
+ duration: 226
+ easing.type: Easing.InOutQuad
+ }
+ }
+
+ // Since an equivalent to InnerShadow doesn't exist in Qt 6 (QTBUG-116161),
+ // we approximate it using semi-transparent rectangle borders.
+ Rectangle {
+ width: parent.width
+ height: parent.height
+ radius: height / 2
+ color: "transparent"
+ border.color: Qt.styleHints.colorScheme === Qt.Light
+ ? Qt.darker("#06000000", indicator.control.down ? indicator.downTintFactor : 1)
+ : Qt.lighter("#1affffff", indicator.control.down ? indicator.downTintFactor : 1)
+
+ Rectangle {
+ x: 1
+ y: 1
+ implicitWidth: parent.width - 2
+ implicitHeight: parent.height - 2
+ radius: parent.radius
+ color: "transparent"
+ border.color: Qt.styleHints.colorScheme === Qt.Light
+ ? Qt.darker("#02000000", indicator.control.down ? indicator.downTintFactor : 1)
+ : Qt.lighter("#04ffffff", indicator.control.down ? indicator.downTintFactor : 1)
+ }
+ }
+
+ SwitchHandle {
+ id: handle
+ x: Math.max(1, Math.min(parent.width - width - 1, indicator.control.visualPosition * parent.width - (width / 2)))
+ y: (parent.height - height) / 2
+ down: indicator.control.down
+
+ // We have this here because we don't want this behavior for RangeSlider,
+ // which also uses SwitchHandle.
+ Behavior on x {
+ enabled: !handle.down
+
+ SmoothedAnimation {
+ velocity: 200
+ }
+ }
+ }
+}