diff options
-rw-r--r-- | src/declarative/fx/qfxlistview.cpp | 29 | ||||
-rw-r--r-- | src/declarative/qml/qmlbinding.cpp | 6 | ||||
-rw-r--r-- | src/declarative/qml/qmlexpression.cpp | 16 | ||||
-rw-r--r-- | src/declarative/qml/qmlexpression_p.h | 2 | ||||
-rw-r--r-- | tests/auto/declarative/listview/data/listview.qml | 1 |
5 files changed, 32 insertions, 22 deletions
diff --git a/src/declarative/fx/qfxlistview.cpp b/src/declarative/fx/qfxlistview.cpp index f9ae0c0..18c3062 100644 --- a/src/declarative/fx/qfxlistview.cpp +++ b/src/declarative/fx/qfxlistview.cpp @@ -1679,37 +1679,46 @@ void QFxListView::trackedPositionChanged() return; if (!isFlicking() && !d->moving && d->moveReason != QFxListViewPrivate::Mouse) { const qreal trackedPos = d->trackedItem->position(); + const qreal viewPos = d->position(); if (d->haveHighlightRange) { if (d->highlightRange == StrictlyEnforceRange) { - qreal pos = d->position(); + qreal pos = viewPos; if (trackedPos > pos + d->highlightRangeEnd - d->trackedItem->size()) pos = trackedPos - d->highlightRangeEnd + d->trackedItem->size(); if (trackedPos < pos + d->highlightRangeStart) pos = trackedPos - d->highlightRangeStart; d->setPosition(pos); } else { - qreal pos = d->position(); + qreal pos = viewPos; if (trackedPos < d->startPosition() + d->highlightRangeStart) { pos = d->startPosition(); } else if (d->trackedItem->endPosition() > d->endPosition() - d->size() + d->highlightRangeEnd) { pos = d->endPosition() - d->size(); } else { - if (trackedPos < d->position() + d->highlightRangeStart) { + if (trackedPos < viewPos + d->highlightRangeStart) { pos = trackedPos - d->highlightRangeStart; - } else if (trackedPos > d->position() + d->highlightRangeEnd - d->trackedItem->size()) { + } else if (trackedPos > viewPos + d->highlightRangeEnd - d->trackedItem->size()) { pos = trackedPos - d->highlightRangeEnd + d->trackedItem->size(); } } d->setPosition(pos); } } else { - if (trackedPos < d->position()) { - d->setPosition(trackedPos); + if (trackedPos < viewPos && d->currentItem->position() < viewPos) { + d->setPosition(d->currentItem->position() < trackedPos ? trackedPos : d->currentItem->position()); d->fixupPosition(); - } else if (d->trackedItem->endPosition() > d->position() + d->size()) { - qreal pos = d->trackedItem->endPosition() - d->size(); - if (d->trackedItem->size() > d->size()) - pos = trackedPos; + } else if (d->trackedItem->endPosition() > viewPos + d->size() + && d->currentItem->endPosition() > viewPos + d->size()) { + qreal pos; + if (d->trackedItem->endPosition() < d->currentItem->endPosition()) { + pos = d->trackedItem->endPosition() - d->size(); + if (d->trackedItem->size() > d->size()) + pos = trackedPos; + } else { + pos = d->currentItem->endPosition() - d->size(); + if (d->currentItem->size() > d->size()) + pos = d->currentItem->position(); + } d->setPosition(pos); d->fixupPosition(); } diff --git a/src/declarative/qml/qmlbinding.cpp b/src/declarative/qml/qmlbinding.cpp index 317a4b3..83ca65b 100644 --- a/src/declarative/qml/qmlbinding.cpp +++ b/src/declarative/qml/qmlbinding.cpp @@ -170,15 +170,15 @@ void QmlBinding::update(QmlMetaProperty::WriteFlags flags) if (!isUndefined && data->property.object() && !data->property.write(value, flags)) { - QString fileName = data->fileName; + QUrl url = data->url; int line = data->line; - if (fileName.isEmpty()) fileName = QLatin1String("<Unknown File>"); + if (url.isEmpty()) url = QUrl(QLatin1String("<Unknown File>")); const char *valueType = 0; if (value.userType() == QVariant::Invalid) valueType = "null"; else valueType = QMetaType::typeName(value.userType()); - data->error.setUrl(fileName); + data->error.setUrl(url); data->error.setLine(line); data->error.setColumn(-1); data->error.setDescription(QLatin1String("Unable to assign ") + diff --git a/src/declarative/qml/qmlexpression.cpp b/src/declarative/qml/qmlexpression.cpp index e5e5cf9..7c69c16 100644 --- a/src/declarative/qml/qmlexpression.cpp +++ b/src/declarative/qml/qmlexpression.cpp @@ -92,7 +92,7 @@ void QmlExpressionPrivate::init(QmlContext *ctxt, const QString &expr, void QmlExpressionPrivate::init(QmlContext *ctxt, void *expr, QmlRefCount *rc, QObject *me, const QUrl &url, int lineNumber) { - data->fileName = url.toString(); + data->url = url; data->line = lineNumber; quint32 *exprData = (quint32 *)expr; @@ -113,7 +113,7 @@ void QmlExpressionPrivate::init(QmlContext *ctxt, void *expr, QmlRefCount *rc, #if !defined(Q_OS_SYMBIAN) //XXX Why doesn't this work? if (!dd->programs.at(progIdx)) { dd->programs[progIdx] = - new QScriptProgram(data->expression, data->fileName, data->line); + new QScriptProgram(data->expression, data->url.toString(), data->line); } #endif @@ -310,12 +310,12 @@ QVariant QmlExpressionPrivate::evalQtScript(QObject *secondaryScope, bool *isUnd if (data->expressionRewritten) { data->expressionFunction = scriptEngine->evaluate(data->expression, - data->fileName, data->line); + data->url.toString(), data->line); } else { QmlRewrite::RewriteBinding rewriteBinding; const QString code = rewriteBinding(data->expression); - data->expressionFunction = scriptEngine->evaluate(code, data->fileName, data->line); + data->expressionFunction = scriptEngine->evaluate(code, data->url.toString(), data->line); } scriptEngine->popContext(); @@ -484,7 +484,7 @@ void QmlExpression::setTrackChange(bool trackChange) QUrl QmlExpression::sourceFile() const { Q_D(const QmlExpression); - return QUrl(d->data->fileName); + return d->data->url; } /*! @@ -498,13 +498,13 @@ int QmlExpression::lineNumber() const } /*! - Set the location of this expression to \a line of \a fileName. This information + Set the location of this expression to \a line of \a url. This information is used by the script engine. */ -void QmlExpression::setSourceLocation(const QUrl &fileName, int line) +void QmlExpression::setSourceLocation(const QUrl &url, int line) { Q_D(QmlExpression); - d->data->fileName = fileName.toString(); + d->data->url = url; d->data->line = line; } diff --git a/src/declarative/qml/qmlexpression_p.h b/src/declarative/qml/qmlexpression_p.h index 4e13de3..6360852 100644 --- a/src/declarative/qml/qmlexpression_p.h +++ b/src/declarative/qml/qmlexpression_p.h @@ -98,7 +98,7 @@ public: QObject *me; bool trackChange; - QString fileName; + QUrl url; int line; struct SignalGuard : public QGuard<QObject> { diff --git a/tests/auto/declarative/listview/data/listview.qml b/tests/auto/declarative/listview/data/listview.qml index 5083329..9039b55 100644 --- a/tests/auto/declarative/listview/data/listview.qml +++ b/tests/auto/declarative/listview/data/listview.qml @@ -31,6 +31,7 @@ Rectangle { x: 200 text: wrapper.y } + color: ListView.isCurrentItem ? "lightsteelblue" : "white" } } ] |