ui/gtk/menu.c

changeset 118
6d0da97105d8
parent 117
b174e721663e
equal deleted inserted replaced
117:b174e721663e 118:6d0da97105d8
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

mercurial