5 #define YUILogComponent "gtk"
6 #include <yui/Libyui_config.h>
10 #include "YMenuButton.h"
11 #include "ygtkmenubutton.h"
13 static void selected_item_cb (GtkMenuItem *menuitem, YItem *item)
16 GtkWidget *menu = gtk_widget_get_ancestor (GTK_WIDGET (menuitem), GTK_TYPE_MENU);
17 g_object_set_data (G_OBJECT (menu),
"active", menuitem);
19 YGUI::ui()->sendEvent (
new YMenuEvent (item));
22 static void doCreateMenu (GtkWidget *parent, YItemIterator begin, YItemIterator end)
24 for (YItemIterator it = begin; it != end; it++) {
25 GtkWidget *entry, *image = 0;
26 std::string str = YGUtils::mapKBAccel ((*it)->label());
28 if ((*it)->hasIconName()) {
29 GdkPixbuf *pixbuf = YGUtils::loadPixbuf ((*it)->iconName());
31 image = gtk_image_new_from_pixbuf (pixbuf);
32 g_object_unref (G_OBJECT (pixbuf));
36 const char *stock = YGUtils::mapStockIcon (str);
38 image = gtk_image_new_from_stock (stock, GTK_ICON_SIZE_MENU);
42 entry = gtk_image_menu_item_new_with_mnemonic (str.c_str());
43 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (entry), image);
46 entry = gtk_menu_item_new_with_mnemonic (str.c_str());
48 gtk_menu_shell_append (GTK_MENU_SHELL (parent), entry);
50 if ((*it)->hasChildren()) {
51 GtkWidget *submenu = gtk_menu_new();
52 doCreateMenu (submenu, (*it)->childrenBegin(), (*it)->childrenEnd());
53 gtk_menu_item_set_submenu (GTK_MENU_ITEM (entry), submenu);
56 g_signal_connect (G_OBJECT (entry),
"activate",
57 G_CALLBACK (selected_item_cb), *it);
65 : YMenuButton (NULL, label),
66 YGWidget (
this, parent, YGTK_TYPE_MENU_BUTTON, NULL)
70 virtual void setLabel (
const std::string &label)
72 std::string str = YGUtils::mapKBAccel (label.c_str());
73 ygtk_menu_button_set_label (YGTK_MENU_BUTTON (getWidget()), str.c_str());
74 YMenuButton::setLabel (label);
77 virtual void rebuildMenuTree()
79 GtkWidget *menu = gtk_menu_new();
80 doCreateMenu (menu, itemsBegin(), itemsEnd());
81 gtk_widget_show_all (menu);
82 ygtk_menu_button_set_popup (YGTK_MENU_BUTTON (getWidget()), menu);
85 YGWIDGET_IMPL_COMMON (YMenuButton)
88 YMenuButton *YGWidgetFactory::createMenuButton (YWidget *parent,
const std::string &label)
91 #include <YContextMenu.h>
95 int m_deactivateTimeout;
100 YGWidget (
this, NULL, GTK_TYPE_MENU, NULL)
103 m_deactivateTimeout = 0;
104 connect (getWidget(),
"deactivate", G_CALLBACK (deactivate_cb),
this);
108 virtual void rebuildMenuTree()
110 GtkWidget *menu = getWidget();
111 doCreateMenu (menu, itemsBegin(), itemsEnd());
112 gtk_widget_show_all (menu);
113 gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL, 3, gtk_get_current_event_time());
117 static void deactivate_cb (GtkMenuShell *menu,
YGContextMenu *pThis)
120 if(pThis->m_deactivateTimeout == 0)
121 pThis->m_deactivateTimeout = g_timeout_add_full (G_PRIORITY_LOW, 50, cancel_cb, pThis, NULL);
125 static gboolean cancel_cb (gpointer data)
128 if (!g_object_get_data (G_OBJECT (pThis->getWidget()),
"active"))
129 YGUI::ui()->sendEvent (
new YCancelEvent());
134 YGWIDGET_IMPL_COMMON (YContextMenu)
137 bool YGApplication::openContextMenu (
const YItemCollection &itemCollection)
140 menu->addItems (itemCollection);