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);
68 void activateItem( YMenuItem * item )
71 YGUI::ui()->sendEvent(
new YMenuEvent( item ) );
75 YGWIDGET_IMPL_COMMON (YMenuButton)
78 YMenuButton *YGWidgetFactory::createMenuButton (YWidget *parent,
const std::string &label)
81 #include <YContextMenu.h>
85 int m_deactivateTimeout;
90 YGWidget (
this, NULL, GTK_TYPE_MENU, NULL)
93 m_deactivateTimeout = 0;
94 connect (getWidget(),
"deactivate", G_CALLBACK (deactivate_cb),
this);
98 virtual void rebuildMenuTree()
100 GtkWidget *menu = getWidget();
101 doCreateMenu (menu, itemsBegin(), itemsEnd());
102 gtk_widget_show_all (menu);
104 # if GTK_CHECK_VERSION (3, 22, 0)
105 gtk_menu_popup_at_pointer (GTK_MENU (menu), NULL);
107 gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL, 3, gtk_get_current_event_time());
112 static void deactivate_cb (GtkMenuShell *menu,
YGContextMenu *pThis)
115 if(pThis->m_deactivateTimeout == 0)
116 pThis->m_deactivateTimeout = g_timeout_add_full (G_PRIORITY_LOW, 50, cancel_cb, pThis, NULL);
120 static gboolean cancel_cb (gpointer data)
123 if (!g_object_get_data (G_OBJECT (pThis->getWidget()),
"active"))
124 YGUI::ui()->sendEvent (
new YCancelEvent());
129 YGWIDGET_IMPL_COMMON (YContextMenu)
132 bool YGApplication::openContextMenu (
const YItemCollection &itemCollection)
135 menu->addItems (itemCollection);