1 /*---------------------------------------------------------------------\
3 | __ __ ____ _____ ____ |
4 | \ \ / /_ _/ ___|_ _|___ \ |
5 | \ V / _` \___ \ | | __) | |
6 | | | (_| |___) || | / __/ |
7 | |_|\__,_|____/ |_| |_____| |
11 \----------------------------------------------------------------------/
15 Author: Stefan Hundhammer <sh@suse.de>
19 #include <QColorGroup>
20 #include <QHeaderView>
22 #include <QTreeWidget>
23 #include <QVBoxLayout>
27 #define y2log_component "qt-ui"
28 #include <ycp/y2log.h>
37 #include "YTreeItem.h"
38 #include "YQSignalBlocker.h"
39 #include "YQWidgetCaption.h"
41 #define VERBOSE_TREE_ITEMS 0
44 YQTree::YQTree( YWidget * parent, const string & label )
45 : QFrame( (QWidget *) parent->widgetRep() )
46 , YTree( parent, label )
48 QVBoxLayout* layout = new QVBoxLayout( this );
53 layout->setSpacing( YQWidgetSpacing );
54 layout->setMargin ( YQWidgetMargin );
58 _caption = new YQWidgetCaption( this, label );
59 YUI_CHECK_NEW( _caption );
60 layout->addWidget( _caption );
62 _qt_listView = new QTreeWidget( this );
63 YUI_CHECK_NEW( _qt_listView );
64 layout->addWidget( _qt_listView );
66 //_qt_listView->setHeaderLabel("");
67 // _qt_listView->addColumn( "" );
68 _qt_listView->header()->hide();
69 // _qt_listView->setHeader(0L);
70 _qt_listView->setRootIsDecorated ( true );
72 _caption->setBuddy ( _qt_listView );
74 connect( _qt_listView, SIGNAL( itemSelectionChanged () ),
75 this, SLOT ( slotSelectionChanged () ) );
77 connect( _qt_listView, SIGNAL( itemActivated ( QTreeWidgetItem * , int ) ),
78 this, SLOT ( slotActivated ( QTreeWidgetItem * ) ) );
80 connect( _qt_listView, SIGNAL( itemDoubleClicked( QTreeWidgetItem *, int ) ),
81 this, SLOT ( slotActivated ( QTreeWidgetItem * ) ) );
91 void YQTree::setLabel( const string & label )
93 _caption->setText( label );
94 YTree::setLabel( label );
98 void YQTree::rebuildTree()
100 // y2debug( "Rebuilding tree" );
102 YQSignalBlocker sigBlocker( _qt_listView );
103 _qt_listView->clear();
105 buildDisplayTree( 0, itemsBegin(), itemsEnd() );
109 void YQTree::buildDisplayTree( YQTreeItem * parentItem, YItemIterator begin, YItemIterator end )
111 for ( YItemIterator it = begin; it < end; ++it )
113 YTreeItem * orig = dynamic_cast<YTreeItem *> (*it);
114 YUI_CHECK_PTR( orig );
119 clone = new YQTreeItem( this, parentItem, orig, _nextSerialNo++ );
121 clone = new YQTreeItem( this, _qt_listView, orig, _nextSerialNo++ );
123 YUI_CHECK_NEW( clone );
125 if ( orig->hasChildren() )
126 buildDisplayTree( clone, orig->childrenBegin(), orig->childrenEnd() );
131 void YQTree::selectItem( YItem * yItem, bool selected )
133 YQSignalBlocker sigBlocker( _qt_listView );
135 YTreeItem * treeItem = dynamic_cast<YTreeItem *> (yItem);
136 YUI_CHECK_PTR( treeItem );
138 YQTreeItem * yqTreeItem = (YQTreeItem *) treeItem->data();
139 YUI_CHECK_PTR( yqTreeItem );
141 if ( ! selected && yqTreeItem == _qt_listView->currentItem() )
147 yqTreeItem->setSelected( true );
148 openBranch( yqTreeItem );
149 YTree::selectItem( treeItem, selected );
154 void YQTree::selectItem( YQTreeItem * item )
158 YQSignalBlocker sigBlocker( _qt_listView );
160 item->setSelected( true );
162 YTree::selectItem( item->origItem(), true );
164 y2debug( "selected item: \"%s\"", item->origItem()->label().c_str() );
169 void YQTree::openBranch( QTreeWidgetItem * item )
173 item->setExpanded( true ); // Takes care of origItem()->setOpen()
174 item = item->parent();
179 void YQTree::deselectAllItems()
181 YQSignalBlocker sigBlocker( _qt_listView );
183 YTree::deselectAllItems();
184 _qt_listView->clearSelection();
188 void YQTree::deleteAllItems()
190 YQSignalBlocker sigBlocker( _qt_listView );
192 _qt_listView->clear();
193 YTree::deleteAllItems();
197 void YQTree::slotSelectionChanged( )
199 QList<QTreeWidgetItem *> items = _qt_listView->selectedItems ();
200 QTreeWidgetItem *qItem = items.first();
201 selectItem( dynamic_cast<YQTreeItem *> (qItem) );
203 if ( notify() && ! YQUI::ui()->eventPendingFor( this ) )
204 YQUI::ui()->sendEvent( new YWidgetEvent( this, YEvent::SelectionChanged ) );
208 void YQTree::slotActivated( QTreeWidgetItem * qItem )
210 selectItem( dynamic_cast<YQTreeItem *> (qItem) );
213 YQUI::ui()->sendEvent( new YWidgetEvent( this, YEvent::Activated ) );
217 int YQTree::preferredWidth()
219 int hintWidth = !_caption->isHidden() ? _caption->sizeHint().width() : 0;
220 return max( 200, hintWidth );
224 int YQTree::preferredHeight()
226 // 300 is an arbitrary value. Use a MinSize or MinHeight widget to set a
227 // size that is useful for the application.
229 int hintHeight = !_caption->isHidden() ? _caption->sizeHint().height() : 0;
231 return 300 + hintHeight;
235 void YQTree::setSize( int newWidth, int newHeight )
237 resize( newWidth, newHeight );
241 void YQTree::setEnabled( bool enabled )
243 _caption->setEnabled( enabled );
244 _qt_listView->setEnabled( enabled );
245 YWidget::setEnabled( enabled );
249 bool YQTree::setKeyboardFocus()
251 _qt_listView->setFocus();
257 /*============================================================================*/
261 YQTreeItem::YQTreeItem( YQTree * tree,
262 QTreeWidget * listView,
265 : QTreeWidgetItem( listView )
267 init( tree, orig, serial );
269 #if VERBOSE_TREE_ITEMS
270 y2debug( "Creating toplevel tree item \"%s\"", orig->label().c_str() );
275 YQTreeItem::YQTreeItem( YQTree * tree,
276 YQTreeItem * parentItem,
279 : QTreeWidgetItem( parentItem )
281 init( tree, orig, serial );
282 #if VERBOSE_TREE_ITEMS
283 y2debug( "Creating tree item \"%s\" as child of \"%s\"",
284 orig->label().c_str(),
285 parentItem->origItem()->label().c_str() );
290 void YQTreeItem::init( YQTree * tree,
294 YUI_CHECK_PTR( tree );
295 YUI_CHECK_PTR( orig );
301 _origItem->setData( this );
303 setText( 0, fromUTF8 ( _origItem->label() ) );
304 setOpen( _origItem->isOpen() );
306 if ( _origItem->hasIconName() )
308 string iconName = _tree->iconFullPath( _origItem );
309 QPixmap icon( iconName.c_str() );
312 y2warning( "Can't load icon %s", iconName.c_str() );
314 setData( 0, Qt::DecorationRole, icon );
320 YQTreeItem::setOpen( bool open )
322 QTreeWidgetItem::setExpanded( open );
323 _origItem->setOpen( open );
329 YQTreeItem::key( int column, bool ascending ) const
332 * Sorting key for QListView internal sorting:
334 * Always sort tree items by insertion order. The tree widget
335 * cannot maintain a meaningful sorting order of its own: All it
336 * could do is sort by names (ASCII sort). Better let the (YCP)
337 * application handle this.
341 strKey.sprintf( "%08d", _serialNo );
347 #include "YQTree.moc"