82 lines
2.6 KiB
QML
82 lines
2.6 KiB
QML
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
|
|
}
|
|
}
|
|
}
|