1 /*---------------------------------------------------------------------\
3 | __ __ ____ _____ ____ |
4 | \ \ / /_ _/ ___|_ _|___ \ |
5 | \ V / _` \___ \ | | __) | |
6 | | | (_| |___) || | / __/ |
7 | |_|\__,_|____/ |_| |_____| |
11 \----------------------------------------------------------------------/
15 Author: Stefan Hundhammer <sh@suse.de>
20 #include <qpushbutton.h>
21 #include <qpopupmenu.h>
25 #define y2log_component "qt-ui"
26 #include <ycp/y2log.h>
30 #include "YQMenuButton.h"
35 YQMenuButton::YQMenuButton( YWidget * parent,
36 const string & label )
37 : QWidget( (QWidget *) parent->widgetRep() )
38 , YMenuButton( parent, label )
42 _qt_button = new QPushButton( fromUTF8( label ), this );
43 // _qt_button->setMinimumSize( 2,2 );
44 _qt_button->move( YQButtonBorder, YQButtonBorder );
45 setMinimumSize( _qt_button->minimumSize()
46 + 2 * QSize( YQButtonBorder, YQButtonBorder ) );
50 YQMenuButton::~YQMenuButton()
57 YQMenuButton::setLabel( const string & label )
59 _qt_button->setText( fromUTF8( label ) );
60 YMenuButton::setLabel( label );
65 YQMenuButton::rebuildMenuTree()
68 // Delete any previous menu
69 // (in case the menu items got replaced)
72 if ( _qt_button->popup() )
73 delete _qt_button->popup();
76 // Create toplevel menu
79 QPopupMenu * menu = new QPopupMenu( _qt_button );
80 YUI_CHECK_NEW( menu );
81 _qt_button->setPopup( menu );
83 connect( menu, SIGNAL( activated ( int ) ),
84 this, SLOT ( menuEntryActivated( int ) ) );
87 // Recursively add Qt menu items from the YMenuItems
90 rebuildMenuTree( menu, itemsBegin(), itemsEnd() );
95 YQMenuButton::rebuildMenuTree( QPopupMenu * parentMenu, YItemIterator begin, YItemIterator end )
97 for ( YItemIterator it = begin; it != end; ++it )
99 YMenuItem * item = dynamic_cast<YMenuItem *> (*it);
100 YUI_CHECK_PTR( item );
104 if ( item->hasIconName() )
106 string iconName = iconFullPath( item );
107 icon = QPixmap( iconName.c_str() );
110 y2warning( "Can't load icon %s", iconName.c_str() );
113 if ( item->hasChildren() )
115 QPopupMenu * subMenu = new QPopupMenu( parentMenu );
116 YUI_CHECK_NEW( subMenu );
119 parentMenu->insertItem( fromUTF8( item->label() ), subMenu );
121 parentMenu->insertItem( QIconSet( icon ), fromUTF8( item->label() ), subMenu );
123 connect( subMenu, SIGNAL( activated ( int ) ),
124 this, SLOT ( menuEntryActivated( int ) ) );
126 rebuildMenuTree( subMenu, item->childrenBegin(), item->childrenEnd() );
128 else // No children - leaf entry
130 // item->index() is guaranteed to be unique within this YMenuButton's items,
131 // so it can easily be used as unique ID in all QPopupMenus that belong
132 // to this YQMenuButton.
135 parentMenu->insertItem( fromUTF8( item->label() ), item->index() );
137 parentMenu->insertItem( QIconSet( icon ), fromUTF8( item->label() ), item->index() );
144 YQMenuButton::menuEntryActivated( int serialNo )
146 // y2debug( "Selected menu entry #%d", menu_item_index );
147 _selectedItem = findMenuItem( serialNo );
152 * Defer the real returnNow() until all popup related events have been
153 * processed. This took me some hours to figure out; obviously
154 * exit_loop() doesn't have any effect as long as there are still
155 * popups open. So be it - use a zero timer to perform the real
160 * the 100 delay is a ugly dirty workaround
162 QTimer::singleShot( 100, this, SLOT( returnNow() ) );
166 y2error( "No menu item with serial no. %d", serialNo );
172 YQMenuButton::returnNow()
176 YQUI::ui()->sendEvent( new YMenuEvent( _selectedItem ) );
184 YQMenuButton::setEnabled( bool enabled )
186 _qt_button->setEnabled( enabled );
187 YWidget::setEnabled( enabled );
191 int YQMenuButton::preferredWidth()
193 return 2*YQButtonBorder + _qt_button->sizeHint().width();
197 int YQMenuButton::preferredHeight()
199 return 2*YQButtonBorder + _qt_button->sizeHint().height();
204 YQMenuButton::setSize( int newWidth, int newHeight )
206 _qt_button->resize( newWidth - 2 * YQButtonBorder,
207 newHeight - 2 * YQButtonBorder );
208 resize( newWidth, newHeight );
213 YQMenuButton::setKeyboardFocus()
215 _qt_button->setFocus();
221 #include "YQMenuButton.moc"