1 /*---------------------------------------------------------------------\
3 | __ __ ____ _____ ____ |
4 | \ \ / /_ _/ ___|_ _|___ \ |
5 | \ V / _` \___ \ | | __) | |
6 | | | (_| |___) || | / __/ |
7 | |_|\__,_|____/ |_| |_____| |
11 \----------------------------------------------------------------------/
15 Author: Stefan Hundhammer <sh@suse.de>
20 #include <QColorGroup>
21 #include <QHeaderView>
23 #include <QTreeWidget>
24 #include <QVBoxLayout>
28 #define y2log_component "qt-ui"
29 #include <ycp/y2log.h>
38 #include "YTreeItem.h"
39 #include "YQSignalBlocker.h"
40 #include "YQWidgetCaption.h"
42 #define VERBOSE_TREE_ITEMS 0
45 YQTree::YQTree( YWidget * parent, const string & label )
46 : QFrame( (QWidget *) parent->widgetRep() )
47 , YTree( parent, label )
49 QVBoxLayout* layout = new QVBoxLayout( this );
54 layout->setSpacing( YQWidgetSpacing );
55 layout->setMargin ( YQWidgetMargin );
59 _caption = new YQWidgetCaption( this, label );
60 YUI_CHECK_NEW( _caption );
61 layout->addWidget( _caption );
63 _qt_listView = new QTreeWidget( this );
64 YUI_CHECK_NEW( _qt_listView );
65 layout->addWidget( _qt_listView );
67 //_qt_listView->setHeaderLabel("");
68 // _qt_listView->addColumn( "" );
69 _qt_listView->header()->hide();
70 // _qt_listView->setHeader(0L);
71 _qt_listView->setRootIsDecorated ( true );
73 _caption->setBuddy ( _qt_listView );
75 connect( _qt_listView, SIGNAL( selectionChanged ( QTreeWidgetItem * ) ),
76 this, SLOT ( slotSelected ( QTreeWidgetItem * ) ) );
78 connect( _qt_listView, SIGNAL( spacePressed ( QTreeWidgetItem * ) ),
79 this, SLOT ( slotActivated ( QTreeWidgetItem * ) ) );
81 connect( _qt_listView, SIGNAL( doubleClicked ( QTreeWidgetItem * ) ),
82 this, SLOT ( slotActivated ( QTreeWidgetItem * ) ) );
92 void YQTree::setLabel( const string & label )
94 _caption->setText( label );
95 YTree::setLabel( label );
99 void YQTree::rebuildTree()
101 // y2debug( "Rebuilding tree" );
103 YQSignalBlocker sigBlocker( _qt_listView );
104 _qt_listView->clear();
106 buildDisplayTree( 0, itemsBegin(), itemsEnd() );
110 void YQTree::buildDisplayTree( YQTreeItem * parentItem, YItemIterator begin, YItemIterator end )
112 for ( YItemIterator it = begin; it < end; ++it )
114 YTreeItem * orig = dynamic_cast<YTreeItem *> (*it);
115 YUI_CHECK_PTR( orig );
120 clone = new YQTreeItem( this, parentItem, orig, _nextSerialNo++ );
122 clone = new YQTreeItem( this, _qt_listView, orig, _nextSerialNo++ );
124 YUI_CHECK_NEW( clone );
126 if ( orig->hasChildren() )
127 buildDisplayTree( clone, orig->childrenBegin(), orig->childrenEnd() );
132 void YQTree::selectItem( YItem * yItem, bool selected )
134 YQSignalBlocker sigBlocker( _qt_listView );
136 YTreeItem * treeItem = dynamic_cast<YTreeItem *> (yItem);
137 YUI_CHECK_PTR( treeItem );
139 YQTreeItem * yqTreeItem = (YQTreeItem *) treeItem->data();
140 YUI_CHECK_PTR( yqTreeItem );
142 if ( ! selected && yqTreeItem == _qt_listView->currentItem() )
148 yqTreeItem->setSelected( true );
149 openBranch( yqTreeItem );
150 YTree::selectItem( treeItem, selected );
155 void YQTree::selectItem( YQTreeItem * item )
159 YQSignalBlocker sigBlocker( _qt_listView );
161 item->setSelected( true );
163 YTree::selectItem( item->origItem(), true );
165 y2debug( "selected item: \"%s\"", item->origItem()->label().c_str() );
170 void YQTree::openBranch( QTreeWidgetItem * item )
174 item->setExpanded( true ); // Takes care of origItem()->setOpen()
175 item = item->parent();
180 void YQTree::deselectAllItems()
182 YQSignalBlocker sigBlocker( _qt_listView );
184 YTree::deselectAllItems();
185 _qt_listView->clearSelection();
189 void YQTree::deleteAllItems()
191 YQSignalBlocker sigBlocker( _qt_listView );
193 _qt_listView->clear();
194 YTree::deleteAllItems();
198 void YQTree::slotSelected( QTreeWidgetItem * qItem )
200 selectItem( dynamic_cast<YQTreeItem *> (qItem) );
202 if ( notify() && ! YQUI::ui()->eventPendingFor( this ) )
203 YQUI::ui()->sendEvent( new YWidgetEvent( this, YEvent::SelectionChanged ) );
207 void YQTree::slotActivated( QTreeWidgetItem * qItem )
209 selectItem( dynamic_cast<YQTreeItem *> (qItem) );
212 YQUI::ui()->sendEvent( new YWidgetEvent( this, YEvent::Activated ) );
216 int YQTree::preferredWidth()
218 int hintWidth = !_caption->isHidden() ? _caption->sizeHint().width() : 0;
219 return max( 200, hintWidth );
223 int YQTree::preferredHeight()
225 // 300 is an arbitrary value. Use a MinSize or MinHeight widget to set a
226 // size that is useful for the application.
228 int hintHeight = !_caption->isHidden() ? _caption->sizeHint().height() : 0;
230 return 300 + hintHeight;
234 void YQTree::setSize( int newWidth, int newHeight )
236 resize( newWidth, newHeight );
240 void YQTree::setEnabled( bool enabled )
242 _caption->setEnabled( enabled );
243 _qt_listView->setEnabled( enabled );
244 YWidget::setEnabled( enabled );
248 bool YQTree::setKeyboardFocus()
250 _qt_listView->setFocus();
256 /*============================================================================*/
260 YQTreeItem::YQTreeItem( YQTree * tree,
261 QTreeWidget * listView,
264 : QTreeWidgetItem( listView )
266 init( tree, orig, serial );
268 #if VERBOSE_TREE_ITEMS
269 y2debug( "Creating toplevel tree item \"%s\"", orig->label().c_str() );
274 YQTreeItem::YQTreeItem( YQTree * tree,
275 YQTreeItem * parentItem,
278 : QTreeWidgetItem( parentItem )
280 init( tree, orig, serial );
281 #if VERBOSE_TREE_ITEMS
282 y2debug( "Creating tree item \"%s\" as child of \"%s\"",
283 orig->label().c_str(),
284 parentItem->origItem()->label().c_str() );
289 void YQTreeItem::init( YQTree * tree,
293 YUI_CHECK_PTR( tree );
294 YUI_CHECK_PTR( orig );
300 _origItem->setData( this );
302 setText( 0, fromUTF8 ( _origItem->label() ) );
303 setOpen( _origItem->isOpen() );
305 if ( _origItem->hasIconName() )
307 string iconName = _tree->iconFullPath( _origItem );
308 QPixmap icon( iconName.c_str() );
311 y2warning( "Can't load icon %s", iconName.c_str() );
313 setData( 0, Qt::DecorationRole, icon );
319 YQTreeItem::setOpen( bool open )
321 QTreeWidgetItem::setExpanded( open );
322 _origItem->setOpen( open );
328 YQTreeItem::key( int column, bool ascending ) const
331 * Sorting key for QListView internal sorting:
333 * Always sort tree items by insertion order. The tree widget
334 * cannot maintain a meaningful sorting order of its own: All it
335 * could do is sort by names (ASCII sort). Better let the (YCP)
336 * application handle this.
340 strKey.sprintf( "%08d", _serialNo );
346 #include "YQTree.moc"