summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--demos/declarative/flickr/common/Slider.qml22
-rw-r--r--demos/declarative/flickr/mobile/ImageDetails.qml22
-rw-r--r--mkspecs/common/symbian/symbian-mmp.conf12
-rw-r--r--qmake/generators/symbian/symmake_sbsv2.cpp43
-rw-r--r--src/3rdparty/webkit/WebCore/WebCore.pro4
-rw-r--r--src/3rdparty/webkit/WebKit/qt/declarative/qdeclarativewebview.cpp6
-rw-r--r--src/declarative/graphicsitems/qdeclarativeimagebase.cpp12
-rw-r--r--src/declarative/graphicsitems/qdeclarativepathview.cpp285
-rw-r--r--src/declarative/graphicsitems/qdeclarativepathview_p.h1
-rw-r--r--src/declarative/graphicsitems/qdeclarativepathview_p_p.h12
-rw-r--r--src/declarative/qml/qdeclarativecompiler.cpp12
-rw-r--r--src/declarative/util/qdeclarativestateoperations.cpp17
-rw-r--r--src/declarative/util/qdeclarativetransitionmanager.cpp2
-rw-r--r--src/gui/image/qpixmap_s60.cpp43
-rw-r--r--src/gui/image/qpixmap_s60_p.h12
-rw-r--r--tests/auto/declarative/qdeclarativepathview/tst_qdeclarativepathview.cpp19
-rw-r--r--tests/auto/declarative/qmlvisual/animation/qtbug13398/data/qtbug13398.0.pngbin0 -> 1265 bytes
-rw-r--r--tests/auto/declarative/qmlvisual/animation/qtbug13398/data/qtbug13398.qml447
-rw-r--r--tests/auto/declarative/qmlvisual/animation/qtbug13398/qtbug13398.qml68
-rw-r--r--tools/qml/main.cpp3
20 files changed, 855 insertions, 187 deletions
diff --git a/demos/declarative/flickr/common/Slider.qml b/demos/declarative/flickr/common/Slider.qml
index 4353f8d..faa2e5f 100644
--- a/demos/declarative/flickr/common/Slider.qml
+++ b/demos/declarative/flickr/common/Slider.qml
@@ -45,11 +45,24 @@ Item {
id: slider; width: 400; height: 16
// value is read/write.
- property real value
- onValueChanged: { handle.x = 2 + (value - minimum) * slider.xMax / (maximum - minimum); }
+ property real value: 1
+ onValueChanged: updatePos();
property real maximum: 1
property real minimum: 1
- property int xMax: slider.width - handle.width - 4
+ property int xMax: width - handle.width - 4
+ onXMaxChanged: updatePos();
+ onMinimumChanged: updatePos();
+
+ function updatePos() {
+ if (maximum > minimum) {
+ var pos = 2 + (value - minimum) * slider.xMax / (maximum - minimum);
+ pos = Math.min(pos, width - handle.width - 2);
+ pos = Math.max(pos, 2);
+ handle.x = pos;
+ } else {
+ handle.x = 2;
+ }
+ }
Rectangle {
anchors.fill: parent
@@ -62,13 +75,14 @@ Item {
Rectangle {
id: handle; smooth: true
- x: slider.width / 2 - handle.width / 2; y: 2; width: 30; height: slider.height-4; radius: 6
+ y: 2; width: 30; height: slider.height-4; radius: 6
gradient: Gradient {
GradientStop { position: 0.0; color: "lightgray" }
GradientStop { position: 1.0; color: "gray" }
}
MouseArea {
+ id: mouse
anchors.fill: parent; drag.target: parent
drag.axis: Drag.XAxis; drag.minimumX: 2; drag.maximumX: slider.xMax+2
onPositionChanged: { value = (maximum - minimum) * (handle.x-2) / slider.xMax + minimum; }
diff --git a/demos/declarative/flickr/mobile/ImageDetails.qml b/demos/declarative/flickr/mobile/ImageDetails.qml
index ff902ce..7441ecc 100644
--- a/demos/declarative/flickr/mobile/ImageDetails.qml
+++ b/demos/declarative/flickr/mobile/ImageDetails.qml
@@ -104,6 +104,24 @@ Flipable {
id: flickable; anchors.fill: parent; clip: true
contentWidth: imageContainer.width; contentHeight: imageContainer.height
+ function updateMinimumScale() {
+ if (bigImage.status == Image.Ready && bigImage.width != 0) {
+ slider.minimum = Math.min(flickable.width / bigImage.width, flickable.height / bigImage.height);
+ if (bigImage.width * slider.value > flickable.width) {
+ var xoff = (flickable.width/2 + flickable.contentX) * slider.value / prevScale;
+ flickable.contentX = xoff - flickable.width/2;
+ }
+ if (bigImage.height * slider.value > flickable.height) {
+ var yoff = (flickable.height/2 + flickable.contentY) * slider.value / prevScale;
+ flickable.contentY = yoff - flickable.height/2;
+ }
+ prevScale = slider.value;
+ }
+ }
+
+ onWidthChanged: updateMinimumScale()
+ onHeightChanged: updateMinimumScale()
+
Item {
id: imageContainer
width: Math.max(bigImage.width * bigImage.scale, flickable.width);
@@ -114,8 +132,8 @@ Flipable {
anchors.centerIn: parent; smooth: !flickable.movingVertically
onStatusChanged : {
// Default scale shows the entire image.
- if (status == Image.Ready && width != 0) {
- slider.minimum = Math.min(flickable.width / width, flickable.height / height);
+ if (bigImage.status == Image.Ready && bigImage.width != 0) {
+ slider.minimum = Math.min(flickable.width / bigImage.width, flickable.height / bigImage.height);
prevScale = Math.min(slider.minimum, 1);
slider.value = prevScale;
}
diff --git a/mkspecs/common/symbian/symbian-mmp.conf b/mkspecs/common/symbian/symbian-mmp.conf
index 4230ad7..5292781 100644
--- a/mkspecs/common/symbian/symbian-mmp.conf
+++ b/mkspecs/common/symbian/symbian-mmp.conf
@@ -55,3 +55,15 @@ symbian {
}
}
}
+
+# Variables for replacing equivalent QMAKE_* variables in bld.inf for FLM execution of commands
+symbian-sbsv2 {
+ QMAKE_SBSV2_COPY = $(GNUCP)
+ QMAKE_SBSV2_COPY_DIR = $(GNUCP) -r
+ QMAKE_SBSV2_MOVE = $(GNUMV)
+ QMAKE_SBSV2_DEL_FILE = $(GNURM) -f
+ QMAKE_SBSV2_MKDIR = $(GNUMKDIR)
+ QMAKE_SBSV2_DEL_DIR = $(GNURMDIR)
+ QMAKE_SBSV2_DEL_TREE = $(GNURM) -rf
+}
+
diff --git a/qmake/generators/symbian/symmake_sbsv2.cpp b/qmake/generators/symbian/symmake_sbsv2.cpp
index e794351..c66c1b8 100644
--- a/qmake/generators/symbian/symmake_sbsv2.cpp
+++ b/qmake/generators/symbian/symmake_sbsv2.cpp
@@ -413,6 +413,28 @@ void SymbianSbsv2MakefileGenerator::writeBldInfExtensionRulesPart(QTextStream& t
}
}
+ QMap<QString, QString> commandsToReplace;
+ commandsToReplace.insert(project->values("QMAKE_COPY").join(" "),
+ project->values("QMAKE_SBSV2_COPY").join(" "));
+ commandsToReplace.insert(project->values("QMAKE_COPY_DIR").join(" "),
+ project->values("QMAKE_SBSV2_COPY_DIR").join(" "));
+ commandsToReplace.insert(project->values("QMAKE_MOVE").join(" "),
+ project->values("QMAKE_SBSV2_MOVE").join(" "));
+ commandsToReplace.insert(project->values("QMAKE_DEL_FILE").join(" "),
+ project->values("QMAKE_SBSV2_DEL_FILE").join(" "));
+ commandsToReplace.insert(project->values("QMAKE_MKDIR").join(" "),
+ project->values("QMAKE_SBSV2_MKDIR").join(" "));
+ commandsToReplace.insert(project->values("QMAKE_DEL_DIR").join(" "),
+ project->values("QMAKE_SBSV2_DEL_DIR").join(" "));
+ commandsToReplace.insert(project->values("QMAKE_DEL_TREE").join(" "),
+ project->values("QMAKE_SBSV2_DEL_TREE").join(" "));
+
+ // If commandItem starts with any $$QMAKE_* commands, do a replace for SBS equivalent
+ // Command replacement is done only for the start of the command or right after
+ // concatenation operators (&& and ||), as otherwise unwanted replacements might occur.
+ static QString cmdFind("(^|&&\\s*|\\|\\|\\s*)%1");
+ static QString cmdReplace("\\1%1");
+
// Write extra compilers and targets to initialize QMAKE_ET_* variables
// Cache results to avoid duplicate calls when creating wrapper makefile
QTextStream extraCompilerStream(&extraCompilersCache);
@@ -424,13 +446,7 @@ void SymbianSbsv2MakefileGenerator::writeBldInfExtensionRulesPart(QTextStream& t
// are not necessary.
QStringList allPreDeps;
foreach(QString item, project->values("PRE_TARGETDEPS")) {
- // Predeps get mangled in windows, so fix them to more sbsv2 friendly format
-#if defined(Q_OS_WIN)
- if (item.mid(1, 1) == ":")
- item = item.mid(0, 1).toUpper().append(item.mid(1)); // Fix drive to uppercase
-#endif
- item.replace("\\", "/");
- allPreDeps << escapeDependencyPath(item);
+ allPreDeps.append(fileInfo(item).absoluteFilePath());
}
foreach (QString item, project->values("GENERATED_SOURCES")) {
@@ -460,7 +476,6 @@ void SymbianSbsv2MakefileGenerator::writeBldInfExtensionRulesPart(QTextStream& t
QStringList deps = project->values(QLatin1String("QMAKE_INTERNAL_ET_PARSED_DEPS.") + item + targetItem);
QString commandItem = project->values(QLatin1String("QMAKE_INTERNAL_ET_PARSED_CMD.") + item + targetItem).join(" ");
-
// Make sure all deps paths are absolute
QString absoluteDeps;
foreach (QString depItem, deps) {
@@ -474,6 +489,18 @@ void SymbianSbsv2MakefileGenerator::writeBldInfExtensionRulesPart(QTextStream& t
t << "OPTION PREDEP_TARGET " << absoluteTarget << endl;
t << "OPTION DEPS " << absoluteDeps << endl;
+ // Iterate command replacements in reverse alphabetical order of keys so
+ // that keys which are starts of other longer keys are iterated after longer keys.
+ QMapIterator<QString, QString> cmdIter(commandsToReplace);
+ cmdIter.toBack();
+ while (cmdIter.hasPrevious()) {
+ cmdIter.previous();
+ if (commandItem.contains(cmdIter.key())) {
+ commandItem.replace(QRegExp(cmdFind.arg(cmdIter.key())),
+ cmdReplace.arg(cmdIter.value()));
+ }
+ }
+
if (commandItem.indexOf("$(INCPATH)") != -1)
commandItem.replace("$(INCPATH)", incPath.join(" "));
if (commandItem.indexOf("$(DEFINES)") != -1)
diff --git a/src/3rdparty/webkit/WebCore/WebCore.pro b/src/3rdparty/webkit/WebCore/WebCore.pro
index 537cdd3..5ea1e77 100644
--- a/src/3rdparty/webkit/WebCore/WebCore.pro
+++ b/src/3rdparty/webkit/WebCore/WebCore.pro
@@ -2857,13 +2857,13 @@ contains(DEFINES, ENABLE_SYMBIAN_DIALOG_PROVIDERS) {
}
}
-!symbian {
+!symbian-abld:!symbian-sbsv2 {
modfile.files = $$moduleFile
modfile.path = $$[QMAKE_MKSPECS]/modules
INSTALLS += modfile
} else {
- # INSTALLS is not implemented in qmake's s60 generators, copy headers manually
+ # INSTALLS is not implemented in qmake's mmp generators, copy headers manually
inst_modfile.commands = $$QMAKE_COPY ${QMAKE_FILE_NAME} ${QMAKE_FILE_OUT}
inst_modfile.input = moduleFile
diff --git a/src/3rdparty/webkit/WebKit/qt/declarative/qdeclarativewebview.cpp b/src/3rdparty/webkit/WebKit/qt/declarative/qdeclarativewebview.cpp
index c1ca23d..2d74d4b 100644
--- a/src/3rdparty/webkit/WebKit/qt/declarative/qdeclarativewebview.cpp
+++ b/src/3rdparty/webkit/WebKit/qt/declarative/qdeclarativewebview.cpp
@@ -91,7 +91,6 @@ GraphicsWebView::GraphicsWebView(QDeclarativeWebView* parent)
void GraphicsWebView::mousePressEvent(QGraphicsSceneMouseEvent* event)
{
- setFocus();
pressPoint = event->pos();
if (pressTime) {
pressTimer.start(pressTime, this);
@@ -101,6 +100,11 @@ void GraphicsWebView::mousePressEvent(QGraphicsSceneMouseEvent* event)
parent->setKeepMouseGrab(true);
}
QGraphicsWebView::mousePressEvent(event);
+
+ QWebHitTestResult hit = page()->mainFrame()->hitTestContent(pressPoint.toPoint());
+ if (hit.isContentEditable())
+ parent->forceActiveFocus();
+ setFocus();
}
void GraphicsWebView::mouseReleaseEvent(QGraphicsSceneMouseEvent* event)
diff --git a/src/declarative/graphicsitems/qdeclarativeimagebase.cpp b/src/declarative/graphicsitems/qdeclarativeimagebase.cpp
index 416604b..f0293d6 100644
--- a/src/declarative/graphicsitems/qdeclarativeimagebase.cpp
+++ b/src/declarative/graphicsitems/qdeclarativeimagebase.cpp
@@ -140,9 +140,6 @@ void QDeclarativeImageBase::load()
setImplicitWidth(0);
setImplicitHeight(0);
emit statusChanged(d->status);
- d->sourcesize.setWidth(0);
- d->sourcesize.setHeight(0);
- emit sourceSizeChanged();
pixmapChange();
update();
} else {
@@ -182,19 +179,20 @@ void QDeclarativeImageBase::requestFinished()
} else {
d->status = Ready;
}
- emit statusChanged(d->status);
+
+ d->progress = 1.0;
setImplicitWidth(d->pix.width());
setImplicitHeight(d->pix.height());
- d->progress = 1.0;
- emit progressChanged(d->progress);
-
if (d->sourcesize.width() != d->pix.width() || d->sourcesize.height() != d->pix.height()) {
d->sourcesize.setWidth(d->pix.width());
d->sourcesize.setHeight(d->pix.height());
emit sourceSizeChanged();
}
+
+ emit statusChanged(d->status);
+ emit progressChanged(d->progress);
pixmapChange();
update();
}
diff --git a/src/declarative/graphicsitems/qdeclarativepathview.cpp b/src/declarative/graphicsitems/qdeclarativepathview.cpp
index 4b97505..de3f9fa 100644
--- a/src/declarative/graphicsitems/qdeclarativepathview.cpp
+++ b/src/declarative/graphicsitems/qdeclarativepathview.cpp
@@ -67,7 +67,7 @@ inline qreal qmlMod(qreal x, qreal y)
static QDeclarativeOpenMetaObjectType *qPathViewAttachedType = 0;
QDeclarativePathViewAttached::QDeclarativePathViewAttached(QObject *parent)
-: QObject(parent), m_view(0), m_onPath(false), m_isCurrent(false)
+: QObject(parent), m_percent(-1), m_view(0), m_onPath(false), m_isCurrent(false)
{
if (qPathViewAttachedType) {
m_metaobject = new QDeclarativeOpenMetaObject(this, qPathViewAttachedType);
@@ -164,8 +164,8 @@ void QDeclarativePathViewPrivate::clear()
void QDeclarativePathViewPrivate::updateMappedRange()
{
- if (model && pathItems != -1 && pathItems < model->count())
- mappedRange = qreal(pathItems)/model->count();
+ if (model && pathItems != -1 && pathItems < modelCount)
+ mappedRange = qreal(pathItems)/modelCount;
else
mappedRange = 1.0;
}
@@ -174,13 +174,13 @@ qreal QDeclarativePathViewPrivate::positionOfIndex(qreal index) const
{
qreal pos = -1.0;
- if (model && index >= 0 && index < model->count()) {
+ if (model && index >= 0 && index < modelCount) {
qreal start = 0.0;
if (haveHighlightRange && highlightRangeMode != QDeclarativePathView::NoHighlightRange)
start = highlightRangeStart;
qreal globalPos = index + offset;
- globalPos = qmlMod(globalPos, qreal(model->count())) / model->count();
- if (pathItems != -1 && pathItems < model->count()) {
+ globalPos = qmlMod(globalPos, qreal(modelCount)) / modelCount;
+ if (pathItems != -1 && pathItems < modelCount) {
globalPos += start * mappedRange;
globalPos = qmlMod(globalPos, 1.0);
if (globalPos < mappedRange)
@@ -242,21 +242,22 @@ void QDeclarativePathViewPrivate::updateHighlight()
} else {
qreal target = currentIndex;
+ offsetAdj = 0.0;
tl.reset(moveHighlight);
moveHighlight.setValue(highlightPosition);
const int duration = highlightMoveDuration;
- if (target - highlightPosition > model->count()/2) {
+ if (target - highlightPosition > modelCount/2) {
highlightUp = false;
- qreal distance = model->count() - target + highlightPosition;
+ qreal distance = modelCount - target + highlightPosition;
tl.move(moveHighlight, 0.0, QEasingCurve(QEasingCurve::InQuad), int(duration * highlightPosition / distance));
- tl.set(moveHighlight, model->count()-0.01);
- tl.move(moveHighlight, target, QEasingCurve(QEasingCurve::OutQuad), int(duration * (model->count()-target) / distance));
- } else if (target - highlightPosition <= -model->count()/2) {
+ tl.set(moveHighlight, modelCount-0.01);
+ tl.move(moveHighlight, target, QEasingCurve(QEasingCurve::OutQuad), int(duration * (modelCount-target) / distance));
+ } else if (target - highlightPosition <= -modelCount/2) {
highlightUp = true;
- qreal distance = model->count() - highlightPosition + target;
- tl.move(moveHighlight, model->count()-0.01, QEasingCurve(QEasingCurve::InQuad), int(duration * (model->count()-highlightPosition) / distance));
+ qreal distance = modelCount - highlightPosition + target;
+ tl.move(moveHighlight, modelCount-0.01, QEasingCurve(QEasingCurve::InQuad), int(duration * (modelCount-highlightPosition) / distance));
tl.set(moveHighlight, 0.0);
tl.move(moveHighlight, target, QEasingCurve(QEasingCurve::OutQuad), int(duration * target / distance));
} else {
@@ -277,7 +278,7 @@ void QDeclarativePathViewPrivate::setHighlightPosition(qreal pos)
end = highlightRangeEnd;
}
- qreal range = qreal(model->count());
+ qreal range = qreal(modelCount);
// calc normalized position of highlight relative to offset
qreal relativeHighlight = qmlMod(pos + offset, range) / range;
@@ -300,6 +301,9 @@ void QDeclarativePathViewPrivate::setHighlightPosition(qreal pos)
void QDeclarativePathViewPrivate::updateItem(QDeclarativeItem *item, qreal percent)
{
if (QDeclarativePathViewAttached *att = attached(item)) {
+ if (qFuzzyCompare(att->m_percent, percent))
+ return;
+ att->m_percent = percent;
foreach(const QString &attr, path->attributes())
att->setValue(attr.toUtf8(), path->attributeAt(attr, percent));
}
@@ -473,17 +477,19 @@ void QDeclarativePathView::setModel(const QVariant &model)
if (QDeclarativeVisualDataModel *dataModel = qobject_cast<QDeclarativeVisualDataModel*>(d->model))
dataModel->setModel(model);
}
+ d->modelCount = 0;
if (d->model) {
connect(d->model, SIGNAL(itemsInserted(int,int)), this, SLOT(itemsInserted(int,int)));
connect(d->model, SIGNAL(itemsRemoved(int,int)), this, SLOT(itemsRemoved(int,int)));
connect(d->model, SIGNAL(itemsMoved(int,int,int)), this, SLOT(itemsMoved(int,int,int)));
connect(d->model, SIGNAL(modelReset()), this, SLOT(modelReset()));
connect(d->model, SIGNAL(createdItem(int, QDeclarativeItem*)), this, SLOT(createdItem(int,QDeclarativeItem*)));
- }
- if (d->model->count())
- d->offset = qmlMod(d->offset, qreal(d->model->count()));
- if (d->offset < 0)
- d->offset = d->model->count() + d->offset;
+ d->modelCount = d->model->count();
+ if (d->model->count())
+ d->offset = qmlMod(d->offset, qreal(d->model->count()));
+ if (d->offset < 0)
+ d->offset = d->model->count() + d->offset;
+}
d->regenerate();
d->fixOffset();
emit countChanged();
@@ -497,7 +503,7 @@ void QDeclarativePathView::setModel(const QVariant &model)
int QDeclarativePathView::count() const
{
Q_D(const QDeclarativePathView);
- return d->model ? d->model->count() : 0;
+ return d->model ? d->modelCount : 0;
}
/*!
@@ -545,11 +551,11 @@ int QDeclarativePathView::currentIndex() const
void QDeclarativePathView::setCurrentIndex(int idx)
{
Q_D(QDeclarativePathView);
- if (d->model && d->model->count())
- idx = qAbs(idx % d->model->count());
+ if (d->model && d->modelCount)
+ idx = qAbs(idx % d->modelCount);
if (d->model && idx != d->currentIndex) {
- if (d->model->count()) {
- int itemIndex = (d->currentIndex - d->firstIndex + d->model->count()) % d->model->count();
+ if (d->modelCount) {
+ int itemIndex = (d->currentIndex - d->firstIndex + d->modelCount) % d->modelCount;
if (itemIndex < d->items.count()) {
if (QDeclarativeItem *item = d->items.at(itemIndex)) {
if (QDeclarativePathViewAttached *att = d->attached(item))
@@ -560,10 +566,10 @@ void QDeclarativePathView::setCurrentIndex(int idx)
d->currentItem = 0;
d->moveReason = QDeclarativePathViewPrivate::SetIndex;
d->currentIndex = idx;
- if (d->model->count()) {
+ if (d->modelCount) {
if (d->haveHighlightRange && d->highlightRangeMode == QDeclarativePathView::StrictlyEnforceRange)
d->snapToCurrent();
- int itemIndex = (idx - d->firstIndex + d->model->count()) % d->model->count();
+ int itemIndex = (idx - d->firstIndex + d->modelCount) % d->modelCount;
if (itemIndex < d->items.count()) {
d->currentItem = d->items.at(itemIndex);
d->currentItem->setFocus(true);
@@ -600,10 +606,10 @@ void QDeclarativePathView::incrementCurrentIndex()
void QDeclarativePathView::decrementCurrentIndex()
{
Q_D(QDeclarativePathView);
- if (d->model && d->model->count()) {
+ if (d->model && d->modelCount) {
int idx = currentIndex()-1;
if (idx < 0)
- idx = d->model->count() - 1;
+ idx = d->modelCount - 1;
setCurrentIndex(idx);
}
}
@@ -632,9 +638,9 @@ void QDeclarativePathViewPrivate::setOffset(qreal o)
Q_Q(QDeclarativePathView);
if (offset != o) {
if (isValid() && q->isComponentComplete()) {
- offset = qmlMod(o, qreal(model->count()));
+ offset = qmlMod(o, qreal(modelCount));
if (offset < 0)
- offset += qreal(model->count());
+ offset += qreal(modelCount);
q->refill();
} else {
offset = o;
@@ -643,6 +649,11 @@ void QDeclarativePathViewPrivate::setOffset(qreal o)
}
}
+void QDeclarativePathViewPrivate::setAdjustedOffset(qreal o)
+{
+ setOffset(o+offsetAdj);
+}
+
/*!
\qmlproperty Component PathView::highlight
This property holds the component to use as the highlight.
@@ -705,6 +716,8 @@ QDeclarativeItem *QDeclarativePathView::highlightItem()
These properties set the preferred range of the highlight (current item)
within the view. The preferred values must be in the range 0.0-1.0.
+ If highlightRangeMode is set to \e PathView.NoHighlightRange
+
If highlightRangeMode is set to \e PathView.ApplyRange the view will
attempt to maintain the highlight within the range, however
the highlight can move outside of the range at the ends of the path
@@ -1071,14 +1084,14 @@ void QDeclarativePathView::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
d->moveReason = QDeclarativePathViewPrivate::Mouse;
qreal newPc;
d->pointNear(event->pos(), &newPc);
- qreal diff = (newPc - d->startPc)*d->model->count()*d->mappedRange;
+ qreal diff = (newPc - d->startPc)*d->modelCount*d->mappedRange;
if (diff) {
setOffset(d->offset + diff);
- if (diff > d->model->count()/2)
- diff -= d->model->count();
- else if (diff < -d->model->count()/2)
- diff += d->model->count();
+ if (diff > d->modelCount/2)
+ diff -= d->modelCount;
+ else if (diff < -d->modelCount/2)
+ diff += d->modelCount;
d->lastElapsed = QDeclarativeItemPrivate::restart(d->lastPosTime);
d->lastDist = diff;
@@ -1102,15 +1115,15 @@ void QDeclarativePathView::mouseReleaseEvent(QGraphicsSceneMouseEvent *)
qreal elapsed = qreal(d->lastElapsed + QDeclarativeItemPrivate::elapsed(d->lastPosTime)) / 1000.;
qreal velocity = elapsed > 0. ? d->lastDist / elapsed : 0;
- if (d->model && d->model->count() && qAbs(velocity) > 1.) {
- qreal count = d->pathItems == -1 ? d->model->count() : d->pathItems;
+ if (d->model && d->modelCount && qAbs(velocity) > 1.) {
+ qreal count = d->pathItems == -1 ? d->modelCount : d->pathItems;
if (qAbs(velocity) > count * 2) // limit velocity
velocity = (velocity > 0 ? count : -count) * 2;
// Calculate the distance to be travelled
qreal v2 = velocity*velocity;
qreal accel = d->deceleration/10;
// + 0.25 to encourage moving at least one item in the flick direction
- qreal dist = qMin(qreal(d->model->count()-1), qreal(v2 / (accel * 2.0) + 0.25));
+ qreal dist = qMin(qreal(d->modelCount-1), qreal(v2 / (accel * 2.0) + 0.25));
if (d->haveHighlightRange && d->highlightRangeMode == QDeclarativePathView::StrictlyEnforceRange) {
// round to nearest item.
if (velocity > 0.)
@@ -1125,6 +1138,7 @@ void QDeclarativePathView::mouseReleaseEvent(QGraphicsSceneMouseEvent *)
accel = v2 / (2.0f * qAbs(dist));
}
}
+ d->offsetAdj = 0.0;
d->moveOffset.setValue(d->offset);
d->tl.accel(d->moveOffset, velocity, accel, dist);
d->tl.callback(QDeclarativeTimeLineCallback(&d->moveOffset, d->fixOffsetCallback, d));
@@ -1260,79 +1274,81 @@ void QDeclarativePathView::refill()
d->updateItem(item, 1.0);
d->releaseItem(item);
if (it == d->items.begin()) {
- if (++d->firstIndex >= d->model->count())
+ if (++d->firstIndex >= d->modelCount)
d->firstIndex = 0;
}
it = d->items.erase(it);
}
++idx;
- if (idx >= d->model->count())
+ if (idx >= d->modelCount)
idx = 0;
}
- // add items to beginning and end
- int count = d->pathItems == -1 ? d->model->count() : qMin(d->pathItems, d->model->count());
- if (d->items.count() < count) {
- int idx = qRound(d->model->count() - d->offset) % d->model->count();
- qreal startPos = 0.0;
- if (d->haveHighlightRange && d->highlightRangeMode != QDeclarativePathView::NoHighlightRange)
- startPos = d->highlightRangeStart;
- if (d->firstIndex >= 0) {
- startPos = d->positionOfIndex(d->firstIndex);
- idx = (d->firstIndex + d->items.count()) % d->model->count();
- }
- qreal pos = d->positionOfIndex(idx);
- while ((pos > startPos || !d->items.count()) && d->items.count() < count) {
-// qDebug() << "append" << idx;
- QDeclarativeItem *item = d->getItem(idx);
- if (d->model->completePending())
- item->setZValue(idx+1);
- if (d->currentIndex == idx) {
- item->setFocus(true);
- if (QDeclarativePathViewAttached *att = d->attached(item))
- att->setIsCurrentItem(true);
- currentVisible = true;
- d->currentItemOffset = pos;
- d->currentItem = item;
+ if (d->modelCount) {
+ // add items to beginning and end
+ int count = d->pathItems == -1 ? d->modelCount : qMin(d->pathItems, d->modelCount);
+ if (d->items.count() < count) {
+ int idx = qRound(d->modelCount - d->offset) % d->modelCount;
+ qreal startPos = 0.0;
+ if (d->haveHighlightRange && d->highlightRangeMode != QDeclarativePathView::NoHighlightRange)
+ startPos = d->highlightRangeStart;
+ if (d->firstIndex >= 0) {
+ startPos = d->positionOfIndex(d->firstIndex);
+ idx = (d->firstIndex + d->items.count()) % d->modelCount;
}
- if (d->items.count() == 0)
- d->firstIndex = idx;
- d->items.append(item);
- d->updateItem(item, pos);
- if (d->model->completePending())
- d->model->completeItem();
- ++idx;
- if (idx >= d->model->count())
- idx = 0;
- pos = d->positionOfIndex(idx);
- }
-
- idx = d->firstIndex - 1;
- if (idx < 0)
- idx = d->model->count() - 1;
- pos = d->positionOfIndex(idx);
- while (pos >= 0.0 && pos < startPos) {
-// qDebug() << "prepend" << idx;
- QDeclarativeItem *item = d->getItem(idx);
- if (d->model->completePending())
- item->setZValue(idx+1);
- if (d->currentIndex == idx) {
- item->setFocus(true);
- if (QDeclarativePathViewAttached *att = d->attached(item))
- att->setIsCurrentItem(true);
- currentVisible = true;
- d->currentItemOffset = pos;
- d->currentItem = item;
+ qreal pos = d->positionOfIndex(idx);
+ while ((pos > startPos || !d->items.count()) && d->items.count() < count) {
+ // qDebug() << "append" << idx;
+ QDeclarativeItem *item = d->getItem(idx);
+ if (d->model->completePending())
+ item->setZValue(idx+1);
+ if (d->currentIndex == idx) {
+ item->setFocus(true);
+ if (QDeclarativePathViewAttached *att = d->attached(item))
+ att->setIsCurrentItem(true);
+ currentVisible = true;
+ d->currentItemOffset = pos;
+ d->currentItem = item;
+ }
+ if (d->items.count() == 0)
+ d->firstIndex = idx;
+ d->items.append(item);
+ d->updateItem(item, pos);
+ if (d->model->completePending())
+ d->model->completeItem();
+ ++idx;
+ if (idx >= d->modelCount)
+ idx = 0;
+ pos = d->positionOfIndex(idx);
}
- d->items.prepend(item);
- d->updateItem(item, pos);
- if (d->model->completePending())
- d->model->completeItem();
- d->firstIndex = idx;
+
idx = d->firstIndex - 1;
if (idx < 0)
- idx = d->model->count() - 1;
+ idx = d->modelCount - 1;
pos = d->positionOfIndex(idx);
+ while (pos >= 0.0 && pos < startPos) {
+ // qDebug() << "prepend" << idx;
+ QDeclarativeItem *item = d->getItem(idx);
+ if (d->model->completePending())
+ item->setZValue(idx+1);
+ if (d->currentIndex == idx) {
+ item->setFocus(true);
+ if (QDeclarativePathViewAttached *att = d->attached(item))
+ att->setIsCurrentItem(true);
+ currentVisible = true;
+ d->currentItemOffset = pos;
+ d->currentItem = item;
+ }
+ d->items.prepend(item);
+ d->updateItem(item, pos);
+ if (d->model->completePending())
+ d->model->completeItem();
+ d->firstIndex = idx;
+ idx = d->firstIndex - 1;
+ if (idx < 0)
+ idx = d->modelCount - 1;
+ pos = d->positionOfIndex(idx);
+ }
}
}
@@ -1348,6 +1364,8 @@ void QDeclarativePathView::refill()
if (QDeclarativePathViewAttached *att = d->attached(d->highlightItem))
att->setOnPath(currentVisible);
}
+ while (d->itemCache.count())
+ d->releaseItem(d->itemCache.takeLast());
}
void QDeclarativePathView::itemsInserted(int modelIndex, int count)
@@ -1357,16 +1375,25 @@ void QDeclarativePathView::itemsInserted(int modelIndex, int count)
if (!d->isValid() || !isComponentComplete())
return;
- QList<QDeclarativeItem *> removedItems = d->items;
+ d->itemCache += d->items;
d->items.clear();
if (modelIndex <= d->currentIndex) {
d->currentIndex += count;
emit currentIndexChanged();
+ } else if (d->offset != 0) {
+ d->offset += count;
+ d->offsetAdj += count;
+ }
+
+ d->modelCount = d->model->count();
+ if (d->flicking || d->moving) {
+ d->regenerate();
+ d->updateCurrent();
+ } else {
+ d->firstIndex = -1;
+ d->updateMappedRange();
+ d->scheduleLayout();
}
- d->regenerate();
- while (removedItems.count())
- d->releaseItem(removedItems.takeLast());
- d->updateCurrent();
emit countChanged();
}
@@ -1374,7 +1401,7 @@ void QDeclarativePathView::itemsRemoved(int modelIndex, int count)
{
//XXX support animated removal
Q_D(QDeclarativePathView);
- if (!d->isValid() || !isComponentComplete())
+ if (!d->model || !d->modelCount || !d->model->isValid() || !d->path || !isComponentComplete())
return;
// fix current
@@ -1384,7 +1411,7 @@ void QDeclarativePathView::itemsRemoved(int modelIndex, int count)
currentChanged = true;
} else if (d->currentIndex >= modelIndex && d->currentIndex < modelIndex + count) {
// current item has been removed.
- d->currentIndex = qMin(modelIndex, d->model->count()-1);
+ d->currentIndex = qMin(modelIndex, d->modelCount-1);
if (d->currentItem) {
if (QDeclarativePathViewAttached *att = d->attached(d->currentItem))
att->setIsCurrentItem(true);
@@ -1392,15 +1419,21 @@ void QDeclarativePathView::itemsRemoved(int modelIndex, int count)
currentChanged = true;
}
- QList<QDeclarativeItem *> removedItems = d->items;
+ d->itemCache += d->items;
d->items.clear();
- if (d->offset >= d->model->count())
- d->offset = d->model->count() - 1;
+ if (modelIndex > d->currentIndex) {
+ if (d->offset >= count) {
+ d->offset -= count;
+ d->offsetAdj -= count;
+ }
+ }
+
+ d->modelCount = d->model->count();
d->regenerate();
- while (removedItems.count())
- d->releaseItem(removedItems.takeLast());
d->updateCurrent();
+ if (!d->modelCount)
+ update();
if (currentChanged)
emit currentIndexChanged();
emit countChanged();
@@ -1431,6 +1464,7 @@ void QDeclarativePathView::itemsMoved(int /*from*/, int /*to*/, int /*count*/)
void QDeclarativePathView::modelReset()
{
Q_D(QDeclarativePathView);
+ d->modelCount = d->model->count();
d->regenerate();
emit countChanged();
}
@@ -1488,11 +1522,11 @@ int QDeclarativePathViewPrivate::calcCurrentIndex()
{
int current = -1;
if (model && items.count()) {
- offset = qmlMod(offset, model->count());
+ offset = qmlMod(offset, modelCount);
if (offset < 0)
- offset += model->count();
- current = qRound(qAbs(qmlMod(model->count() - offset, model->count())));
- current = current % model->count();
+ offset += modelCount;
+ current = qRound(qAbs(qmlMod(modelCount - offset, modelCount)));
+ current = current % modelCount;
}
return current;
@@ -1508,7 +1542,7 @@ void QDeclarativePathViewPrivate::updateCurrent()
int idx = calcCurrentIndex();
if (model && idx != currentIndex) {
- int itemIndex = (currentIndex - firstIndex + model->count()) % model->count();
+ int itemIndex = (currentIndex - firstIndex + modelCount) % modelCount;
if (itemIndex < items.count()) {
if (QDeclarativeItem *item = items.at(itemIndex)) {
if (QDeclarativePathViewAttached *att = attached(item))
@@ -1517,7 +1551,7 @@ void QDeclarativePathViewPrivate::updateCurrent()
}
currentIndex = idx;
currentItem = 0;
- itemIndex = (idx - firstIndex + model->count()) % model->count();
+ itemIndex = (idx - firstIndex + modelCount) % modelCount;
if (itemIndex < items.count()) {
currentItem = items.at(itemIndex);
currentItem->setFocus(true);
@@ -1549,25 +1583,26 @@ void QDeclarativePathViewPrivate::fixOffset()
void QDeclarativePathViewPrivate::snapToCurrent()
{
- if (!model || model->count() <= 0)
+ if (!model || modelCount <= 0)
return;
- qreal targetOffset = model->count() - currentIndex;
+ qreal targetOffset = modelCount - currentIndex;
moveReason = Other;
+ offsetAdj = 0.0;
tl.reset(moveOffset);
moveOffset.setValue(offset);
const int duration = highlightMoveDuration;
- if (targetOffset - offset > model->count()/2) {
- qreal distance = model->count() - targetOffset + offset;
+ if (targetOffset - offset > modelCount/2) {
+ qreal distance = modelCount - targetOffset + offset;
tl.move(moveOffset, 0.0, QEasingCurve(QEasingCurve::InQuad), int(duration * offset / distance));
- tl.set(moveOffset, model->count());
- tl.move(moveOffset, targetOffset, QEasingCurve(QEasingCurve::OutQuad), int(duration * (model->count()-targetOffset) / distance));
- } else if (targetOffset - offset <= -model->count()/2) {
- qreal distance = model->count() - offset + targetOffset;
- tl.move(moveOffset, model->count(), QEasingCurve(QEasingCurve::InQuad), int(duration * (model->count()-offset) / distance));
+ tl.set(moveOffset, modelCount);
+ tl.move(moveOffset, targetOffset, QEasingCurve(QEasingCurve::OutQuad), int(duration * (modelCount-targetOffset) / distance));
+ } else if (targetOffset - offset <= -modelCount/2) {
+ qreal distance = modelCount - offset + targetOffset;
+ tl.move(moveOffset, modelCount, QEasingCurve(QEasingCurve::InQuad), int(duration * (modelCount-offset) / distance));
tl.set(moveOffset, 0.0);
tl.move(moveOffset, targetOffset, QEasingCurve(QEasingCurve::OutQuad), int(duration * targetOffset / distance));
} else {
diff --git a/src/declarative/graphicsitems/qdeclarativepathview_p.h b/src/declarative/graphicsitems/qdeclarativepathview_p.h
index 035a64b..62a8c44 100644
--- a/src/declarative/graphicsitems/qdeclarativepathview_p.h
+++ b/src/declarative/graphicsitems/qdeclarativepathview_p.h
@@ -226,6 +226,7 @@ public:
emit pathChanged();
}
}
+ qreal m_percent;
Q_SIGNALS:
void currentItemChanged();
diff --git a/src/declarative/graphicsitems/qdeclarativepathview_p_p.h b/src/declarative/graphicsitems/qdeclarativepathview_p_p.h
index 9abec2e..dfebe35 100644
--- a/src/declarative/graphicsitems/qdeclarativepathview_p_p.h
+++ b/src/declarative/graphicsitems/qdeclarativepathview_p_p.h
@@ -75,19 +75,19 @@ class QDeclarativePathViewPrivate : public QDeclarativeItemPrivate, public QDecl
public:
QDeclarativePathViewPrivate()
: path(0), currentIndex(0), currentItemOffset(0.0), startPc(0), lastDist(0)
- , lastElapsed(0), mappedRange(1.0)
+ , lastElapsed(0), offset(0.0), offsetAdj(0.0), mappedRange(1.0)
, stealMouse(false), ownModel(false), interactive(true), haveHighlightRange(true)
, autoHighlight(true), highlightUp(false), layoutScheduled(false)
, moving(false), flicking(false)
, dragMargin(0), deceleration(100)
- , moveOffset(this, &QDeclarativePathViewPrivate::setOffset)
+ , moveOffset(this, &QDeclarativePathViewPrivate::setAdjustedOffset)
, firstIndex(-1), pathItems(-1), requestedIndex(-1)
, moveReason(Other), attType(0), highlightComponent(0), highlightItem(0)
, moveHighlight(this, &QDeclarativePathViewPrivate::setHighlightPosition)
, highlightPosition(0)
, highlightRangeStart(0), highlightRangeEnd(0)
, highlightRangeMode(QDeclarativePathView::StrictlyEnforceRange)
- , highlightMoveDuration(300)
+ , highlightMoveDuration(300), modelCount(0)
{
}
@@ -96,6 +96,8 @@ public:
void itemGeometryChanged(QDeclarativeItem *item, const QRectF &newGeometry, const QRectF &oldGeometry) {
if ((newGeometry.size() != oldGeometry.size())
&& (!highlightItem || item != highlightItem)) {
+ if (QDeclarativePathViewAttached *att = attached(item))
+ att->m_percent = -1;
scheduleLayout();
}
}
@@ -126,6 +128,7 @@ public:
static void fixOffsetCallback(void*);
void fixOffset();
void setOffset(qreal offset);
+ void setAdjustedOffset(qreal offset);
void regenerate();
void updateItem(QDeclarativeItem *, qreal);
void snapToCurrent();
@@ -140,6 +143,7 @@ public:
qreal lastDist;
int lastElapsed;
qreal offset;
+ qreal offsetAdj;
qreal mappedRange;
bool stealMouse : 1;
bool ownModel : 1;
@@ -160,6 +164,7 @@ public:
int pathItems;
int requestedIndex;
QList<QDeclarativeItem *> items;
+ QList<QDeclarativeItem *> itemCache;
QDeclarativeGuard<QDeclarativeVisualModel> model;
QVariant modelVariant;
enum MovementReason { Other, SetIndex, Mouse };
@@ -173,6 +178,7 @@ public:
qreal highlightRangeEnd;
QDeclarativePathView::HighlightRangeMode highlightRangeMode;
int highlightMoveDuration;
+ int modelCount;
};
QT_END_NAMESPACE
diff --git a/src/declarative/qml/qdeclarativecompiler.cpp b/src/declarative/qml/qdeclarativecompiler.cpp
index 61ea9c8..e55dc92 100644
--- a/src/declarative/qml/qdeclarativecompiler.cpp
+++ b/src/declarative/qml/qdeclarativecompiler.cpp
@@ -1764,9 +1764,7 @@ bool QDeclarativeCompiler::buildGroupedProperty(QDeclarativeParser::Property *pr
Q_ASSERT(prop->index != -1);
if (QDeclarativeValueTypeFactory::isValueType(prop->type)) {
- QDeclarativeEnginePrivate *ep =
- static_cast<QDeclarativeEnginePrivate *>(QObjectPrivate::get(engine));
- if (prop->type >= 0 /* QVariant == -1 */ && ep->valueTypes[prop->type]) {
+ if (prop->type >= 0 /* QVariant == -1 */ && enginePrivate->valueTypes[prop->type]) {
if (prop->values.count()) {
if (prop->values.at(0)->location < prop->value->location) {
@@ -1780,7 +1778,7 @@ bool QDeclarativeCompiler::buildGroupedProperty(QDeclarativeParser::Property *pr
COMPILE_EXCEPTION(prop, tr( "Invalid property assignment: \"%1\" is a read-only property").arg(QString::fromUtf8(prop->name)));
}
- COMPILE_CHECK(buildValueTypeProperty(ep->valueTypes[prop->type],
+ COMPILE_CHECK(buildValueTypeProperty(enginePrivate->valueTypes[prop->type],
prop->value, obj, ctxt.incr()));
obj->addValueTypeProperty(prop);
} else {
@@ -2211,7 +2209,7 @@ bool QDeclarativeCompiler::checkDynamicMeta(QDeclarativeParser::Object *obj)
if (propName.at(0).isUpper())
COMPILE_EXCEPTION(&prop, tr("Property names cannot begin with an upper case letter"));
- if (QDeclarativeEnginePrivate::get(engine)->globalClass->illegalNames().contains(propName))
+ if (enginePrivate->globalClass->illegalNames().contains(propName))
COMPILE_EXCEPTION(&prop, tr("Illegal property name"));
propNames.insert(prop.name);
@@ -2224,7 +2222,7 @@ bool QDeclarativeCompiler::checkDynamicMeta(QDeclarativeParser::Object *obj)
QString nameStr = QString::fromUtf8(name);
if (nameStr.at(0).isUpper())
COMPILE_EXCEPTION(obj, tr("Signal names cannot begin with an upper case letter"));
- if (QDeclarativeEnginePrivate::get(engine)->globalClass->illegalNames().contains(nameStr))
+ if (enginePrivate->globalClass->illegalNames().contains(nameStr))
COMPILE_EXCEPTION(obj, tr("Illegal signal name"));
methodNames.insert(name);
}
@@ -2235,7 +2233,7 @@ bool QDeclarativeCompiler::checkDynamicMeta(QDeclarativeParser::Object *obj)
QString nameStr = QString::fromUtf8(name);
if (nameStr.at(0).isUpper())
COMPILE_EXCEPTION(obj, tr("Method names cannot begin with an upper case letter"));
- if (QDeclarativeEnginePrivate::get(engine)->globalClass->illegalNames().contains(nameStr))
+ if (enginePrivate->globalClass->illegalNames().contains(nameStr))
COMPILE_EXCEPTION(obj, tr("Illegal method name"));
methodNames.insert(name);
}
diff --git a/src/declarative/util/qdeclarativestateoperations.cpp b/src/declarative/util/qdeclarativestateoperations.cpp
index 6e6f0cb..845b3da 100644
--- a/src/declarative/util/qdeclarativestateoperations.cpp
+++ b/src/declarative/util/qdeclarativestateoperations.cpp
@@ -1427,6 +1427,7 @@ void QDeclarativeAnchorChanges::clearBindings()
if (!d->target)
return;
+ //### should this (saving "from" values) be moved to saveCurrentValues()?
d->fromX = d->target->x();
d->fromY = d->target->y();
d->fromWidth = d->target->width();
@@ -1486,22 +1487,8 @@ void QDeclarativeAnchorChanges::rewind()
return;
QDeclarativeItemPrivate *targetPrivate = QDeclarativeItemPrivate::get(d->target);
- //restore previous anchors
- if (d->rewindLeft.anchorLine != QDeclarativeAnchorLine::Invalid)
- targetPrivate->anchors()->setLeft(d->rewindLeft);
- if (d->rewindRight.anchorLine != QDeclarativeAnchorLine::Invalid)
- targetPrivate->anchors()->setRight(d->rewindRight);
- if (d->rewindHCenter.anchorLine != QDeclarativeAnchorLine::Invalid)
- targetPrivate->anchors()->setHorizontalCenter(d->rewindHCenter);
- if (d->rewindTop.anchorLine != QDeclarativeAnchorLine::Invalid)
- targetPrivate->anchors()->setTop(d->rewindTop);
- if (d->rewindBottom.anchorLine != QDeclarativeAnchorLine::Invalid)
- targetPrivate->anchors()->setBottom(d->rewindBottom);
- if (d->rewindVCenter.anchorLine != QDeclarativeAnchorLine::Invalid)
- targetPrivate->anchors()->setVerticalCenter(d->rewindVCenter);
- if (d->rewindBaseline.anchorLine != QDeclarativeAnchorLine::Invalid)
- targetPrivate->anchors()->setBaseline(d->rewindBaseline);
+ //restore previous values (but not previous bindings, i.e. anchors)
d->target->setX(d->rewindX);
d->target->setY(d->rewindY);
if (targetPrivate->widthValid) {
diff --git a/src/declarative/util/qdeclarativetransitionmanager.cpp b/src/declarative/util/qdeclarativetransitionmanager.cpp
index 9f198e4..d82c4bb 100644
--- a/src/declarative/util/qdeclarativetransitionmanager.cpp
+++ b/src/declarative/util/qdeclarativetransitionmanager.cpp
@@ -176,7 +176,7 @@ void QDeclarativeTransitionManager::transition(const QList<QDeclarativeAction> &
if (action.event->isReversable()) {
action.event->clearBindings();
action.event->rewind();
- action.event->clearBindings();
+ action.event->clearBindings(); //### shouldn't be needed
}
continue;
}
diff --git a/src/gui/image/qpixmap_s60.cpp b/src/gui/image/qpixmap_s60.cpp
index 9d571b5..dbdf0bc 100644
--- a/src/gui/image/qpixmap_s60.cpp
+++ b/src/gui/image/qpixmap_s60.cpp
@@ -63,6 +63,42 @@ QT_BEGIN_NAMESPACE
const uchar qt_pixmap_bit_mask[] = { 0x01, 0x02, 0x04, 0x08,
0x10, 0x20, 0x40, 0x80 };
+static bool cleanup_function_registered = false;
+static QS60PixmapData *firstPixmap = 0;
+
+static void qt_symbian_register_pixmap(QS60PixmapData *pd)
+{
+ if(!cleanup_function_registered) {
+ qAddPostRoutine(qt_symbian_release_pixmaps);
+ cleanup_function_registered = true;
+ }
+
+ pd->next = firstPixmap;
+ pd->prev = 0;
+ if (firstPixmap)
+ firstPixmap->prev = pd;
+ firstPixmap = pd;
+}
+
+static void qt_symbian_unregister_pixmap(QS60PixmapData *pd)
+{
+ if (pd->next)
+ pd->next->prev = pd->prev;
+ if (pd->prev)
+ pd->prev->next = pd->next;
+ else
+ firstPixmap = pd->next;
+}
+
+static void qt_symbian_release_pixmaps()
+{
+ // Scan all QS60PixmapData objects in the system and destroy them.
+ QS60PixmapData *pd = firstPixmap;
+ while (pd != 0) {
+ pd->release();
+ pd = pd->next;
+ }
+}
/*
\class QSymbianFbsClient
@@ -356,15 +392,18 @@ QS60PixmapData::QS60PixmapData(PixelType type) : QRasterPixmapData(type),
cfbsBitmap(0),
pengine(0),
bytes(0),
- formatLocked(false)
+ formatLocked(false),
+ next(0),
+ prev(0)
{
-
+ qt_symbian_register_pixmap(this);
}
QS60PixmapData::~QS60PixmapData()
{
release();
delete symbianBitmapDataAccess;
+ qt_symbian_unregister_pixmap(this);
}
void QS60PixmapData::resize(int width, int height)
diff --git a/src/gui/image/qpixmap_s60_p.h b/src/gui/image/qpixmap_s60_p.h
index 85c9ebe..a82f5c2 100644
--- a/src/gui/image/qpixmap_s60_p.h
+++ b/src/gui/image/qpixmap_s60_p.h
@@ -63,6 +63,11 @@ class CFbsBitGc;
class QSymbianBitmapDataAccess;
+class QS60PixmapData;
+void qt_symbian_register_pixmap(QS60PixmapData *pd);
+void qt_symbian_unregister_pixmap(QS60PixmapData *pd);
+void qt_symbian_release_pixmaps();
+
class QSymbianFbsHeapLock
{
public:
@@ -120,6 +125,13 @@ private:
bool formatLocked;
+ QS60PixmapData *next;
+ QS60PixmapData *prev;
+
+ friend void qt_symbian_register_pixmap(QS60PixmapData *pd);
+ friend void qt_symbian_unregister_pixmap(QS60PixmapData *pd);
+ friend void qt_symbian_release_pixmaps();
+
friend class QPixmap;
friend class QS60WindowSurface;
friend class QS60PaintEngine;
diff --git a/tests/auto/declarative/qdeclarativepathview/tst_qdeclarativepathview.cpp b/tests/auto/declarative/qdeclarativepathview/tst_qdeclarativepathview.cpp
index e2ccfd2..74d2f0a 100644
--- a/tests/auto/declarative/qdeclarativepathview/tst_qdeclarativepathview.cpp
+++ b/tests/auto/declarative/qdeclarativepathview/tst_qdeclarativepathview.cpp
@@ -367,9 +367,11 @@ void tst_QDeclarativePathView::dataModel()
QCOMPARE(item->y(), 10.0);
model.insertItem(4, "orange", "10");
+ QTest::qWait(100);
- int itemCount = findItems<QDeclarativeItem>(pathview, "wrapper").count();
- QCOMPARE(itemCount, 10);
+ QTRY_COMPARE(findItems<QDeclarativeItem>(pathview, "wrapper").count(), 10);
+
+ QVERIFY(pathview->currentIndex() == 0);
QDeclarativeText *text = findItem<QDeclarativeText>(pathview, "myText", 4);
QVERIFY(text);
@@ -384,26 +386,27 @@ void tst_QDeclarativePathView::dataModel()
QMetaObject::invokeMethod(canvas->rootObject(), "checkProperties");
QVERIFY(testObject->error() == false);
- itemCount = findItems<QDeclarativeItem>(pathview, "wrapper").count();
- QCOMPARE(itemCount, 5);
+ QTRY_COMPARE(findItems<QDeclarativeItem>(pathview, "wrapper").count(), 5);
QDeclarativeRectangle *testItem = findItem<QDeclarativeRectangle>(pathview, "wrapper", 4);
QVERIFY(testItem != 0);
testItem = findItem<QDeclarativeRectangle>(pathview, "wrapper", 5);
QVERIFY(testItem == 0);
+ pathview->setCurrentIndex(1);
+
model.insertItem(2, "pink", "2");
+ QTest::qWait(100);
- itemCount = findItems<QDeclarativeItem>(pathview, "wrapper").count();
- QCOMPARE(itemCount, 5);
+ QTRY_COMPARE(findItems<QDeclarativeItem>(pathview, "wrapper").count(), 5);
+ QVERIFY(pathview->currentIndex() == 1);
text = findItem<QDeclarativeText>(pathview, "myText", 2);
QVERIFY(text);
QCOMPARE(text->text(), model.name(2));
model.removeItem(3);
- itemCount = findItems<QDeclarativeItem>(pathview, "wrapper").count();
- QCOMPARE(itemCount, 5);
+ QTRY_COMPARE(findItems<QDeclarativeItem>(pathview, "wrapper").count(), 5);
text = findItem<QDeclarativeText>(pathview, "myText", 3);
QVERIFY(text);
QCOMPARE(text->text(), model.name(3));
diff --git a/tests/auto/declarative/qmlvisual/animation/qtbug13398/data/qtbug13398.0.png b/tests/auto/declarative/qmlvisual/animation/qtbug13398/data/qtbug13398.0.png
new file mode 100644
index 0000000..16adc51
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/animation/qtbug13398/data/qtbug13398.0.png
Binary files differ
diff --git a/tests/auto/declarative/qmlvisual/animation/qtbug13398/data/qtbug13398.qml b/tests/auto/declarative/qmlvisual/animation/qtbug13398/data/qtbug13398.qml
new file mode 100644
index 0000000..0cc98ce
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/animation/qtbug13398/data/qtbug13398.qml
@@ -0,0 +1,447 @@
+import Qt.VisualTest 4.7
+
+VisualTest {
+ Frame {
+ msec: 0
+ }
+ Frame {
+ msec: 16
+ hash: "2452007928bf86b9c42e666c7a7afc89"
+ }
+ Frame {
+ msec: 32
+ hash: "2452007928bf86b9c42e666c7a7afc89"
+ }
+ Frame {
+ msec: 48
+ hash: "2452007928bf86b9c42e666c7a7afc89"
+ }
+ Frame {
+ msec: 64
+ hash: "2452007928bf86b9c42e666c7a7afc89"
+ }
+ Frame {
+ msec: 80
+ hash: "2452007928bf86b9c42e666c7a7afc89"
+ }
+ Frame {
+ msec: 96
+ hash: "2452007928bf86b9c42e666c7a7afc89"
+ }
+ Frame {
+ msec: 112
+ hash: "2452007928bf86b9c42e666c7a7afc89"
+ }
+ Frame {
+ msec: 128
+ hash: "2452007928bf86b9c42e666c7a7afc89"
+ }
+ Frame {
+ msec: 144
+ hash: "2452007928bf86b9c42e666c7a7afc89"
+ }
+ Frame {
+ msec: 160
+ hash: "2452007928bf86b9c42e666c7a7afc89"
+ }
+ Frame {
+ msec: 176
+ hash: "2452007928bf86b9c42e666c7a7afc89"
+ }
+ Frame {
+ msec: 192
+ hash: "2452007928bf86b9c42e666c7a7afc89"
+ }
+ Frame {
+ msec: 208
+ hash: "2452007928bf86b9c42e666c7a7afc89"
+ }
+ Frame {
+ msec: 224
+ hash: "2452007928bf86b9c42e666c7a7afc89"
+ }
+ Frame {
+ msec: 240
+ hash: "2452007928bf86b9c42e666c7a7afc89"
+ }
+ Frame {
+ msec: 256
+ hash: "2452007928bf86b9c42e666c7a7afc89"
+ }
+ Frame {
+ msec: 272
+ hash: "2452007928bf86b9c42e666c7a7afc89"
+ }
+ Frame {
+ msec: 288
+ hash: "2452007928bf86b9c42e666c7a7afc89"
+ }
+ Frame {
+ msec: 304
+ hash: "2452007928bf86b9c42e666c7a7afc89"
+ }
+ Frame {
+ msec: 320
+ hash: "2452007928bf86b9c42e666c7a7afc89"
+ }
+ Frame {
+ msec: 336
+ hash: "2452007928bf86b9c42e666c7a7afc89"
+ }
+ Frame {
+ msec: 352
+ hash: "2452007928bf86b9c42e666c7a7afc89"
+ }
+ Frame {
+ msec: 368
+ hash: "2452007928bf86b9c42e666c7a7afc89"
+ }
+ Frame {
+ msec: 384
+ hash: "2452007928bf86b9c42e666c7a7afc89"
+ }
+ Frame {
+ msec: 400
+ hash: "2452007928bf86b9c42e666c7a7afc89"
+ }
+ Frame {
+ msec: 416
+ hash: "2452007928bf86b9c42e666c7a7afc89"
+ }
+ Frame {
+ msec: 432
+ hash: "2452007928bf86b9c42e666c7a7afc89"
+ }
+ Frame {
+ msec: 448
+ hash: "2452007928bf86b9c42e666c7a7afc89"
+ }
+ Frame {
+ msec: 464
+ hash: "2452007928bf86b9c42e666c7a7afc89"
+ }
+ Frame {
+ msec: 480
+ hash: "2452007928bf86b9c42e666c7a7afc89"
+ }
+ Frame {
+ msec: 496
+ hash: "2452007928bf86b9c42e666c7a7afc89"
+ }
+ Mouse {
+ type: 2
+ button: 1
+ buttons: 1
+ x: 220; y: 270
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 512
+ hash: "2452007928bf86b9c42e666c7a7afc89"
+ }
+ Frame {
+ msec: 528
+ hash: "2452007928bf86b9c42e666c7a7afc89"
+ }
+ Frame {
+ msec: 544
+ hash: "2452007928bf86b9c42e666c7a7afc89"
+ }
+ Frame {
+ msec: 560
+ hash: "2452007928bf86b9c42e666c7a7afc89"
+ }
+ Frame {
+ msec: 576
+ hash: "2452007928bf86b9c42e666c7a7afc89"
+ }
+ Mouse {
+ type: 5
+ button: 0
+ buttons: 1
+ x: 220; y: 271
+ modifiers: 0
+ sendToViewport: true
+ }
+ Mouse {
+ type: 3
+ button: 1
+ buttons: 0
+ x: 220; y: 271
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 592
+ hash: "2452007928bf86b9c42e666c7a7afc89"
+ }
+ Frame {
+ msec: 608
+ hash: "96e8e81d61bffe02b8f41f47a4a7e8fc"
+ }
+ Frame {
+ msec: 624
+ hash: "75881a2779bd7d7f683f87c4a7393769"
+ }
+ Frame {
+ msec: 640
+ hash: "2ef628328d2a6393095e78db80b0513f"
+ }
+ Frame {
+ msec: 656
+ hash: "390926f2c2c27dfa10c9b393ee466ce6"
+ }
+ Frame {
+ msec: 672
+ hash: "ea07d93e7d8a53f56cff19d9d3b282a4"
+ }
+ Frame {
+ msec: 688
+ hash: "8aa6be919b1ef4b7e102a319a453707e"
+ }
+ Frame {
+ msec: 704
+ hash: "6ebc518fb53ffe42fca20b9f16a21b36"
+ }
+ Frame {
+ msec: 720
+ hash: "ee7a93b157e24e22efa84604e7e44fe6"
+ }
+ Frame {
+ msec: 736
+ hash: "de3bf8f67e51b036db4976fd3b4b6c3c"
+ }
+ Frame {
+ msec: 752
+ hash: "648be4298ebe3bbc7e5c4a4c9c46f193"
+ }
+ Frame {
+ msec: 768
+ hash: "1ccf3b73e22a4b98ce1df098af9466f2"
+ }
+ Frame {
+ msec: 784
+ hash: "73a2fb047728b2b8e613f0fb8dfe429d"
+ }
+ Frame {
+ msec: 800
+ hash: "bbb4cabec4b98ea8ca94dff91a0d8c99"
+ }
+ Frame {
+ msec: 816
+ hash: "3337e86bd9fcfbce939389928fb1fb72"
+ }
+ Frame {
+ msec: 832
+ hash: "cb4a2a330e8470c61de9e9b6d2dc4597"
+ }
+ Frame {
+ msec: 848
+ hash: "e09a359578935b988ac1cc8c40b25547"
+ }
+ Frame {
+ msec: 864
+ hash: "e09a359578935b988ac1cc8c40b25547"
+ }
+ Frame {
+ msec: 880
+ hash: "e09a359578935b988ac1cc8c40b25547"
+ }
+ Frame {
+ msec: 896
+ hash: "e09a359578935b988ac1cc8c40b25547"
+ }
+ Frame {
+ msec: 912
+ hash: "e09a359578935b988ac1cc8c40b25547"
+ }
+ Frame {
+ msec: 928
+ hash: "e09a359578935b988ac1cc8c40b25547"
+ }
+ Frame {
+ msec: 944
+ hash: "e09a359578935b988ac1cc8c40b25547"
+ }
+ Frame {
+ msec: 960
+ image: "qtbug13398.0.png"
+ }
+ Frame {
+ msec: 976
+ hash: "e09a359578935b988ac1cc8c40b25547"
+ }
+ Frame {
+ msec: 992
+ hash: "e09a359578935b988ac1cc8c40b25547"
+ }
+ Frame {
+ msec: 1008
+ hash: "e09a359578935b988ac1cc8c40b25547"
+ }
+ Frame {
+ msec: 1024
+ hash: "e09a359578935b988ac1cc8c40b25547"
+ }
+ Frame {
+ msec: 1040
+ hash: "e09a359578935b988ac1cc8c40b25547"
+ }
+ Frame {
+ msec: 1056
+ hash: "e09a359578935b988ac1cc8c40b25547"
+ }
+ Frame {
+ msec: 1072
+ hash: "e09a359578935b988ac1cc8c40b25547"
+ }
+ Frame {
+ msec: 1088
+ hash: "e09a359578935b988ac1cc8c40b25547"
+ }
+ Frame {
+ msec: 1104
+ hash: "e09a359578935b988ac1cc8c40b25547"
+ }
+ Frame {
+ msec: 1120
+ hash: "e09a359578935b988ac1cc8c40b25547"
+ }
+ Frame {
+ msec: 1136
+ hash: "e09a359578935b988ac1cc8c40b25547"
+ }
+ Frame {
+ msec: 1152
+ hash: "e09a359578935b988ac1cc8c40b25547"
+ }
+ Frame {
+ msec: 1168
+ hash: "e09a359578935b988ac1cc8c40b25547"
+ }
+ Frame {
+ msec: 1184
+ hash: "e09a359578935b988ac1cc8c40b25547"
+ }
+ Frame {
+ msec: 1200
+ hash: "e09a359578935b988ac1cc8c40b25547"
+ }
+ Frame {
+ msec: 1216
+ hash: "e09a359578935b988ac1cc8c40b25547"
+ }
+ Frame {
+ msec: 1232
+ hash: "e09a359578935b988ac1cc8c40b25547"
+ }
+ Mouse {
+ type: 2
+ button: 1
+ buttons: 1
+ x: 220; y: 271
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1248
+ hash: "e09a359578935b988ac1cc8c40b25547"
+ }
+ Frame {
+ msec: 1264
+ hash: "e09a359578935b988ac1cc8c40b25547"
+ }
+ Frame {
+ msec: 1280
+ hash: "e09a359578935b988ac1cc8c40b25547"
+ }
+ Frame {
+ msec: 1296
+ hash: "e09a359578935b988ac1cc8c40b25547"
+ }
+ Frame {
+ msec: 1312
+ hash: "e09a359578935b988ac1cc8c40b25547"
+ }
+ Frame {
+ msec: 1328
+ hash: "e09a359578935b988ac1cc8c40b25547"
+ }
+ Mouse {
+ type: 3
+ button: 1
+ buttons: 0
+ x: 220; y: 271
+ modifiers: 0
+ sendToViewport: true
+ }
+ Frame {
+ msec: 1344
+ hash: "e09a359578935b988ac1cc8c40b25547"
+ }
+ Frame {
+ msec: 1360
+ hash: "697a4fd182ff90cd557f224174bad43a"
+ }
+ Frame {
+ msec: 1376
+ hash: "99e5ca9a77df1acfed628f31b9050179"
+ }
+ Frame {
+ msec: 1392
+ hash: "1f0dc00d3e3536b40a6becf775b31cee"
+ }
+ Frame {
+ msec: 1408
+ hash: "5b81ddd35d74be222bc8a40d2573884b"
+ }
+ Frame {
+ msec: 1424
+ hash: "4e236f5de69048e87add0e4380f2c3e6"
+ }
+ Frame {
+ msec: 1440
+ hash: "a901c9c0c77e03d98a2b95267cca8514"
+ }
+ Frame {
+ msec: 1456
+ hash: "78bbdf6781c2968c67982ffdb747dbbe"
+ }
+ Frame {
+ msec: 1472
+ hash: "a245ca593649f60980be982eb8fda57e"
+ }
+ Frame {
+ msec: 1488
+ hash: "c27fddc147749da24eaeb92aeaf61738"
+ }
+ Frame {
+ msec: 1504
+ hash: "b9674af46b618dc1eedabd4f18253b11"
+ }
+ Frame {
+ msec: 1520
+ hash: "8ae3c0cc0888fd0a607bc5b537a9ce0a"
+ }
+ Frame {
+ msec: 1536
+ hash: "f1981bd3fb08233622a4078e2f717011"
+ }
+ Frame {
+ msec: 1552
+ hash: "4dce834c9e3988fe535391fedc942add"
+ }
+ Frame {
+ msec: 1568
+ hash: "ca7356dee61e156d04b0b46ea033498e"
+ }
+ Frame {
+ msec: 1584
+ hash: "97499f6e04cbe690bc12458aef4b66a5"
+ }
+ Frame {
+ msec: 1600
+ hash: "2452007928bf86b9c42e666c7a7afc89"
+ }
+}
diff --git a/tests/auto/declarative/qmlvisual/animation/qtbug13398/qtbug13398.qml b/tests/auto/declarative/qmlvisual/animation/qtbug13398/qtbug13398.qml
new file mode 100644
index 0000000..8f388bc
--- /dev/null
+++ b/tests/auto/declarative/qmlvisual/animation/qtbug13398/qtbug13398.qml
@@ -0,0 +1,68 @@
+import Qt 4.7
+
+Item {
+ width: 300
+ height: 400
+
+ Rectangle {
+ id: root
+ color: "darkkhaki"
+
+ x: 50
+ y: 50
+
+ width: 200
+ height: 300
+
+ Rectangle {
+ id: statusbar
+ color: "chocolate"
+
+ height: 30
+
+ anchors.top: root.top
+ anchors.left: root.left
+ anchors.right: root.right
+ }
+
+ Rectangle {
+ id: titlebar
+ color: "crimson"
+
+ height: 60
+
+ anchors.top: statusbar.bottom
+ anchors.left: root.left
+ anchors.right: root.right
+ }
+
+ MouseArea {
+ anchors.fill: parent
+ onClicked: {
+ root.state = root.state ? "" : "fullscreen";
+ }
+ }
+
+ states: [
+ State {
+ name: "fullscreen"
+ AnchorChanges {
+ target: statusbar
+ anchors.top: undefined
+ anchors.bottom: titlebar.top
+ }
+ AnchorChanges {
+ target: titlebar
+ anchors.top: undefined
+ anchors.bottom: root.top
+ }
+ }
+ ]
+
+ transitions: [
+ Transition {
+ AnchorAnimation { }
+ }
+ ]
+ }
+}
diff --git a/tools/qml/main.cpp b/tools/qml/main.cpp
index 7421b5e..78cd64d 100644
--- a/tools/qml/main.cpp
+++ b/tools/qml/main.cpp
@@ -441,6 +441,7 @@ static QDeclarativeViewer *createViewer()
QDeclarativeViewer *viewer = new QDeclarativeViewer(0, wflags);
viewer->setAttribute(Qt::WA_DeleteOnClose, true);
+ viewer->setUseGL(opts.useGL);
if (!opts.scriptopts.isEmpty()) {
viewer->setScriptOptions(opts.scriptOptions);
@@ -492,8 +493,6 @@ void showViewer(QDeclarativeViewer *viewer)
viewer->showMaximized();
else
viewer->show();
-
- viewer->setUseGL(opts.useGL);
viewer->raise();
}