122 callback(&evt, cbdata); |
122 callback(&evt, cbdata); |
123 }); |
123 }); |
124 } |
124 } |
125 } |
125 } |
126 |
126 |
|
127 // for some stupid reason the ToggleSwitch is not a ToggleButton and we need to write the same |
|
128 // code again, because although everything is basically the same, it is named differently |
|
129 static void switch_register_observers(ToggleSwitch button, UiObject* obj, UiVar* var) { |
|
130 button.Toggled([button, obj, var](IInspectable const& sender, RoutedEventArgs) { |
|
131 UiInteger* i = (UiInteger*)var->value; |
|
132 UiEvent evt = ui_create_int_event(obj, i->get(i)); |
|
133 ui_notify_evt(i->observers, &evt); |
|
134 }); |
|
135 } |
|
136 |
|
137 static void switch_register_callback(ToggleSwitch button, UiObject* obj, UiToggleArgs& args) { |
|
138 ui_callback callback = args.onchange; |
|
139 void* cbdata = args.onchangedata; |
|
140 if (callback) { |
|
141 button.Toggled([button, obj, callback, cbdata](IInspectable const& sender, RoutedEventArgs) { |
|
142 UiEvent evt = ui_create_int_event(obj, button.IsOn()); |
|
143 callback(&evt, cbdata); |
|
144 }); |
|
145 } |
|
146 } |
|
147 |
|
148 |
127 static UIWIDGET create_togglebutton(UiObject *obj, ToggleButton button, UiToggleArgs args) { |
149 static UIWIDGET create_togglebutton(UiObject *obj, ToggleButton button, UiToggleArgs args) { |
128 UiObject* current = uic_current_obj(obj); |
150 UiObject* current = uic_current_obj(obj); |
129 |
151 |
130 // set label |
152 // set label |
131 set_button_label(button, args.label, args.stockid); |
153 set_button_label(button, args.label, args.stockid); |
169 } |
191 } |
170 |
192 |
171 UIWIDGET ui_checkbox_create(UiObject* obj, UiToggleArgs args) { |
193 UIWIDGET ui_checkbox_create(UiObject* obj, UiToggleArgs args) { |
172 CheckBox button = CheckBox(); |
194 CheckBox button = CheckBox(); |
173 return create_togglebutton(obj, button, args); |
195 return create_togglebutton(obj, button, args); |
|
196 } |
|
197 |
|
198 UIWIDGET ui_switch_create(UiObject* obj, UiToggleArgs args) { |
|
199 ToggleSwitch button = ToggleSwitch(); |
|
200 if (args.label) { |
|
201 wchar_t* wlabel = str2wstr(args.label, nullptr); |
|
202 button.Header(box_value(wlabel)); |
|
203 free(wlabel); |
|
204 } |
|
205 switch_register_callback(button, obj, args); |
|
206 |
|
207 UiObject* current = uic_current_obj(obj); |
|
208 |
|
209 // create toolkit wrapper object and register destructor |
|
210 UIElement elm = button; |
|
211 UiWidget* widget = new UiWidget(elm); |
|
212 ui_context_add_widget_destructor(current->ctx, widget); |
|
213 |
|
214 // bind variable |
|
215 UiVar* var = nullptr; |
|
216 if (args.value) { |
|
217 var = uic_create_value_var(current->ctx, args.value); |
|
218 } |
|
219 else if (args.varname) { |
|
220 var = uic_create_var(obj->ctx, args.varname, UI_VAR_INTEGER); |
|
221 } |
|
222 if (var) { |
|
223 UiInteger* value = (UiInteger*)var->value; |
|
224 value->obj = widget; |
|
225 value->get = ui_toggle_button_get; |
|
226 value->set = ui_toggle_button_set; |
|
227 |
|
228 // listener for notifying observers |
|
229 switch_register_observers(button, obj, var); |
|
230 } |
|
231 |
|
232 // add button to current container |
|
233 UI_APPLY_LAYOUT1(current, args); |
|
234 |
|
235 current->container->Add(button, false); |
|
236 |
|
237 return widget; |
174 } |
238 } |
175 |
239 |
176 UIWIDGET ui_radiobutton_create(UiObject* obj, UiToggleArgs args) { |
240 UIWIDGET ui_radiobutton_create(UiObject* obj, UiToggleArgs args) { |
177 RadioButton button = RadioButton(); |
241 RadioButton button = RadioButton(); |
178 |
242 |
246 ToggleButton toggleButton = widget->uielement.as<ToggleButton>(); |
310 ToggleButton toggleButton = widget->uielement.as<ToggleButton>(); |
247 toggleButton.IsChecked((bool)value); |
311 toggleButton.IsChecked((bool)value); |
248 integer->value = value; |
312 integer->value = value; |
249 } |
313 } |
250 |
314 |
|
315 extern "C" int64_t ui_switch_get(UiInteger * integer) { |
|
316 UiWidget* widget = (UiWidget*)integer->obj; |
|
317 ToggleSwitch toggleButton = widget->uielement.as<ToggleSwitch>(); |
|
318 int val = toggleButton.IsOn(); |
|
319 integer->value = val; |
|
320 return val; |
|
321 } |
|
322 |
|
323 extern "C" void ui_switch_set(UiInteger * integer, int64_t value) { |
|
324 UiWidget* widget = (UiWidget*)integer->obj; |
|
325 ToggleSwitch toggleButton = widget->uielement.as<ToggleSwitch>(); |
|
326 toggleButton.IsOn((bool)value); |
|
327 integer->value = value; |
|
328 } |
|
329 |
251 extern "C" int64_t ui_radio_button_get(UiInteger * integer) { |
330 extern "C" int64_t ui_radio_button_get(UiInteger * integer) { |
252 CxList* list = (CxList*)integer->obj; |
331 CxList* list = (CxList*)integer->obj; |
253 CxIterator i = cxListIterator(list); |
332 CxIterator i = cxListIterator(list); |
254 int selection = -1; |
333 int selection = -1; |
255 cx_foreach(UiWidget*, widget, i) { |
334 cx_foreach(UiWidget*, widget, i) { |