| 411 int index = 0; |
411 int index = 0; |
| 412 int index_section = 0; |
412 int index_section = 0; |
| 413 GMenu *section = NULL; |
413 GMenu *section = NULL; |
| 414 while(it) { |
414 while(it) { |
| 415 if(it->type == UI_MENU_SEPARATOR) { |
415 if(it->type == UI_MENU_SEPARATOR) { |
| |
416 if(section) { |
| |
417 g_object_unref(section); |
| |
418 } |
| 416 section = g_menu_new(); |
419 section = g_menu_new(); |
| 417 g_menu_append_section(parent, NULL, G_MENU_MODEL(section)); |
420 g_menu_append_section(parent, NULL, G_MENU_MODEL(section)); |
| 418 index++; |
421 index++; |
| 419 index_section = 0; |
422 index_section = 0; |
| 420 } else { |
423 } else { |
| 424 createMenuItem[it->type](parent, index++, it, obj); |
427 createMenuItem[it->type](parent, index++, it, obj); |
| 425 } |
428 } |
| 426 } |
429 } |
| 427 it = it->next; |
430 it = it->next; |
| 428 } |
431 } |
| |
432 if(section) { |
| |
433 g_object_unref(section); |
| |
434 } |
| 429 } |
435 } |
| 430 |
436 |
| 431 void ui_gmenu_add_menu(GMenu *parent, int index, UiMenuItemI *item, UiObject *obj) { |
437 void ui_gmenu_add_menu(GMenu *parent, int index, UiMenuItemI *item, UiObject *obj) { |
| 432 UiMenu *mi = (UiMenu*)item; |
438 UiMenu *mi = (UiMenu*)item; |
| 433 GMenu *menu = g_menu_new(); |
439 GMenu *menu = g_menu_new(); |
| 434 ui_gmenu_add_menu_items(menu, 0, mi, obj); |
440 ui_gmenu_add_menu_items(menu, 0, mi, obj); |
| 435 g_menu_append_submenu(parent, mi->label, G_MENU_MODEL(menu)); |
441 g_menu_append_submenu(parent, mi->label, G_MENU_MODEL(menu)); |
| |
442 g_object_unref(menu); |
| 436 } |
443 } |
| 437 |
444 |
| 438 static void action_enable(GSimpleAction *action, int enabled) { |
445 static void action_enable(GSimpleAction *action, int enabled) { |
| 439 g_simple_action_set_enabled(action, enabled); |
446 g_simple_action_set_enabled(action, enabled); |
| 440 } |
447 } |
| 442 void ui_gmenu_add_menuitem(GMenu *parent, int index, UiMenuItemI *item, UiObject *obj) { |
449 void ui_gmenu_add_menuitem(GMenu *parent, int index, UiMenuItemI *item, UiObject *obj) { |
| 443 UiMenuItem *i = (UiMenuItem*)item; |
450 UiMenuItem *i = (UiMenuItem*)item; |
| 444 |
451 |
| 445 GSimpleAction *action = g_simple_action_new(item->id, NULL); |
452 GSimpleAction *action = g_simple_action_new(item->id, NULL); |
| 446 g_action_map_add_action(obj->ctx->action_map, G_ACTION(action)); |
453 g_action_map_add_action(obj->ctx->action_map, G_ACTION(action)); |
| |
454 g_object_unref(action); |
| 447 |
455 |
| 448 if(i->groups) { |
456 if(i->groups) { |
| 449 CxList *groups = cxArrayListCreateSimple(sizeof(int), i->ngroups); |
457 CxList *groups = cxArrayListCreateSimple(sizeof(int), i->ngroups); |
| 450 cxListAddArray(groups, i->groups, i->ngroups); |
458 cxListAddArray(groups, i->groups, i->ngroups); |
| 451 uic_add_group_widget(obj->ctx, action, (ui_enablefunc)action_enable, groups); |
459 uic_add_group_widget(obj->ctx, action, (ui_enablefunc)action_enable, groups); |
| 472 G_CALLBACK(ui_destroy_userdata), |
480 G_CALLBACK(ui_destroy_userdata), |
| 473 event); |
481 event); |
| 474 } |
482 } |
| 475 |
483 |
| 476 char action_name[32]; |
484 char action_name[32]; |
| 477 snprintf(action_name, 32, "win.%s", item->id); |
485 snprintf(action_name, 32, "win.%s", item->id); |
| |
486 |
| 478 g_menu_append(parent, i->label, action_name); |
487 g_menu_append(parent, i->label, action_name); |
| 479 } |
488 } |
| 480 |
489 |
| 481 void ui_gmenu_add_menuseparator(GMenu *p, int index, UiMenuItemI *item, UiObject *obj) { |
490 void ui_gmenu_add_menuseparator(GMenu *p, int index, UiMenuItemI *item, UiObject *obj) { |
| 482 |
491 |
| 612 GAction *action = g_action_map_lookup_action(obj->ctx->action_map, i->varname); |
621 GAction *action = g_action_map_lookup_action(obj->ctx->action_map, i->varname); |
| 613 if(!action) { |
622 if(!action) { |
| 614 GVariant *state = g_variant_new_string("0"); |
623 GVariant *state = g_variant_new_string("0"); |
| 615 GSimpleAction *newAction = g_simple_action_new_stateful(i->varname, G_VARIANT_TYPE_STRING, state); |
624 GSimpleAction *newAction = g_simple_action_new_stateful(i->varname, G_VARIANT_TYPE_STRING, state); |
| 616 g_action_map_add_action(obj->ctx->action_map, G_ACTION(newAction)); |
625 g_action_map_add_action(obj->ctx->action_map, G_ACTION(newAction)); |
| |
626 g_object_unref(newAction); |
| 617 |
627 |
| 618 group = create_radio_group(obj, i, newAction); |
628 group = create_radio_group(obj, i, newAction); |
| 619 g_object_set_data(G_OBJECT(newAction), "ui_radiogroup", group); |
629 g_object_set_data(G_OBJECT(newAction), "ui_radiogroup", group); |
| 620 |
630 |
| 621 g_signal_connect( |
631 g_signal_connect( |
| 673 ls->oldcount = 0; |
683 ls->oldcount = 0; |
| 674 ls->getvalue = il->getvalue; |
684 ls->getvalue = il->getvalue; |
| 675 |
685 |
| 676 GSimpleAction *action = g_simple_action_new(item->id, g_variant_type_new("i")); |
686 GSimpleAction *action = g_simple_action_new(item->id, g_variant_type_new("i")); |
| 677 g_action_map_add_action(obj->ctx->action_map, G_ACTION(action)); |
687 g_action_map_add_action(obj->ctx->action_map, G_ACTION(action)); |
| |
688 g_object_unref(action); |
| 678 snprintf(ls->action, 32, "win.%s", item->id); |
689 snprintf(ls->action, 32, "win.%s", item->id); |
| 679 |
690 |
| 680 UiVar* var = uic_create_var(ui_global_context(), il->varname, UI_VAR_LIST); |
691 UiVar* var = uic_create_var(ui_global_context(), il->varname, UI_VAR_LIST); |
| 681 //UiVar* var = uic_create_var(obj->ctx, il->varname, UI_VAR_LIST); |
692 //UiVar* var = uic_create_var(obj->ctx, il->varname, UI_VAR_LIST); |
| 682 ls->var = var; |
693 ls->var = var; |
| 786 |
797 |
| 787 GMenuItem *item = g_menu_item_new(label, NULL); |
798 GMenuItem *item = g_menu_item_new(label, NULL); |
| 788 GVariant *v = g_variant_new("i", i); |
799 GVariant *v = g_variant_new("i", i); |
| 789 g_menu_item_set_action_and_target_value(item, list->action, v); |
800 g_menu_item_set_action_and_target_value(item, list->action, v); |
| 790 g_menu_insert_item(list->menu, list->index+i, item); |
801 g_menu_insert_item(list->menu, list->index+i, item); |
| |
802 g_object_unref(item); |
| 791 |
803 |
| 792 elm = ui_list_next(ls); |
804 elm = ui_list_next(ls); |
| 793 i++; |
805 i++; |
| 794 } |
806 } |
| 795 |
807 |
| 805 |
817 |
| 806 UIMENU ui_contextmenu_create(UiMenuBuilder *builder, UiObject *obj, GtkWidget *widget) { |
818 UIMENU ui_contextmenu_create(UiMenuBuilder *builder, UiObject *obj, GtkWidget *widget) { |
| 807 GMenu *menu = g_menu_new(); |
819 GMenu *menu = g_menu_new(); |
| 808 ui_gmenu_add_menu_items(menu, 0, builder->menus_begin, obj); |
820 ui_gmenu_add_menu_items(menu, 0, builder->menus_begin, obj); |
| 809 GtkWidget *contextmenu = gtk_popover_menu_new_from_model(G_MENU_MODEL(menu)); |
821 GtkWidget *contextmenu = gtk_popover_menu_new_from_model(G_MENU_MODEL(menu)); |
| |
822 g_object_unref(menu); |
| 810 gtk_popover_set_has_arrow(GTK_POPOVER(contextmenu), FALSE); |
823 gtk_popover_set_has_arrow(GTK_POPOVER(contextmenu), FALSE); |
| 811 gtk_widget_set_halign(contextmenu, GTK_ALIGN_START); |
824 gtk_widget_set_halign(contextmenu, GTK_ALIGN_START); |
| 812 gtk_widget_set_parent(GTK_WIDGET(contextmenu), widget); |
825 gtk_widget_set_parent(GTK_WIDGET(contextmenu), widget); |
| 813 g_signal_connect( |
826 g_signal_connect( |
| 814 widget, |
827 widget, |