diff options
Diffstat (limited to 'src/qgraphicslistview.cpp')
-rw-r--r-- | src/qgraphicslistview.cpp | 518 |
1 files changed, 279 insertions, 239 deletions
diff --git a/src/qgraphicslistview.cpp b/src/qgraphicslistview.cpp index 85dd752..70d3ec6 100644 --- a/src/qgraphicslistview.cpp +++ b/src/qgraphicslistview.cpp @@ -55,7 +55,7 @@ QT_BEGIN_NAMESPACE alter the individual list items appearance, for example; <ul> <li>Reimplement paint() to change the look for just this list.</li> - <li>Add any number of child QGraphicsItem objects that do the painting instead.</li> + <li>Add any number of child QGraphicsObject instances that do the painting instead.</li> <!-- we will have to refer to the kinetic items when they are done --> </ul> @@ -70,8 +70,8 @@ QtGraphicsListViewItem::QtGraphicsListViewItem(int index, QtGraphicsListView *vi : QGraphicsWidget(view, 0), d_ptr(new QtGraphicsListViewItemPrivate) { Q_D(QtGraphicsListViewItem); - Q_ASSERT(view); - setCacheMode(QGraphicsItem::ItemCoordinateCache); + setCacheMode(QGraphicsObject::ItemCoordinateCache); + setSizePolicy(QSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred)); d->q_ptr = this; d->view = view; d->index = index; @@ -111,36 +111,38 @@ void QtGraphicsListViewItem::setIndex(int index) /*! \reimp */ -QSizeF QtGraphicsListViewItem::sizeHint(Qt::SizeHint which, const QSizeF &constraint) const + +QRectF QtGraphicsListViewItem::boundingRect() const { - Q_D(const QtGraphicsListViewItem); - d->view->initStyleOption(&d->option); - d->view->initStyleOption(&d->option, d->index); - return sizeHint(d->index, &d->option, which, constraint); + return QRectF(QPointF(), geometry().size()); } /*! - Returns \a which size hint for the item indicated by the given \a index, - using the given \a option and \a constrainst. + \reimp */ -QSizeF QtGraphicsListViewItem::sizeHint(int index, const QStyleOptionViewItemV4 *option, Qt::SizeHint which, const QSizeF &constraint) const +QSizeF QtGraphicsListViewItem::sizeHint(Qt::SizeHint which, const QSizeF &constraint) const { Q_D(const QtGraphicsListViewItem); - switch (which) { - case Qt::MinimumSize: - case Qt::PreferredSize: { - const QVariant value = d->view->d_func()->cachedData(index, Qt::SizeHintRole); - if (value.isValid()) - return qvariant_cast<QSizeF>(value); - else - return d->view->style()->sizeFromContents(QStyle::CT_ItemViewItem, option, QSize(), option->widget); - } - case Qt::MaximumSize: - return QSizeF(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX); - default: - break; + Q_UNUSED(constraint); + if (d->view) { + d->view->initStyleOption(&d->option); + initStyleOption(&d->option); + switch (which) { + case Qt::MinimumSize: + case Qt::PreferredSize: { + const QVariant value = d->view->d_func()->cachedData(d->index, Qt::SizeHintRole); + if (value.isValid()) + return qvariant_cast<QSizeF>(value); + else + return d->view->style()->sizeFromContents(QStyle::CT_ItemViewItem, &d->option, QSize(), d->option.widget); + } + case Qt::MaximumSize: + return QSizeF(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX); + default: + break; + } } - return QGraphicsWidget::sizeHint(which, constraint); + return QSizeF(); } /*! @@ -151,11 +153,13 @@ void QtGraphicsListViewItem::paint(QPainter *painter, const QStyleOptionGraphics Q_D(QtGraphicsListViewItem); // ### this code is less than optimal, but we will hopefully get rid of the style calls // ### by moving to a purely scene-graph based approach for items - d->view->copyStyleOptionState(option, &d->option); - d->view->initStyleOption(&d->option); - d->view->initStyleOption(&d->option, d->index); - d->option.rect = rect().toRect(); - d->view->style()->drawControl(QStyle::CE_ItemViewItem, &d->option, painter, widget); + if (d->view) { + copyStyleOptionState(option, &d->option); + d->view->initStyleOption(&d->option); + initStyleOption(&d->option); + d->option.rect = boundingRect().toRect(); + d->view->style()->drawControl(QStyle::CE_ItemViewItem, &d->option, painter, widget); + } } /*! @@ -187,6 +191,128 @@ QHash<int, QVariant> QtGraphicsListViewItem::data(const QList<int> &roles) const } /*! + Initialize the given \a option with the settings and data + specific for the item at the given \a index. + */ +void QtGraphicsListViewItem::initStyleOption(QStyleOptionViewItemV4 *option) const +{ + Q_D(const QtGraphicsListViewItem); + Q_ASSERT(option); + + if (!d->view) + return; + + if (d->view->selectionManager()) { + // Current Item + if (d->view->selectionManager()->currentItem() == d->index) + option->state |= QStyle::State_HasFocus; + else + option->state &= ~QStyle::State_HasFocus; + // selectionManager + if (d->view->selectionManager()->isSelected(d->index)) + option->state |= QStyle::State_Selected; + else + option->state &= ~QStyle::State_Selected; + } + + // Data + QVariant value; + + // FontRole + value = d->view->cachedData(d->index, Qt::FontRole); + if (value.isValid()) { + option->font = qvariant_cast<QFont>(value).resolve(option->font); + option->fontMetrics = QFontMetrics(option->font); + } + + // TextAlignmentRole + value = d->view->cachedData(d->index, Qt::TextAlignmentRole); + if (value.isValid()) + option->displayAlignment = (Qt::Alignment)value.toInt(); + + // ForegroundRole + value = d->view->cachedData(d->index, Qt::ForegroundRole); + if (qVariantCanConvert<QBrush>(value)) + option->palette.setBrush(QPalette::Text, qvariant_cast<QBrush>(value)); + + // CheckStateRole + value = d->view->cachedData(d->index, Qt::CheckStateRole); + if (value.isValid()) { + option->features |= QStyleOptionViewItemV2::HasCheckIndicator; + option->checkState = static_cast<Qt::CheckState>(value.toInt()); + } + + // DecorationRole + value = d->view->cachedData(d->index, Qt::DecorationRole); + if (value.isValid()) { + option->features |= QStyleOptionViewItemV2::HasDecoration; + switch (value.type()) { + case QVariant::Icon: + option->icon = qvariant_cast<QIcon>(value); + break; + case QVariant::Color: { + QPixmap pixmap(option->decorationSize); + pixmap.fill(qvariant_cast<QColor>(value)); + option->icon = QIcon(pixmap); } + default: + break; + } + } + + // DisplayRole + value = d->view->cachedData(d->index, 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; } + } + } +} + +/*! + Copies style option state information from the + given \a source to the given \a destination + */ +void QtGraphicsListViewItem::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; + } +} + +/*! Returns the view where this item is shown. */ QtGraphicsListView *QtGraphicsListViewItem::view() const @@ -219,17 +345,18 @@ QtGraphicsListViewItemCreatorBase::~QtGraphicsListViewItemCreatorBase() /*! This method basically does a recycle and a create in one go. */ -QtGraphicsListViewItem *QtGraphicsListViewItemCreatorBase::reassign(int index, QtGraphicsListViewItem *item) +QGraphicsObject *QtGraphicsListViewItemCreatorBase::reassign(int index, QGraphicsObject *item, QtGraphicsListView *view) { + Q_UNUSED(view); Q_ASSERT(item); - item->setIndex(index); + static_cast<QtGraphicsListViewItem*>(item)->setIndex(index); return item; } /*! Give back the \a item to the creator pool of unused objects. */ -void QtGraphicsListViewItemCreatorBase::recycle(QtGraphicsListViewItem *item) +void QtGraphicsListViewItemCreatorBase::recycle(QGraphicsObject *item) { delete item; } @@ -300,14 +427,14 @@ 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) { - QtGraphicsListViewItem *item = items.at(i); - int itemIndex = item->index(); + QGraphicsObject *item = items.at(i).second; + int itemIndex = items.at(i).first; if (itemIndex >= index + count) // change happened above break; - //if (itemIndex < index + viewItems.count()) - // break; // change happened below - if (itemIndex >= index) - item->itemChanged(roles); + //if (itemIndex >= index && item->isWidget()) + // item->itemChanged(roles); + Q_UNUSED(roles); + item->update(); // ### } q->updateLayout(); // ### FIXME: be more discriminate } @@ -353,14 +480,14 @@ void QtGraphicsListViewPrivate::_q_selectionsChanged(const QtListSelectionChange { if (items.isEmpty()) return; - const int from = items.first()->index(); - const int to = items.last()->index(); + const int from = items.first().first; + const int to = items.last().first; if (from <= change.index() && (change.index() + change.count() - 1) <= to) { - const QList<int> indexes = change.indexes(); - for (int i = 0; i < indexes.count(); ++i) { - const int index = indexes.at(i); + const QList<int> changeIndexes = change.indexes(); + for (int i = 0; i < changeIndexes.count(); ++i) { + const int index = changeIndexes.at(i); if (from <= index && index <= to) - items.at(index - from)->update(); + items.at(index - from).second->update(); } } } @@ -370,13 +497,15 @@ void QtGraphicsListViewPrivate::_q_selectionsChanged(const QtListSelectionChange */ void QtGraphicsListViewPrivate::_q_currentChanged(int current, int previous) { + if (items.isEmpty()) + return; //qDebug() << "QtGraphicsListViewPrivate::_q_currentChanged" << current << previous; - const int from = items.first()->index(); - const int to = items.last()->index(); + const int from = items.first().first; + const int to = items.last().first; if (from <= current && current <= to) - items.at(current - from)->update(); + items.at(current - from).second->update(); if (from <= previous && previous <= to) - items.at(current - from)->update(); + items.at(current - from).second->update(); } /*! @@ -439,18 +568,21 @@ int QtGraphicsListViewPrivate::currentItem() const */ void QtGraphicsListViewPrivate::scrollItems(int firstVisibleIndex) { + Q_Q(QtGraphicsListView); // shift items around if (!items.isEmpty()) { // scrolling down or right - move from first to last - while (items.first()->index() < firstVisibleIndex) { - const int index = items.last()->index() + 1; - items.append(creator->reassign(index, items.takeFirst())); + while (items.first().first < firstVisibleIndex) { + const int index = items.last().first + 1; + QPair<int,QGraphicsObject*> item = items.takeFirst(); + items.append(QPair<int,QGraphicsObject*>(index, creator->reassign(index, item.second, q))); } // scrolling up or left - move from last to first (assuming same view size) const int firstNonVisibleIndex = firstVisibleIndex + items.count(); - while (items.last()->index() >= firstNonVisibleIndex) { - const int index = items.first()->index() - 1; - items.prepend(creator->reassign(index, items.takeLast())); + while (items.last().first >= firstNonVisibleIndex) { + const int index = items.first().first - 1; + QPair<int,QGraphicsObject*> item = items.takeLast(); + items.prepend(QPair<int,QGraphicsObject*>(index, creator->reassign(index, item.second, q))); } } } @@ -458,9 +590,28 @@ void QtGraphicsListViewPrivate::scrollItems(int firstVisibleIndex) /*! \internal */ -QSizeF QtGraphicsListViewPrivate::itemSizeHint(const QStyleOptionViewItemV4 *option, int index, const QSizeF &constraint) const -{ - return items.isEmpty() ? QSizeF() : items.first()->sizeHint(index, option, Qt::PreferredSize, constraint); +QSizeF QtGraphicsListViewPrivate::itemSize(int index) const +{ + Q_Q(const QtGraphicsListView); + const QSizeF constraint = (orientation == Qt::Horizontal + ? QSizeF(-1, q->size().height()) + : QSizeF(q->size().width(), -1)); + if (items.isEmpty()) { // construct an item + if (QGraphicsObject *item = creator->create(index, 0)) { + QSizeF size = (item->isWidget() + ? static_cast<QGraphicsWidget*>(item)->size() + : item->boundingRect().size()); // ### FIXME: don't use bounding rect + creator->recycle(item); // ### FIXME: save it for re-use later + return size; + } + qWarning() << "QtGraphicsListView: could not create a new item"; + return QSizeF(); + } + // average size of visible items + QSizeF size; + for (int i = 0; i < items.count(); ++i) + size += items.at(i).second->boundingRect().size(); + return size / items.count(); } // QtGraphicsListView @@ -666,17 +817,16 @@ QRectF QtGraphicsListView::itemGeometry(int index) const Q_D(const QtGraphicsListView); if (!d->model) return QRectF(); - if (QtGraphicsListViewItem *item = itemForIndex(index)) - return item->geometry(); - const QSizeF constraint = size(); + if (QGraphicsObject *item = itemForIndex(index)) + return QRectF(item->pos(), item->boundingRect().size()); + const QSizeF constraint = (d->orientation == Qt::Horizontal + ? QSizeF(-1, size().height()) + : QSizeF(size().width(), -1)); const int count = d->model->count(); - QStyleOptionViewItemV4 option; - initStyleOption(&option); if (d->orientation == Qt::Vertical) { qreal y = -d->offset; for (int i = d->firstIndex; i < count; ++i) { - initStyleOption(&option, i); - const QSizeF size = d->itemSizeHint(&option, i, constraint); + const QSizeF size = d->itemSize(i); if (i == index) return QRectF(QPointF(0, y), size); y += size.height(); @@ -684,8 +834,7 @@ QRectF QtGraphicsListView::itemGeometry(int index) const } else { // Horizontal qreal x = -d->offset; for (int i = d->firstIndex; i < count; ++i) { - initStyleOption(&option, i); - const QSizeF size = d->itemSizeHint(&option, i, constraint); + const QSizeF size = d->itemSize(i); if (i == index) return QRectF(QPointF(x, 0), size); x += size.width(); @@ -705,16 +854,15 @@ int QtGraphicsListView::itemAt(const QPointF &position) const if (!d->model) return -1; // ### FIXME: check the visible items first - const QSizeF constraint = size(); + const QSizeF constraint = (d->orientation == Qt::Horizontal + ? QSizeF(-1, size().height()) + : QSizeF(size().width(), -1)); const int count = d->model->count(); - QStyleOptionViewItemV4 option; - initStyleOption(&option); int index = d->firstIndex; if (d->orientation == Qt::Vertical) { qreal y = -d->offset; while (y <= position.y() && index < count) { - initStyleOption(&option, index); - const QSizeF size = d->itemSizeHint(&option, index, constraint); + const QSizeF size = d->itemSize(index); y += size.height(); if (y >= position.y()) return index; @@ -723,8 +871,7 @@ int QtGraphicsListView::itemAt(const QPointF &position) const } else { qreal x = -d->offset; while (x <= position.x() && index < count) { - initStyleOption(&option, index); - const QSizeF size = d->itemSizeHint(&option, index, constraint); + const QSizeF size = d->itemSize(index); x += size.width(); if (x >= position.x()) return index; @@ -754,11 +901,10 @@ void QtGraphicsListView::doLayout() Q_D(QtGraphicsListView); d->layoutTimer.stop(); - QStyleOptionViewItemV4 option; - initStyleOption(&option); - const QRectF area = boundingRect(); - const QSizeF constraint = area.size(); + const QSizeF constraint = (d->orientation == Qt::Horizontal + ? QSizeF(-1, size().height()) + : QSizeF(size().width(), -1)); const int count = d->model ? d->model->count() : 0; const bool vertical = (d->orientation == Qt::Vertical); const qreal areaStart = (vertical ? area.y() : area.x()); @@ -779,8 +925,7 @@ void QtGraphicsListView::doLayout() // the visible area starts at coordinate == 0 if (coordinate < 0) { // the cached offset was above or to the left of the visible area while (index < count) { - initStyleOption(&option, index); - const QSizeF hint = d->itemSizeHint(&option, index, constraint); + const QSizeF hint = d->itemSize(index); const qreal size = vertical ? hint.height() : hint.width(); if (coordinate + size > areaStart) break; @@ -789,8 +934,7 @@ void QtGraphicsListView::doLayout() } } else if (coordinate > 0) { // the cached offset was below or to the right while (index >= 0 && coordinate > 0) { - initStyleOption(&option, index); - const QSizeF hint = d->itemSizeHint(&option, index, constraint); + const QSizeF hint = d->itemSize(index); const qreal size = vertical ? hint.height() : hint.width(); coordinate -= size; --index; @@ -808,8 +952,8 @@ void QtGraphicsListView::doLayout() // set existing item positions for (int i = 0; i < d->items.count() && index < count && coordinate < areaEnd; ++i) { - QtGraphicsListViewItem *item = d->items.at(i); - const QSizeF size = item->size(); + QGraphicsObject *item = d->items.at(i).second; + const QSizeF size = item->boundingRect().size(); if (vertical) { item->setPos(0, coordinate); coordinate += size.height(); @@ -822,16 +966,23 @@ void QtGraphicsListView::doLayout() // add more items and set geometry while (index < count && coordinate < areaEnd) { - QtGraphicsListViewItem *item = d->creator->create(index, this); - d->items.append(item); - initStyleOption(&option, index); - const QSizeF size = item->sizeHint(index, &option, Qt::PreferredSize, constraint); - if (vertical) { - item->setGeometry(0, coordinate, area.width(), size.height()); - coordinate += size.height(); - } else { - item->setGeometry(coordinate, 0, size.width(), area.height()); - coordinate += size.width(); + if (QGraphicsObject *item = d->creator->create(index, this)) { + d->items.append(QPair<int,QGraphicsObject*>(index, item)); + const bool isWidget = item->isWidget(); + const QSizeF size = (isWidget + ? static_cast<QGraphicsWidget*>(item)->effectiveSizeHint(Qt::PreferredSize, constraint) + : item->boundingRect().size()); // ### don't use bounding rect + if (vertical) { + item->setPos(0, coordinate); + if (isWidget) + static_cast<QGraphicsWidget*>(item)->resize(area.width(), size.height()); + coordinate += size.height(); + } else { + item->setPos(coordinate, 0); + if (isWidget) + static_cast<QGraphicsWidget*>(item)->resize(size.width(), area.height()); + coordinate += size.width(); + } } ++index; } @@ -839,8 +990,7 @@ void QtGraphicsListView::doLayout() // remove unused items const int visibleCount = index - firstVisibleIndex; while (visibleCount < d->items.count()) - d->creator->recycle(d->items.takeLast()); - + d->creator->recycle(d->items.takeLast().second); } /*! @@ -853,24 +1003,22 @@ int QtGraphicsListView::maximumFirstIndex() const { // ### cache this value Q_D(const QtGraphicsListView); - const QSizeF constraint = size(); - QStyleOptionViewItemV4 option; - initStyleOption(&option); + const QSizeF constraint = (d->orientation == Qt::Horizontal + ? QSizeF(-1, size().height()) + : QSizeF(size().width(), -1)); int last = (d->model ? d->model->count() : 0) - 1; int index = last; if (orientation() == Qt::Vertical) { qreal height = size().height() + d->offset; for (; index >= 0; --index) { - initStyleOption(&option, index); - height -= d->itemSizeHint(&option, index, constraint).height(); + height -= d->itemSize(index).height(); if (height < 0) break; } } else { qreal width = size().width() + d->offset; for (; index >= 0; --index) { - initStyleOption(&option, index); - width -= d->itemSizeHint(&option, index, constraint).width(); + width -= d->itemSize(index).width(); if (width < 0) break; } @@ -892,24 +1040,22 @@ qreal QtGraphicsListView::maximumOffset() const { // ### cache this value Q_D(const QtGraphicsListView); - const QSizeF constraint = size(); - QStyleOptionViewItemV4 option; - initStyleOption(&option); + const QSizeF constraint = (d->orientation == Qt::Horizontal + ? QSizeF(-1, size().height()) + : QSizeF(size().width(), -1)); qreal max = 0; qreal content = 0; int count = d->model ? d->model->count() : 0; if (orientation() == Qt::Vertical) { for (int index = 0; index < count; ++index) { - initStyleOption(&option, index); - const QSizeF size = d->itemSizeHint(&option, index, constraint); + const QSizeF size = d->itemSize(index); content += size.height(); max = qMax(max, size.height()); } return qMax<qreal>(content - size().height(), 0); } else { // Horizontal for (int index = 0; index < count; ++index) { - initStyleOption(&option, index); - const QSizeF size = d->itemSizeHint(&option, index, constraint); + const QSizeF size = d->itemSize(index); content += size.width(); max = qMax(max, size.width()); } @@ -1006,7 +1152,9 @@ void QtGraphicsListView::setFirstIndexToEnsureIndexIsVisible(int index) Q_D(QtGraphicsListView); // ### cache if (index > d->firstIndex) { - const QSizeF constraint = size(); + const QSizeF constraint = (d->orientation == Qt::Horizontal + ? QSizeF(-1, size().height()) + : QSizeF(size().width(), -1)); QStyleOptionViewItemV4 option; initStyleOption(&option); if (orientation() == Qt::Vertical) { @@ -1063,124 +1211,6 @@ void QtGraphicsListView::initStyleOption(QStyleOptionViewItemV4 *option) const } /*! - Initialize the given \a option with the settings and data - specific for the item at the given \a index. - */ -void QtGraphicsListView::initStyleOption(QStyleOptionViewItemV4 *option, int index) const -{ - Q_D(const QtGraphicsListView); - Q_ASSERT(option); - - // Current Item - if (d->selectionManager && d->selectionManager->currentItem() == index) - option->state |= QStyle::State_HasFocus; - else - option->state &= ~QStyle::State_HasFocus; - - // selectionManager - if (d->selectionManager && d->selectionManager->isSelected(index)) - option->state |= QStyle::State_Selected; - else - option->state &= ~QStyle::State_Selected; - - // Data - QVariant value; - - // FontRole - value = d->cachedData(index, Qt::FontRole); - if (value.isValid()) { - option->font = qvariant_cast<QFont>(value).resolve(option->font); - option->fontMetrics = QFontMetrics(option->font); - } - - // TextAlignmentRole - value = d->cachedData(index, Qt::TextAlignmentRole); - if (value.isValid()) - option->displayAlignment = (Qt::Alignment)value.toInt(); - - // ForegroundRole - value = d->cachedData(index, Qt::ForegroundRole); - if (qVariantCanConvert<QBrush>(value)) - option->palette.setBrush(QPalette::Text, qvariant_cast<QBrush>(value)); - - // CheckStateRole - value = d->cachedData(index, Qt::CheckStateRole); - if (value.isValid()) { - option->features |= QStyleOptionViewItemV2::HasCheckIndicator; - option->checkState = static_cast<Qt::CheckState>(value.toInt()); - } - - // DecorationRole - value = d->cachedData(index, Qt::DecorationRole); - if (value.isValid()) { - option->features |= QStyleOptionViewItemV2::HasDecoration; - switch (value.type()) { - case QVariant::Icon: - option->icon = qvariant_cast<QIcon>(value); - break; - case QVariant::Color: { - QPixmap pixmap(option->decorationSize); - pixmap.fill(qvariant_cast<QColor>(value)); - option->icon = QIcon(pixmap); } - default: - break; - } - } - - // DisplayRole - value = d->cachedData(index, 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; } - } - } -} - -/*! - Copies style option state information from the - given \a source to the given \a destination - */ -void QtGraphicsListView::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; - } -} - -/*! */ /* bool QtGraphicsListView::layoutsBlocked() const @@ -1221,11 +1251,14 @@ bool QtGraphicsListView::event(QEvent *event) QVariant QtGraphicsListView::itemChange(GraphicsItemChange change, const QVariant &value) { Q_D(QtGraphicsListView); - if (change == QGraphicsItem::ItemChildRemovedChange) { - QGraphicsItem *item = qvariant_cast<QGraphicsItem*>(value); - int index = d->items.indexOf(static_cast<QtGraphicsListViewItem*>(item)); - if (index != -1) - d->items.removeAt(index); + if (change == QGraphicsObject::ItemChildRemovedChange) { + void *ptr = qvariant_cast<void*>(value); + for (int i = 0; i < d->items.count(); ++i) { + if (d->items.at(i).second == ptr) { + d->items.removeAt(i); + break; + } + } } return QGraphicsWidget::itemChange(change, value); } @@ -1255,16 +1288,15 @@ void QtGraphicsListView::setItemCreator(QtGraphicsListViewItemCreatorBase *creat Returns a view item for the given \a index if such an item exists, otherwise returns null. */ -QtGraphicsListViewItem* QtGraphicsListView::itemForIndex(int index) const +QGraphicsObject* QtGraphicsListView::itemForIndex(int index) const { Q_D(const QtGraphicsListView); if (!d->items.isEmpty()) { - const int firstIndex = d->items.first()->index(); - const int lastIndex = d->items.last()->index(); + const int firstIndex = d->items.first().first; + const int lastIndex = d->items.last().first; if (firstIndex <= index && index <= lastIndex) { - QtGraphicsListViewItem *item = d->items.at(index - firstIndex); + QGraphicsObject *item = d->items.at(index - firstIndex).second; Q_ASSERT(item); - Q_ASSERT(item->index() == index); return item; } } @@ -1282,6 +1314,14 @@ 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" |