import qs.Config import QtQuick CustomRect { id: root enum Type { Filled, Tonal, Text } property alias icon: label.text property bool checked property bool toggle property real padding: type === IconButton.Text ? 10 / 2 : 7 property alias font: label.font property int type: IconButton.Filled property bool disabled property alias stateLayer: stateLayer property alias label: label property alias radiusAnim: radiusAnim property bool internalChecked property color activeColour: type === IconButton.Filled ? DynamicColors.palette.m3primary : DynamicColors.palette.m3secondary property color inactiveColour: { if (!toggle && type === IconButton.Filled) return DynamicColors.palette.m3primary; return type === IconButton.Filled ? DynamicColors.tPalette.m3surfaceContainer : DynamicColors.palette.m3secondaryContainer; } property color activeOnColour: type === IconButton.Filled ? DynamicColors.palette.m3onPrimary : type === IconButton.Tonal ? DynamicColors.palette.m3onSecondary : DynamicColors.palette.m3primary property color inactiveOnColour: { if (!toggle && type === IconButton.Filled) return DynamicColors.palette.m3onPrimary; return type === IconButton.Tonal ? DynamicColors.palette.m3onSecondaryContainer : DynamicColors.palette.m3onSurfaceVariant; } property color disabledColour: Qt.alpha(DynamicColors.palette.m3onSurface, 0.1) property color disabledOnColour: Qt.alpha(DynamicColors.palette.m3onSurface, 0.38) signal clicked onCheckedChanged: internalChecked = checked radius: internalChecked ? 6 : implicitHeight / 2 * Math.min(1, 1) color: type === IconButton.Text ? "transparent" : disabled ? disabledColour : internalChecked ? activeColour : inactiveColour implicitWidth: implicitHeight implicitHeight: label.implicitHeight + padding * 2 StateLayer { id: stateLayer color: root.internalChecked ? root.activeOnColour : root.inactiveOnColour disabled: root.disabled function onClicked(): void { if (root.toggle) root.internalChecked = !root.internalChecked; root.clicked(); } } MaterialIcon { id: label anchors.centerIn: parent color: root.disabled ? root.disabledOnColour : root.internalChecked ? root.activeOnColour : root.inactiveOnColour fill: !root.toggle || root.internalChecked ? 1 : 0 Behavior on fill { Anim {} } } Behavior on radius { Anim { id: radiusAnim } } }