1 /*---------------------------------------------------------------------\
3 | __ __ ____ _____ ____ |
4 | \ \ / /_ _/ ___|_ _|___ \ |
5 | \ V / _` \___ \ | | __) | |
6 | | | (_| |___) || | / __/ |
7 | |_|\__,_|____/ |_| |_____| |
11 \----------------------------------------------------------------------/
15 Author: Stefan Hundhammer <sh@suse.de>
20 #include <qpushbutton.h>
24 #define y2log_component "qt-ui"
25 #include <ycp/y2log.h>
29 #include "YQMenuButton.h"
34 YQMenuButton::YQMenuButton( YWidget * parent,
35 const string & label )
36 : QWidget( (QWidget *) parent->widgetRep() )
37 , YMenuButton( parent, label )
41 _qt_button = new QPushButton( fromUTF8( label ), this );
42 // _qt_button->setMinimumSize( 2,2 );
43 _qt_button->move( YQButtonBorder, YQButtonBorder );
44 setMinimumSize( _qt_button->minimumSize()
45 + 2 * QSize( YQButtonBorder, YQButtonBorder ) );
49 YQMenuButton::~YQMenuButton()
56 YQMenuButton::setLabel( const string & label )
58 _qt_button->setText( fromUTF8( label ) );
59 YMenuButton::setLabel( label );
64 YQMenuButton::rebuildMenuTree()
67 // Delete any previous menu
68 // (in case the menu items got replaced)
71 if ( _qt_button->menu() )
72 delete _qt_button->menu();
75 // Create toplevel menu
78 QMenu * menu = new QMenu( _qt_button );
79 YUI_CHECK_NEW( menu );
80 _qt_button->setMenu( menu );
82 connect( menu, SIGNAL( triggered ( QAction* ) ),
83 this, SLOT ( menuEntryActivated( QAction* ) ) );
86 // Recursively add Qt menu items from the YMenuItems
89 rebuildMenuTree( menu, itemsBegin(), itemsEnd() );
94 YQMenuButton::rebuildMenuTree( QMenu * parentMenu, YItemIterator begin, YItemIterator end )
96 for ( YItemIterator it = begin; it != end; ++it )
98 YMenuItem * item = dynamic_cast<YMenuItem *> (*it);
99 YUI_CHECK_PTR( item );
103 if ( item->hasIconName() )
105 string iconName = iconFullPath( item );
106 icon = QPixmap( iconName.c_str() );
109 y2warning( "Can't load icon %s", iconName.c_str() );
112 if ( item->hasChildren() )
117 subMenu = parentMenu->addMenu( fromUTF8( item->label() ));
119 subMenu = parentMenu->addMenu( QIcon( icon ), fromUTF8( item->label() ));
121 connect( subMenu, SIGNAL( triggered ( QAction* ) ),
122 this, SLOT ( menuEntryActivated( QAction* ) ) );
124 rebuildMenuTree( subMenu, item->childrenBegin(), item->childrenEnd() );
126 else // No children - leaf entry
128 // item->index() is guaranteed to be unique within this YMenuButton's items,
129 // so it can easily be used as unique ID in all Q3PopupMenus that belong
130 // to this YQMenuButton.
134 act = parentMenu->addAction( fromUTF8( item->label() ) );
136 act = parentMenu->addAction( QIcon( icon ), fromUTF8( item->label() ) );
137 _serials[act] = item->index();
144 YQMenuButton::menuEntryActivated( QAction* action )
147 if ( _serials.contains( action ) )
148 serialNo = _serials[action];
150 // y2debug( "Selected menu entry #%d", menu_item_index );
151 _selectedItem = findMenuItem( serialNo );
156 * Defer the real returnNow() until all popup related events have been
157 * processed. This took me some hours to figure out; obviously
158 * exit_loop() doesn't have any effect as long as there are still
159 * popups open. So be it - use a zero timer to perform the real
164 * the 100 delay is a ugly dirty workaround
166 QTimer::singleShot( 100, this, SLOT( returnNow() ) );
170 y2error( "No menu item with serial no. %d", serialNo );
176 YQMenuButton::returnNow()
180 YQUI::ui()->sendEvent( new YMenuEvent( _selectedItem ) );
188 YQMenuButton::setEnabled( bool enabled )
190 _qt_button->setEnabled( enabled );
191 YWidget::setEnabled( enabled );
195 int YQMenuButton::preferredWidth()
197 return 2*YQButtonBorder + _qt_button->sizeHint().width();
201 int YQMenuButton::preferredHeight()
203 return 2*YQButtonBorder + _qt_button->sizeHint().height();
208 YQMenuButton::setSize( int newWidth, int newHeight )
210 _qt_button->resize( newWidth - 2 * YQButtonBorder,
211 newHeight - 2 * YQButtonBorder );
212 resize( newWidth, newHeight );
217 YQMenuButton::setKeyboardFocus()
219 _qt_button->setFocus();
225 #include "YQMenuButton.moc"