25 #include <QHeaderView>
27 #include <QTreeWidget>
28 #include <QVBoxLayout>
31 #define YUILogComponent "qt-ui"
32 #include <yui/YUILog.h>
38 #include <yui/YEvent.h>
41 #include <yui/YTreeItem.h>
42 #include "YQSignalBlocker.h"
43 #include "YQWidgetCaption.h"
44 #include "YQApplication.h"
47 #define VERBOSE_TREE_ITEMS 0
50 YQTree::YQTree( YWidget * parent,
const std::string & label,
bool multiSelectionMode,
bool recursiveSelectionMode )
51 : QFrame( (QWidget *) parent->widgetRep() )
52 , YTree( parent, label, multiSelectionMode, recursiveSelectionMode )
54 QVBoxLayout* layout =
new QVBoxLayout(
this );
59 layout->setSpacing( YQWidgetSpacing );
60 layout->setMargin ( YQWidgetMargin );
65 YUI_CHECK_NEW( _caption );
66 layout->addWidget( _caption );
68 _qt_treeWidget =
new QTreeWidget(
this );
69 YUI_CHECK_NEW( _qt_treeWidget );
70 layout->addWidget( _qt_treeWidget );
74 _qt_treeWidget->header()->hide();
76 _qt_treeWidget->setRootIsDecorated (
true );
78 _qt_treeWidget->setContextMenuPolicy( Qt::CustomContextMenu );
80 _caption->setBuddy ( _qt_treeWidget );
82 connect( _qt_treeWidget, &pclass(_qt_treeWidget)::itemSelectionChanged,
85 connect( _qt_treeWidget, &pclass(_qt_treeWidget)::itemClicked,
86 this, &pclass(
this)::slotItemClicked );
91 connect( _qt_treeWidget, &pclass(_qt_treeWidget)::itemChanged,
94 connect( _qt_treeWidget, &pclass(_qt_treeWidget)::itemDoubleClicked,
97 connect( _qt_treeWidget, &pclass(_qt_treeWidget)::itemExpanded,
100 connect( _qt_treeWidget, &pclass(_qt_treeWidget)::itemCollapsed,
103 connect( _qt_treeWidget, &pclass(_qt_treeWidget)::customContextMenuRequested,
118 YTree::setLabel( label );
125 _qt_treeWidget->clear();
128 _qt_treeWidget->resizeColumnToContents( 0 );
134 for ( YItemIterator it = begin; it < end; ++it )
136 YTreeItem * orig =
dynamic_cast<YTreeItem *
> (*it);
137 YUI_CHECK_PTR( orig );
142 clone =
new YQTreeItem(
this, parentItem, orig, _nextSerialNo++ );
144 clone =
new YQTreeItem(
this, _qt_treeWidget, orig, _nextSerialNo++ );
146 YUI_CHECK_NEW( clone );
148 if ( orig->hasChildren() )
159 YTreeItem * treeItem =
dynamic_cast<YTreeItem *
> (yItem);
160 YUI_CHECK_PTR( treeItem );
163 YUI_CHECK_PTR( yqTreeItem );
170 else if ( yqTreeItem == _qt_treeWidget->currentItem() )
183 _qt_treeWidget->setCurrentItem( item );
184 item->setSelected(
true );
186 if ( hasMultiSelection() )
187 item->setCheckState( 0, Qt::Checked );
189 if ( item->parent() )
192 YTree::selectItem( item->
origItem(), true );
216 _qt_treeWidget->resizeColumnToContents( 0 );
227 _qt_treeWidget->resizeColumnToContents( 0 );
235 YTree::deselectAllItems();
236 _qt_treeWidget->clearSelection();
238 if ( hasMultiSelection() )
240 QTreeWidgetItemIterator it( _qt_treeWidget);
247 treeItem->setCheckState( 0, Qt::Unchecked );
248 treeItem->
origItem()->setSelected(
false );
261 _qt_treeWidget->clear();
262 YTree::deleteAllItems();
274 YSelectionWidget::selectItem( treeItem->
origItem(), selected );
278 for (
int i=0; i < item->childCount(); ++i)
280 QTreeWidgetItem* child = item->child(i);
281 child->setCheckState(0, ( selected )? Qt::Checked : Qt::Unchecked );
294 if ( hasMultiSelection() )
296 if ( recursiveSelection() )
299 if ( item->checkState(0) == Qt::Checked )
305 if ( recursiveSelection() )
311 QList<QTreeWidgetItem *> items = _qt_treeWidget->selectedItems ();
313 if ( ! items.empty() )
315 QTreeWidgetItem *qItem = items.first();
316 selectItem( dynamic_cast<YQTreeItem *> (qItem) );
322 if ( notify() && !
YQUI::ui()->eventPendingFor(
this ) )
329 void YQTree::slotItemClicked( QTreeWidgetItem * item,
int column )
331 _qt_treeWidget->setCurrentItem( item );
333 if ( notify() && !
YQUI::ui()->eventPendingFor(
this ) )
342 QList<QTreeWidgetItem *> items = _qt_treeWidget->selectedItems ();
344 if ( ! hasMultiSelection() && ! items.empty() )
346 QTreeWidgetItem *qItem = items.first();
347 selectItem( dynamic_cast<YQTreeItem *> (qItem) );
351 if ( notify() && !
YQUI::ui()->eventPendingFor(
this ) )
358 selectItem( dynamic_cast<YQTreeItem *> (qItem) );
367 int hintWidth = !_caption->isHidden() ? _caption->sizeHint().width() : 0;
368 return max( 80, hintWidth );
374 int hintHeight = !_caption->isHidden() ? _caption->sizeHint().height() : 0;
379 return 80 + hintHeight;
385 resize( newWidth, newHeight );
391 _caption->setEnabled( enabled );
392 _qt_treeWidget->setEnabled( enabled );
393 YWidget::setEnabled( enabled );
399 _qt_treeWidget->setFocus();
407 if ( ! _qt_treeWidget || ! _qt_treeWidget->viewport() )
411 if ( notifyContextMenu() )
420 QTreeWidgetItem * currentQItem = _qt_treeWidget->currentItem();
440 QTreeWidget * listView,
443 : QTreeWidgetItem( listView )
445 init( tree, orig, serial );
447 #if VERBOSE_TREE_ITEMS
448 yuiDebug() <<
"Creating toplevel tree item \"" << orig->label() <<
"\"" << std::endl;
458 : QTreeWidgetItem( parentItem )
460 init( tree, orig, serial );
461 #if VERBOSE_TREE_ITEMS
462 yuiDebug() <<
"Creating tree item \"" << orig->label()
463 <<
"\" as child of \"" << parentItem->
origItem()->label() <<
"\""
473 void YQTreeItem::init(
YQTree * tree,
477 YUI_CHECK_PTR( tree );
478 YUI_CHECK_PTR( orig );
484 _origItem->setData(
this );
486 setText( 0, fromUTF8 ( _origItem->label() ) );
487 setOpen( _origItem->isOpen() );
489 if ( _origItem->hasIconName() )
491 string iconName = _tree->iconFullPath( _origItem );
492 QPixmap icon( iconName.c_str() );
495 yuiWarning() <<
"Can't load icon " << iconName << std::endl;
497 setData( 0, Qt::DecorationRole, icon );
500 if ( tree->hasMultiSelection() )
501 setCheckState(0,Qt::Unchecked);
508 QTreeWidgetItem::setExpanded( open );
509 _origItem->setOpen( open );
526 strKey.sprintf(
"%08d", _serialNo );
532 #include "YQTree.moc"