Fluid 1.3.0
Material Design for QtQuick and Qml
Loading...
Searching...
No Matches
Badge.qml
Go to the documentation of this file.
1// SPDX-FileCopyrightText: 2026 Pier Luigi Fiorini <pierluigi.fiorini@gmail.com>
2// SPDX-License-Identifier: MPL-2.0
3
4pragma ComponentBehavior: Bound
5
6import QtQuick
7import QtQuick.Templates as T
8import Fluid as MD
9import Fluid.Private as Private
10import "../core/BadgeContent.js" as BadgeContent
11import "../core/UiMetrics.js" as UiMetrics
12
88T.Control {
89 id: control
90
92 enum Variant { Auto, Small, Large }
93
95 property int variant: MD.Badge.Auto
96
98 property real count: -1
99
101 property string text: ""
102
104 property MD.typescale typescale: MD.Tokens.typescale.labelSmall
105
107 property color containerColor: control.MD.Style.errorColor
108
110 property color contentColor: control.MD.Style.onErrorColor
111
113 property string accessibleDescription: _defaultAccessibleDescription
114
116 readonly property string _defaultAccessibleDescription: text.length > 0 ? text
117 : BadgeContent.isValidCount(count) ? count.toLocaleString(locale, "f", 0)
118 : qsTr("New notification")
119
120
121 readonly property int effectiveVariant: variant === MD.Badge.Auto
122 ? (text.length > 0 || BadgeContent.isValidCount(count) ? MD.Badge.Large : MD.Badge.Small)
123 : variant
124
126 readonly property string displayText: {
127 if (effectiveVariant === MD.Badge.Small)
128 return "";
129 if (text.length > 0)
130 return Private.BadgeText.elide(text, MD.Tokens.badge.maximumCharacters);
131 if (!BadgeContent.isValidCount(count))
132 return "";
133 const maximum = MD.Tokens.badge.maximumCount;
134 return Math.min(count, maximum).toLocaleString(locale, "f", 0)
135 + (count > maximum ? "+" : "");
136 }
137
138 readonly property MD.shapeValue _containerShape: effectiveVariant === MD.Badge.Small
139 ? MD.Tokens.badge.shape : MD.Tokens.badge.largeShape
140
141 font.family: typescale.face === MD.Style.TypeFace.Brand
142 ? control.MD.Style.brandFontFamily : control.MD.Style.plainFontFamily
143 font.pixelSize: typescale.fontSize
144 font.weight: typescale.fontWeight
145 font.letterSpacing: typescale.tracking
146
147 implicitWidth: Math.max(implicitHeight,
148 implicitBackgroundWidth + leftInset + rightInset,
149 (effectiveVariant === MD.Badge.Small ? 0 : implicitContentWidth)
150 + leftPadding + rightPadding)
151 implicitHeight: Math.max(effectiveVariant === MD.Badge.Small
152 ? MD.Tokens.badge.size : MD.Tokens.badge.largeSize,
153 implicitBackgroundHeight + topInset + bottomInset,
154 (effectiveVariant === MD.Badge.Small ? 0 : implicitContentHeight)
155 + topPadding + bottomPadding)
156 leftPadding: effectiveVariant === MD.Badge.Small ? 0 : MD.Tokens.badge.horizontalPadding
157 rightPadding: leftPadding
158 topPadding: 0
159 bottomPadding: 0
160 // Control otherwise consumes pointer/touch events above its host. Badge has
161 // no disabled visual state, so disabling input preserves the passive visual.
162 enabled: false
163 hoverEnabled: false
164 wheelEnabled: false
165 focusPolicy: Qt.NoFocus
166 Accessible.ignored: true
167
168 FontMetrics {
169 id: fontMetrics
170 font: control.font
171 }
172
173 contentItem: Text {
174 objectName: "badgeLabel"
175 text: control.displayText
176 font: control.font
177 color: control.contentColor
178 textFormat: Text.PlainText
179 horizontalAlignment: Text.AlignHCenter
180 verticalAlignment: Text.AlignVCenter
181 wrapMode: Text.NoWrap
182 lineHeight: Math.max(control.typescale.lineHeight, fontMetrics.height)
183 lineHeightMode: Text.FixedHeight
184 Accessible.ignored: true
185 }
186
187 background: Rectangle {
188 objectName: "badgeBackground"
189 color: control.containerColor
190 topLeftRadius: UiMetrics.resolveShapeRadius(control._containerShape.topLeft, width, height)
191 topRightRadius: UiMetrics.resolveShapeRadius(control._containerShape.topRight, width, height)
192 bottomLeftRadius: UiMetrics.resolveShapeRadius(control._containerShape.bottomLeft, width, height)
193 bottomRightRadius: UiMetrics.resolveShapeRadius(control._containerShape.bottomRight, width, height)
194 Accessible.ignored: true
195 }
196}
Material Design 3 design tokens.
Definition tokens.h:71
Immutable Material Design 3 badge metrics.
Definition badge.h:20
qreal maximumCount
Definition badge.h:34