ui/gtk/menu.c

changeset 1039
6691e007cef7
parent 1038
832e9288f8e2
equal deleted inserted replaced
1038:832e9288f8e2 1039:6691e007cef7
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

mercurial