ui/winui/button.cpp

branch
newapi
changeset 191
6113ed66d258
parent 189
4daddc326877
child 192
bcacd00ea955
equal deleted inserted replaced
190:70fd1b24e395 191:6113ed66d258
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) {

mercurial