import QtQuick import QtQuick.Controls import QtQuick.Layouts import qs.Constants RowLayout { id: root property string label: "" property string description: "" property bool checked: false property bool hovering: false property int baseSize: Math.round(Style.baseWidgetSize * 0.8) signal toggled(bool checked) signal entered() signal exited() Layout.fillWidth: true NLabel { label: root.label description: root.description } Rectangle { id: switcher implicitWidth: Math.round(root.baseSize * 0.85) * 2 implicitHeight: Math.round(root.baseSize * 0.5) * 2 radius: height * 0.5 color: root.checked ? Color.mPrimary : Color.mSurface border.color: Color.mOutline border.width: Math.max(1, Style.borderS) Rectangle { implicitWidth: Math.round(root.baseSize * 0.4) * 2 implicitHeight: Math.round(root.baseSize * 0.4) * 2 radius: height * 0.5 color: root.checked ? Color.mOnPrimary : Color.mPrimary border.color: root.checked ? Color.mSurface : Color.mSurface border.width: Math.max(1, Style.borderM) anchors.verticalCenter: parent.verticalCenter anchors.verticalCenterOffset: 0 x: root.checked ? switcher.width - width - 3 : 3 Behavior on x { NumberAnimation { duration: Style.animationFast easing.type: Easing.OutCubic } } } MouseArea { anchors.fill: parent cursorShape: Qt.PointingHandCursor hoverEnabled: true onEntered: { hovering = true; root.entered(); } onExited: { hovering = false; root.exited(); } onClicked: { root.toggled(!root.checked); } } Behavior on color { ColorAnimation { duration: Style.animationFast } } Behavior on border.color { ColorAnimation { duration: Style.animationFast } } } }