1 /*---------------------------------------------------------------------\
3 | __ __ ____ _____ ____ |
4 | \ \ / /_ _/ ___|_ _|___ \ |
5 | \ V / _` \___ \ | | __) | |
6 | | | (_| |___) || | / __/ |
7 | |_|\__,_|____/ |_| |_____| |
11 \----------------------------------------------------------------------/
15 Author: Stefan Hundhammer <sh@suse.de>
23 #include <q3listview.h>
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 Q3ListView( this );
64 YUI_CHECK_NEW( _qt_listView );
65 layout->addWidget( _qt_listView );
67 _qt_listView->addColumn( "" );
68 _qt_listView->header()->hide();
69 _qt_listView->setRootIsDecorated ( true );
71 _caption->setBuddy ( _qt_listView );
73 connect( _qt_listView, SIGNAL( selectionChanged ( Q3ListViewItem * ) ),
74 this, SLOT ( slotSelected ( Q3ListViewItem * ) ) );
76 connect( _qt_listView, SIGNAL( spacePressed ( Q3ListViewItem * ) ),
77 this, SLOT ( slotActivated ( Q3ListViewItem * ) ) );
79 connect( _qt_listView, SIGNAL( doubleClicked ( Q3ListViewItem * ) ),
80 this, SLOT ( slotActivated ( Q3ListViewItem * ) ) );
90 void YQTree::setLabel( const string & label )
92 _caption->setText( label );
93 YTree::setLabel( label );
97 void YQTree::rebuildTree()
99 // y2debug( "Rebuilding tree" );
101 YQSignalBlocker sigBlocker( _qt_listView );
102 _qt_listView->clear();
104 buildDisplayTree( 0, itemsBegin(), itemsEnd() );
108 void YQTree::buildDisplayTree( YQTreeItem * parentItem, YItemIterator begin, YItemIterator end )
110 for ( YItemIterator it = begin; it < end; ++it )
112 YTreeItem * orig = dynamic_cast<YTreeItem *> (*it);
113 YUI_CHECK_PTR( orig );
118 clone = new YQTreeItem( this, parentItem, orig, _nextSerialNo++ );
120 clone = new YQTreeItem( this, _qt_listView, orig, _nextSerialNo++ );
122 YUI_CHECK_NEW( clone );
124 if ( orig->hasChildren() )
125 buildDisplayTree( clone, orig->childrenBegin(), orig->childrenEnd() );
130 void YQTree::selectItem( YItem * yItem, bool selected )
132 YQSignalBlocker sigBlocker( _qt_listView );
134 YTreeItem * treeItem = dynamic_cast<YTreeItem *> (yItem);
135 YUI_CHECK_PTR( treeItem );
137 YQTreeItem * yqTreeItem = (YQTreeItem *) treeItem->data();
138 YUI_CHECK_PTR( yqTreeItem );
140 if ( ! selected && yqTreeItem == _qt_listView->selectedItem() )
146 _qt_listView->setSelected( yqTreeItem, true );
147 openBranch( yqTreeItem );
148 YTree::selectItem( treeItem, selected );
153 void YQTree::selectItem( YQTreeItem * item )
157 YQSignalBlocker sigBlocker( _qt_listView );
159 _qt_listView->setSelected( item, true );
161 YTree::selectItem( item->origItem(), true );
163 y2debug( "selected item: \"%s\"", item->origItem()->label().c_str() );
168 void YQTree::openBranch( Q3ListViewItem * item )
172 item->setOpen( true ); // Takes care of origItem()->setOpen()
173 item = item->parent();
178 void YQTree::deselectAllItems()
180 YQSignalBlocker sigBlocker( _qt_listView );
182 YTree::deselectAllItems();
183 _qt_listView->clearSelection();
187 void YQTree::deleteAllItems()
189 YQSignalBlocker sigBlocker( _qt_listView );
191 _qt_listView->clear();
192 YTree::deleteAllItems();
196 void YQTree::slotSelected( Q3ListViewItem * qItem )
198 selectItem( dynamic_cast<YQTreeItem *> (qItem) );
200 if ( notify() && ! YQUI::ui()->eventPendingFor( this ) )
201 YQUI::ui()->sendEvent( new YWidgetEvent( this, YEvent::SelectionChanged ) );
205 void YQTree::slotActivated( Q3ListViewItem * qItem )
207 selectItem( dynamic_cast<YQTreeItem *> (qItem) );
210 YQUI::ui()->sendEvent( new YWidgetEvent( this, YEvent::Activated ) );
214 int YQTree::preferredWidth()
216 int hintWidth = _caption->isShown() ? _caption->sizeHint().width() : 0;
217 return max( 200, hintWidth );
221 int YQTree::preferredHeight()
223 // 300 is an arbitrary value. Use a MinSize or MinHeight widget to set a
224 // size that is useful for the application.
226 int hintHeight = _caption->isShown() ? _caption->sizeHint().height() : 0;
228 return 300 + hintHeight;
232 void YQTree::setSize( int newWidth, int newHeight )
234 resize( newWidth, newHeight );
238 void YQTree::setEnabled( bool enabled )
240 _caption->setEnabled( enabled );
241 _qt_listView->setEnabled( enabled );
242 YWidget::setEnabled( enabled );
246 bool YQTree::setKeyboardFocus()
248 _qt_listView->setFocus();
254 /*============================================================================*/
258 YQTreeItem::YQTreeItem( YQTree * tree,
259 Q3ListView * listView,
262 : Q3ListViewItem( listView )
264 init( tree, orig, serial );
266 #if VERBOSE_TREE_ITEMS
267 y2debug( "Creating toplevel tree item \"%s\"", orig->label().c_str() );
272 YQTreeItem::YQTreeItem( YQTree * tree,
273 YQTreeItem * parentItem,
276 : Q3ListViewItem( parentItem )
278 init( tree, orig, serial );
280 #if VERBOSE_TREE_ITEMS
281 y2debug( "Creating tree item \"%s\" as child of \"%s\"",
282 orig->label().c_str(),
283 parentItem->origItem()->label().c_str() );
288 void YQTreeItem::init( YQTree * tree,
292 YUI_CHECK_PTR( tree );
293 YUI_CHECK_PTR( orig );
299 _origItem->setData( this );
301 setText( 0, fromUTF8 ( _origItem->label() ) );
302 setOpen( _origItem->isOpen() );
304 if ( _origItem->hasIconName() )
306 string iconName = _tree->iconFullPath( _origItem );
307 QPixmap icon( iconName.c_str() );
310 y2warning( "Can't load icon %s", iconName.c_str() );
312 setPixmap( 0, icon );
318 YQTreeItem::setOpen( bool open )
320 Q3ListViewItem::setOpen( open );
321 _origItem->setOpen( open );
327 YQTreeItem::key( int column, bool ascending ) const
330 * Sorting key for QListView internal sorting:
332 * Always sort tree items by insertion order. The tree widget
333 * cannot maintain a meaningful sorting order of its own: All it
334 * could do is sort by names (ASCII sort). Better let the (YCP)
335 * application handle this.
339 strKey.sprintf( "%08d", _serialNo );
345 #include "YQTree.moc"