}
qreal endRowPos() const {
if (view->flow() == QSGGridView::LeftToRight) {
- return item->y() + view->cellHeight() - 1;
+ return item->y() + view->cellHeight();
} else {
if (view->effectiveLayoutDirection() == Qt::RightToLeft)
- return -item->x() - 1;
+ return -item->x();
else
- return item->x() + view->cellWidth() - 1;
+ return item->x() + view->cellWidth();
}
}
void setPosition(qreal col, qreal row) {
qreal pos = 0;
if (model && model->count()) {
// get end position of last item
- // endPosition() of items calculate -1 to get last edge pixel, so do that here as well
- pos = (rowPosAt(model->count() - 1) + rowSize()) - 1;
+ pos = (rowPosAt(model->count() - 1) + rowSize());
}
return pos;
}
colOffset = gridItem->item->width() - cellWidth;
}
if (visibleItems.count()) {
- qreal endPos = lastPosition() + 1;
+ qreal endPos = lastPosition();
if (findLastVisibleIndex() == model->count()-1) {
gridItem->setPosition(colOffset, endPos + rowOffset);
} else {
qreal visiblePos = isRightToLeftTopToBottom() ? -position() : position() + size();
- if (endPos <= visiblePos || gridItem->endPosition() < endPos + rowOffset)
+ if (endPos <= visiblePos || gridItem->endPosition() <= endPos + rowOffset)
gridItem->setPosition(colOffset, endPos + rowOffset);
}
} else {
case QSGItemView::Visible:
if (itemPos > pos + size())
pos = itemPos - size() + item->size();
- else if (item->endPosition() < pos)
+ else if (item->endPosition() <= pos)
pos = itemPos;
break;
case QSGItemView::Contain:
- if (item->endPosition() > pos + size())
+ if (item->endPosition() >= pos + size())
pos = itemPos - size() + item->size();
if (itemPos < pos)
pos = itemPos;
if (trackedPos < pos + highlightStart)
pos = trackedPos - highlightStart;
} else {
- if (trackedPos < d->startPosition() + highlightStart) {
+ if (trackedPos > pos + highlightEnd - trackedSize)
+ pos = trackedPos - highlightEnd + trackedSize;
+ if (trackedPos < pos + highlightStart)
+ pos = trackedPos - highlightStart;
+ if (pos > d->endPosition() - d->size())
+ pos = d->endPosition() - d->size();
+ if (pos < d->startPosition())
pos = d->startPosition();
- } else if (d->trackedItem->endPosition() > d->endPosition() - d->size() + highlightEnd) {
- pos = d->endPosition() - d->size() + 1;
- if (pos < d->startPosition())
- pos = d->startPosition();
- } else {
- if (trackedPos > pos + highlightEnd - trackedSize)
- pos = trackedPos - highlightEnd + trackedSize;
- if (trackedPos < pos + highlightStart)
- pos = trackedPos - highlightStart;
- }
}
} else {
if (trackedPos < viewPos && d->currentItem->position() < viewPos) {
} else if (d->trackedItem->endPosition() >= viewPos + d->size()
&& d->currentItem->endPosition() >= viewPos + d->size()) {
if (d->trackedItem->endPosition() <= d->currentItem->endPosition()) {
- pos = d->trackedItem->endPosition() - d->size() + 1;
+ pos = d->trackedItem->endPosition() - d->size();
if (trackedSize > d->size())
pos = trackedPos;
} else {
- pos = d->currentItem->endPosition() - d->size() + 1;
+ pos = d->currentItem->endPosition() - d->size();
if (d->currentItem->size() > d->size())
pos = d->currentItem->position();
}
d->minExtent += d->highlightRangeStart;
if (d->visibleItem(0))
d->minExtent -= d->visibleItem(0)->sectionSize();
- d->minExtent = qMax(d->minExtent, -(d->endPositionAt(0) - d->highlightRangeEnd + 1));
+ d->minExtent = qMax(d->minExtent, -(d->endPositionAt(0) - d->highlightRangeEnd));
}
d->minExtentDirty = false;
}
} else if (d->haveHighlightRange && d->highlightRange == StrictlyEnforceRange) {
d->maxExtent = -(d->positionAt(d->model->count()-1) - d->highlightRangeStart);
if (d->highlightRangeEnd != d->highlightRangeStart)
- d->maxExtent = qMin(d->maxExtent, -(d->endPosition() - d->highlightRangeEnd + 1));
+ d->maxExtent = qMin(d->maxExtent, -(d->endPosition() - d->highlightRangeEnd));
} else {
- d->maxExtent = -(d->endPosition() - height() + 1);
+ d->maxExtent = -(d->endPosition() - height());
}
if (d->footer)
}
if (d->haveHighlightRange && d->highlightRange == StrictlyEnforceRange) {
d->minExtent += highlightStart;
- d->minExtent = qMax(d->minExtent, -(endPositionFirstItem - highlightEnd + 1));
+ d->minExtent = qMax(d->minExtent, -(endPositionFirstItem - highlightEnd));
}
d->minExtentDirty = false;
}
d->maxExtent = -(lastItemPosition - highlightStart);
if (highlightEnd != highlightStart) {
d->maxExtent = d->isContentFlowReversed()
- ? qMax(d->maxExtent, -(d->endPosition() - highlightEnd + 1))
- : qMin(d->maxExtent, -(d->endPosition() - highlightEnd + 1));
+ ? qMax(d->maxExtent, -(d->endPosition() - highlightEnd))
+ : qMin(d->maxExtent, -(d->endPosition() - highlightEnd));
}
} else {
- d->maxExtent = -(d->endPosition() - width() + 1);
+ d->maxExtent = -(d->endPosition() - width());
}
if (d->isContentFlowReversed()) {
if (d->header && d->visibleItems.count())
qreal QSGItemViewPrivate::startPosition() const
{
- return isContentFlowReversed() ? -lastPosition()-1 : originPosition();
+ return isContentFlowReversed() ? -lastPosition() : originPosition();
}
qreal QSGItemViewPrivate::endPosition() const
{
- return isContentFlowReversed() ? -originPosition()-1 : lastPosition();
+ return isContentFlowReversed() ? -originPosition() : lastPosition();
}
qreal QSGItemViewPrivate::contentStartPosition() const
const qreal pos = isContentFlowReversed() ? -position()-size() : position();
for (int i = 0; i < visibleItems.count(); ++i) {
FxViewItem *item = visibleItems.at(i);
- if (item->index != -1 && item->endPosition() > pos)
+ if (item->index != -1 && item->endPosition() >= pos)
return item;
}
return visibleItems.count() ? visibleItems.first() : 0;
void QSGItemViewPrivate::refill()
{
if (isContentFlowReversed())
- refill(-position()-size()+1, -position());
+ refill(-position()-size(), -position());
else
- refill(position(), position()+size()-1);
+ refill(position(), position()+size());
}
void QSGItemViewPrivate::refill(qreal from, qreal to, bool doBuffer)
Q_Q(QSGItemView);
if (isValid()) {
if (layoutOrientation() == Qt::Vertical)
- q->setContentHeight(endPosition() - startPosition() + 1);
+ q->setContentHeight(endPosition() - startPosition());
else
- q->setContentWidth(endPosition() - startPosition() + 1);
+ q->setContentWidth(endPosition() - startPosition());
}
}
}
qreal endPosition() const {
if (view->orientation() == QSGListView::Vertical) {
- return item->y() + (item->height() >= 1.0 ? item->height() : 1) - 1;
+ return item->y() + item->height();
} else {
return (view->effectiveLayoutDirection() == Qt::RightToLeft
- ? -item->width()-item->x() + (item->width() >= 1.0 ? item->width() : 1)
- : item->x() + (item->width() >= 1.0 ? item->width() : 1)) - 1;
+ ? -item->x()
+ : item->x() + item->width());
}
}
void setPosition(qreal pos) {
if (item->index != -1) {
if (foundFirst)
return item;
- else if (item->position() < pos && item->endPosition() > pos)
+ else if (item->position() < pos && item->endPosition() >= pos)
foundFirst = true;
}
}
}
pos = (*(--visibleItems.constEnd()))->endPosition() + invisibleCount * (averageSize + spacing);
} else if (model && model->count()) {
- // endPosition() of items calculate -1 to get last edge pixel, so do that here as well
- pos = (model->count() * averageSize + (model->count()-1) * spacing) - 1;
+ pos = (model->count() * averageSize + (model->count()-1) * spacing);
}
return pos;
}
return (*visibleItems.constBegin())->position() - count * (averageSize + spacing) - cs;
} else {
int count = modelIndex - findLastVisibleIndex(visibleIndex) - 1;
- return (*(--visibleItems.constEnd()))->endPosition() + spacing + count * (averageSize + spacing) + 1;
+ return (*(--visibleItems.constEnd()))->endPosition() + spacing + count * (averageSize + spacing);
}
}
return 0;
if (!visibleItems.isEmpty()) {
if (modelIndex < visibleIndex) {
int count = visibleIndex - modelIndex;
- return (*visibleItems.constBegin())->position() - (count - 1) * (averageSize + spacing) - spacing - 1;
+ return (*visibleItems.constBegin())->position() - (count - 1) * (averageSize + spacing) - spacing;
} else {
int count = modelIndex - findLastVisibleIndex(visibleIndex) - 1;
return (*(--visibleItems.constEnd()))->endPosition() + count * (averageSize + spacing);
if (item->index == -1)
continue;
qreal itemTop = item->position();
- if (highlight && itemTop >= pos && item->endPosition() <= pos + highlight->size() - 1)
+ if (highlight && itemTop >= pos && item->endPosition() <= pos + highlight->size())
return item;
if (itemTop+item->size()/2 >= pos && itemTop-item->size()/2 < pos)
snapItem = item;
bool QSGListViewPrivate::addVisibleItems(int fillFrom, int fillTo, bool doBuffer)
{
- qreal itemEnd = visiblePos-1;
+ qreal itemEnd = visiblePos;
if (visibleItems.count()) {
visiblePos = (*visibleItems.constBegin())->position();
itemEnd = (*(--visibleItems.constEnd()))->endPosition() + spacing;
modelIndex = 0;
}
visibleIndex = modelIndex;
- visiblePos = itemEnd + count * (averageSize + spacing) + 1;
- itemEnd = visiblePos-1;
+ visiblePos = itemEnd + count * (averageSize + spacing);
+ itemEnd = visiblePos;
}
bool changed = false;
FxListItemSG *item = 0;
- qreal pos = itemEnd + 1;
+ qreal pos = itemEnd;
while (modelIndex < model->count() && pos <= fillTo) {
// qDebug() << "refill: append item" << modelIndex << "pos" << pos;
if (!(item = static_cast<FxListItemSG*>(createItem(modelIndex))))
if (doBuffer) // never buffer more than one item per frame
break;
}
- while (visibleIndex > 0 && visibleIndex <= model->count() && visiblePos-1 >= fillFrom) {
+ while (visibleIndex > 0 && visibleIndex <= model->count() && visiblePos >= fillFrom) {
// qDebug() << "refill: prepend item" << visibleIndex-1 << "current top pos" << visiblePos;
if (!(item = static_cast<FxListItemSG*>(createItem(visibleIndex-1))))
break;
FxViewItem *item = 0;
bool changed = false;
- while (visibleItems.count() > 1 && (item = visibleItems.first()) && item->endPosition() < bufferFrom) {
+ while (visibleItems.count() > 1 && (item = visibleItems.first()) && item->endPosition() <= bufferFrom) {
if (item->attached->delayRemove())
break;
// qDebug() << "refill: remove first" << visibleIndex << "top end pos" << item->endPosition();
return;
}
int index = 0;
- while (index < visibleItems.count() && visibleItems.at(index)->endPosition() < position())
+ while (index < visibleItems.count() && visibleItems.at(index)->endPosition() <= position())
++index;
QString newSection = currentSection;
FxListItemSG *listItem = static_cast<FxListItemSG*>(footer);
if (visibleItems.count()) {
- qreal endPos = lastPosition() + 1;
+ qreal endPos = lastPosition();
if (findLastVisibleIndex() == model->count()-1) {
listItem->setPosition(endPos);
} else {
// there are no visible items except items marked for removal
index = d->visibleItems.count();
} else if (d->visibleItems.at(i)->index + 1 == modelIndex
- && d->visibleItems.at(i)->endPosition() < d->buffer+tempPos+d->size()-1) {
+ && d->visibleItems.at(i)->endPosition() <= d->buffer+tempPos+d->size()) {
// Special case of appending an item to the model.
index = d->visibleItems.count();
} else {
int pos = 0;
if (d->visibleItems.count()) {
pos = index < d->visibleItems.count() ? d->visibleItems.at(index)->position()
- : d->visibleItems.last()->endPosition()+d->spacing+1;
+ : d->visibleItems.last()->endPosition()+d->spacing;
}
int initialPos = pos;
}
} else {
int i = 0;
- int to = d->buffer+tempPos+d->size()-1;
+ int to = d->buffer+tempPos+d->size();
for (i = 0; i < count && pos <= to; ++i) {
if (!addedVisible) {
d->scheduleLayout();
void tst_QSGListView::currentIndex()
{
- QSKIP("QTBUG-20020", SkipAll);
-
TestModel model;
for (int i = 0; i < 30; i++)
model.addItem("Item" + QString::number(i), QString::number(i));