Fluid 1.3.0
Material Design for QtQuick and Qml
Loading...
Searching...
No Matches
SegmentedButton.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 "../internal"
10import "../core/UiMetrics.js" as UiMetrics
11
55T.Button {
56 id: control
57
59 property MD.typescale typescale: MD.Tokens.segmentedButton.labelTextFont
60
67 property bool showCheckmark: true
68
73 property color containerColor: checked ? control.MD.Style.secondaryContainerColor : "transparent"
74
81 property color contentColor: !enabled
82 ? Qt.alpha(control.MD.Style.onSurfaceColor, MD.Tokens.segmentedButton.disabledContentOpacity)
83 : (checked ? control.MD.Style.onSecondaryContainerColor : control.MD.Style.onSurfaceColor)
84
89 property color outlineColor: enabled ? control.MD.Style.outlineColor
90 : Qt.alpha(control.MD.Style.onSurfaceColor, MD.Tokens.segmentedButton.disabledOutlineOpacity)
91
97 property color stateLayerColor: checked ? control.MD.Style.onSecondaryContainerColor : control.MD.Style.onSurfaceColor
98
99 property var __segmentedButtonGroup: null
100 property bool __leftEnd: true
101 property bool __rightEnd: true
102 readonly property bool __mirrored: __segmentedButtonGroup ? __segmentedButtonGroup.mirrored : mirrored
103 readonly property real __stateLayerOpacity: !enabled ? 0
104 : down ? MD.Tokens.segmentedButton.pressedStateLayerOpacity
105 : visualFocus ? MD.Tokens.segmentedButton.focusStateLayerOpacity
106 : hovered ? MD.Tokens.segmentedButton.hoverStateLayerOpacity : 0
107
108 implicitWidth: Math.max(MD.Tokens.segmentedButton.minimumInteractiveSize,
109 implicitContentWidth + leftPadding + rightPadding)
110 implicitHeight: Math.max(MD.Tokens.segmentedButton.minimumInteractiveSize,
111 implicitContentHeight + topPadding + bottomPadding,
112 MD.Tokens.segmentedButton.containerHeight + topInset + bottomInset)
113 leftPadding: MD.Tokens.segmentedButton.contentPadding
114 rightPadding: MD.Tokens.segmentedButton.contentPadding
115 topPadding: topInset
116 bottomPadding: bottomInset
117 topInset: (MD.Tokens.segmentedButton.minimumInteractiveSize - MD.Tokens.segmentedButton.containerHeight) / 2
118 bottomInset: topInset
119 leftInset: 0
120 rightInset: 0
121 spacing: MD.Tokens.segmentedButton.contentSpacing
122 icon.width: MD.Tokens.segmentedButton.iconSize
123 icon.height: MD.Tokens.segmentedButton.iconSize
124 icon.color: contentColor
125 font.family: typescale.face === MD.Style.TypeFace.Brand ? control.MD.Style.brandFontFamily : control.MD.Style.plainFontFamily
126 font.pixelSize: typescale.fontSize
127 font.weight: typescale.fontWeight
128 font.letterSpacing: typescale.tracking
129 checkable: true
130 autoExclusive: false
131 hoverEnabled: true
132 focusPolicy: Qt.StrongFocus
133
134 Accessible.role: __segmentedButtonGroup && __segmentedButtonGroup.selectionMode === MD.SegmentedButtonGroup.SingleSelection
135 ? Accessible.RadioButton : Accessible.CheckBox
136 Accessible.name: text
137 Accessible.checkable: true
138 Accessible.checked: checked
139 Accessible.focusable: enabled && focusPolicy !== Qt.NoFocus
140 Accessible.focused: activeFocus
141 Accessible.pressed: down
142 Accessible.onPressAction: {
143 if (control.enabled && control.visible)
144 control.click();
145 }
146
147 onCheckedChanged: {
148 if (__segmentedButtonGroup)
149 __segmentedButtonGroup.__childCheckedChanged(control);
150 }
151 onActiveFocusChanged: {
152 if (activeFocus && __segmentedButtonGroup)
153 __segmentedButtonGroup.__childFocused(control);
154 }
155 onVisibleChanged: {
156 if (__segmentedButtonGroup)
157 __segmentedButtonGroup.__scheduleSync();
158 }
159 onEnabledChanged: {
160 if (__segmentedButtonGroup)
161 __segmentedButtonGroup.__scheduleSync();
162 }
163 onImplicitWidthChanged: {
164 if (__segmentedButtonGroup)
165 __segmentedButtonGroup.__scheduleSync();
166 }
167 onImplicitHeightChanged: {
168 if (__segmentedButtonGroup)
169 __segmentedButtonGroup.__scheduleSync();
170 }
171 Keys.onPressed: event => {
172 if (__segmentedButtonGroup && __segmentedButtonGroup.__handleKey(control, event))
173 event.accepted = true;
174 else if (event.key === Qt.Key_Return || event.key === Qt.Key_Enter) {
175 if (!event.isAutoRepeat)
176 control.click();
177 event.accepted = true;
178 }
179 }
180
181 contentItem: SegmentedButtonContent {
182 text: control.text
183 iconName: control.icon.name
184 iconSource: control.icon.source
185 iconWidth: control.icon.width
186 iconHeight: control.icon.height
187 checked: control.checked
188 showCheckmark: control.showCheckmark
189 mirrored: control.__mirrored
190 textFont: control.font
191 lineHeight: control.typescale.lineHeight
192 contentColor: control.contentColor
193 iconColor: control.icon.color
194 spacing: control.spacing
195 indicatorSize: MD.Tokens.segmentedButton.iconSize
196 }
197
198 background: SegmentedButtonBackground {
199 implicitHeight: MD.Tokens.segmentedButton.containerHeight
200 containerColor: control.containerColor
201 outlineColor: control.outlineColor
202 stateLayerColor: control.stateLayerColor
203 stateLayerOpacity: control.__stateLayerOpacity
204 outlineWidth: MD.Tokens.segmentedButton.outlineWidth
205 leftRadius: control.__leftEnd ? UiMetrics.resolveShapeRadius(MD.Tokens.segmentedButton.containerShape.topLeft, width, height) : 0
206 rightRadius: control.__rightEnd ? UiMetrics.resolveShapeRadius(MD.Tokens.segmentedButton.containerShape.topRight, width, height) : 0
207 drawLeftOutline: control.__leftEnd
208 }
209}
Material Design 3 design tokens.
Definition tokens.h:68
Material Design 3 checkbox tokens.
Definition checkbox.h:20
Material Design 3 radio-button tokens.
Definition radiobutton.h:20