summaryrefslogtreecommitdiffstats
path: root/src/qgraphicslistview.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/qgraphicslistview.cpp')
-rw-r--r--src/qgraphicslistview.cpp518
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"