LINUX.ORG.RU

Меню переполнения в gtk

 ,


0

1

Проблема: есть GtkToolbar, в нем находится GtkToolItem, в который завернуто GtkMenuButton. Никак не пойму, как сделать так, что бы в меню переполнения находился объект с таки же меню, как в исходном GtkMenuButton. О существовании GtkMenuToolButton знаю, но мне нужен именно такой подход, плюс проблемы он не решает. Сжатый код, который демонстрирует проблему: постоянно вываливается

Gtk-WARNING **: gtk_menu_attach_to_widget(): menu already attached to GtkMenuButton
И после выбора меню вообще все сыпется. Код:
#include <gtk/gtk.h>
 
static gboolean 
on_create (GtkToolItem *tool_item, gpointer data) 
{
        GtkWidget *menu_button;
        GtkWidget *menu_item; 
        GtkMenu   *submenu;
 
        menu_button = gtk_bin_get_child(GTK_BIN(tool_item));
        submenu = gtk_menu_button_get_popup(GTK_MENU_BUTTON(menu_button));
        menu_item = gtk_menu_item_new_with_label ("goo!");
        gtk_menu_item_set_submenu (GTK_MENU_ITEM(menu_item), GTK_WIDGET(submenu));
 
        gtk_tool_item_set_proxy_menu_item(tool_item, "menuitem", menu_item);
 
        return TRUE;
}
 
int 
main (int argc, char ** argv) 
{
        GtkWidget    *main_window;
        GtkWidget    *toolbar;
        GtkWidget    *menu_button;
        GtkWidget    *menu;
        GtkWidget    *image;
        GtkToolItem  *tool_item;
        
        gtk_init (&argc, &argv);
        
        main_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
        gtk_window_set_title (GTK_WINDOW (main_window), "Toolbar arrow test");
        gtk_window_set_resizable (GTK_WINDOW (main_window), TRUE);
 
        menu = gtk_menu_new ();
 
        menu_button = gtk_menu_button_new ();
        image = gtk_image_new_from_file ("aaa.png");
        gtk_button_set_image (GTK_BUTTON (menu_button), image);
        gtk_menu_button_set_popup (GTK_MENU_BUTTON (menu_button), menu);
 
        tool_item = gtk_tool_item_new ();
        g_signal_connect (G_OBJECT (tool_item), "create-menu-proxy", G_CALLBACK (on_create), NULL);
        gtk_container_add (GTK_CONTAINER (tool_item), menu_button);
 
        toolbar = gtk_toolbar_new();
        gtk_toolbar_set_show_arrow (GTK_TOOLBAR (toolbar), TRUE); 
        gtk_toolbar_insert (GTK_TOOLBAR (toolbar), tool_item, 0);
 
        gtk_container_add (GTK_CONTAINER (main_window), toolbar);
        gtk_widget_show_all (main_window);
 
        gtk_main();
        
        return 0;
}



Последнее исправление: cetjs2 (всего исправлений: 2)

как сделать так, что бы в меню переполнения находился объект с таки же меню, как в исходном GtkMenuButton

Может имеет смысл в on_create делать новое меню через gtk_menu_new и скопировать в него пункты, а не менять существующему меню хозяина?

monk ★★★★★
()
Ответ на: комментарий от actics

То есть 2 хозяина у элемента быть не может?

Можно по очереди. Используй gtk_menu_detach()

А скопирвоать элемент полностью возможно?

Можешь сделать функцию, формирующую меню и вызывать её когда надо. Если у тебя пункты меню каждый раз разные, то можно копировать через gtk_container_get_children и далее рекурсивно поэлементно.

monk ★★★★★
()
Ответ на: комментарий от monk

Меню создается с помощью UIManager, если вызывать его из калбека, о ситуация та же самая. Видимо он кеширует элементы.
Детач, думаю, не пойдет, так как тогда я не знаю, как восстановить меню у кнопки, когда она вновь станет видимой.

actics
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.