diff options
Diffstat (limited to 'src/quickcontrols/material/impl/SwitchIndicator.qml')
-rw-r--r-- | src/quickcontrols/material/impl/SwitchIndicator.qml | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/src/quickcontrols/material/impl/SwitchIndicator.qml b/src/quickcontrols/material/impl/SwitchIndicator.qml new file mode 100644 index 0000000000..d864f3887a --- /dev/null +++ b/src/quickcontrols/material/impl/SwitchIndicator.qml @@ -0,0 +1,101 @@ +// Copyright (C) 2017 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 +import QtQuick.Controls.impl +import QtQuick.Controls.Material +import QtQuick.Controls.Material.impl + +Rectangle { + id: indicator + width: control.Material.switchIndicatorWidth + height: control.Material.switchIndicatorHeight + radius: height / 2 + y: parent.height / 2 - height / 2 + color: control.enabled + ? (control.checked + ? control.Material.switchCheckedTrackColor : control.Material.switchUncheckedTrackColor) + : (control.checked + ? control.Material.switchDisabledCheckedTrackColor + : control.Material.switchDisabledUncheckedTrackColor) + border.width: 2 + border.color: control.enabled + ? (control.checked ? control.Material.switchCheckedTrackColor : control.Material.switchUncheckedHandleColor) + : (control.checked ? control.Material.switchDisabledCheckedTrackColor : control.Material.switchDisabledUncheckedTrackBorderColor) + + property T.AbstractButton control + property alias handle: handle + + Behavior on color { + ColorAnimation { + duration: 200 + } + } + Behavior on border.color { + ColorAnimation { + duration: 200 + } + } + + Rectangle { + id: handle + x: Math.max(offset, Math.min(parent.width - offset - width, + indicator.control.visualPosition * parent.width - (width / 2))) + y: (parent.height - height) / 2 + // We use scale to allow us to enlarge the circle from the center, + // as using width/height will cause it to jump due to the position x/y bindings. + // However, a large enough scale on certain displays will show the triangles + // that make up the circle, so instead we make sure that the circle is always + // its largest size so that more triangles are used, and downscale instead. + width: normalSize * largestScale + height: normalSize * largestScale + radius: width / 2 + color: indicator.control.enabled + ? (indicator.control.checked + ? indicator.control.Material.switchCheckedHandleColor + : indicator.control.hovered + ? indicator.control.Material.switchUncheckedHoveredHandleColor : indicator.control.Material.switchUncheckedHandleColor) + : (indicator.control.checked + ? indicator.control.Material.switchDisabledCheckedHandleColor + : indicator.control.Material.switchDisabledUncheckedHandleColor) + scale: indicator.control.down ? 1 : (indicator.control.checked ? checkedSize / largestSize : normalSize / largestSize) + + readonly property int offset: 2 + readonly property real normalSize: !hasIcon ? indicator.control.Material.switchNormalHandleHeight : checkedSize + readonly property real checkedSize: indicator.control.Material.switchCheckedHandleHeight + readonly property real largestSize: indicator.control.Material.switchLargestHandleHeight + readonly property real largestScale: largestSize / normalSize + readonly property bool hasIcon: indicator.control.icon.name.length > 0 + || indicator.control.icon.source.toString().length > 0 + + Behavior on x { + enabled: !indicator.control.pressed + SmoothedAnimation { + duration: 300 + } + } + + Behavior on scale { + NumberAnimation { + duration: 100 + } + } + + Behavior on color { + ColorAnimation { + duration: 200 + } + } + + IconImage { + x: (parent.width - width) / 2 + y: (parent.height - height) / 2 + name: indicator.control.icon.name + source: indicator.control.icon.source + sourceSize: Qt.size(indicator.control.icon.width, indicator.control.icon.height) + color: indicator.control.icon.color + visible: handle.hasIcon + } + } +} |