1 /*---------------------------------------------------------------------\
3 | __ __ ____ _____ ____ |
4 | \ \ / /_ _/ ___|_ _|___ \ |
5 | \ V / _` \___ \ | | __) | |
6 | | | (_| |___) || | / __/ |
7 | |_|\__,_|____/ |_| |_____| |
11 \----------------------------------------------------------------------/
15 Author: Stefan Hundhammer <sh@suse.de>
23 #include <qlistview.h>
25 #define y2log_component "qt-ui"
26 #include <ycp/y2log.h>
35 #include "YTreeItem.h"
36 #include "YQSignalBlocker.h"
37 #include "YQWidgetCaption.h"
39 #define VERBOSE_TREE_ITEMS 0
42 YQTree::YQTree( YWidget * parent, const string & label )
43 : QVBox( (QWidget *) parent->widgetRep() )
44 , YTree( parent, label )
48 setSpacing( YQWidgetSpacing );
49 setMargin ( YQWidgetMargin );
53 _caption = new YQWidgetCaption( this, label );
54 YUI_CHECK_NEW( _caption );
56 _qt_listView = new QListView( this );
57 YUI_CHECK_NEW( _qt_listView );
59 _qt_listView->addColumn( "" );
60 _qt_listView->header()->hide();
61 _qt_listView->setRootIsDecorated ( true );
63 _caption->setBuddy ( _qt_listView );
65 connect( _qt_listView, SIGNAL( selectionChanged ( QListViewItem * ) ),
66 this, SLOT ( slotSelected ( QListViewItem * ) ) );
68 connect( _qt_listView, SIGNAL( spacePressed ( QListViewItem * ) ),
69 this, SLOT ( slotActivated ( QListViewItem * ) ) );
71 connect( _qt_listView, SIGNAL( doubleClicked ( QListViewItem * ) ),
72 this, SLOT ( slotActivated ( QListViewItem * ) ) );
82 void YQTree::setLabel( const string & label )
84 _caption->setText( label );
85 YTree::setLabel( label );
89 void YQTree::rebuildTree()
91 // y2debug( "Rebuilding tree" );
93 YQSignalBlocker sigBlocker( _qt_listView );
94 _qt_listView->clear();
96 buildDisplayTree( 0, itemsBegin(), itemsEnd() );
100 void YQTree::buildDisplayTree( YQTreeItem * parentItem, YItemIterator begin, YItemIterator end )
102 for ( YItemIterator it = begin; it < end; ++it )
104 YTreeItem * orig = dynamic_cast<YTreeItem *> (*it);
105 YUI_CHECK_PTR( orig );
110 clone = new YQTreeItem( this, parentItem, orig, _nextSerialNo++ );
112 clone = new YQTreeItem( this, _qt_listView, orig, _nextSerialNo++ );
114 YUI_CHECK_NEW( clone );
116 if ( orig->hasChildren() )
117 buildDisplayTree( clone, orig->childrenBegin(), orig->childrenEnd() );
122 void YQTree::selectItem( YItem * yItem, bool selected )
124 YQSignalBlocker sigBlocker( _qt_listView );
126 YTreeItem * treeItem = dynamic_cast<YTreeItem *> (yItem);
127 YUI_CHECK_PTR( treeItem );
129 YQTreeItem * yqTreeItem = (YQTreeItem *) treeItem->data();
130 YUI_CHECK_PTR( yqTreeItem );
132 if ( ! selected && yqTreeItem == _qt_listView->selectedItem() )
138 _qt_listView->setSelected( yqTreeItem, true );
139 openBranch( yqTreeItem );
140 YTree::selectItem( treeItem, selected );
145 void YQTree::selectItem( YQTreeItem * item )
149 YQSignalBlocker sigBlocker( _qt_listView );
151 _qt_listView->setSelected( item, true );
153 YTree::selectItem( item->origItem(), true );
155 y2debug( "selected item: \"%s\"", item->origItem()->label().c_str() );
160 void YQTree::openBranch( QListViewItem * item )
164 item->setOpen( true ); // Takes care of origItem()->setOpen()
165 item = item->parent();
170 void YQTree::deselectAllItems()
172 YQSignalBlocker sigBlocker( _qt_listView );
174 YTree::deselectAllItems();
175 _qt_listView->clearSelection();
179 void YQTree::deleteAllItems()
181 YQSignalBlocker sigBlocker( _qt_listView );
183 _qt_listView->clear();
184 YTree::deleteAllItems();
188 void YQTree::slotSelected( QListViewItem * qItem )
190 selectItem( dynamic_cast<YQTreeItem *> (qItem) );
192 if ( notify() && ! YQUI::ui()->eventPendingFor( this ) )
193 YQUI::ui()->sendEvent( new YWidgetEvent( this, YEvent::SelectionChanged ) );
197 void YQTree::slotActivated( QListViewItem * qItem )
199 selectItem( dynamic_cast<YQTreeItem *> (qItem) );
202 YQUI::ui()->sendEvent( new YWidgetEvent( this, YEvent::Activated ) );
206 int YQTree::preferredWidth()
208 int hintWidth = _caption->isShown() ? _caption->sizeHint().width() : 0;
209 return max( 200, hintWidth );
213 int YQTree::preferredHeight()
215 // 300 is an arbitrary value. Use a MinSize or MinHeight widget to set a
216 // size that is useful for the application.
218 int hintHeight = _caption->isShown() ? _caption->sizeHint().height() : 0;
220 return 300 + hintHeight;
224 void YQTree::setSize( int newWidth, int newHeight )
226 resize( newWidth, newHeight );
230 void YQTree::setEnabled( bool enabled )
232 _caption->setEnabled( enabled );
233 _qt_listView->setEnabled( enabled );
234 YWidget::setEnabled( enabled );
238 bool YQTree::setKeyboardFocus()
240 _qt_listView->setFocus();
246 /*============================================================================*/
250 YQTreeItem::YQTreeItem( YQTree * tree,
251 QListView * listView,
254 : QListViewItem( listView )
256 init( tree, orig, serial );
258 #if VERBOSE_TREE_ITEMS
259 y2debug( "Creating toplevel tree item \"%s\"", orig->label().c_str() );
264 YQTreeItem::YQTreeItem( YQTree * tree,
265 YQTreeItem * parentItem,
268 : QListViewItem( parentItem )
270 init( tree, orig, serial );
272 #if VERBOSE_TREE_ITEMS
273 y2debug( "Creating tree item \"%s\" as child of \"%s\"",
274 orig->label().c_str(),
275 parentItem->origItem()->label().c_str() );
280 void YQTreeItem::init( YQTree * tree,
284 YUI_CHECK_PTR( tree );
285 YUI_CHECK_PTR( orig );
291 _origItem->setData( this );
293 setText( 0, fromUTF8 ( _origItem->label() ) );
294 setOpen( _origItem->isOpen() );
296 if ( _origItem->hasIconName() )
298 string iconName = _tree->iconFullPath( _origItem );
299 QPixmap icon( iconName.c_str() );
302 y2warning( "Can't load icon %s", iconName.c_str() );
304 setPixmap( 0, icon );
310 YQTreeItem::setOpen( bool open )
312 QListViewItem::setOpen( open );
313 _origItem->setOpen( open );
319 YQTreeItem::key( int column, bool ascending ) const
322 * Sorting key for QListView internal sorting:
324 * Always sort tree items by insertion order. The tree widget
325 * cannot maintain a meaningful sorting order of its own: All it
326 * could do is sort by names (ASCII sort). Better let the (YCP)
327 * application handle this.
331 strKey.sprintf( "%08d", _serialNo );
337 #include "YQTree.moc"