| 151 void add_checkitem_widget(GtkWidget *p, int index, UiMenuItemI *item, UiObject *obj) { |
151 void add_checkitem_widget(GtkWidget *p, int index, UiMenuItemI *item, UiObject *obj) { |
| 152 UiMenuCheckItem *ci = (UiMenuCheckItem*)item; |
152 UiMenuCheckItem *ci = (UiMenuCheckItem*)item; |
| 153 GtkWidget *widget = gtk_check_menu_item_new_with_mnemonic(ci->label); |
153 GtkWidget *widget = gtk_check_menu_item_new_with_mnemonic(ci->label); |
| 154 gtk_menu_shell_append(GTK_MENU_SHELL(p), widget); |
154 gtk_menu_shell_append(GTK_MENU_SHELL(p), widget); |
| 155 |
155 |
| 156 if(ci->callback) { |
156 UiVarEventData *event = malloc(sizeof(UiVarEventData)); |
| 157 UiEventData *event = malloc(sizeof(UiEventData)); |
157 memset(event, 0, sizeof(UiVarEventData)); |
| 158 event->obj = obj; |
158 event->obj = obj; |
| 159 event->userdata = ci->userdata; |
159 event->userdata = ci->userdata; |
| 160 event->callback = ci->callback; |
160 event->callback = ci->callback; |
| 161 event->value = 0; |
161 event->var = uic_widget_var(obj->ctx, obj->ctx, NULL, ci->varname, UI_VAR_INTEGER); |
| 162 event->customdata = NULL; |
162 if(event->var) { |
| 163 |
163 UiInteger *v = event->var->value; |
| 164 g_signal_connect( |
164 v->obj = widget; |
| 165 widget, |
165 v->get = ui_checkitem_get; |
| 166 "toggled", |
166 v->set = ui_checkitem_set; |
| 167 G_CALLBACK(ui_menu_event_toggled), |
167 if(v->value != 0) { |
| 168 event); |
168 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widget), TRUE); |
| 169 g_signal_connect( |
169 } |
| 170 widget, |
170 } |
| 171 "destroy", |
171 |
| 172 G_CALLBACK(ui_destroy_userdata), |
172 g_signal_connect( |
| 173 event); |
173 widget, |
| 174 } |
174 "toggled", |
| |
175 G_CALLBACK(ui_menu_event_toggled), |
| |
176 event); |
| |
177 g_signal_connect( |
| |
178 widget, |
| |
179 "destroy", |
| |
180 G_CALLBACK(ui_destroy_userdata), |
| |
181 event); |
| |
182 } |
| |
183 |
| |
184 static void ui_menu_event_radio_item_toggled(GtkRadioMenuItem *ri, UiVarEventData *event) { |
| |
185 UiInteger *i = event->var->value; |
| |
186 |
| |
187 UiEvent evt; |
| |
188 evt.obj = event->obj; |
| |
189 evt.window = event->obj->window; |
| |
190 evt.document = event->obj->ctx->document; |
| |
191 evt.eventdata = i; |
| |
192 evt.eventdatatype = i ? UI_EVENT_DATA_INTEGER_VALUE : 0; |
| |
193 evt.intval = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(ri)); |
| |
194 |
| |
195 if(event->callback) { |
| |
196 event->callback(&evt, event->userdata); |
| |
197 } |
| |
198 |
| |
199 if(evt.intval) { |
| |
200 evt.intval = ui_get(i); |
| |
201 ui_notify_evt(i->observers, &evt); |
| |
202 } |
| |
203 } |
| |
204 |
| |
205 static void ui_destroy_menu_radio_item(GtkWidget *unused, UiVarEventData *event) { |
| |
206 if(event->customint1) { |
| |
207 uic_unbind_var(event->var); |
| |
208 } |
| |
209 free(event); |
| 175 } |
210 } |
| 176 |
211 |
| 177 void add_radioitem_widget(GtkWidget *p, int index, UiMenuItemI *item, UiObject *obj) { |
212 void add_radioitem_widget(GtkWidget *p, int index, UiMenuItemI *item, UiObject *obj) { |
| 178 // TODO |
213 UiMenuRadioItem *ri = (UiMenuRadioItem*)item; |
| |
214 |
| |
215 UiVar *var = uic_widget_var(obj->ctx, obj->ctx, NULL, ri->varname, UI_VAR_INTEGER); |
| |
216 if(!var) { |
| |
217 fprintf(stderr, "Error: menu radioitem varname is null\n"); |
| |
218 return; |
| |
219 } |
| |
220 int first = 0; |
| |
221 UiInteger *i = var->value; |
| |
222 GSList *group = i->obj; |
| |
223 GtkWidget *widget = gtk_radio_menu_item_new_with_label(group, ri->label); |
| |
224 gtk_menu_shell_append(GTK_MENU_SHELL(p), widget); |
| |
225 if(!group) { |
| |
226 i->get = ui_radioitem_get; |
| |
227 i->set = ui_radioitem_set; |
| |
228 first = 1; |
| |
229 } |
| |
230 i->obj = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(widget)); |
| |
231 |
| |
232 UiVarEventData *event = malloc(sizeof(UiVarEventData)); |
| |
233 memset(event, 0, sizeof(UiVarEventData)); |
| |
234 event->obj = obj; |
| |
235 event->var = var; |
| |
236 event->callback = ri->callback; |
| |
237 event->userdata = ri->userdata; |
| |
238 event->customint1 = first; |
| |
239 |
| |
240 g_signal_connect( |
| |
241 widget, |
| |
242 "toggled", |
| |
243 G_CALLBACK(ui_menu_event_radio_item_toggled), |
| |
244 event); |
| |
245 g_signal_connect( |
| |
246 widget, |
| |
247 "destroy", |
| |
248 G_CALLBACK(ui_destroy_menu_radio_item), |
| |
249 event); |
| 179 } |
250 } |
| 180 |
251 |
| 181 static void menuitem_list_remove_binding(void *obj) { |
252 static void menuitem_list_remove_binding(void *obj) { |
| 182 UiActiveMenuItemList *ls = obj; |
253 UiActiveMenuItemList *ls = obj; |
| 183 UiList *list = ls->var->value; |
254 UiList *list = ls->var->value; |
| 321 evt.intval = event->value; |
392 evt.intval = event->value; |
| 322 event->callback(&evt, event->userdata); |
393 event->callback(&evt, event->userdata); |
| 323 uic_set_tmp_eventdata(NULL, 0); |
394 uic_set_tmp_eventdata(NULL, 0); |
| 324 } |
395 } |
| 325 |
396 |
| 326 void ui_menu_event_toggled(GtkCheckMenuItem *ci, UiEventData *event) { |
397 void ui_menu_event_toggled(GtkCheckMenuItem *ci, UiVarEventData *event) { |
| |
398 UiInteger *i = event->var ? event->var->value : NULL; |
| |
399 |
| 327 UiEvent evt; |
400 UiEvent evt; |
| 328 evt.obj = event->obj; |
401 evt.obj = event->obj; |
| 329 evt.window = event->obj->window; |
402 evt.window = event->obj->window; |
| 330 evt.document = event->obj->ctx->document; |
403 evt.document = event->obj->ctx->document; |
| 331 evt.eventdata = NULL; |
404 evt.eventdata = i; |
| |
405 evt.eventdatatype = i ? UI_EVENT_DATA_INTEGER_VALUE : 0; |
| 332 evt.intval = gtk_check_menu_item_get_active(ci); |
406 evt.intval = gtk_check_menu_item_get_active(ci); |
| 333 event->callback(&evt, event->userdata); |
407 if(event->callback) { |
| |
408 event->callback(&evt, event->userdata); |
| |
409 } |
| |
410 |
| |
411 if(i) { |
| |
412 ui_notify_evt(i->observers, &evt); |
| |
413 } |
| 334 } |
414 } |
| 335 |
415 |
| 336 int64_t ui_checkitem_get(UiInteger *i) { |
416 int64_t ui_checkitem_get(UiInteger *i) { |
| 337 int state = gtk_check_menu_item_get_active(i->obj); |
417 int state = gtk_check_menu_item_get_active(i->obj); |
| 338 i->value = state; |
418 i->value = state; |
| 339 return state; |
419 return state; |
| 340 } |
420 } |
| 341 |
421 |
| 342 void ui_checkitem_set(UiInteger *i, int64_t value) { |
422 void ui_checkitem_set(UiInteger *i, int64_t value) { |
| 343 i->value = value; |
423 i->value = value; |
| 344 gtk_check_menu_item_set_active(i->obj, value); |
424 gtk_check_menu_item_set_active(i->obj, (gboolean)value); |
| |
425 } |
| |
426 |
| |
427 int64_t ui_radioitem_get(UiInteger *value) { |
| |
428 int selection = 0; |
| |
429 GSList *ls = value->obj; |
| |
430 guint len = g_slist_length(ls); |
| |
431 int i = 0; |
| |
432 while(ls) { |
| |
433 if(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(ls->data))) { |
| |
434 selection = len - i; |
| |
435 break; |
| |
436 } |
| |
437 ls = ls->next; |
| |
438 i++; |
| |
439 } |
| |
440 |
| |
441 value->value = selection; |
| |
442 return selection; |
| |
443 } |
| |
444 |
| |
445 void ui_radioitem_set(UiInteger *i, int64_t value) { |
| |
446 GSList *ls = i->obj; |
| |
447 |
| |
448 int len = g_slist_length(ls); |
| |
449 if(value > len) { |
| |
450 value = len; |
| |
451 } |
| |
452 int s = len - value; |
| |
453 int j = 0; |
| |
454 int unset = 1; |
| |
455 while(ls) { |
| |
456 if(j == s) { |
| |
457 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(ls->data), TRUE); |
| |
458 unset = 0; |
| |
459 break; |
| |
460 } |
| |
461 ls = ls->next; |
| |
462 j++; |
| |
463 } |
| |
464 |
| |
465 i->value = value; |
| 345 } |
466 } |
| 346 |
467 |
| 347 |
468 |
| 348 /* |
469 /* |
| 349 * widget menu functions |
470 * widget menu functions |