28 #include <QHBoxLayout>
31 #define YUILogComponent "mga-qt-ui"
32 #include <yui/YUILog.h>
34 #include <yui/qt/utf8.h>
36 #include <yui/qt/YQUI.h>
37 #include <yui/YEvent.h>
38 #include <yui/qt/YQSignalBlocker.h>
39 #include <yui/YUIException.h>
40 #include <yui/YMenuItem.h>
42 #include "YMGAQMenuBar.h"
43 #include <yui/qt/YQApplication.h>
44 #include <yui/mga/YMGAMenuItem.h>
46 typedef std::map<YItem*, QObject*> MenuEntryMap;
47 typedef std::pair<YItem*, QObject*> MenuEntryPair;
52 MenuEntryMap menu_entry;
62 QItemAction(YMenuItem *item, QObject *parent =
nullptr ) :
63 QAction(item->label().c_str(), parent), _yitem(item)
72 YQUI::ui()->sendEvent(
new YMenuEvent( _yitem ) );
77 : QWidget( (QWidget *) parent->widgetRep() )
78 , YMGAMenuBar( parent ), d(new
Private)
82 setWidgetRep (
this );
84 QHBoxLayout* layout =
new QHBoxLayout (
this );
85 layout->setSpacing ( 0 );
88 layout->setMargin ( YQWidgetMargin );
90 d->menubar =
new QMenuBar (
this );
91 YUI_CHECK_NEW ( d->menubar );
92 layout->addWidget ( d->menubar );
103 YMenuItem * item =
dynamic_cast<YMenuItem *
> ( yitem );
104 YUI_CHECK_PTR ( item );
106 YMenuSeparator *separator =
dynamic_cast<YMenuSeparator *
>(yitem);
108 menu->addSeparator();
113 if (item->hasIconName())
115 QString qtIcon = fromUTF8( yitem->iconName() );
116 QString icon_name = QFileInfo( qtIcon ).baseName();
118 if ( QIcon::hasThemeIcon( icon_name ) )
120 action->setIcon( QIcon::fromTheme ( icon_name ) );
124 QPixmap pixmap( qtIcon );
126 if ( !pixmap.isNull() )
127 action->setIcon( QIcon( pixmap ) );
129 action->setIconVisibleInMenu(
true);
131 connect(action, &QAction::triggered, action, &QItemAction::selectedItem);
132 menu->addAction(action);
134 YMGAMenuItem *menuItem =
dynamic_cast<YMGAMenuItem *
>(yitem);
137 action->setEnabled(menuItem->enabled());
138 d->menu_entry.insert(MenuEntryPair(yitem, action));
139 action->setVisible(!menuItem->hidden());
147 YMenuItem * item =
dynamic_cast<YMenuItem *
> ( yitem );
148 YUI_CHECK_PTR ( item );
151 QMenu *m=menu->addMenu(item->label().c_str());
152 if (item->hasChildren())
154 YMGAMenuItem *menuItem =
dynamic_cast<YMGAMenuItem *
>(yitem);
157 m->setEnabled(menuItem->enabled());
158 d->menu_entry.insert(MenuEntryPair(yitem, m));
159 m->menuAction()->setVisible(!menuItem->hidden());
161 for (YItemIterator miter = item->childrenBegin(); miter != item->childrenEnd(); miter++)
163 YMenuItem *m_item=
dynamic_cast<YMenuItem *
>(*miter);
164 if (m_item->hasChildren())
179 YMenuItem * item =
dynamic_cast<YMenuItem *
> ( yitem );
180 YUI_CHECK_PTR ( item );
183 QMenu *menu = d->menubar->addMenu(item->label().c_str());
185 if (item->hasChildren())
187 for (YItemIterator miter = item->childrenBegin(); miter != item->childrenEnd(); miter++)
189 YMenuItem *m_item=
dynamic_cast<YMenuItem *
>(*miter);
190 if (m_item->hasChildren())
201 YMGAMenuItem *menuItem =
dynamic_cast<YMGAMenuItem *
>(yitem);
204 menu->setEnabled(menuItem->enabled());
205 d->menu_entry.insert(MenuEntryPair(yitem, menu));
206 menu->menuAction()->setVisible(!menuItem->hidden());
208 YMGAMenuBar::addItem(yitem);
217 return 20 + d->menubar->sizeHint().width();
225 return 20 + d->menubar->sizeHint().height();
232 resize( newWidth, newHeight );
237 YMGAMenuBar::enableItem(menu_item, enable);
239 auto search = d->menu_entry.find( menu_item );
240 if (search != d->menu_entry.end())
242 QMenu * menu_entry =
dynamic_cast<QMenu*
>(search->second);
244 menu_entry->setEnabled(enable);
247 QAction * menu_action =
dynamic_cast<QAction*
>(search->second);
249 menu_action->setEnabled(enable);
254 yuiError() << menu_item->label() <<
" not found" << std::endl;
260 YMGAMenuBar::hideItem(menu_item, invisible);
262 auto search = d->menu_entry.find( menu_item );
263 if (search != d->menu_entry.end())
265 QMenu * menu_entry =
dynamic_cast<QMenu*
>(search->second);
268 menu_entry->menuAction()->setVisible(!invisible);
276 QAction * menu_action =
dynamic_cast<QAction*
>(search->second);
278 menu_action->setVisible(!invisible);
283 yuiError() << menu_item->label() <<
" not found" << std::endl;
305 d->menu_entry.clear();
307 YSelectionWidget::deleteAllItems();