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++) {
26 std::string str = YGUtils::mapKBAccel ((*it)->label());
28 entry = gtk_menu_item_new_with_mnemonic (str.c_str());
30 gtk_menu_shell_append (GTK_MENU_SHELL (parent), entry);
32 if ((*it)->hasChildren()) {
33 GtkWidget *submenu = gtk_menu_new();
34 doCreateMenu (submenu, (*it)->childrenBegin(), (*it)->childrenEnd());
35 gtk_menu_item_set_submenu (GTK_MENU_ITEM (entry), submenu);
38 g_signal_connect (G_OBJECT (entry),
"activate",
39 G_CALLBACK (selected_item_cb), *it);
47 : YMenuButton (NULL, label),
48 YGWidget (
this, parent, YGTK_TYPE_MENU_BUTTON, NULL)
52 virtual void setLabel (
const std::string &label)
54 std::string str = YGUtils::mapKBAccel (label.c_str());
55 ygtk_menu_button_set_label (YGTK_MENU_BUTTON (getWidget()), str.c_str());
56 YMenuButton::setLabel (label);
59 virtual void rebuildMenuTree()
61 GtkWidget *menu = gtk_menu_new();
62 doCreateMenu (menu, itemsBegin(), itemsEnd());
63 gtk_widget_show_all (menu);
64 ygtk_menu_button_set_popup (YGTK_MENU_BUTTON (getWidget()), menu);
67 YGWIDGET_IMPL_COMMON (YMenuButton)
70 YMenuButton *YGWidgetFactory::createMenuButton (YWidget *parent,
const std::string &label)
73 #include <YContextMenu.h> 77 int m_deactivateTimeout;
82 YGWidget (
this, NULL, GTK_TYPE_MENU, NULL)
85 m_deactivateTimeout = 0;
86 connect (getWidget(),
"deactivate", G_CALLBACK (deactivate_cb),
this);
90 virtual void rebuildMenuTree()
92 GtkWidget *menu = getWidget();
93 doCreateMenu (menu, itemsBegin(), itemsEnd());
94 gtk_widget_show_all (menu);
97 gtk_menu_popup_at_pointer (GTK_MENU (menu), NULL);
101 static void deactivate_cb (GtkMenuShell *menu,
YGContextMenu *pThis)
104 if(pThis->m_deactivateTimeout == 0)
105 pThis->m_deactivateTimeout = g_timeout_add_full (G_PRIORITY_LOW, 50, cancel_cb, pThis, NULL);
109 static gboolean cancel_cb (gpointer data)
112 if (!g_object_get_data (G_OBJECT (pThis->getWidget()),
"active"))
113 YGUI::ui()->sendEvent (
new YCancelEvent());
118 YGWIDGET_IMPL_COMMON (YContextMenu)
121 bool YGApplication::openContextMenu (
const YItemCollection &itemCollection)
124 menu->addItems (itemCollection);