| 179 "destroy", |
179 "destroy", |
| 180 G_CALLBACK(ui_destroy_userdata), |
180 G_CALLBACK(ui_destroy_userdata), |
| 181 event); |
181 event); |
| 182 } |
182 } |
| 183 |
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); |
| |
210 } |
| |
211 |
| 184 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) { |
| 185 // 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); |
| 186 } |
250 } |
| 187 |
251 |
| 188 static void menuitem_list_remove_binding(void *obj) { |
252 static void menuitem_list_remove_binding(void *obj) { |
| 189 UiActiveMenuItemList *ls = obj; |
253 UiActiveMenuItemList *ls = obj; |
| 190 UiList *list = ls->var->value; |
254 UiList *list = ls->var->value; |
| 356 } |
420 } |
| 357 |
421 |
| 358 void ui_checkitem_set(UiInteger *i, int64_t value) { |
422 void ui_checkitem_set(UiInteger *i, int64_t value) { |
| 359 i->value = value; |
423 i->value = value; |
| 360 gtk_check_menu_item_set_active(i->obj, (gboolean)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; |
| 361 } |
466 } |
| 362 |
467 |
| 363 |
468 |
| 364 /* |
469 /* |
| 365 * widget menu functions |
470 * widget menu functions |