summaryrefslogtreecommitdiff
path: root/components/controls/IconButton.qml
diff options
context:
space:
mode:
Diffstat (limited to 'components/controls/IconButton.qml')
-rw-r--r--components/controls/IconButton.qml68
1 files changed, 68 insertions, 0 deletions
diff --git a/components/controls/IconButton.qml b/components/controls/IconButton.qml
new file mode 100644
index 0000000..7eadcc3
--- /dev/null
+++ b/components/controls/IconButton.qml
@@ -0,0 +1,68 @@
+import ".."
+import qs.services
+import qs.config
+import QtQuick
+
+StyledRect {
+ id: root
+
+ enum Type {
+ Filled,
+ Tonal,
+ Text
+ }
+
+ required property string icon
+ property bool checked
+ property bool toggle
+ property real padding: type == IconButton.Text ? Appearance.padding.small / 2 : Appearance.padding.smaller
+ property alias font: label.font
+ property int type: IconButton.Filled
+
+ property alias label: label
+
+ property bool internalChecked
+ property color activeColour: type == IconButton.Filled ? Colours.palette.m3primary : Colours.palette.m3secondary
+ property color inactiveColour: type == IconButton.Filled ? Colours.palette.m3surfaceContainer : Colours.palette.m3secondaryContainer
+ property color activeOnColour: type == IconButton.Filled ? Colours.palette.m3onPrimary : Colours.palette.m3onSecondary
+ property color inactiveOnColour: type == IconButton.Filled ? Colours.palette.m3onSurface : Colours.palette.m3onSecondaryContainer
+
+ function onClicked(): void {
+ }
+
+ onCheckedChanged: internalChecked = checked
+
+ radius: internalChecked ? Appearance.rounding.small : implicitHeight / 2
+ color: type == IconButton.Text ? "transparent" : internalChecked ? activeColour : inactiveColour
+
+ implicitWidth: implicitHeight
+ implicitHeight: label.implicitHeight + padding * 2
+
+ StateLayer {
+ color: root.internalChecked ? root.activeOnColour : root.inactiveOnColour
+
+ function onClicked(): void {
+ if (root.toggle)
+ root.internalChecked = !root.internalChecked;
+ root.onClicked();
+ }
+ }
+
+ MaterialIcon {
+ id: label
+
+ anchors.centerIn: parent
+
+ text: root.icon
+ color: root.internalChecked ? root.activeOnColour : root.inactiveOnColour
+ fill: root.internalChecked ? 1 : 0
+
+ Behavior on fill {
+ Anim {}
+ }
+ }
+
+ Behavior on radius {
+ Anim {}
+ }
+}