4pragma ComponentBehavior: Bound
7import Fluid.Private as P
8import "../core/UiMetrics.js" as UiMetrics
10import QtQuick.Templates as T
24 objectName: "menuItem"
25 readonly
property int _menuContentType: 0
56 property int variant:
MenuItem.Vertical
58 property int colorStyle:
MenuItem.Standard
60 property int groupPosition:
MenuItem.Only
62 property string supportingText:
""
64 property string trailingText:
""
66 property var badgeContent:
""
69 readonly
property bool _hasNamedIcon: icon.name.length > 0
71 readonly
property bool _hasSourceIcon: icon.source.toString().length > 0
73 readonly
property bool _hasIcon: _hasNamedIcon || _hasSourceIcon
75 readonly
property string _shortcutText: action !== null
76 ? P.ShortcutUtils.text(action.shortcut) :
""
78 readonly
property bool _hasShortcut: _shortcutText.length > 0
80 readonly
property bool _hasBadge: badgeContent !== undefined && badgeContent !== null
81 && badgeContent.toString().length > 0
83 readonly
property bool _vertical: variant ===
MenuItem.Vertical
85 readonly
property real _iconSize: _vertical ? MD.Tokens.menu.verticalIconSize
86 : MD.Tokens.menu.iconSize
88 readonly
property var _containerShape: {
90 return MD.Tokens.shape.cornerNone;
92 return MD.Tokens.menu.verticalSelectedItemShape;
93 switch (groupPosition) {
94 case MenuItem.First:
return MD.Tokens.menu.verticalFirstItemShape;
95 case MenuItem.Middle:
return MD.Tokens.menu.verticalMiddleItemShape;
96 case MenuItem.Last:
return MD.Tokens.menu.verticalLastItemShape;
97 default:
return MD.Tokens.menu.verticalOnlyItemShape;
101 readonly
property color _contentColor: {
103 return checked ? menuItem.MD.Style.onSecondaryContainerColor
104 : menuItem.MD.Style.onSurfaceColor;
105 if (colorStyle ===
MenuItem.Vibrant)
106 return checked ? menuItem.MD.Style.onTertiaryColor
107 : menuItem.MD.Style.onTertiaryContainerColor;
108 return checked ? menuItem.MD.Style.onTertiaryContainerColor
109 : menuItem.MD.Style.onSurfaceColor;
112 readonly
property color _secondaryColor: {
114 return _contentColor;
115 if (_vertical && colorStyle ===
MenuItem.Vibrant)
116 return menuItem.MD.Style.onTertiaryContainerColor;
117 return menuItem.MD.Style.onSurfaceVariantColor;
120 readonly
property real _contentOpacity: enabled ? 1 : MD.Tokens.menu.disabledContentOpacity
122 implicitWidth: Math.max(MD.Tokens.menu.minimumWidth,
123 implicitContentWidth + leftPadding + rightPadding)
124 implicitHeight: supportingText.length > 0
125 ? Math.max(_vertical ? MD.Tokens.menu.verticalItemHeight
126 : MD.
Tokens.menu.itemHeight,
127 implicitContentHeight + topPadding + bottomPadding)
128 : _vertical ? MD.
Tokens.menu.verticalItemHeight : MD.
Tokens.menu.itemHeight
129 leftPadding: _vertical ? MD.
Tokens.menu.verticalItemLeadingSpace
130 : MD.
Tokens.menu.itemHorizontalPadding
131 rightPadding: _vertical ? MD.
Tokens.menu.verticalItemTrailingSpace
132 : MD.
Tokens.menu.itemHorizontalPadding
133 topPadding: _vertical ? MD.
Tokens.menu.verticalItemTopPadding : 0
134 bottomPadding: _vertical ? MD.
Tokens.menu.verticalItemBottomPadding : 0
135 spacing: _vertical ? MD.
Tokens.menu.verticalItemBetweenSpace : MD.
Tokens.menu.iconLabelGap
137 focusPolicy: Qt.StrongFocus
138 LayoutMirroring.childrenInherit: true
139 Accessible.description: supportingText
143 readonly property int auxiliaryCount: (iconSlot.visible ? 1 : 0)
144 + (trailingLabel.visible ? 1 : 0)
145 + (badgeLabel.visible ? 1 : 0)
146 + (shortcutLabel.visible ? 1 : 0)
147 + (submenuArrow.visible ? 1 : 0)
148 readonly property real auxiliaryWidth: (iconSlot.visible ? iconSlot.width : 0)
149 + (trailingLabel.visible ? trailingLabel.implicitWidth : 0)
150 + (badgeLabel.visible ? badgeLabel.implicitWidth : 0)
151 + (shortcutLabel.visible ? shortcutLabel.implicitWidth : 0)
152 + (submenuArrow.visible ? submenuArrow.width : 0)
153 implicitWidth: auxiliaryWidth
154 + Math.max(primaryLabel.implicitWidth, supportingLabel.implicitWidth)
155 + auxiliaryCount * menuItem.spacing
156 implicitHeight: Math.max(menuItem._iconSize, labelColumn.implicitHeight)
160 spacing: menuItem.spacing
161 LayoutMirroring.enabled: menuItem.mirrored
162 LayoutMirroring.childrenInherit: true
166 objectName:
"menuItemIcon"
167 anchors.verticalCenter: parent.verticalCenter
168 width: menuItem._iconSize
169 height: menuItem._iconSize
170 visible: menuItem._hasIcon || menuItem.checkable
173 objectName:
"menuItemSelection"
174 anchors.centerIn: parent
176 iconWidth: menuItem._iconSize
177 iconHeight: menuItem._iconSize
178 color: menuItem._secondaryColor
179 opacity: menuItem._contentOpacity
180 visible: menuItem.checked
184 source: menuItem.icon.source
185 sourceSize: Qt.size(width, height)
186 fillMode: Image.PreserveAspectFit
187 opacity: menuItem._contentOpacity
188 visible: menuItem._hasSourceIcon && !menuItem.checked
191 anchors.centerIn: parent
192 name: menuItem.icon.name
193 iconWidth: menuItem._iconSize
194 iconHeight: menuItem._iconSize
195 color: menuItem._secondaryColor
196 opacity: menuItem._contentOpacity
197 visible: !menuItem._hasSourceIcon && menuItem._hasNamedIcon && !menuItem.checked
203 width: Math.max(0, menuContent.width - menuContent.auxiliaryWidth
204 - menuContent.auxiliaryCount * menuItem.spacing)
205 anchors.verticalCenter: parent.verticalCenter
209 objectName:
"menuItemLabel"
212 typescale: MD.
Tokens.typescale.labelLarge
213 color: menuItem._contentColor
214 opacity: menuItem._contentOpacity
215 horizontalAlignment: menuItem.mirrored ? Text.AlignRight : Text.AlignLeft
216 wrapMode: Text.NoWrap
217 elide: Text.ElideRight
221 objectName:
"menuItemSupportingText"
223 text: menuItem.supportingText
224 typescale: MD.
Tokens.typescale.bodySmall
225 color: menuItem._secondaryColor
226 opacity: menuItem._contentOpacity
227 horizontalAlignment: menuItem.mirrored ? Text.AlignRight : Text.AlignLeft
228 wrapMode: Text.NoWrap
229 elide: Text.ElideRight
230 visible: text.length > 0
236 objectName:
"menuItemTrailingText"
237 anchors.verticalCenter: parent.verticalCenter
238 text: menuItem.trailingText
239 typescale: MD.
Tokens.typescale.labelLarge
240 color: menuItem._secondaryColor
241 opacity: menuItem._contentOpacity
242 visible: text.length > 0
246 objectName:
"menuItemBadge"
247 anchors.verticalCenter: parent.verticalCenter
248 text: menuItem._hasBadge ? menuItem.badgeContent.toString() :
""
249 typescale: MD.
Tokens.typescale.labelSmall
250 color: menuItem._secondaryColor
251 opacity: menuItem._contentOpacity
252 visible: menuItem._hasBadge
256 objectName:
"menuItemShortcut"
257 anchors.verticalCenter: parent.verticalCenter
258 text: menuItem._shortcutText
259 typescale: MD.
Tokens.typescale.labelLarge
260 color: menuItem._secondaryColor
261 opacity: menuItem._contentOpacity
262 visible: menuItem._hasShortcut
266 objectName:
"menuItemSubmenuArrow"
267 anchors.verticalCenter: parent.verticalCenter
269 iconWidth: menuItem._iconSize
270 iconHeight: menuItem._iconSize
271 color: menuItem._secondaryColor
272 opacity: menuItem._contentOpacity
273 visible: menuItem.subMenu !== null
275 origin.x: submenuArrow.width / 2
276 xScale: menuItem.mirrored ? -1 : 1
282 background: Rectangle {
283 objectName:
"menuItemBackground"
285 if (!menuItem.checked)
286 return "transparent";
287 if (!menuItem._vertical)
288 return menuItem.MD.Style.secondaryContainerColor;
289 return menuItem.colorStyle ===
MenuItem.Vibrant
290 ? menuItem.MD.Style.tertiaryColor
291 : menuItem.MD.Style.tertiaryContainerColor;
293 topLeftRadius: UiMetrics.resolveShapeRadius(menuItem._containerShape.topLeft, width, height)
294 topRightRadius: UiMetrics.resolveShapeRadius(menuItem._containerShape.topRight, width, height)
295 bottomLeftRadius: UiMetrics.resolveShapeRadius(menuItem._containerShape.bottomLeft, width, height)
296 bottomRightRadius: UiMetrics.resolveShapeRadius(menuItem._containerShape.bottomRight, width, height)
299 objectName:
"menuItemStateLayer"
301 pressed: menuItem.pressed
302 pressX: menuItem.pressX
303 pressY: menuItem.pressY
304 color: menuItem._contentColor
305 topLeftRadius: parent.topLeftRadius
306 topRightRadius: parent.topRightRadius
307 bottomLeftRadius: parent.bottomLeftRadius
308 bottomRightRadius: parent.bottomRightRadius
310 if (!menuItem.enabled)
312 if (menuItem.pressed)
313 return MD.Tokens.menu.pressedStateLayerOpacity;
314 if (menuItem.visualFocus || menuItem.highlighted)
315 return MD.Tokens.menu.focusStateLayerOpacity;
316 if (menuItem.hovered)
317 return MD.Tokens.menu.hoverStateLayerOpacity;
Material Design 3 design tokens.
Displays text using a selectable Material 3 type scale.
Material Symbols icon tokens.