summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/declarative/fx/qfxlistview.cpp29
-rw-r--r--src/declarative/qml/qmlbinding.cpp6
-rw-r--r--src/declarative/qml/qmlexpression.cpp16
-rw-r--r--src/declarative/qml/qmlexpression_p.h2
-rw-r--r--tests/auto/declarative/listview/data/listview.qml1
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"
}
}
]