26 #include <yui/gtk/YGi18n.h>
28 #define YUILogComponent "mga-gtk-ui"
30 #include <yui/YUILog.h>
31 #include <yui/gtk/YGUI.h>
32 #include <yui/gtk/YGUtils.h>
33 #include <yui/gtk/YGWidget.h>
34 #include <YSelectionWidget.h>
35 #include <yui/gtk/YGSelectionStore.h>
36 #include <yui/gtk/ygtktreeview.h>
37 #include <yui/gtk/ygtkratiobox.h>
39 #include <yui/mga/YMGAMenuItem.h>
42 #include <yui/gtk/YGDialog.h>
43 #include <gdk/gdkkeysyms.h>
44 #include <gtk/gtkmenubar.h>
46 #include "YMGAGMenuBar.h"
47 #include <boost/filesystem.hpp>
49 #define YGTK_VBOX_NEW(arg) gtk_box_new(GTK_ORIENTATION_VERTICAL,arg)
50 #define YGTK_HBOX_NEW(arg) gtk_box_new(GTK_ORIENTATION_HORIZONTAL,arg)
52 typedef std::map<YItem*, GtkWidget*> MenuEntryMap;
53 typedef std::pair<YItem*, GtkWidget*> MenuEntryPair;
55 typedef std::map<YItem*, gulong> MenuCBMap;
56 typedef std::pair<YItem*, gulong> MenuCBPair;
63 MenuEntryMap menu_entry;
66 std::vector<GtkWidget*> menu_widgets;
69 YMGAGMenuBar::YMGAGMenuBar(YWidget* parent)
71 YGWidget(this, parent, gtk_menu_bar_get_type(), NULL),
76 d->menubar = getWidget();
82 static void selected_menuitem(GtkMenuItem *, YItem *item)
84 YGUI::ui()->sendEvent (
new YMenuEvent (item));
87 void YMGAGMenuBar::doCreateMenu (GtkWidget *menu, YItemIterator begin, YItemIterator end)
89 for (YItemIterator it = begin; it != end; it++)
91 YMenuSeparator *separator =
dynamic_cast<YMenuSeparator *
>(*it);
94 GtkWidget *sep = gtk_separator_menu_item_new();
95 gtk_menu_shell_append(GTK_MENU_SHELL(menu), sep);
102 std::string action_name = YGUtils::mapKBAccel (yitem->label());
103 if (yitem->hasIconName())
105 GtkIconTheme * theme = gtk_icon_theme_get_default();
106 std::string ico = boost::filesystem::path(yitem->iconName()).stem().c_str();
108 GtkWidget *box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
109 if (gtk_icon_theme_has_icon (theme, ico.c_str()))
111 icon = gtk_image_new_from_icon_name (ico.c_str(), GTK_ICON_SIZE_MENU);
115 icon = gtk_image_new_from_file(yitem->iconName().c_str());
117 GtkWidget *label = gtk_label_new (action_name.c_str());
118 entry = gtk_menu_item_new ();
120 gtk_container_add (GTK_CONTAINER (box), icon);
121 gtk_container_add (GTK_CONTAINER (box), label);
123 gtk_label_set_use_underline (GTK_LABEL (label), TRUE);
124 gtk_label_set_xalign (GTK_LABEL (label), 0.0);
126 gtk_container_add (GTK_CONTAINER (entry), box);
130 entry = gtk_menu_item_new_with_mnemonic (action_name.c_str());
132 d->menu_entry.insert(MenuEntryPair(*it, entry));
135 YMGAMenuItem *menuItem =
dynamic_cast<YMGAMenuItem *
>(*it);
138 gtk_widget_set_sensitive(entry, menuItem->enabled() ? gtk_true() : gtk_false());
140 yuiDebug() << menuItem->label() <<
" enabled: " << menuItem->enabled() <<
" hidden:" << menuItem->hidden() << std::endl;
142 if ((*it)->hasChildren()) {
143 GtkWidget *submenu = gtk_menu_new();
145 gtk_menu_item_set_submenu(GTK_MENU_ITEM(entry), submenu);
146 gtk_menu_shell_append (GTK_MENU_SHELL (menu), entry);
147 gtk_widget_show_all(entry);
149 doCreateMenu (submenu, (*it)->childrenBegin(), (*it)->childrenEnd());
154 gtk_menu_shell_append (GTK_MENU_SHELL (menu), entry);
155 gtk_widget_show_all (entry);
157 gulong
id = g_signal_connect (G_OBJECT (entry),
"activate",
158 G_CALLBACK (selected_menuitem), *it);
160 d->menu_cb.insert(MenuCBPair(*it,
id));
163 if (menuItem->hidden())
164 gtk_widget_hide(entry);
172 YMenuItem * item =
dynamic_cast<YMenuItem *
> ( yitem );
173 YUI_CHECK_PTR ( item );
174 yuiDebug() << item->label() << std::endl;
177 GtkWidget *menu = gtk_menu_new();
180 std::string lbl = YGUtils::mapKBAccel (item->label());
181 GtkWidget *menu_entry = gtk_menu_item_new_with_mnemonic(lbl.c_str());
183 d->menu_widgets.push_back(menu_entry);
185 d->menu_entry.insert(MenuEntryPair(yitem, menu_entry));
186 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_entry), menu);
187 gtk_widget_show(menu_entry);
188 gtk_menu_shell_append (GTK_MENU_SHELL (d->menubar), menu_entry);
190 YMGAMenuItem *menuItem =
dynamic_cast<YMGAMenuItem *
>(yitem);
193 yuiDebug() << menuItem->label() <<
" enabled: " << menuItem->enabled() <<
" hidden:" << menuItem->hidden() << std::endl;
194 gtk_widget_set_sensitive(menu_entry, menuItem->enabled() ? gtk_true() : gtk_false());
196 if (item->hasChildren())
197 doCreateMenu(menu, item->childrenBegin(), item->childrenEnd());
200 if (menuItem->hidden())
201 gtk_widget_hide(menu_entry);
204 YMGAMenuBar::addItem(yitem);
209 YMGAMenuBar::enableItem(menu_item, enable);
211 auto search = d->menu_entry.find( menu_item );
212 if (search != d->menu_entry.end())
214 GtkWidget * menu_entry = search->second;
215 gtk_widget_set_sensitive(menu_entry, enable ? gtk_true() : gtk_false());
219 yuiError() << menu_item->label() <<
" not found" << std::endl;
225 YMGAMenuBar::hideItem(menu_item, invisible);
227 auto search = d->menu_entry.find( menu_item );
228 if (search != d->menu_entry.end())
230 GtkWidget * menu_entry = search->second;
231 gtk_widget_set_visible(menu_entry, invisible ? gtk_false() : gtk_true());
244 yuiError() << menu_item->label() <<
" not found" << std::endl;
251 for (MenuCBMap::iterator it=d->menu_cb.begin(); it!=d->menu_cb.end(); ++it)
253 auto search = d->menu_entry.find( it->first );
254 if (search != d->menu_entry.end())
255 g_signal_handler_disconnect (search->second, it->second);
259 for (GtkWidget *m: d->menu_widgets)
261 gtk_widget_destroy(m);
269 d->menu_widgets.clear();
271 d->menu_entry.clear();
273 YSelectionWidget::deleteAllItems();
277 YMGAGMenuBar::~YMGAGMenuBar()
280 d->menu_entry.clear();