25 #include <QColorGroup>
26 #include <QHeaderView>
28 #include <QTreeWidget>
29 #include <QVBoxLayout>
32 #define YUILogComponent "qt-ui"
33 #include <yui/YUILog.h>
39 #include <yui/YEvent.h>
42 #include <yui/YTreeItem.h>
43 #include "YQSignalBlocker.h"
44 #include "YQWidgetCaption.h"
45 #include "YQApplication.h"
48 #define VERBOSE_TREE_ITEMS 0
51 YQTree::YQTree( YWidget * parent,
const std::string & label,
bool multiSelectionMode,
bool recursiveSelectionMode )
52 : QFrame( (QWidget *) parent->widgetRep() )
53 , YTree( parent, label, multiSelectionMode, recursiveSelectionMode )
55 QVBoxLayout* layout =
new QVBoxLayout(
this );
60 layout->setSpacing( YQWidgetSpacing );
61 layout->setMargin ( YQWidgetMargin );
66 YUI_CHECK_NEW( _caption );
67 layout->addWidget( _caption );
69 _qt_treeWidget =
new QTreeWidget(
this );
70 YUI_CHECK_NEW( _qt_treeWidget );
71 layout->addWidget( _qt_treeWidget );
75 _qt_treeWidget->header()->hide();
77 _qt_treeWidget->setRootIsDecorated (
true );
79 _qt_treeWidget->setContextMenuPolicy( Qt::CustomContextMenu );
81 _caption->setBuddy ( _qt_treeWidget );
83 connect( _qt_treeWidget, SIGNAL( itemSelectionChanged () ),
86 connect( _qt_treeWidget, SIGNAL( itemClicked ( QTreeWidgetItem *,
int ) ),
87 this, SLOT ( slotItemClicked ( QTreeWidgetItem *,
int ) ) );
92 connect( _qt_treeWidget, SIGNAL( itemChanged ( QTreeWidgetItem *,
int ) ),
95 connect( _qt_treeWidget, SIGNAL( itemDoubleClicked( QTreeWidgetItem *,
int ) ),
98 connect( _qt_treeWidget, SIGNAL( itemExpanded ( QTreeWidgetItem * ) ),
101 connect( _qt_treeWidget, SIGNAL( itemCollapsed ( QTreeWidgetItem * ) ),
104 connect( _qt_treeWidget, SIGNAL( customContextMenuRequested (
const QPoint & ) ),
119 YTree::setLabel( label );
126 _qt_treeWidget->clear();
129 _qt_treeWidget->resizeColumnToContents( 0 );
135 for ( YItemIterator it = begin; it < end; ++it )
137 YTreeItem * orig =
dynamic_cast<YTreeItem *
> (*it);
138 YUI_CHECK_PTR( orig );
143 clone =
new YQTreeItem(
this, parentItem, orig, _nextSerialNo++ );
145 clone =
new YQTreeItem(
this, _qt_treeWidget, orig, _nextSerialNo++ );
147 YUI_CHECK_NEW( clone );
149 if ( orig->hasChildren() )
160 YTreeItem * treeItem =
dynamic_cast<YTreeItem *
> (yItem);
161 YUI_CHECK_PTR( treeItem );
164 YUI_CHECK_PTR( yqTreeItem );
171 else if ( yqTreeItem == _qt_treeWidget->currentItem() )
184 _qt_treeWidget->setCurrentItem( item );
185 item->setSelected(
true );
187 if ( hasMultiSelection() )
188 item->setCheckState( 0, Qt::Checked );
190 if ( item->parent() )
193 YTree::selectItem( item->
origItem(), true );
217 _qt_treeWidget->resizeColumnToContents( 0 );
228 _qt_treeWidget->resizeColumnToContents( 0 );
236 YTree::deselectAllItems();
237 _qt_treeWidget->clearSelection();
239 if ( hasMultiSelection() )
241 QTreeWidgetItemIterator it( _qt_treeWidget);
248 treeItem->setCheckState( 0, Qt::Unchecked );
249 treeItem->
origItem()->setSelected(
false );
262 _qt_treeWidget->clear();
263 YTree::deleteAllItems();
275 YSelectionWidget::selectItem( treeItem->
origItem(), selected );
279 for (
int i=0; i < item->childCount(); ++i)
281 QTreeWidgetItem* child = item->child(i);
282 child->setCheckState(0, ( selected )? Qt::Checked : Qt::Unchecked );
295 if ( hasMultiSelection() )
297 if ( recursiveSelection() )
300 if ( item->checkState(0) == Qt::Checked )
306 if ( recursiveSelection() )
312 QList<QTreeWidgetItem *> items = _qt_treeWidget->selectedItems ();
314 if ( ! items.empty() )
316 QTreeWidgetItem *qItem = items.first();
317 selectItem( dynamic_cast<YQTreeItem *> (qItem) );
323 if ( notify() && !
YQUI::ui()->eventPendingFor(
this ) )
330 void YQTree::slotItemClicked( QTreeWidgetItem * item,
int column )
332 _qt_treeWidget->setCurrentItem( item );
334 if ( notify() && !
YQUI::ui()->eventPendingFor(
this ) )
343 QList<QTreeWidgetItem *> items = _qt_treeWidget->selectedItems ();
345 if ( ! hasMultiSelection() && ! items.empty() )
347 QTreeWidgetItem *qItem = items.first();
348 selectItem( dynamic_cast<YQTreeItem *> (qItem) );
352 if ( notify() && !
YQUI::ui()->eventPendingFor(
this ) )
359 selectItem( dynamic_cast<YQTreeItem *> (qItem) );
368 int hintWidth = !_caption->isHidden() ? _caption->sizeHint().width() : 0;
369 return max( 80, hintWidth );
375 int hintHeight = !_caption->isHidden() ? _caption->sizeHint().height() : 0;
380 return 80 + hintHeight;
386 resize( newWidth, newHeight );
392 _caption->setEnabled( enabled );
393 _qt_treeWidget->setEnabled( enabled );
394 YWidget::setEnabled( enabled );
400 _qt_treeWidget->setFocus();
408 if ( ! _qt_treeWidget || ! _qt_treeWidget->viewport() )
412 if ( notifyContextMenu() )
421 QTreeWidgetItem * currentQItem = _qt_treeWidget->currentItem();
441 QTreeWidget * listView,
444 : QTreeWidgetItem( listView )
446 init( tree, orig, serial );
448 #if VERBOSE_TREE_ITEMS
449 yuiDebug() <<
"Creating toplevel tree item \"" << orig->label() <<
"\"" << std::endl;
459 : QTreeWidgetItem( parentItem )
461 init( tree, orig, serial );
462 #if VERBOSE_TREE_ITEMS
463 yuiDebug() <<
"Creating tree item \"" << orig->label()
464 <<
"\" as child of \"" << parentItem->
origItem()->label() <<
"\""
474 void YQTreeItem::init(
YQTree * tree,
478 YUI_CHECK_PTR( tree );
479 YUI_CHECK_PTR( orig );
485 _origItem->setData(
this );
487 setText( 0, fromUTF8 ( _origItem->label() ) );
488 setOpen( _origItem->isOpen() );
490 if ( _origItem->hasIconName() )
492 string iconName = _tree->iconFullPath( _origItem );
493 QPixmap icon( iconName.c_str() );
496 yuiWarning() <<
"Can't load icon " << iconName << std::endl;
498 setData( 0, Qt::DecorationRole, icon );
501 if ( tree->hasMultiSelection() )
502 setCheckState(0,Qt::Unchecked);
509 QTreeWidgetItem::setExpanded( open );
510 _origItem->setOpen( open );
527 strKey.sprintf(
"%08d", _serialNo );
533 #include "YQTree.moc"
static YQApplication * yqApp()
void slotItemChanged(QTreeWidgetItem *item)
virtual int preferredWidth()
virtual void setOpen(bool open)
virtual void rebuildTree()
virtual YTreeItem * currentItem()
YQTree(YWidget *parent, const std::string &label, bool multiSelection, bool recursiveSelection)
void openBranch(YQTreeItem *item)
void slotItemExpanded(QTreeWidgetItem *item)
virtual void setLabel(const std::string &label)
void slotItemCollapsed(QTreeWidgetItem *item)
virtual void deselectAllItems()
virtual void setContextMenuPos(QPoint contextMenuPos)
void sendEvent(YEvent *event)
virtual void setSize(int newWidth, int newHeight)
virtual void selectItem(YItem *item, bool selected=true)
YQTreeItem(YQTree *tree, QTreeWidget *parent, YTreeItem *origItem, int serial)
void slotSelectionChanged()
virtual void deleteAllItems()
virtual void setEnabled(bool enabled)
QString key(int column, bool ascending) const
void slotActivated(QTreeWidgetItem *item)
void buildDisplayTree(YQTreeItem *parentItem, YItemIterator begin, YItemIterator end)
virtual int preferredHeight()
virtual bool setKeyboardFocus()
void slotContextMenu(const QPoint &pos)