| 30 #include <stdlib.h> |
30 #include <stdlib.h> |
| 31 |
31 |
| 32 #include "button.h" |
32 #include "button.h" |
| 33 #include "container.h" |
33 #include "container.h" |
| 34 #include "../common/context.h" |
34 #include "../common/context.h" |
| |
35 #include "../common/action.h" |
| 35 #include <cx/mempool.h> |
36 #include <cx/mempool.h> |
| 36 |
37 |
| 37 #include <cx/linked_list.h> |
38 #include <cx/linked_list.h> |
| 38 #include <cx/array_list.h> |
39 #include <cx/array_list.h> |
| 39 #include <cx/compare.h> |
40 #include <cx/compare.h> |
| 68 UiEventData *eventdata = malloc(sizeof(UiEventData)); |
69 UiEventData *eventdata = malloc(sizeof(UiEventData)); |
| 69 eventdata->callback = args->onclick; |
70 eventdata->callback = args->onclick; |
| 70 eventdata->userdata = args->onclickdata; |
71 eventdata->userdata = args->onclickdata; |
| 71 eventdata->obj = obj; |
72 eventdata->obj = obj; |
| 72 eventdata->value = 0; |
73 eventdata->value = 0; |
| |
74 eventdata->action = args->action ? strdup(args->action) : NULL; |
| 73 XtAddCallback( |
75 XtAddCallback( |
| 74 button, |
76 button, |
| 75 XmNactivateCallback, |
77 XmNactivateCallback, |
| 76 (XtCallbackProc)ui_push_button_callback, |
78 (XtCallbackProc)ui_push_button_callback, |
| 77 eventdata); |
79 eventdata); |
| 78 XtAddCallback( |
80 XtAddCallback( |
| 79 button, |
81 button, |
| 80 XmNdestroyCallback, |
82 XmNdestroyCallback, |
| 81 (XtCallbackProc)ui_destroy_data, |
83 (XtCallbackProc)ui_destroy_event_data, |
| 82 eventdata); |
84 eventdata); |
| 83 } |
85 } |
| 84 |
86 |
| 85 |
87 |
| 86 XmStringFree(label); |
88 XmStringFree(label); |
| 93 e.window = event->obj->window; |
95 e.window = event->obj->window; |
| 94 e.document = event->obj->ctx->document; |
96 e.document = event->obj->ctx->document; |
| 95 e.intval = event->value; |
97 e.intval = event->value; |
| 96 e.set = 0; |
98 e.set = 0; |
| 97 event->callback(&e, event->userdata); |
99 event->callback(&e, event->userdata); |
| |
100 |
| |
101 if(event->action) { |
| |
102 uic_action_callback(&e, event->action); |
| |
103 } |
| 98 } |
104 } |
| 99 |
105 |
| 100 UIWIDGET ui_togglebutton_create(UiObject* obj, UiToggleArgs *args) { |
106 UIWIDGET ui_togglebutton_create(UiObject* obj, UiToggleArgs *args) { |
| 101 Arg xargs[16]; |
107 Arg xargs[16]; |
| 102 int n = 0; |
108 int n = 0; |
| 120 ui_container_add(ctn, button); |
126 ui_container_add(ctn, button); |
| 121 uic_widget_set_visibility_states(obj->ctx, button, args->visibility_states); |
127 uic_widget_set_visibility_states(obj->ctx, button, args->visibility_states); |
| 122 |
128 |
| 123 ui_set_widget_groups(obj->ctx, button, args->states); |
129 ui_set_widget_groups(obj->ctx, button, args->states); |
| 124 |
130 |
| 125 ui_bind_togglebutton(obj, button, args->varname, args->value, args->onchange, args->onchangedata, args->enable_state); |
131 ui_bind_togglebutton(obj, button, args->varname, args->value, args->onchange, args->onchangedata, args->action, args->enable_state); |
| 126 |
132 |
| 127 XmStringFree(label); |
133 XmStringFree(label); |
| 128 return button; |
134 return button; |
| 129 } |
135 } |
| 130 |
136 |
| 149 ui_container_add(ctn, button); |
155 ui_container_add(ctn, button); |
| 150 uic_widget_set_visibility_states(obj->ctx, button, args->visibility_states); |
156 uic_widget_set_visibility_states(obj->ctx, button, args->visibility_states); |
| 151 |
157 |
| 152 ui_set_widget_groups(obj->ctx, button, args->states); |
158 ui_set_widget_groups(obj->ctx, button, args->states); |
| 153 |
159 |
| 154 ui_bind_togglebutton(obj, button, args->varname, args->value, args->onchange, args->onchangedata, args->enable_state); |
160 ui_bind_togglebutton(obj, button, args->varname, args->value, args->onchange, args->onchangedata, args->action, args->enable_state); |
| 155 |
161 |
| 156 XmStringFree(label); |
162 XmStringFree(label); |
| 157 return button; |
163 return button; |
| 158 } |
164 } |
| 159 |
165 |
| 182 |
188 |
| 183 if(event->callback) { |
189 if(event->callback) { |
| 184 event->callback(&e, event->userdata); |
190 event->callback(&e, event->userdata); |
| 185 } |
191 } |
| 186 |
192 |
| |
193 if(event->action) { |
| |
194 uic_action_callback(&e, event->action); |
| |
195 } |
| |
196 |
| 187 if(event->var && event->var->value) { |
197 if(event->var && event->var->value) { |
| 188 UiInteger *v = event->var->value; |
198 UiInteger *v = event->var->value; |
| 189 v->value = e.intval; |
199 v->value = e.intval; |
| 190 ui_notify_evt(v->observers, &e); |
200 ui_notify_evt(v->observers, &e); |
| 191 } |
201 } |
| 196 Widget widget, |
206 Widget widget, |
| 197 const char *varname, |
207 const char *varname, |
| 198 UiInteger *value, |
208 UiInteger *value, |
| 199 ui_callback onchange, |
209 ui_callback onchange, |
| 200 void *onchangedata, |
210 void *onchangedata, |
| |
211 const char *action, |
| 201 int enable_state) |
212 int enable_state) |
| 202 { |
213 { |
| 203 UiVar* var = uic_widget_var(obj->ctx, obj->ctx, value, varname, UI_VAR_INTEGER); |
214 UiVar* var = uic_widget_var(obj->ctx, obj->ctx, value, varname, UI_VAR_INTEGER); |
| 204 if(var) { |
215 if(var) { |
| 205 value = (UiInteger*)var->value; |
216 value = (UiInteger*)var->value; |
| 214 |
225 |
| 215 UiVarEventData *event = malloc(sizeof(UiVarEventData)); |
226 UiVarEventData *event = malloc(sizeof(UiVarEventData)); |
| 216 event->obj = obj; |
227 event->obj = obj; |
| 217 event->callback = onchange; |
228 event->callback = onchange; |
| 218 event->userdata = onchangedata; |
229 event->userdata = onchangedata; |
| |
230 event->action = action ? strdup(action) : NULL; |
| 219 event->var = var; |
231 event->var = var; |
| 220 event->observers = NULL; |
232 event->observers = NULL; |
| 221 event->value = enable_state; |
233 event->value = enable_state; |
| 222 XtAddCallback( |
234 XtAddCallback( |
| 223 widget, |
235 widget, |
| 225 (XtCallbackProc)togglebutton_changed, |
237 (XtCallbackProc)togglebutton_changed, |
| 226 event); |
238 event); |
| 227 XtAddCallback( |
239 XtAddCallback( |
| 228 widget, |
240 widget, |
| 229 XmNdestroyCallback, |
241 XmNdestroyCallback, |
| 230 (XtCallbackProc)ui_destroy_data, |
242 (XtCallbackProc)ui_destroy_var_event_data, |
| 231 event); |
243 event); |
| 232 } |
244 } |
| 233 |
245 |
| 234 int64_t ui_togglebutton_get(UiInteger *i) { |
246 int64_t ui_togglebutton_get(UiInteger *i) { |
| 235 Widget togglebutton = i->obj; |
247 Widget togglebutton = i->obj; |
| 292 |
304 |
| 293 if(event->callback) { |
305 if(event->callback) { |
| 294 event->callback(&e, event->userdata); |
306 event->callback(&e, event->userdata); |
| 295 } |
307 } |
| 296 |
308 |
| |
309 if(event->action) { |
| |
310 uic_action_callback(&e, event->action); |
| |
311 } |
| |
312 |
| 297 if(value) { |
313 if(value) { |
| 298 ui_notify_evt(value->observers, &e); |
314 ui_notify_evt(value->observers, &e); |
| 299 } |
315 } |
| 300 } |
316 } |
| 301 |
317 |
| 302 void ui_bind_radiobutton(UiObject *obj, Widget rbutton, UiInteger *value, const char *varname, ui_callback onchange, void *onchangedata, int enable_group) { |
318 void ui_bind_radiobutton(UiObject *obj, Widget rbutton, UiInteger *value, const char *varname, ui_callback onchange, void *onchangedata, const char *action, int enable_group) { |
| 303 UiVar* var = uic_widget_var(obj->ctx, obj->ctx, value, varname, UI_VAR_INTEGER); |
319 UiVar* var = uic_widget_var(obj->ctx, obj->ctx, value, varname, UI_VAR_INTEGER); |
| 304 if(var) { |
320 if(var) { |
| 305 UiInteger *value = var->value; |
321 UiInteger *value = var->value; |
| 306 CxList *rb = value->obj; |
322 CxList *rb = value->obj; |
| 307 if(!rb) { |
323 if(!rb) { |
| 331 // other buttons in the radio button group |
347 // other buttons in the radio button group |
| 332 UiVarEventData *event = malloc(sizeof(UiVarEventData)); |
348 UiVarEventData *event = malloc(sizeof(UiVarEventData)); |
| 333 event->obj = obj; |
349 event->obj = obj; |
| 334 event->callback = onchange; |
350 event->callback = onchange; |
| 335 event->userdata = onchangedata; |
351 event->userdata = onchangedata; |
| |
352 event->action = action ? strdup(action) : NULL; |
| 336 event->observers = NULL; |
353 event->observers = NULL; |
| 337 event->var = var; |
354 event->var = var; |
| 338 event->value = enable_group; |
355 event->value = enable_group; |
| 339 XtAddCallback( |
356 XtAddCallback( |
| 340 rbutton, |
357 rbutton, |
| 402 // other buttons in the radio button group |
419 // other buttons in the radio button group |
| 403 UiVarEventData *event = malloc(sizeof(UiVarEventData)); |
420 UiVarEventData *event = malloc(sizeof(UiVarEventData)); |
| 404 event->obj = obj; |
421 event->obj = obj; |
| 405 event->callback = args->onchange; |
422 event->callback = args->onchange; |
| 406 event->userdata = args->onchangedata; |
423 event->userdata = args->onchangedata; |
| |
424 event->action = args->action ? strdup(args->action) : NULL; |
| 407 event->observers = NULL; |
425 event->observers = NULL; |
| 408 event->var = var; |
426 event->var = var; |
| 409 event->value = args->enable_state; |
427 event->value = args->enable_state; |
| 410 XtAddCallback( |
428 XtAddCallback( |
| 411 button, |
429 button, |