ui/gtk/menu.c

changeset 859
c13653b1cc9d
parent 852
a04cb4398034
child 890
8d30cbd1c465
equal deleted inserted replaced
858:52d05b12ea87 859:c13653b1cc9d
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,

mercurial