Fluid 1.3.0
Material Design for QtQuick and Qml
Loading...
Searching...
No Matches
RadioButton.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
4import QtQuick
5import QtQuick.Templates as T
6import Fluid as MD
7
22T.RadioButton {
23 id: control
24
25 Accessible.role: Accessible.RadioButton
26 Accessible.name: text
27 Accessible.checkable: true
28 Accessible.checked: checked
29 Accessible.focusable: enabled && focusPolicy !== Qt.NoFocus
30 Accessible.focused: activeFocus
31 Accessible.pressed: down
32 Accessible.onPressAction: {
33 if (control.enabled)
34 control.click();
35 }
36
38 property MD.typescale typescale: MD.Tokens.typescale.labelLarge
39
40 implicitWidth: Math.max(MD.Tokens.radioButton.minimumInteractiveSize,
41 implicitBackgroundWidth + leftInset + rightInset,
42 implicitContentWidth + leftPadding + rightPadding)
43 implicitHeight: Math.max(MD.Tokens.radioButton.minimumInteractiveSize,
44 implicitBackgroundHeight + topInset + bottomInset,
45 implicitContentHeight + topPadding + bottomPadding,
46 implicitIndicatorHeight + topPadding + bottomPadding)
47
48 padding: MD.Tokens.radioButton.contentPadding
49 spacing: MD.Tokens.radioButton.contentSpacing
50
51 hoverEnabled: true
52 focusPolicy: Qt.StrongFocus
53
54 QtObject {
55 id: state
56
57 property color iconColor: control.checked ? control.MD.Style.primaryColor
58 : control.MD.Style.onSurfaceVariantColor
59 property color labelColor: control.MD.Style.onSurfaceColor
60 property color stateLayerColor: "transparent"
61
62 property real iconOpacity: 1.0
63 property real contentOpacity: 1.0
64 property real stateLayerOpacity: 0.0
65 }
66
67 states: [
68 State {
69 name: "disabled"
70 when: !control.enabled
71
72 PropertyChanges {
73 state.iconColor: control.MD.Style.onSurfaceColor
74 state.iconOpacity: control.checked
75 ? MD.Tokens.radioButton.selectedDisabledIconOpacity
76 : MD.Tokens.radioButton.unselectedDisabledIconOpacity
77 state.contentOpacity: MD.Tokens.radioButton.unselectedDisabledIconOpacity
78 }
79 },
80 State {
81 name: "hovered"
82 when: control.hovered && control.enabled && !control.down
83
84 PropertyChanges {
85 state.iconColor: control.checked ? control.MD.Style.primaryColor
86 : control.MD.Style.onSurfaceColor
87 state.stateLayerColor: control.checked ? control.MD.Style.primaryColor
88 : control.MD.Style.onSurfaceColor
89 state.stateLayerOpacity: MD.Tokens.radioButton.hoverStateLayerOpacity
90 }
91 },
92 State {
93 name: "focused"
94 when: control.visualFocus && control.enabled && !control.down
95
96 PropertyChanges {
97 state.iconColor: control.checked ? control.MD.Style.primaryColor
98 : control.MD.Style.onSurfaceColor
99 state.stateLayerColor: control.checked ? control.MD.Style.primaryColor
100 : control.MD.Style.onSurfaceColor
101 state.stateLayerOpacity: MD.Tokens.radioButton.focusStateLayerOpacity
102 }
103 },
104 State {
105 name: "pressed"
106 when: control.down && control.enabled
107
108 PropertyChanges {
109 state.iconColor: control.checked ? control.MD.Style.primaryColor
110 : control.MD.Style.onSurfaceColor
111 state.stateLayerColor: control.checked ? control.MD.Style.primaryColor
112 : control.MD.Style.onSurfaceColor
113 state.stateLayerOpacity: MD.Tokens.radioButton.pressedStateLayerOpacity
114 }
115 }
116 ]
117
118 indicator: MD.RadioIndicator {
119 id: radioIndicator
120
121 x: control.text
122 ? (control.mirrored ? control.width - width - control.rightPadding
123 : control.leftPadding)
124 : control.leftPadding + (control.availableWidth - width) / 2
125 y: control.topPadding + (control.availableHeight - height) / 2
126
127 control: control
128 color: state.iconColor
129 opacity: state.iconOpacity
130
131 MD.Ripple {
132 objectName: "radioStateLayer"
133 anchors.centerIn: parent
134 width: MD.Tokens.radioButton.stateLayerSize
135 height: width
136 radius: width / 2
137 pressX: width / 2
138 pressY: height / 2
139 pressed: control.pressed
140 stateOpacity: state.stateLayerOpacity
141 color: state.stateLayerColor
142 }
143 }
144
145 contentItem: MD.Label {
146 Accessible.ignored: true
147
148 leftPadding: control.indicator && !control.mirrored
149 ? control.indicator.width + control.spacing : 0
150 rightPadding: control.indicator && control.mirrored
151 ? control.indicator.width + control.spacing : 0
152
153 text: control.text
154 typescale: control.typescale
155 color: state.labelColor
156 opacity: state.contentOpacity
157 elide: Text.ElideRight
158 verticalAlignment: Text.AlignVCenter
159 }
160}
Material Design 3 design tokens.
Definition tokens.h:65
Displays text using a selectable Material 3 type scale.
Definition Label.qml:15