From 1bca6a469a21d635781c700a9606ffb1f963d98b Mon Sep 17 00:00:00 2001 From: Marius Bugge Monsen Date: Mon, 10 Aug 2009 16:33:07 +0200 Subject: Updates to enable itemviews-ng use qml and to be used by qml. QGraphicsObject is now the base class for view items. --- src/qgraphicslistview.cpp | 81 ++++++---- src/qgraphicslistview.h | 22 ++- src/qgraphicslistview_p.h | 2 + src/qgraphicstableview.cpp | 361 ++++++++++++++++++++++---------------------- src/qgraphicstableview.h | 29 +++- src/qgraphicstableview_p.h | 2 +- src/qgraphicstreeview.cpp | 366 +++++++++++++++++++++++---------------------- src/qgraphicstreeview.h | 29 +++- src/qgraphicstreeview_p.h | 2 +- src/qlistmodelinterface.h | 1 + 10 files changed, 479 insertions(+), 416 deletions(-) (limited to 'src') diff --git a/src/qgraphicslistview.cpp b/src/qgraphicslistview.cpp index 70d3ec6..b77e56b 100644 --- a/src/qgraphicslistview.cpp +++ b/src/qgraphicslistview.cpp @@ -219,31 +219,31 @@ void QtGraphicsListViewItem::initStyleOption(QStyleOptionViewItemV4 *option) con QVariant value; // FontRole - value = d->view->cachedData(d->index, Qt::FontRole); + value = d->view->d_func()->cachedData(d->index, Qt::FontRole); if (value.isValid()) { option->font = qvariant_cast(value).resolve(option->font); option->fontMetrics = QFontMetrics(option->font); } // TextAlignmentRole - value = d->view->cachedData(d->index, Qt::TextAlignmentRole); + value = d->view->d_func()->cachedData(d->index, Qt::TextAlignmentRole); if (value.isValid()) option->displayAlignment = (Qt::Alignment)value.toInt(); // ForegroundRole - value = d->view->cachedData(d->index, Qt::ForegroundRole); + value = d->view->d_func()->cachedData(d->index, Qt::ForegroundRole); if (qVariantCanConvert(value)) option->palette.setBrush(QPalette::Text, qvariant_cast(value)); // CheckStateRole - value = d->view->cachedData(d->index, Qt::CheckStateRole); + value = d->view->d_func()->cachedData(d->index, Qt::CheckStateRole); if (value.isValid()) { option->features |= QStyleOptionViewItemV2::HasCheckIndicator; option->checkState = static_cast(value.toInt()); } // DecorationRole - value = d->view->cachedData(d->index, Qt::DecorationRole); + value = d->view->d_func()->cachedData(d->index, Qt::DecorationRole); if (value.isValid()) { option->features |= QStyleOptionViewItemV2::HasDecoration; switch (value.type()) { @@ -260,7 +260,7 @@ void QtGraphicsListViewItem::initStyleOption(QStyleOptionViewItemV4 *option) con } // DisplayRole - value = d->view->cachedData(d->index, Qt::DisplayRole); + value = d->view->d_func()->cachedData(d->index, Qt::DisplayRole); if (value.isValid()) { option->features |= QStyleOptionViewItemV2::HasDisplay; switch (value.type()) { @@ -343,18 +343,23 @@ QtGraphicsListViewItemCreatorBase::~QtGraphicsListViewItemCreatorBase() */ /*! - This method basically does a recycle and a create in one go. + \fn QGraphicsObject *QtGraphicsListViewItemCreatorBase::reassign(int index, QGraphicsObject *item, QtGraphicsListView *view) + Assigns a new \a index to the given \a item in the given \a view, and returns it to the view. */ -QGraphicsObject *QtGraphicsListViewItemCreatorBase::reassign(int index, QGraphicsObject *item, QtGraphicsListView *view) + +/*! + Updates the given \a item, with the given \a index, using the given \a roles. +*/ +void QtGraphicsListViewItemCreatorBase::update(int index, QGraphicsObject *item, const QList &roles) { - Q_UNUSED(view); + Q_UNUSED(index); + Q_UNUSED(roles); Q_ASSERT(item); - static_cast(item)->setIndex(index); - return item; + item->update(); } /*! - Give back the \a item to the creator pool of unused objects. + Discart the given \a item. The creator may choose to reuse the item later. */ void QtGraphicsListViewItemCreatorBase::recycle(QGraphicsObject *item) { @@ -376,7 +381,7 @@ void QtGraphicsListViewItemCreatorBase::recycle(QGraphicsObject *item) QtGraphicsListViewPrivate::QtGraphicsListViewPrivate() : q_ptr(0), controller(0), model(0), selectionManager(0), orientation(Qt::Horizontal), textElideMode(Qt::ElideMiddle), - firstIndex(0), offset(0), + highlight(0), firstIndex(0), offset(0), #if CACHING_ENABLED cachedIndexOffset(0), cachedCoordinateOffset(0), #endif @@ -427,14 +432,11 @@ void QtGraphicsListViewPrivate::_q_itemsChanged(int index, int count, const QLis checkCache(index, count); //qDebug() << "QtGraphicsListViewPrivate::_q_itemsChanged" << index << count; for (int i = 0; i < items.count(); ++i) { - QGraphicsObject *item = items.at(i).second; int itemIndex = items.at(i).first; + if (itemIndex <= index) // item was changed + creator->update(itemIndex, items.at(i).second, roles); if (itemIndex >= index + count) // change happened above break; - //if (itemIndex >= index && item->isWidget()) - // item->itemChanged(roles); - Q_UNUSED(roles); - item->update(); // ### } q->updateLayout(); // ### FIXME: be more discriminate } @@ -500,12 +502,16 @@ void QtGraphicsListViewPrivate::_q_currentChanged(int current, int previous) if (items.isEmpty()) return; //qDebug() << "QtGraphicsListViewPrivate::_q_currentChanged" << current << previous; - const int from = items.first().first; - const int to = items.last().first; - if (from <= current && current <= to) - items.at(current - from).second->update(); - if (from <= previous && previous <= to) - items.at(current - from).second->update(); + if (highlight) { + // FIXME: update highlight geometry + } else { + const int from = items.first().first; + const int to = items.last().first; + if (from <= current && current <= to) + items.at(current - from).second->update(); + if (from <= previous && previous <= to) + items.at(current - from).second->update(); + } } /*! @@ -798,6 +804,23 @@ void QtGraphicsListView::setTextElideMode(Qt::TextElideMode mode) //d->checkCache(0, 0); } +/*! + */ +QGraphicsObject *QtGraphicsListView::highlight() const +{ + Q_D(const QtGraphicsListView); + return d->highlight; +} + +/*! + */ +void QtGraphicsListView::setHighlight(QGraphicsObject *highlight) +{ + Q_D(QtGraphicsListView); + d->highlight = highlight; + // update the highlight geometry +} + /*! */ QtGraphicsListView::~QtGraphicsListView() @@ -1192,7 +1215,6 @@ void QtGraphicsListView::initStyleOption(QStyleOptionViewItemV4 *option) const option->widget = 0; option->font = QApplication::font(); option->fontMetrics = QFontMetrics(option->font); - option->displayAlignment = Qt::AlignLeft|Qt::AlignVCenter; option->textElideMode = textElideMode(); option->showDecorationSelected = style()->styleHint(QStyle::SH_ItemView_ShowDecorationSelected); int pm = style()->pixelMetric(QStyle::PM_ListViewIconSize); @@ -1282,6 +1304,7 @@ void QtGraphicsListView::setItemCreator(QtGraphicsListViewItemCreatorBase *creat if (d->creator) delete d->creator; d->creator = creator; + d->items.clear(); } /*! @@ -1314,14 +1337,6 @@ void QtGraphicsListView::itemGeometryChanged(QtGraphicsListViewItem *item) } } -/*! - */ -QVariant QtGraphicsListView::cachedData(int index, int role) const -{ - Q_D(const QtGraphicsListView); - return d->cachedData(index, role); -} - QT_END_NAMESPACE #include "moc_qgraphicslistview.cpp" diff --git a/src/qgraphicslistview.h b/src/qgraphicslistview.h index 5e2d3a1..67f1ff1 100644 --- a/src/qgraphicslistview.h +++ b/src/qgraphicslistview.h @@ -46,6 +46,7 @@ class QtGraphicsListView; class Q_ITEMVIEWSNG_EXPORT QtGraphicsListViewItem : public QGraphicsWidget { + Q_OBJECT public: QtGraphicsListViewItem(int index, QtGraphicsListView *view); virtual ~QtGraphicsListViewItem(); @@ -78,7 +79,8 @@ class Q_ITEMVIEWSNG_EXPORT QtGraphicsListViewItemCreatorBase public: virtual ~QtGraphicsListViewItemCreatorBase(); virtual QGraphicsObject *create(int index, QtGraphicsListView *view) = 0; - virtual QGraphicsObject *reassign(int index, QGraphicsObject *item, QtGraphicsListView *view); + virtual QGraphicsObject *reassign(int index, QGraphicsObject *item, QtGraphicsListView *view) = 0; + virtual void update(int index, QGraphicsObject *item, const QList &roles); virtual void recycle(QGraphicsObject *item); }; @@ -87,6 +89,17 @@ class Q_ITEMVIEWSNG_EXPORT QtGraphicsListViewItemCreator : public QtGraphicsList { public: inline QGraphicsObject *create(int index, QtGraphicsListView *view) { return new T(index, view); } + inline QGraphicsObject *reassign(int index, QGraphicsObject *item, QtGraphicsListView *view) + { + Q_UNUSED(view); + static_cast(item)->setIndex(index); + return item; + } + inline void update(int index, QGraphicsObject *item, const QList &roles) + { + Q_UNUSED(index); + static_cast(item)->itemChanged(roles); + } }; class Q_ITEMVIEWSNG_EXPORT QtGraphicsListView : public QGraphicsWidget @@ -96,6 +109,7 @@ class Q_ITEMVIEWSNG_EXPORT QtGraphicsListView : public QGraphicsWidget Q_PROPERTY(Qt::TextElideMode textElideMode READ textElideMode WRITE setTextElideMode) Q_PROPERTY(int firstIndex READ firstIndex WRITE setFirstIndex) Q_PROPERTY(qreal offset READ offset WRITE setOffset) + Q_PROPERTY(QGraphicsObject* highlight READ highlight WRITE setHighlight) public: QtGraphicsListView(Qt::Orientation orientation = Qt::Vertical, QGraphicsWidget *parent = 0, Qt::WindowFlags wFlags = 0); @@ -118,6 +132,9 @@ public: int firstIndex() const; qreal offset() const; + QGraphicsObject *highlight() const; + void setHighlight(QGraphicsObject *highlight); + virtual int maximumFirstIndex() const; virtual qreal maximumOffset() const; @@ -154,8 +171,6 @@ protected: virtual bool event(QEvent *event); virtual QVariant itemChange(GraphicsItemChange change, const QVariant &value); - QVariant cachedData(int index, int role) const; - QtGraphicsListViewPrivate *d_ptr; private: @@ -171,6 +186,7 @@ private: Q_PRIVATE_SLOT(d_func(), void _q_itemsInserted(int index, int count)) Q_PRIVATE_SLOT(d_func(), void _q_itemsRemoved(int index, int count)) Q_PRIVATE_SLOT(d_func(), void _q_selectionsChanged(const QtListSelectionChange &change)) + Q_PRIVATE_SLOT(d_func(), void _q_currentChanged(int current, int previous)) }; QT_END_NAMESPACE diff --git a/src/qgraphicslistview_p.h b/src/qgraphicslistview_p.h index 3da1b02..0a2d3e2 100644 --- a/src/qgraphicslistview_p.h +++ b/src/qgraphicslistview_p.h @@ -93,6 +93,8 @@ public: Qt::Orientation orientation; Qt::TextElideMode textElideMode; + QGraphicsObject *highlight; + int firstIndex; qreal offset; diff --git a/src/qgraphicstableview.cpp b/src/qgraphicstableview.cpp index a52faeb..3e1b15a 100644 --- a/src/qgraphicstableview.cpp +++ b/src/qgraphicstableview.cpp @@ -86,7 +86,7 @@ QSizeF QtGraphicsTableViewItem::sizeHint(Qt::SizeHint which, const QSizeF &const { Q_D(const QtGraphicsTableViewItem); d->view->initStyleOption(&d->option); - d->view->initStyleOption(&d->option, d->row, d->column); + initStyleOption(&d->option); return sizeHint(d->row, d->column, &d->option, which, constraint); } @@ -138,8 +138,8 @@ void QtGraphicsTableViewItem::paint(QPainter *painter, const QStyleOptionGraphic Q_D(QtGraphicsTableViewItem); // draw content d->view->initStyleOption(&d->option); - d->view->copyStyleOptionState(option, &d->option); - d->view->initStyleOption(&d->option, d->row, d->column); + copyStyleOptionState(option, &d->option); + initStyleOption(&d->option); const QRect rect = QRectF(QPointF(), size()).toRect(); d->option.rect = rect; // ### FIXME: allow text to be drawn outside the item @@ -155,6 +155,147 @@ void QtGraphicsTableViewItem::paint(QPainter *painter, const QStyleOptionGraphic // bottom painter->fillRect(rect.right(), rect.top(), 1, rect.height(), gridColor); } + +/*! + */ +void QtGraphicsTableViewItem::initStyleOption(QStyleOptionViewItemV4 *option) const +{ + Q_D(const QtGraphicsTableViewItem); + Q_ASSERT(option); + + option->rect = QRect(); + option->features = 0; + +// FIXME: + if (d->view->d_func()->isCurrent(d->row, d->column)) + option->state |= QStyle::State_HasFocus; + else + option->state &= ~QStyle::State_HasFocus; + + if (d->view->d_func()->isSelected(d->row, d->column)) + option->state |= QStyle::State_Selected; + else + option->state &= ~QStyle::State_Selected; +/* + if (d->view->d_func()->mouseOver(d->row, d->column)) + opt.state |= QStyle::State_MouseOver; + else + opt.state &= ~QStyle::State_MouseOver; +*/ + + option->rect = QRect(); + option->features = 0; + + QVariant value; + + // FontRole + value = d->view->d_func()->cachedData(d->row, d->column, Qt::FontRole); + if (value.isValid()) { + option->font = qvariant_cast(value).resolve(option->font); + option->fontMetrics = QFontMetrics(option->font); + } else { + option->font = QFont(); + } + + // TextAlignmentRole + value = d->view->d_func()->cachedData(d->row, d->column, Qt::TextAlignmentRole); + if (value.isValid()) + option->displayAlignment = static_cast(value.toInt()); + else + option->displayAlignment = Qt::AlignLeft|Qt::AlignVCenter; + + // ForegroundRole + value = d->view->d_func()->cachedData(d->row, d->column, Qt::ForegroundRole); + if (qVariantCanConvert(value)) + option->palette.setBrush(QPalette::Text, qvariant_cast(value)); + else + option->palette = QPalette(); + + // CheckStateRole + value = d->view->d_func()->cachedData(d->row, d->column, Qt::CheckStateRole); + if (value.isValid()) { + option->features |= QStyleOptionViewItemV2::HasCheckIndicator; + option->checkState = static_cast(value.toInt()); + } else { + option->checkState = Qt::Unchecked; + } + + // DecorationRole + value = d->view->d_func()->cachedData(d->row, d->column, Qt::DecorationRole); + if (value.isValid()) { + option->features |= QStyleOptionViewItemV2::HasDecoration; + switch (value.type()) { + case QVariant::Icon: + option->icon = qvariant_cast(value); + break; + case QVariant::Color: { + QPixmap pixmap(option->decorationSize); + pixmap.fill(qvariant_cast(value)); + option->icon = QIcon(pixmap); } + default: + break; + } + } else { + option->icon = QIcon(); + } + + // DisplayRole + value = d->view->d_func()->cachedData(d->row, d->column, Qt::DisplayRole); + if (value.isValid()) { + option->features |= QStyleOptionViewItemV2::HasDisplay; + switch (value.type()) { + case QVariant::Double: + option->text = option->locale.toString(value.toDouble()); + break; + case QVariant::Int: + case QVariant::LongLong: + option->text = option->locale.toString(value.toLongLong()); + break; + case QVariant::UInt: + case QVariant::ULongLong: + option->text = option->locale.toString(value.toULongLong()); + break; + case QVariant::Date: + option->text = option->locale.toString(value.toDate(), QLocale::ShortFormat); + break; + case QVariant::Time: + option->text = option->locale.toString(value.toTime(), QLocale::ShortFormat); + break; + case QVariant::DateTime: + option->text = option->locale.toString(value.toDateTime().date(), QLocale::ShortFormat); + option->text += QLatin1Char(' '); + option->text += option->locale.toString(value.toDateTime().time(), QLocale::ShortFormat); + break; + default: { + QString text = value.toString(); + for (int i = 0; i < text.count(); ++i) + if (text.at(i).unicode() == '\n') + text[i] = QChar::LineSeparator; + option->text = text; + break; } + } + } else { + option->text = QString(); + } + + if (d->view->d_func()->showGrid) { + // ### FIXME: create and set a flag for each of the sides of the cell to paint the grid lines. + } +} + +/*! + */ +void QtGraphicsTableViewItem::copyStyleOptionState(const QStyleOptionGraphicsItem *source, QStyleOptionViewItemV4 *destination) +{ + if (source && destination) { + destination->state = source->state; + destination->direction = source->direction; + destination->rect = source->rect; + destination->fontMetrics = source->fontMetrics; + destination->palette = source->palette; + } +} + /*! \class QtGraphicsTableViewItemCreatorBase */ @@ -165,14 +306,16 @@ QtGraphicsTableViewItemCreatorBase::~QtGraphicsTableViewItemCreatorBase() { } -QtGraphicsTableViewItem *QtGraphicsTableViewItemCreatorBase::reassign(int row, int column, QtGraphicsTableViewItem *item) +void QtGraphicsTableViewItemCreatorBase::update(int row, int column, QGraphicsObject *item, const QList &roles) { + Q_UNUSED(row); + Q_UNUSED(column); + Q_UNUSED(roles); Q_ASSERT(item); - item->setCell(row, column); - return item; + item->update(); } -void QtGraphicsTableViewItemCreatorBase::recycle(QtGraphicsTableViewItem *item) +void QtGraphicsTableViewItemCreatorBase::recycle(QGraphicsObject *item) { delete item; } @@ -253,7 +396,7 @@ void QtGraphicsTableViewPrivate::_q_selectionsChanged(const QListupdate(); } } @@ -266,9 +409,9 @@ void QtGraphicsTableViewPrivate::_q_currentChanged(int currentRow, int currentCo if (!model) return; const int columnCount = model->columnCount(); - if (QtGraphicsTableViewItem *current = items.value((currentRow * columnCount) + currentColumn)) + if (QGraphicsObject *current = items.value((currentRow * columnCount) + currentColumn)) current->update(); - if (QtGraphicsTableViewItem *previous = items.value((previousRow * columnCount) + previousColumn)) + if (QGraphicsObject *previous = items.value((previousRow * columnCount) + previousColumn)) previous->update(); } @@ -341,7 +484,7 @@ void QtGraphicsTableViewPrivate::checkItems(int firstRow, int firstColumn, int r Q_UNUSED(firstColumn); Q_UNUSED(rowCount); Q_UNUSED(columnCount); - QHash::iterator it = items.begin(); + QHash::iterator it = items.begin(); while (it != items.end()) { creator->recycle(it.value()); ++it; @@ -375,7 +518,7 @@ QVariant QtGraphicsTableViewPrivate::cachedData(int row, int column, int role) c return QVariant(); if (row != cachedDataRow || column != cachedDataColumn) { cachedDataHash = model->data(row, column, roles); - cachedDataRow = row; + cachedDataRow = row; cachedDataColumn = column; } return cachedDataHash.value(role); @@ -428,15 +571,15 @@ void QtGraphicsTableView::setController(QtTableController *controller) Q_D(QtGraphicsTableView); if (d->controller == controller) return; - if (d->controller) { - QObject::disconnect(d->controller, SIGNAL(destroyed()), - this, SLOT(_q_controllerDestroyed())); - } - d->controller = controller; - if (d->controller) { - QObject::connect(d->controller, SIGNAL(destroyed()), - this, SLOT(_q_controllerDestroyed())); - } + if (d->controller) { + QObject::disconnect(d->controller, SIGNAL(destroyed()), + this, SLOT(_q_controllerDestroyed())); + } + d->controller = controller; + if (d->controller) { + QObject::connect(d->controller, SIGNAL(destroyed()), + this, SLOT(_q_controllerDestroyed())); + } updateLayout(); } @@ -516,7 +659,7 @@ void QtGraphicsTableView::setSelectionManager(QtTableSelectionManager *selection disconnect(d->selectionManager, SIGNAL(selectionsChanged(const QList&)), this, SLOT(_q_selectionsChanged(const QList&))); disconnect(d->selectionManager, SIGNAL(currentChanged(int,int,int,int)), - this, SLOT(_q_currentChanged(int,int,int,int))); + this, SLOT(_q_currentChanged(int,int,int,int))); } d->selectionManager = selectionManager; if (d->selectionManager) { @@ -960,7 +1103,7 @@ void QtGraphicsTableView::setItemCreator(QtGraphicsTableViewItemCreatorBase *cre Returns the visible item for the given \a row and \a column, or null if the item is not visible. */ -QtGraphicsTableViewItem *QtGraphicsTableView::itemForCell(int row, int column) const +QGraphicsObject *QtGraphicsTableView::itemForCell(int row, int column) const { Q_D(const QtGraphicsTableView); const int columnCount = d->model ? d->model->columnCount() : 0; @@ -1027,7 +1170,7 @@ void QtGraphicsTableView::doLayout() const int oldLastHorizontalSection = d->visibleSections.rightColumn(); // find unused items for reassignment - QStack unused; + QStack unused; /* -------------- @@ -1047,7 +1190,7 @@ void QtGraphicsTableView::doLayout() for (int horizontalSection = oldFirstHorizontalSection; horizontalSection <= oldLastHorizontalSection; ++horizontalSection) { const int column = horizontalMapping.value(horizontalSection, horizontalSection); const qint64 index = (row * columnCount) + column; - if (QtGraphicsTableViewItem *item = d->items.take(index)) + if (QGraphicsObject *item = d->items.take(index)) unused.push(item); } } @@ -1057,7 +1200,7 @@ void QtGraphicsTableView::doLayout() for (int verticalSection = firstVerticalSection; verticalSection <= lastVerticalSection; ++verticalSection) { const int row = verticalMapping.value(verticalSection, verticalSection); const qint64 index = (row * columnCount) + column; - if (QtGraphicsTableViewItem *item = d->items.take(index)) + if (QGraphicsObject *item = d->items.take(index)) unused.push(item); } } @@ -1067,7 +1210,7 @@ void QtGraphicsTableView::doLayout() for (int horizontalSection = oldFirstHorizontalSection; horizontalSection <= oldLastHorizontalSection; ++horizontalSection) { const int column = horizontalMapping.value(horizontalSection, horizontalSection); const qint64 index = (row * columnCount) + column; - if (QtGraphicsTableViewItem *item = d->items.take(index)) + if (QGraphicsObject *item = d->items.take(index)) unused.push(item); } } @@ -1077,7 +1220,7 @@ void QtGraphicsTableView::doLayout() for (int verticalSection = firstVerticalSection; verticalSection <= lastVerticalSection; ++verticalSection) { const int row = verticalMapping.value(verticalSection, verticalSection); const qint64 index = (row * columnCount) + column; - if (QtGraphicsTableViewItem *item = d->items.take(index)) + if (QGraphicsObject *item = d->items.take(index)) unused.push(item); } } @@ -1092,15 +1235,18 @@ void QtGraphicsTableView::doLayout() const int column = horizontalMapping.value(horizontalSection, horizontalSection); const qreal width = columnWidth(column); const qint64 index = (row * columnCount) + column; - QtGraphicsTableViewItem *item = d->items.value(index); + QGraphicsObject *item = d->items.value(index); if (!item) { if (unused.isEmpty()) item = d->creator->create(row, column, this); else - item = d->creator->reassign(row, column, unused.pop()); + item = d->creator->reassign(row, column, unused.pop(), this); d->items.insert(index, item); } - item->setGeometry(x, y, width, height); + if (item->isWidget()) + static_cast(item)->setGeometry(x, y, width, height); + else + item->setPos(x, y); x += width; } y += height; @@ -1187,6 +1333,7 @@ void QtGraphicsTableView::initStyleOption(QStyleOptionViewItemV4 *option) const Q_ASSERT(option); option->widget = 0; option->font = QApplication::font(); + option->fontMetrics = QFontMetrics(option->font); option->decorationPosition = QStyleOptionViewItem::Left; option->decorationAlignment = Qt::AlignCenter; //option->displayAlignment = Qt::AlignLeft|Qt::AlignVCenter; @@ -1204,154 +1351,6 @@ void QtGraphicsTableView::initStyleOption(QStyleOptionViewItemV4 *option) const option->state |= QStyle::State_Active; } -/*! - */ -void QtGraphicsTableView::initStyleOption(QStyleOptionViewItemV4 *option, int row, int column) const -{ - Q_D(const QtGraphicsTableView); - Q_ASSERT(option); - - option->rect = QRect(); - option->features = 0; - - initStyleOptionState(option, row, column); - - option->rect = QRect(); - option->features = 0; - - QVariant value; - - // FontRole - value = d->cachedData(row, column, Qt::FontRole); - if (value.isValid()) { - option->font = qvariant_cast(value).resolve(option->font); - option->fontMetrics = QFontMetrics(option->font); - } else { - option->font = QFont(); - } - - // TextAlignmentRole - value = d->cachedData(row, column, Qt::TextAlignmentRole); - if (value.isValid()) - option->displayAlignment = static_cast(value.toInt()); - else - option->displayAlignment = Qt::AlignLeft|Qt::AlignVCenter; - - // ForegroundRole - value = d->cachedData(row, column, Qt::ForegroundRole); - if (qVariantCanConvert(value)) - option->palette.setBrush(QPalette::Text, qvariant_cast(value)); - else - option->palette = QPalette(); - - // CheckStateRole - value = d->cachedData(row, column, Qt::CheckStateRole); - if (value.isValid()) { - option->features |= QStyleOptionViewItemV2::HasCheckIndicator; - option->checkState = static_cast(value.toInt()); - } else { - option->checkState = Qt::Unchecked; - } - - // DecorationRole - value = d->cachedData(row, column, Qt::DecorationRole); - if (value.isValid()) { - option->features |= QStyleOptionViewItemV2::HasDecoration; - switch (value.type()) { - case QVariant::Icon: - option->icon = qvariant_cast(value); - break; - case QVariant::Color: { - QPixmap pixmap(option->decorationSize); - pixmap.fill(qvariant_cast(value)); - option->icon = QIcon(pixmap); } - default: - break; - } - } else { - option->icon = QIcon(); - } - - // DisplayRole - value = d->cachedData(row, column, Qt::DisplayRole); - if (value.isValid()) { - option->features |= QStyleOptionViewItemV2::HasDisplay; - switch (value.type()) { - case QVariant::Double: - option->text = option->locale.toString(value.toDouble()); - break; - case QVariant::Int: - case QVariant::LongLong: - option->text = option->locale.toString(value.toLongLong()); - break; - case QVariant::UInt: - case QVariant::ULongLong: - option->text = option->locale.toString(value.toULongLong()); - break; - case QVariant::Date: - option->text = option->locale.toString(value.toDate(), QLocale::ShortFormat); - break; - case QVariant::Time: - option->text = option->locale.toString(value.toTime(), QLocale::ShortFormat); - break; - case QVariant::DateTime: - option->text = option->locale.toString(value.toDateTime().date(), QLocale::ShortFormat); - option->text += QLatin1Char(' '); - option->text += option->locale.toString(value.toDateTime().time(), QLocale::ShortFormat); - break; - default: { - QString text = value.toString(); - for (int i = 0; i < text.count(); ++i) - if (text.at(i).unicode() == '\n') - text[i] = QChar::LineSeparator; - option->text = text; - break; } - } - } else { - option->text = QString(); - } - - if (d->showGrid) { - // TODO create and set a flag for each of the sides of the cell to paint the grid lines. - } -} - -/*! - */ -void QtGraphicsTableView::initStyleOptionState(QStyleOptionViewItemV4 *option, int row, int column) const -{ - Q_D(const QtGraphicsTableView); - Q_ASSERT(option); - - if (d->isCurrent(row, column)) - option->state |= QStyle::State_HasFocus; - else - option->state &= ~QStyle::State_HasFocus; - - if (d->isSelected(row, column)) - option->state |= QStyle::State_Selected; - else - option->state &= ~QStyle::State_Selected; -/* - if (d->mouseOver(row, column)) - opt.state |= QStyle::State_MouseOver; - else - opt.state &= ~QStyle::State_MouseOver; -*/ -} - -/*! - */ -void QtGraphicsTableView::copyStyleOptionState(const QStyleOptionGraphicsItem *source, QStyleOptionViewItemV4 *destination) -{ - if (source && destination) { - destination->state = source->state; - destination->direction = source->direction; - destination->rect = source->rect; - destination->fontMetrics = source->fontMetrics; - destination->palette = source->palette; - } -} /*! \reimp @@ -1372,9 +1371,9 @@ bool QtGraphicsTableView::event(QEvent *event) QVariant QtGraphicsTableView::itemChange(GraphicsItemChange change, const QVariant &value) { Q_D(QtGraphicsTableView); - if (change == QGraphicsItem::ItemChildRemovedChange) { + if (change == QGraphicsItem::ItemChildRemovedChange) { // ### FIXME QGraphicsItem *item = qvariant_cast(value); - qint64 key = d->items.key(static_cast(item), -1); + qint64 key = d->items.key(static_cast(item), -1); if (key != -1) d->items.remove(key); } diff --git a/src/qgraphicstableview.h b/src/qgraphicstableview.h index 9b5ca48..566c2e0 100644 --- a/src/qgraphicstableview.h +++ b/src/qgraphicstableview.h @@ -64,10 +64,13 @@ public: virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); virtual void itemChanged(const QList &roles = QList()); + virtual void initStyleOption(QStyleOptionViewItemV4 *option) const; QHash data(const QList &roles = QList()) const; QtGraphicsTableView *view() const; + void copyStyleOptionState(const QStyleOptionGraphicsItem *source, QStyleOptionViewItemV4 *dest); + protected: QtGraphicsTableViewItemPrivate *d_ptr; @@ -80,16 +83,29 @@ class QtGraphicsTableViewItemCreatorBase { public: virtual ~QtGraphicsTableViewItemCreatorBase(); - virtual QtGraphicsTableViewItem *create(int row, int column, QtGraphicsTableView *view) = 0; - virtual QtGraphicsTableViewItem *reassign(int row, int column, QtGraphicsTableViewItem *item); - virtual void recycle(QtGraphicsTableViewItem *item); + virtual QGraphicsObject *create(int row, int column, QtGraphicsTableView *view) = 0; + virtual QGraphicsObject *reassign(int row, int column, QGraphicsObject *item, QtGraphicsTableView *view) = 0; + virtual void update(int row, int column, QGraphicsObject *item, const QList &roles); + virtual void recycle(QGraphicsObject *item); }; template class Q_ITEMVIEWSNG_EXPORT QtGraphicsTableViewItemCreator : public QtGraphicsTableViewItemCreatorBase { public: - inline QtGraphicsTableViewItem *create(int row, int column, QtGraphicsTableView *view) { return new T(row, column, view); } + inline QGraphicsObject *create(int row, int column, QtGraphicsTableView *view) { return new T(row, column, view); } + inline QGraphicsObject *reassign(int row, int column, QGraphicsObject *item, QtGraphicsTableView *view) + { + Q_UNUSED(view); + static_cast(item)->setCell(row, column); + return item; + } + inline void update(int row, int column, QGraphicsObject *item, const QList &roles) + { + Q_UNUSED(row); + Q_UNUSED(column); + static_cast(item)->itemChanged(roles); + } }; class Q_ITEMVIEWSNG_EXPORT QtGraphicsTableView : public QGraphicsWidget @@ -171,7 +187,7 @@ public: QtGraphicsTableViewItemCreatorBase *itemCreator() const; void setItemCreator(QtGraphicsTableViewItemCreatorBase *creator); - QtGraphicsTableViewItem *itemForCell(int row, int column) const; + QGraphicsObject *itemForCell(int row, int column) const; virtual void doLayout(); virtual QRectF cellGeometry(int row, int column) const; @@ -180,9 +196,6 @@ public: virtual QPointF mapToCell(int row, int column, const QPointF &position, const QTransform &transform) const; virtual void initStyleOption(QStyleOptionViewItemV4 *option) const; - virtual void initStyleOption(QStyleOptionViewItemV4 *option, int row, int column) const; - virtual void initStyleOptionState(QStyleOptionViewItemV4 *option, int row, int column) const; - void copyStyleOptionState(const QStyleOptionGraphicsItem *source, QStyleOptionViewItemV4 *dest); public Q_SLOTS: void setGridShown(bool show); diff --git a/src/qgraphicstableview_p.h b/src/qgraphicstableview_p.h index 48fd02a..3a7bc6d 100644 --- a/src/qgraphicstableview_p.h +++ b/src/qgraphicstableview_p.h @@ -118,7 +118,7 @@ public: // view items QtTableSelectionRange visibleSections; - QHash items; + QHash items; QtGraphicsTableViewItemCreatorBase *creator; QtGraphicsTableView *q_ptr; diff --git a/src/qgraphicstreeview.cpp b/src/qgraphicstreeview.cpp index 10b992d..e5e421a 100644 --- a/src/qgraphicstreeview.cpp +++ b/src/qgraphicstreeview.cpp @@ -104,7 +104,7 @@ QSizeF QtGraphicsTreeViewItem::sizeHint(const QtTreeModelIterator &it, const QSt qreal width = 0; qreal height = 0; for (int column = 0; column < it.columnCount(); ++column) { - d->view->initStyleOption(&d->option, d->it, column); + initStyleOption(&d->option, column); const QSizeF size = sizeHint(it, column, option, which, constraint); width += size.width(); height = qMax(height, size.height()); @@ -161,8 +161,8 @@ void QtGraphicsTreeViewItem::paint(QPainter *painter, const QStyleOptionGraphics // for each column for (int section = 0; section < count; ++section) { const int column = mapping.value(section, section); - d->view->copyStyleOptionState(option, &d->option); - d->view->initStyleOption(&d->option, d->it, column); + copyStyleOptionState(option, &d->option); + initStyleOption(&d->option, column); QSizeF size = sizeHint(d->it, column, &d->option, Qt::PreferredSize); size.setWidth(d->header ? d->header->sectionSize(section) : d->view->geometry().width()); if (column == 0) { @@ -186,13 +186,167 @@ void QtGraphicsTreeViewItem::paintBranches(QPainter *painter, QStyleOptionViewIt // paint braches - this can be cached - this is incredibly slow when painting the dotted lines for (int i = 0; i < depth; ++i) { const QtTreeModelIterator &it = stack.at(i); - d->view->initStyleOptionState(&d->option, it, i == depth - 1 ? 0 : -1); + initStyleOptionState(&d->option, it, i == depth - 1 ? 0 : -1); const qreal w = QtGraphicsTreeViewPrivate::indentation(); option->rect = QRectF(i * w, 0, w, size().height()).toRect(); style()->drawPrimitive(QStyle::PE_IndicatorBranch, option, painter, 0); } } +/*! + */ +void QtGraphicsTreeViewItem::initStyleOption(QStyleOptionViewItemV4 *option, int column) const +{ + Q_D(const QtGraphicsTreeViewItem); + Q_ASSERT(option); + + option->rect = QRect(); + option->features = 0; + + initStyleOptionState(option, d->it, column); + + QVariant value; + + // FontRole + value = d->view->d_func()->cachedData(d->it, column, Qt::FontRole); + if (value.isValid()){ + option->font = qvariant_cast(value).resolve(option->font); + option->fontMetrics = QFontMetrics(option->font); + } + + // TextAlignmentRole + value = d->view->d_func()->cachedData(d->it, column, Qt::TextAlignmentRole); + if (value.isValid()) + option->displayAlignment = (Qt::Alignment)value.toInt(); + else + option->displayAlignment = 0; // ### default value + + // ForegroundRole + value = d->view->d_func()->cachedData(d->it, column, Qt::ForegroundRole); + if (qVariantCanConvert(value)) + option->palette.setBrush(QPalette::Text, qvariant_cast(value)); + // ### default value + + // CheckStateRole + value = d->view->d_func()->cachedData(d->it, column, Qt::CheckStateRole); + if (value.isValid()) { + option->features |= QStyleOptionViewItemV2::HasCheckIndicator; + option->checkState = static_cast(value.toInt()); + } + + // DecorationRole + value = d->view->d_func()->cachedData(d->it, column, Qt::DecorationRole); + if (value.isValid()) { + option->features |= QStyleOptionViewItemV2::HasDecoration; + switch (value.type()) { + case QVariant::Icon: + option->icon = qvariant_cast(value); + break; + case QVariant::Color: { + QPixmap pixmap(option->decorationSize); + pixmap.fill(qvariant_cast(value)); + option->icon = QIcon(pixmap); } + default: + break; + } + } + + // DisplayRole + value = d->view->d_func()->cachedData(d->it, column, Qt::DisplayRole); + if (value.isValid()) { + option->features |= QStyleOptionViewItemV2::HasDisplay; + switch (value.type()) { + case QVariant::Double: + option->text = option->locale.toString(value.toDouble()); + break; + case QVariant::Int: + case QVariant::LongLong: + option->text = option->locale.toString(value.toLongLong()); + break; + case QVariant::UInt: + case QVariant::ULongLong: + option->text = option->locale.toString(value.toULongLong()); + break; + case QVariant::Date: + option->text = option->locale.toString(value.toDate(), QLocale::ShortFormat); + break; + case QVariant::Time: + option->text = option->locale.toString(value.toTime(), QLocale::ShortFormat); + break; + case QVariant::DateTime: + option->text = option->locale.toString(value.toDateTime().date(), QLocale::ShortFormat); + option->text += QLatin1Char(' '); + option->text += option->locale.toString(value.toDateTime().time(), QLocale::ShortFormat); + break; + default: { + QString text = value.toString(); + const QChar nl = QLatin1Char('\n'); + for (int i = 0; i < text.count(); ++i) + if (text.at(i) == nl) + text[i] = QChar::LineSeparator; + option->text = text; + break;} + } + } +} +/*! + */ +void QtGraphicsTreeViewItem::initStyleOptionState(QStyleOptionViewItemV4 *option, const QtTreeModelIterator &it, int column) const +{ + Q_D(const QtGraphicsTreeViewItem); + Q_ASSERT(option); + + if (d->view->d_func()->isCurrent(it, column)) // ### currentColumn + option->state |= QStyle::State_HasFocus; + else + option->state &= ~QStyle::State_HasFocus; + + if (d->view->d_func()->isSelected(it, column)) + option->state |= QStyle::State_Selected; + else + option->state &= ~QStyle::State_Selected; + + if (d->it.hasNextSibling()) + option->state |= QStyle::State_Sibling; + else + option->state &= ~QStyle::State_Sibling; + + // ### the column != -1 trick is a bit hacky... + + if (it.hasChildren() && column != -1) + option->state |= QStyle::State_Children; + else + option->state &= ~QStyle::State_Children; + + if (d->view->d_func()->isExpanded(it) && column != -1) + option->state |= QStyle::State_Open; + else + option->state &= ~QStyle::State_Open; + + if (column != -1) + option->state |= QStyle::State_Item; + else + option->state &= ~QStyle::State_Item; +/* + if (d->view->d_func()->mouseOver(it)) + opt.state |= QStyle::State_MouseOver; + else + opt.state &= ~QStyle::State_MouseOver; +*/ +} + +/*! + */ +void QtGraphicsTreeViewItem::copyStyleOptionState(const QStyleOptionGraphicsItem *source, QStyleOptionViewItemV4 *destination) +{ + if (source && destination) { + destination->state = source->state; + destination->direction = source->direction; + destination->rect = source->rect; + destination->fontMetrics = source->fontMetrics; + destination->palette = source->palette; + } +} /*! */ void QtGraphicsTreeViewItem::itemChanged(const QList &roles) @@ -222,14 +376,15 @@ QtGraphicsTreeViewItemCreatorBase::~QtGraphicsTreeViewItemCreatorBase() { } -QtGraphicsTreeViewItem *QtGraphicsTreeViewItemCreatorBase::reassign(const QtTreeModelIterator &it, QtGraphicsTreeViewItem *item) +void QtGraphicsTreeViewItemCreatorBase::update(const QtTreeModelIterator &it, QGraphicsObject *item, const QList &roles) { + Q_UNUSED(it); + Q_UNUSED(roles); Q_ASSERT(item); - item->setIterator(it); - return item; + item->update(); } -void QtGraphicsTreeViewItemCreatorBase::recycle(QtGraphicsTreeViewItem *item) +void QtGraphicsTreeViewItemCreatorBase::recycle(QGraphicsObject *item) { delete item; } @@ -390,7 +545,7 @@ QVariant QtGraphicsTreeViewPrivate::cachedData(const QtTreeModelBase::iterator_b << Qt::DisplayRole); if (it != cachedDataItem || column != cachedDataColumn) { cachedDataHash = it.data(column, roles); - cachedDataItem = it; + cachedDataItem = it; cachedDataColumn = column; } return cachedDataHash.value(role); @@ -609,7 +764,7 @@ qreal QtGraphicsTreeViewPrivate::itemHeight(QStyleOptionViewItemV4 &option, cons qreal height = 0; const int count = it.columnCount(); for (int column = 0; column < count; ++column) { - q->initStyleOption(&option, it, column); + //#### FIXME: q->initStyleOption(&option, it, column); const QVariant value = cachedData(it, column, Qt::SizeHintRole); const QSizeF size = (value.isValid() ? qvariant_cast(value) : q->style()->sizeFromContents(QStyle::CT_ItemViewItem, &option, QSize(), option.widget)); @@ -697,7 +852,8 @@ void QtGraphicsTreeViewPrivate::_q_mapIndexesToItems() */ void QtGraphicsTreeViewPrivate::updateItem(const QtTreeModelBase::iterator_base &it) const { - if (QtGraphicsTreeViewItem *item = items.value(it)) + // ### FIXME: remove this function + if (QGraphicsObject *item = items.value(it)) item->update(); } @@ -1060,7 +1216,7 @@ QVariant QtGraphicsTreeView::itemChange(GraphicsItemChange change, const QVarian Q_D(QtGraphicsTreeView); if (change == QGraphicsItem::ItemChildRemovedChange) { QGraphicsItem *item = qvariant_cast(value); - QtTreeModelBase::iterator_base key = d->items.key(static_cast(item)); + QtTreeModelBase::iterator_base key = d->items.key(static_cast(item)); if (key.isValid()) d->items.remove(key); } @@ -1088,7 +1244,7 @@ void QtGraphicsTreeView::setItemCreator(QtGraphicsTreeViewItemCreatorBase *creat Returns the visible item representing the given \a it, if that item exists and is visible. Otherwise returns null. */ -QtGraphicsTreeViewItem *QtGraphicsTreeView::itemForIterator(const QtTreeModelIterator &it) const +QGraphicsObject *QtGraphicsTreeView::itemForIterator(const QtTreeModelIterator &it) const { Q_D(const QtGraphicsTreeView); return d->items.value(it); @@ -1109,11 +1265,8 @@ void QtGraphicsTreeView::doLayout() Q_D(QtGraphicsTreeView); d->layoutTimer.stop(); - QStyleOptionViewItemV4 option; - initStyleOption(&option); - const QRectF area = QRectF(QPointF(0, 0), size()); - const QSizeF constraint = size(); + const QSizeF constraint = QSizeF(size().width(), -1); qreal y = -d->verticalOffset; qreal w = d->header ? qMax(d->header->contentSize(), area.width()) : area.width(); @@ -1155,33 +1308,40 @@ void QtGraphicsTreeView::doLayout() return; // collect unused items for reassignment - QHash unused = d->items; + QHash unused = d->items; d->items.clear(); // ### FIXME: find a solution that updates in-place // position the visible items const qreal x = -horizontalOffset; while (y < area.height() && it.isValid()) { // update item geometry - QtGraphicsTreeViewItem *item = unused.take(it); + QGraphicsObject *item = unused.take(it); if (!item) { // if the item did not exist if (unused.isEmpty()) { item = d->creator->create(it, this); } else { // take another random item (idealy we should take from the bottom, since this kicks in early when scolling up) - QHash::iterator random = unused.begin(); - item = d->creator->reassign(it, random.value()); + QHash::iterator random = unused.begin(); + item = d->creator->reassign(it, random.value(), this); unused.erase(random); } } d->items.insert(it, item); - QSizeF size = item->sizeHint(it, &option, Qt::PreferredSize, constraint); - item->setGeometry(x, y, w, size.height()); + qreal height; + if (item->isWidget()) { + QSizeF size = static_cast(item)->effectiveSizeHint(Qt::PreferredSize, constraint); + static_cast(item)->setGeometry(x, y, w, size.height()); + height = size.height(); + } else { + item->setPos(x, y); + height = item->boundingRect().height(); + } // next item - y += size.height(); + y += height; d->next(it, stack); } // while // recycle any unused items left - QHash::iterator it2 = unused.begin(); + QHash::iterator it2 = unused.begin(); for (; it2 != unused.end(); ++it2) d->creator->recycle(it2.value()); } @@ -1269,162 +1429,6 @@ void QtGraphicsTreeView::initStyleOption(QStyleOptionViewItemV4 *option) const option->state |= QStyle::State_Active; } -/*! - */ -void QtGraphicsTreeView::initStyleOption(QStyleOptionViewItemV4 *option, const QtTreeModelIterator &it, int column) const -{ - Q_D(const QtGraphicsTreeView); - Q_ASSERT(option); - - option->rect = QRect(); - option->features = 0; - - initStyleOptionState(option, it, column); - - QVariant value; - - // FontRole - value = d->cachedData(it, column, Qt::FontRole); - if (value.isValid()){ - option->font = qvariant_cast(value).resolve(option->font); - option->fontMetrics = QFontMetrics(option->font); - } - - // TextAlignmentRole - value = d->cachedData(it, column, Qt::TextAlignmentRole); - if (value.isValid()) - option->displayAlignment = (Qt::Alignment)value.toInt(); - else - option->displayAlignment = 0; // ### default value - - // ForegroundRole - value = d->cachedData(it, column, Qt::ForegroundRole); - if (qVariantCanConvert(value)) - option->palette.setBrush(QPalette::Text, qvariant_cast(value)); - // ### default value - - // CheckStateRole - value = d->cachedData(it, column, Qt::CheckStateRole); - if (value.isValid()) { - option->features |= QStyleOptionViewItemV2::HasCheckIndicator; - option->checkState = static_cast(value.toInt()); - } - - // DecorationRole - value = d->cachedData(it, column, Qt::DecorationRole); - if (value.isValid()) { - option->features |= QStyleOptionViewItemV2::HasDecoration; - switch (value.type()) { - case QVariant::Icon: - option->icon = qvariant_cast(value); - break; - case QVariant::Color: { - QPixmap pixmap(option->decorationSize); - pixmap.fill(qvariant_cast(value)); - option->icon = QIcon(pixmap); } - default: - break; - } - } - - // DisplayRole - value = d->cachedData(it, column, Qt::DisplayRole); - if (value.isValid()) { - option->features |= QStyleOptionViewItemV2::HasDisplay; - switch (value.type()) { - case QVariant::Double: - option->text = option->locale.toString(value.toDouble()); - break; - case QVariant::Int: - case QVariant::LongLong: - option->text = option->locale.toString(value.toLongLong()); - break; - case QVariant::UInt: - case QVariant::ULongLong: - option->text = option->locale.toString(value.toULongLong()); - break; - case QVariant::Date: - option->text = option->locale.toString(value.toDate(), QLocale::ShortFormat); - break; - case QVariant::Time: - option->text = option->locale.toString(value.toTime(), QLocale::ShortFormat); - break; - case QVariant::DateTime: - option->text = option->locale.toString(value.toDateTime().date(), QLocale::ShortFormat); - option->text += QLatin1Char(' '); - option->text += option->locale.toString(value.toDateTime().time(), QLocale::ShortFormat); - break; - default: { - QString text = value.toString(); - const QChar nl = QLatin1Char('\n'); - for (int i = 0; i < text.count(); ++i) - if (text.at(i) == nl) - text[i] = QChar::LineSeparator; - option->text = text; - break;} - } - } -} - -/*! - */ -void QtGraphicsTreeView::initStyleOptionState(QStyleOptionViewItemV4 *option, const QtTreeModelIterator &it, int column) const -{ - Q_D(const QtGraphicsTreeView); - Q_ASSERT(option); - - if (d->isCurrent(it, column)) // ### currentColumn - option->state |= QStyle::State_HasFocus; - else - option->state &= ~QStyle::State_HasFocus; - - if (d->isSelected(it, column)) - option->state |= QStyle::State_Selected; - else - option->state &= ~QStyle::State_Selected; - - if (it.hasNextSibling()) - option->state |= QStyle::State_Sibling; - else - option->state &= ~QStyle::State_Sibling; - - // ### the column != -1 trick is a bit hacky... - - if (it.hasChildren() && column != -1) - option->state |= QStyle::State_Children; - else - option->state &= ~QStyle::State_Children; - - if (d->isExpanded(it) && column != -1) - option->state |= QStyle::State_Open; - else - option->state &= ~QStyle::State_Open; - - if (column != -1) - option->state |= QStyle::State_Item; - else - option->state &= ~QStyle::State_Item; -/* - if (d->mouseOver(it)) - opt.state |= QStyle::State_MouseOver; - else - opt.state &= ~QStyle::State_MouseOver; -*/ -} - -/*! - */ -void QtGraphicsTreeView::copyStyleOptionState(const QStyleOptionGraphicsItem *source, QStyleOptionViewItemV4 *destination) -{ - if (source && destination) { - destination->state = source->state; - destination->direction = source->direction; - destination->rect = source->rect; - destination->fontMetrics = source->fontMetrics; - destination->palette = source->palette; - } -} - /*! */ QRectF QtGraphicsTreeView::disclosureRect(const QRectF &rect) const diff --git a/src/qgraphicstreeview.h b/src/qgraphicstreeview.h index ea12062..dd52e01 100644 --- a/src/qgraphicstreeview.h +++ b/src/qgraphicstreeview.h @@ -68,6 +68,10 @@ public: virtual void paintBranches(QPainter *painter, QStyleOptionViewItemV4 *option, const QStack &stack); virtual void itemChanged(const QList &roles = QList()); + virtual void initStyleOption(QStyleOptionViewItemV4 *option, int column) const; + virtual void initStyleOptionState(QStyleOptionViewItemV4 *option, const QtTreeModelIterator &it, int column) const; + void copyStyleOptionState(const QStyleOptionGraphicsItem *source, QStyleOptionViewItemV4 *dest); + QHash data(int column = 0, const QList &roles = QList()) const; QtGraphicsTreeView *view() const; @@ -83,16 +87,28 @@ class QtGraphicsTreeViewItemCreatorBase { public: virtual ~QtGraphicsTreeViewItemCreatorBase(); - virtual QtGraphicsTreeViewItem *create(const QtTreeModelIterator &it, QtGraphicsTreeView *view) = 0; - virtual QtGraphicsTreeViewItem *reassign(const QtTreeModelIterator &it, QtGraphicsTreeViewItem *item); - virtual void recycle(QtGraphicsTreeViewItem *item); + virtual QGraphicsObject *create(const QtTreeModelIterator &it, QtGraphicsTreeView *view) = 0; + virtual QGraphicsObject *reassign(const QtTreeModelIterator &it, QGraphicsObject *item, QtGraphicsTreeView *view) = 0; + virtual void update(const QtTreeModelIterator &it, QGraphicsObject *item, const QList &roles); + virtual void recycle(QGraphicsObject *item); }; template class QtGraphicsTreeViewItemCreator : public QtGraphicsTreeViewItemCreatorBase { public: - inline QtGraphicsTreeViewItem *create(const QtTreeModelIterator &it, QtGraphicsTreeView *view) { return new T(it, view); } + inline QGraphicsObject *create(const QtTreeModelIterator &it, QtGraphicsTreeView *view) { return new T(it, view); } + inline QGraphicsObject *reassign(const QtTreeModelIterator &it, QGraphicsObject *item, QtGraphicsTreeView *view) + { + Q_UNUSED(view); + static_cast(item)->setIterator(it); + return item; + } + inline void update(const QtTreeModelIterator &it, QGraphicsObject *item, const QList &roles) + { + Q_UNUSED(it); + static_cast(item)->itemChanged(roles); + } }; @@ -144,16 +160,13 @@ public: QtGraphicsTreeViewItemCreatorBase *itemCreator() const; void setItemCreator(QtGraphicsTreeViewItemCreatorBase *creator); - QtGraphicsTreeViewItem *itemForIterator(const QtTreeModelIterator &it) const; // ### FIXME: make virtual ? + QGraphicsObject *itemForIterator(const QtTreeModelIterator &it) const; // ### FIXME: make virtual ? virtual void doLayout(); virtual QtTreeModelIterator itemAt(const QPointF &position, int *index = 0, QRectF *rect = 0) const; virtual int indexOf(const QtTreeModelIterator &it) const; virtual void initStyleOption(QStyleOptionViewItemV4 *option) const; - virtual void initStyleOption(QStyleOptionViewItemV4 *option, const QtTreeModelIterator &it, int column) const; - virtual void initStyleOptionState(QStyleOptionViewItemV4 *option, const QtTreeModelIterator &it, int column) const; - void copyStyleOptionState(const QStyleOptionGraphicsItem *source, QStyleOptionViewItemV4 *dest); public Q_SLOTS: void setFirstIndex(int index); diff --git a/src/qgraphicstreeview_p.h b/src/qgraphicstreeview_p.h index dfdc3f6..964866e 100644 --- a/src/qgraphicstreeview_p.h +++ b/src/qgraphicstreeview_p.h @@ -177,7 +177,7 @@ public: static inline qreal indentation() { return 20; } // ### hardcoded value; make styleHint - QHash items; + QHash items; QtGraphicsTreeViewItemCreatorBase *creator; QBasicTimer layoutTimer; diff --git a/src/qlistmodelinterface.h b/src/qlistmodelinterface.h index 5d3592d..f3e3897 100644 --- a/src/qlistmodelinterface.h +++ b/src/qlistmodelinterface.h @@ -26,6 +26,7 @@ #include #include +#include QT_BEGIN_HEADER -- cgit v1.2.3