summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoona Petrell <joona.t.petrell@nokia.com>2010-06-09 11:51:29 +1000
committerJoona Petrell <joona.t.petrell@nokia.com>2010-06-09 13:13:50 +1000
commit5c6501970c7b6805b7edc30f90187700f05d9f15 (patch)
treecbc23e38845e2ae349e3fcae547818998b8b7f43
parent00b157dc4aad203e78b8e4d821470a1d01a195c0 (diff)
Fix drawing flicker on Qml Viewer startup
Task-number: QTBUG-10251 and QTBUG-11156 Reviewed-by: Martin Jones
-rw-r--r--src/declarative/QmlChanges.txt2
-rw-r--r--src/declarative/util/qdeclarativeview.cpp20
-rw-r--r--src/declarative/util/qdeclarativeview.h1
-rw-r--r--tests/auto/declarative/qdeclarativeview/tst_qdeclarativeview.cpp5
-rw-r--r--tests/auto/declarative/qdeclarativeviewer/tst_qdeclarativeviewer.cpp187
-rw-r--r--tools/qml/qmlruntime.cpp7
6 files changed, 214 insertions, 8 deletions
diff --git a/src/declarative/QmlChanges.txt b/src/declarative/QmlChanges.txt
index 5735b1ebe5..8b6b83f664 100644
--- a/src/declarative/QmlChanges.txt
+++ b/src/declarative/QmlChanges.txt
@@ -1,6 +1,8 @@
=============================================================================
The changes below are pre Qt 4.7.0 RC
+QDeclarativeView
+ - initialSize() function added
TextInput and TextEdit:
- openSoftwareInputPanel() and closeSoftwareInputPanel() functions added
Flickable:
diff --git a/src/declarative/util/qdeclarativeview.cpp b/src/declarative/util/qdeclarativeview.cpp
index 6059ad6684..0414e65818 100644
--- a/src/declarative/util/qdeclarativeview.cpp
+++ b/src/declarative/util/qdeclarativeview.cpp
@@ -131,7 +131,7 @@ class QDeclarativeViewPrivate : public QGraphicsViewPrivate, public QDeclarative
Q_DECLARE_PUBLIC(QDeclarativeView)
public:
QDeclarativeViewPrivate()
- : root(0), declarativeItemRoot(0), graphicsWidgetRoot(0), component(0), resizeMode(QDeclarativeView::SizeViewToRootObject) {}
+ : root(0), declarativeItemRoot(0), graphicsWidgetRoot(0), component(0), resizeMode(QDeclarativeView::SizeViewToRootObject), initialSize(0,0) {}
~QDeclarativeViewPrivate() { delete root; }
void execute();
void itemGeometryChanged(QDeclarativeItem *item, const QRectF &newGeometry, const QRectF &oldGeometry);
@@ -150,6 +150,7 @@ public:
QBasicTimer resizetimer;
QDeclarativeView::ResizeMode resizeMode;
+ QSize initialSize;
QElapsedTimer frameTimer;
void init();
@@ -586,9 +587,11 @@ void QDeclarativeView::setRootObject(QObject *obj)
}
if (d->root) {
- QSize initialSize = d->rootObjectSize();
- if (initialSize != size()) {
- resize(initialSize);
+ d->initialSize = d->rootObjectSize();
+ if (d->initialSize != size()) {
+ if (!(parentWidget() && parentWidget()->layout())) {
+ resize(d->initialSize);
+ }
}
d->initResize();
}
@@ -638,6 +641,15 @@ QSize QDeclarativeView::sizeHint() const
}
/*!
+ Returns the initial size of the root object
+*/
+QSize QDeclarativeView::initialSize() const
+{
+ Q_D(const QDeclarativeView);
+ return d->initialSize;
+}
+
+/*!
Returns the view's root \l {QGraphicsObject} {item}.
*/
QGraphicsObject *QDeclarativeView::rootObject() const
diff --git a/src/declarative/util/qdeclarativeview.h b/src/declarative/util/qdeclarativeview.h
index e9cff32569..cdcf134aa4 100644
--- a/src/declarative/util/qdeclarativeview.h
+++ b/src/declarative/util/qdeclarativeview.h
@@ -90,6 +90,7 @@ public:
QList<QDeclarativeError> errors() const;
QSize sizeHint() const;
+ QSize initialSize() const;
Q_SIGNALS:
void sceneResized(QSize size); // ???
diff --git a/tests/auto/declarative/qdeclarativeview/tst_qdeclarativeview.cpp b/tests/auto/declarative/qdeclarativeview/tst_qdeclarativeview.cpp
index cc48bd0766..6450e38c57 100644
--- a/tests/auto/declarative/qdeclarativeview/tst_qdeclarativeview.cpp
+++ b/tests/auto/declarative/qdeclarativeview/tst_qdeclarativeview.cpp
@@ -80,6 +80,7 @@ void tst_QDeclarativeView::resizemodedeclarativeitem()
QVERIFY(canvas);
QSignalSpy sceneResizedSpy(canvas, SIGNAL(sceneResized(QSize)));
canvas->setResizeMode(QDeclarativeView::SizeRootObjectToView);
+ QCOMPARE(QSize(0,0), canvas->initialSize());
canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/resizemodedeclarativeitem.qml"));
QDeclarativeItem* declarativeItem = qobject_cast<QDeclarativeItem*>(canvas->rootObject());
QVERIFY(declarativeItem);
@@ -90,6 +91,7 @@ void tst_QDeclarativeView::resizemodedeclarativeitem()
QCOMPARE(declarativeItem->height(), 200.0);
QCOMPARE(canvas->size(), QSize(200, 200));
QCOMPARE(canvas->size(), canvas->sizeHint());
+ QCOMPARE(canvas->size(), canvas->initialSize());
QCOMPARE(sceneResizedSpy.count(), 1);
// size update from view
@@ -135,6 +137,7 @@ void tst_QDeclarativeView::resizemodedeclarativeitem()
QCOMPARE(declarativeItem->width(), 200.0);
QCOMPARE(declarativeItem->height(), 200.0);
QCOMPARE(canvas->size(), canvas->sizeHint());
+ QCOMPARE(canvas->size(), canvas->initialSize());
QCOMPARE(sceneResizedSpy2.count(), 1);
// size update from root object
@@ -184,6 +187,7 @@ void tst_QDeclarativeView::resizemodegraphicswidget()
QCOMPARE(canvas->size(), QSize(200, 200));
QCOMPARE(canvas->size(), QSize(200, 200));
QCOMPARE(canvas->size(), canvas->sizeHint());
+ QCOMPARE(canvas->size(), canvas->initialSize());
QCOMPARE(sceneResizedSpy.count(), 1);
// size update from view
@@ -223,6 +227,7 @@ void tst_QDeclarativeView::resizemodegraphicswidget()
QCOMPARE(graphicsWidget->size(), QSizeF(200.0, 200.0));
QCOMPARE(canvas->size(), QSize(200, 200));
QCOMPARE(canvas->size(), canvas->sizeHint());
+ QCOMPARE(canvas->size(), canvas->initialSize());
QCOMPARE(sceneResizedSpy2.count(), 1);
// size update from root object
diff --git a/tests/auto/declarative/qdeclarativeviewer/tst_qdeclarativeviewer.cpp b/tests/auto/declarative/qdeclarativeviewer/tst_qdeclarativeviewer.cpp
index 49273eaccb..91b7cf8741 100644
--- a/tests/auto/declarative/qdeclarativeviewer/tst_qdeclarativeviewer.cpp
+++ b/tests/auto/declarative/qdeclarativeviewer/tst_qdeclarativeviewer.cpp
@@ -59,6 +59,11 @@ public:
private slots:
void orientation();
+ void loading();
+ void fileBrowser();
+ void resizing();
+ void paths();
+ void slowMode();
private:
QDeclarativeEngine engine;
@@ -108,6 +113,188 @@ void tst_QDeclarativeViewer::orientation()
QCOMPARE(viewer->size(), viewer->sizeHint());
}
+void tst_QDeclarativeViewer::loading()
+{
+ QDeclarativeViewer *viewer = new QDeclarativeViewer();
+ QVERIFY(viewer);
+ viewer->setSizeToView(true);
+ viewer->open(SRCDIR "/data/orientation.qml");
+ QVERIFY(viewer->view());
+ QVERIFY(viewer->menuBar());
+ QDeclarativeItem* rootItem = qobject_cast<QDeclarativeItem*>(viewer->view()->rootObject());
+ QVERIFY(rootItem);
+ viewer->show();
+
+ // initial size
+ QCOMPARE(rootItem->width(), 200.0);
+ QCOMPARE(rootItem->height(), 300.0);
+ QCOMPARE(viewer->view()->size(), QSize(200, 300));
+ QCOMPARE(viewer->view()->sceneRect().size(), QSizeF(200, 300));
+ QCOMPARE(viewer->size(), QSize(200, 300+viewer->menuBar()->height()));
+ QCOMPARE(viewer->size(), viewer->sizeHint());
+
+ viewer->resize(QSize(400, 500));
+ qApp->processEvents();
+
+ // window resized
+ QCOMPARE(rootItem->width(), 400.0);
+ QCOMPARE(rootItem->height(), 500.0-viewer->menuBar()->height());
+ QCOMPARE(viewer->view()->size(), QSize(400, 500-viewer->menuBar()->height()));
+ QCOMPARE(viewer->view()->initialSize(), QSize(200, 300));
+ QCOMPARE(viewer->view()->sceneRect().size(), QSizeF(400, 500-viewer->menuBar()->height()));
+ QCOMPARE(viewer->size(), QSize(400, 500));
+ QCOMPARE(viewer->size(), viewer->sizeHint());
+
+ viewer->reload();
+ rootItem = qobject_cast<QDeclarativeItem*>(viewer->view()->rootObject());
+ QVERIFY(rootItem);
+
+ // reload cause the window to return back to initial size
+ QCOMPARE(rootItem->width(), 200.0);
+ QCOMPARE(rootItem->height(), 300.0);
+ QCOMPARE(viewer->view()->size(), QSize(200, 300));
+ QCOMPARE(viewer->view()->initialSize(), QSize(200, 300));
+ QCOMPARE(viewer->view()->sceneRect().size(), QSizeF(200, 300));
+ QCOMPARE(viewer->size(), QSize(200, 300+viewer->menuBar()->height()));
+ QCOMPARE(viewer->size(), viewer->sizeHint());
+
+ viewer->resize(QSize(400, 500));
+ qApp->processEvents();
+
+ // window resized again
+ QCOMPARE(rootItem->width(), 400.0);
+ QCOMPARE(rootItem->height(), 500.0-viewer->menuBar()->height());
+ QCOMPARE(viewer->view()->size(), QSize(400, 500-viewer->menuBar()->height()));
+ QCOMPARE(viewer->view()->initialSize(), QSize(200, 300));
+ QCOMPARE(viewer->view()->sceneRect().size(), QSizeF(400, 500-viewer->menuBar()->height()));
+ QCOMPARE(viewer->size(), QSize(400, 500));
+ QCOMPARE(viewer->size(), viewer->sizeHint());
+
+ viewer->open(SRCDIR "/data/orientation.qml");
+ rootItem = qobject_cast<QDeclarativeItem*>(viewer->view()->rootObject());
+ QVERIFY(rootItem);
+
+ // open also causes the window to return back to initial size
+ QCOMPARE(rootItem->width(), 200.0);
+ QCOMPARE(rootItem->height(), 300.0);
+ QCOMPARE(viewer->view()->size(), QSize(200, 300));
+ QCOMPARE(viewer->view()->initialSize(), QSize(200, 300));
+ QCOMPARE(viewer->view()->sceneRect().size(), QSizeF(200, 300));
+ QCOMPARE(viewer->size(), QSize(200, 300+viewer->menuBar()->height()));
+ QCOMPARE(viewer->size(), viewer->sizeHint());
+}
+
+void tst_QDeclarativeViewer::fileBrowser()
+{
+ QDeclarativeViewer *viewer = new QDeclarativeViewer();
+ QVERIFY(viewer);
+ viewer->setUseNativeFileBrowser(false);
+ viewer->openFile();
+ viewer->show();
+
+ // Browser.qml successfully loaded
+ QDeclarativeItem* browserItem = qobject_cast<QDeclarativeItem*>(viewer->view()->rootObject());
+ QVERIFY(viewer->view());
+ QVERIFY(viewer->menuBar());
+ QVERIFY(browserItem);
+
+ // load something
+ viewer->open(SRCDIR "/data/orientation.qml");
+ QVERIFY(viewer->view());
+ QVERIFY(viewer->menuBar());
+ QDeclarativeItem* rootItem = qobject_cast<QDeclarativeItem*>(viewer->view()->rootObject());
+ QVERIFY(rootItem);
+ QVERIFY(browserItem != rootItem);
+
+ // go back to Browser.qml
+ viewer->openFile();
+ browserItem = qobject_cast<QDeclarativeItem*>(viewer->view()->rootObject());
+ QVERIFY(viewer->view());
+ QVERIFY(viewer->menuBar());
+ QVERIFY(browserItem);
+}
+
+void tst_QDeclarativeViewer::resizing()
+{
+ QDeclarativeViewer *viewer = new QDeclarativeViewer();
+ QVERIFY(viewer);
+ viewer->open(SRCDIR "/data/orientation.qml");
+ QVERIFY(viewer->view());
+ QVERIFY(viewer->menuBar());
+ QDeclarativeItem* rootItem = qobject_cast<QDeclarativeItem*>(viewer->view()->rootObject());
+ QVERIFY(rootItem);
+ viewer->show();
+
+ // initial size
+ QCOMPARE(rootItem->width(), 200.0);
+ QCOMPARE(rootItem->height(), 300.0);
+ QCOMPARE(viewer->view()->size(), QSize(200, 300));
+ QCOMPARE(viewer->view()->initialSize(), QSize(200, 300));
+ QCOMPARE(viewer->view()->sceneRect().size(), QSizeF(200, 300));
+ QCOMPARE(viewer->size(), QSize(200, 300+viewer->menuBar()->height()));
+ QCOMPARE(viewer->size(), viewer->sizeHint());
+
+ viewer->setSizeToView(false);
+
+ // size view to root object
+ rootItem->setWidth(100);
+ rootItem->setHeight(200);
+ qApp->processEvents();
+
+ QCOMPARE(rootItem->width(), 100.0);
+ QCOMPARE(rootItem->height(), 200.0);
+ QCOMPARE(viewer->view()->size(), QSize(100, 200));
+ QCOMPARE(viewer->view()->initialSize(), QSize(200, 300));
+ QCOMPARE(viewer->view()->sceneRect().size(), QSizeF(100, 200));
+ QCOMPARE(viewer->size(), QSize(100, 200+viewer->menuBar()->height()));
+ QCOMPARE(viewer->size(), viewer->sizeHint());
+
+ // do not size root object to view
+ viewer->resize(QSize(150,250));
+ QCOMPARE(rootItem->width(), 100.0);
+ QCOMPARE(rootItem->height(), 200.0);
+
+ viewer->setSizeToView(true);
+
+ // size root object to view
+ viewer->resize(QSize(250,350));
+ qApp->processEvents();
+
+ QCOMPARE(rootItem->width(), 250.0);
+ QCOMPARE(rootItem->height(), 350.0-viewer->menuBar()->height());
+ QCOMPARE(viewer->view()->size(), QSize(250, 350-viewer->menuBar()->height()));
+ QCOMPARE(viewer->view()->initialSize(), QSize(200, 300));
+ QCOMPARE(viewer->view()->sceneRect().size(), QSizeF(250, 350-viewer->menuBar()->height()));
+ QCOMPARE(viewer->size(), QSize(250, 350));
+ QCOMPARE(viewer->size(), viewer->sizeHint());
+
+ // do not size view to root object
+ rootItem->setWidth(100);
+ rootItem->setHeight(200);
+ QCOMPARE(viewer->size(), QSize(250, 350));
+}
+
+void tst_QDeclarativeViewer::paths()
+{
+ QDeclarativeViewer *viewer = new QDeclarativeViewer();
+ QVERIFY(viewer);
+
+ viewer->addLibraryPath("miscImportPath");
+ viewer->view()->engine()->importPathList().contains("miscImportPath");
+
+ viewer->addPluginPath("miscPluginPath");
+ viewer->view()->engine()->pluginPathList().contains("miscPluginPath");
+}
+
+void tst_QDeclarativeViewer::slowMode()
+{
+ QDeclarativeViewer *viewer = new QDeclarativeViewer();
+ QVERIFY(viewer);
+
+ viewer->setSlowMode(true);
+ viewer->setSlowMode(false);
+}
+
QTEST_MAIN(tst_QDeclarativeViewer)
#include "tst_qdeclarativeviewer.moc"
diff --git a/tools/qml/qmlruntime.cpp b/tools/qml/qmlruntime.cpp
index d95bec269d..676881d0ea 100644
--- a/tools/qml/qmlruntime.cpp
+++ b/tools/qml/qmlruntime.cpp
@@ -804,11 +804,11 @@ void QDeclarativeViewer::statusChanged()
tester->executefailure();
if (canvas->status() == QDeclarativeView::Ready) {
- initialSize = canvas->sizeHint();
+ initialSize = canvas->initialSize();
if (canvas->resizeMode() == QDeclarativeView::SizeRootObjectToView) {
- updateSizeHints();
if (!isFullScreen() && !isMaximized()) {
resize(QSize(initialSize.width(), initialSize.height()+menuBarHeight()));
+ updateSizeHints();
}
}
}
@@ -941,7 +941,7 @@ void QDeclarativeViewer::sceneResized(QSize size)
if (canvas->resizeMode() == QDeclarativeView::SizeViewToRootObject) {
updateSizeHints();
}
- }
+ }
}
void QDeclarativeViewer::keyPressEvent(QKeyEvent *event)
@@ -1264,7 +1264,6 @@ void QDeclarativeViewer::updateSizeHints()
setMinimumSize(QSize(0,0));
setMaximumSize(QSize(16777215,16777215));
}
- updateGeometry();
}
void QDeclarativeViewer::registerTypes()