@@ -107,3 +107,105 @@ function ui.Grid:_encode_fields()
107
107
108
108
return ui ._encode (" SZ" , ui .Elem ._encode_fields (self ), ui ._encode_flags (fl ))
109
109
end
110
+
111
+ ui .Button = ui ._new_type (ui .Elem , " button" , 0x05 , true )
112
+
113
+ function ui .Button :new (props )
114
+ ui .Elem .new (self , props )
115
+
116
+ self ._disabled = props .disabled
117
+ self ._on_press = props .on_press
118
+ end
119
+
120
+ function ui .Button :_encode_fields ()
121
+ local fl = ui ._make_flags ()
122
+
123
+ ui ._shift_flag (fl , self ._disabled )
124
+ ui ._shift_flag (fl , self ._on_press )
125
+
126
+ return ui ._encode (" SZ" , ui .Elem ._encode_fields (self ), ui ._encode_flags (fl ))
127
+ end
128
+
129
+ ui .Button ._handlers [0x00 ] = function (self , ev , data )
130
+ if self ._disabled then
131
+ return nil
132
+ end
133
+ return self ._on_press
134
+ end
135
+
136
+ ui .Toggle = ui ._new_type (ui .Elem , " toggle" , 0x06 , true )
137
+
138
+ ui .Check = ui .derive_elem (ui .Toggle , " check" )
139
+ ui .Switch = ui .derive_elem (ui .Toggle , " switch" )
140
+
141
+ function ui .Toggle :new (props )
142
+ ui .Elem .new (self , props )
143
+
144
+ self ._disabled = props .disabled
145
+ self ._locked = props .locked
146
+ self ._family = props .family
147
+
148
+ self ._selected = props .selected
149
+
150
+ self ._on_press = props .on_press
151
+ self ._on_change = props .on_change
152
+
153
+ if self ._family then
154
+ assert (ui .is_id (self ._family ), " Element family must be an ID string" )
155
+ end
156
+ end
157
+
158
+ function ui .Toggle :_encode_fields ()
159
+ local fl = ui ._make_flags ()
160
+
161
+ ui ._shift_flag (fl , self ._disabled )
162
+ ui ._shift_flag (fl , self ._locked )
163
+
164
+ if ui ._shift_flag (fl , self ._family ) then
165
+ ui ._encode_flag (fl , " z" , self ._family )
166
+ end
167
+ if ui ._shift_flag (fl , self ._selected ~= nil ) then
168
+ ui ._shift_flag (fl , self ._selected )
169
+ end
170
+
171
+ ui ._shift_flag (fl , self ._on_press )
172
+ ui ._shift_flag (fl , self ._on_change )
173
+
174
+ return ui ._encode (" SZ" , ui .Elem ._encode_fields (self ), ui ._encode_flags (fl ))
175
+ end
176
+
177
+ local function on_select (self , ev , data , handler )
178
+ local selected = ui ._decode (" B" , data )
179
+ ev .selected = selected ~= 0
180
+
181
+
182
+ return handler
183
+ end
184
+
185
+ ui .Toggle ._handlers [0x00 ] = function (self , ev , data )
186
+ local selected = ui ._decode (" B" , data )
187
+ ev .selected = selected ~= 0
188
+
189
+ if self ._disabled then
190
+ -- It's impossible press a disabled radio button.
191
+ return nil
192
+ elseif self ._locked and not ev .selected then
193
+ -- It's also impossible to deselect a radio button that's locked.
194
+ return nil
195
+ end
196
+
197
+ return self ._on_press
198
+ end
199
+
200
+ ui .Toggle ._handlers [0x01 ] = function (self , ev , data )
201
+ local selected = ui ._decode (" B" , data )
202
+ ev .selected = selected ~= 0
203
+
204
+ if self ._disabled and self ._selected then
205
+ -- It's impossible to select a disabled radio button, but it's possible
206
+ -- for one to be deselected in a family.
207
+ return nil
208
+ end
209
+
210
+ return self ._on_change
211
+ end
0 commit comments