summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBea Lam <bea.lam@nokia.com>2010-05-26 10:38:06 +1000
committerBea Lam <bea.lam@nokia.com>2010-05-26 10:38:06 +1000
commit3d34201d34ba26530025d5ff88fa6e498ae6f800 (patch)
tree490263b773db802c4dcf9355ef789e3e19c9cf0f
parent96f47aeec086b2d35b859194e42721dbc2d2db6a (diff)
parent291dce4ceba88a6cada0415524e3466621ac1612 (diff)
Merge branch '4.7' of scm.dev.nokia.troll.no:qt/qt-qml into 4.7
Conflicts: examples/declarative/toys/tic-tac-toe/tic-tac-toe.qml
-rw-r--r--demos/qtdemo/MagicAnim.qml60
-rw-r--r--demos/qtdemo/colors.cpp4
-rw-r--r--demos/qtdemo/colors.h1
-rw-r--r--demos/qtdemo/mainwindow.cpp23
-rw-r--r--demos/qtdemo/mainwindow.h3
-rw-r--r--demos/qtdemo/menumanager.cpp110
-rw-r--r--demos/qtdemo/menumanager.h9
-rw-r--r--demos/qtdemo/qmlShell.qml158
-rw-r--r--demos/qtdemo/qtdemo.pro5
-rw-r--r--demos/qtdemo/qtdemo.qrc18
-rw-r--r--demos/qtdemo/xml/examples.xml36
-rw-r--r--doc/src/declarative/declarativeui.qdoc2
-rw-r--r--doc/src/declarative/dynamicobjects.qdoc4
-rw-r--r--doc/src/declarative/examples.qdoc6
-rw-r--r--doc/src/examples/qml-examples.qdoc41
-rw-r--r--doc/src/examples/qml-flickr.qdoc2
-rw-r--r--doc/src/examples/qml-minehunt.qdoc5
-rw-r--r--doc/src/examples/qml-photoviewer.qdoc2
-rw-r--r--doc/src/examples/qml-rssnews.qdoc2
-rw-r--r--doc/src/examples/qml-samegame.qdoc5
-rw-r--r--doc/src/examples/qml-snake.qdoc5
-rw-r--r--doc/src/examples/qml-twitter.qdoc50
-rw-r--r--doc/src/images/qml-clocks-example.pngbin0 -> 40742 bytes
-rw-r--r--doc/src/images/qml-corkboards-example.pngbin0 -> 179625 bytes
-rw-r--r--doc/src/images/qml-dialcontrol-example.pngbin0 -> 33569 bytes
-rw-r--r--doc/src/images/qml-dynamicscene-example.pngbin0 -> 65247 bytes
-rw-r--r--doc/src/images/qml-flickr-demo.png (renamed from doc/src/images/qml-flickr-example.png)bin280730 -> 280730 bytes
-rw-r--r--doc/src/images/qml-flipable-example.pngbin0 -> 13301 bytes
-rw-r--r--doc/src/images/qml-minehunt-demo.png (renamed from doc/src/images/qml-minehunt-example.png)bin170648 -> 170648 bytes
-rw-r--r--doc/src/images/qml-photoviewer-demo.png (renamed from doc/src/images/qml-photoviewer-example.png)bin473306 -> 473306 bytes
-rw-r--r--doc/src/images/qml-progressbar-example.pngbin0 -> 15188 bytes
-rw-r--r--doc/src/images/qml-rssnews-demo.png (renamed from doc/src/images/qml-rssnews-example.png)bin143314 -> 143314 bytes
-rw-r--r--doc/src/images/qml-samegame-demo.png (renamed from doc/src/images/qml-samegame-example.png)bin285415 -> 285415 bytes
-rw-r--r--doc/src/images/qml-searchbox-example.pngbin0 -> 8170 bytes
-rw-r--r--doc/src/images/qml-slideswitch-example.pngbin0 -> 8298 bytes
-rw-r--r--doc/src/images/qml-snake-demo.png (renamed from doc/src/images/qml-snake-example.png)bin105053 -> 105053 bytes
-rw-r--r--doc/src/images/qml-spinner-example.pngbin0 -> 5637 bytes
-rw-r--r--doc/src/images/qml-tabwidget-example.pngbin0 -> 6487 bytes
-rw-r--r--doc/src/images/qml-tic-tac-toe-example.pngbin0 -> 24275 bytes
-rw-r--r--doc/src/images/qml-tvtennis-example.pngbin0 -> 2070 bytes
-rw-r--r--doc/src/images/qml-twitter-demo.pngbin0 -> 95812 bytes
-rw-r--r--doc/src/snippets/declarative/Sprite.qml2
-rw-r--r--doc/src/snippets/declarative/createComponent.qml2
-rw-r--r--doc/src/snippets/declarative/texteditor.qml71
-rw-r--r--examples/declarative/README4
-rw-r--r--examples/declarative/animation/easing/easing.qml2
-rwxr-xr-xexamples/declarative/modelviews/webview/content/Mapping/map.html8
-rw-r--r--examples/declarative/toys/README2
-rw-r--r--examples/declarative/ui-components/README39
-rw-r--r--examples/declarative/ui-components/dialcontrol/content/Dial.qml (renamed from examples/declarative/toys/dial-example/content/Dial.qml)0
-rw-r--r--examples/declarative/ui-components/dialcontrol/content/background.png (renamed from examples/declarative/toys/dial-example/content/background.png)bin35876 -> 35876 bytes
-rw-r--r--examples/declarative/ui-components/dialcontrol/content/needle.png (renamed from examples/declarative/toys/dial-example/content/needle.png)bin342 -> 342 bytes
-rw-r--r--examples/declarative/ui-components/dialcontrol/content/needle_shadow.png (renamed from examples/declarative/toys/dial-example/content/needle_shadow.png)bin632 -> 632 bytes
-rw-r--r--examples/declarative/ui-components/dialcontrol/content/overlay.png (renamed from examples/declarative/toys/dial-example/content/overlay.png)bin3564 -> 3564 bytes
-rw-r--r--examples/declarative/ui-components/dialcontrol/dial.qmlproject (renamed from examples/declarative/toys/dial-example/dial.qmlproject)0
-rw-r--r--examples/declarative/ui-components/dialcontrol/dialcontrol.qml (renamed from examples/declarative/toys/dial-example/dial-example.qml)0
-rw-r--r--examples/declarative/ui-components/flipable/flipable.qml (renamed from examples/declarative/ui-components/flipable/flipable-example.qml)0
-rw-r--r--examples/declarative/ui-components/progressbar/main.qml (renamed from examples/declarative/ui-components/progressbar/progressbars.qml)0
-rw-r--r--examples/declarative/ui-components/scrollbar/main.qml (renamed from examples/declarative/ui-components/scrollbar/display.qml)0
-rw-r--r--examples/declarative/ui-components/tabwidget/main.qml (renamed from examples/declarative/ui-components/tabwidget/tabs.qml)0
-rw-r--r--src/declarative/QmlChanges.txt1
-rw-r--r--src/declarative/graphicsitems/qdeclarativeitem.cpp8
-rw-r--r--src/declarative/graphicsitems/qdeclarativetextedit.cpp73
-rw-r--r--src/declarative/graphicsitems/qdeclarativetextedit_p.h4
-rw-r--r--src/declarative/graphicsitems/qdeclarativetextedit_p_p.h4
-rw-r--r--src/declarative/graphicsitems/qdeclarativetextinput.cpp5
-rw-r--r--src/declarative/qml/qdeclarativebinding.cpp8
-rw-r--r--src/declarative/qml/qdeclarativecompiler.cpp17
-rw-r--r--src/declarative/qml/qdeclarativecomponent.cpp10
-rw-r--r--src/declarative/qml/qdeclarativeengine.cpp4
-rw-r--r--src/declarative/qml/qdeclarativeobjectscriptclass.cpp2
-rw-r--r--src/declarative/qml/qdeclarativevmemetaobject.cpp2
-rw-r--r--src/declarative/util/qdeclarativestateoperations.cpp4
-rw-r--r--src/gui/graphicsview/qgraphicsscene.cpp14
-rw-r--r--src/gui/graphicsview/qgraphicswidget_p.cpp3
-rw-r--r--src/network/access/qnetworkaccessmanager.cpp8
-rw-r--r--tests/auto/declarative/qdeclarativebehaviors/data/groupedPropertyCrash.qml10
-rw-r--r--tests/auto/declarative/qdeclarativebehaviors/tst_qdeclarativebehaviors.cpp10
-rw-r--r--tests/auto/declarative/qdeclarativecomponent/data/createObject.qml16
-rw-r--r--tests/auto/declarative/qdeclarativecomponent/tst_qdeclarativecomponent.cpp28
-rw-r--r--tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp10
-rw-r--r--tests/auto/declarative/qdeclarativeengine/tst_qdeclarativeengine.cpp2
-rw-r--r--tests/auto/declarative/qdeclarativetextedit/tst_qdeclarativetextedit.cpp8
-rw-r--r--tests/auto/declarative/qmlvisual/tst_qmlvisual.cpp6
-rw-r--r--tests/auto/headers/tst_headers.cpp14
-rw-r--r--tests/benchmarks/declarative/binding/testtypes.h10
-rw-r--r--tests/benchmarks/declarative/creation/tst_creation.cpp4
-rw-r--r--tests/benchmarks/declarative/qdeclarativecomponent/testtypes.h10
-rw-r--r--tests/benchmarks/declarative/qmltime/qmltime.cpp2
-rw-r--r--tools/qml/qml.pri5
-rw-r--r--tools/qml/qmlruntime.cpp29
-rw-r--r--tools/qml/qmlruntime.h1
92 files changed, 843 insertions, 170 deletions
diff --git a/demos/qtdemo/MagicAnim.qml b/demos/qtdemo/MagicAnim.qml
new file mode 100644
index 0000000000..7ac3e1ca5b
--- /dev/null
+++ b/demos/qtdemo/MagicAnim.qml
@@ -0,0 +1,60 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the demonstration applications of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import Qt 4.7
+
+//Emulates the in animation of the menu elements
+SequentialAnimation{
+ id: main;
+ property Item target
+ property int from: 0
+ property int to: 100
+ property int duration: 1000
+ property string properties: "y"
+ PauseAnimation { duration: main.duration*0.20 }
+ NumberAnimation { target: main.target; properties: main.properties; from: main.from; to: main.to + 40; duration: main.duration*0.30 }
+ NumberAnimation { target: main.target; properties: main.properties; from: main.to + 40; to: main.to; duration: main.duration*0.10 }
+ NumberAnimation { target: main.target; properties: main.properties; from: main.to; to: main.to + 20; duration: main.duration*0.10 }
+ NumberAnimation { target: main.target; properties: main.properties; from: main.to + 20; to: main.to; duration: main.duration*0.10 }
+ NumberAnimation { target: main.target; properties: main.properties; from: main.to; to: main.to + 8; duration: main.duration*0.10 }
+ NumberAnimation { target: main.target; properties: main.properties; from: main.to + 8; to: main.to; duration: main.duration*0.10 }
+}
+
diff --git a/demos/qtdemo/colors.cpp b/demos/qtdemo/colors.cpp
index 802d77d232..07cf1627ed 100644
--- a/demos/qtdemo/colors.cpp
+++ b/demos/qtdemo/colors.cpp
@@ -81,6 +81,7 @@ bool Colors::noRescale = false;
bool Colors::noAnimations = false;
bool Colors::noBlending = false;
bool Colors::noScreenSync = false;
+bool Colors::noBlur = true;
bool Colors::fullscreen = false;
bool Colors::usePixmaps = false;
bool Colors::useLoop = false;
@@ -232,6 +233,8 @@ void Colors::parseArgs(int argc, char *argv[])
Colors::showFps = true;
else if (s == "-no-blending")
Colors::noBlending = true;
+ else if (s == "-use-blur")
+ Colors::noBlur = false;
else if (s == "-no-sync")
Colors::noScreenSync = true;
else if (s.startsWith("-menu"))
@@ -295,6 +298,7 @@ void Colors::setLowSettings()
Colors::usePixmaps = true;
Colors::noAnimations = true;
Colors::noBlending = true;
+ Colors::noBlur = true;
}
void Colors::detectSystemResources()
diff --git a/demos/qtdemo/colors.h b/demos/qtdemo/colors.h
index 1e0b795970..2d58058e7a 100644
--- a/demos/qtdemo/colors.h
+++ b/demos/qtdemo/colors.h
@@ -91,6 +91,7 @@ public:
static bool noAnimations;
static bool noBlending;
static bool noScreenSync;
+ static bool noBlur;
static bool useLoop;
static bool noWindowMask;
static bool usePixmaps;
diff --git a/demos/qtdemo/mainwindow.cpp b/demos/qtdemo/mainwindow.cpp
index a679c4f505..45ec9a6d43 100644
--- a/demos/qtdemo/mainwindow.cpp
+++ b/demos/qtdemo/mainwindow.cpp
@@ -270,8 +270,10 @@ void MainWindow::setupSceneItems()
this->fpsLabel->setPos(Colors::stageStartX, 600 - QFontMetricsF(Colors::buttonFont()).height() - 5);
}
- this->companyLogo = new ImageItem(QImage(":/images/trolltech-logo.png"), 1000, 1000, this->scene, 0, true, 0.5f);
- this->qtLogo = new ImageItem(QImage(":/images/qtlogo_small.png"), 1000, 1000, this->scene, 0, true, 0.5f);
+ this->mainSceneRoot = new QGraphicsWidget();
+ this->scene->addItem(mainSceneRoot);
+ this->companyLogo = new ImageItem(QImage(":/images/trolltech-logo.png"), 1000, 1000, this->scene, mainSceneRoot, true, 0.5f);
+ this->qtLogo = new ImageItem(QImage(":/images/qtlogo_small.png"), 1000, 1000, this->scene, mainSceneRoot, true, 0.5f);
this->companyLogo->setZValue(100);
this->qtLogo->setZValue(100);
this->pausedLabel = new DemoTextItem(QString("PAUSED"), Colors::buttonFont(), Qt::white, -1, this->scene, 0);
@@ -308,6 +310,20 @@ void MainWindow::checkAdapt()
qDebug() << "- benchmark adaption: removed ticker (fps < 30)";
}
+ //Note: Because we don't adapt later in the program, if blur makes FPS plummet then we won't catch it
+ if (!Colors::noBlur && MenuManager::instance()->mainSceneBlur && this->mainSceneRoot){
+ Colors::noBlur = true;
+ this->mainSceneRoot->setGraphicsEffect(0);
+ MenuManager::instance()->mainSceneBlur = 0;
+ if(MenuManager::instance()->qmlRoot){
+ MenuManager::instance()->qmlRoot->setGraphicsEffect(0);
+ MenuManager::instance()->declarativeEngine->rootContext()->setContextProperty("realBlur", 0);
+ }
+ MenuManager::instance()->qmlShadow = 0;
+ if (Colors::verbose)
+ qDebug() << "- benchmark adaption: removed blur (fps < 30)";
+ }
+
if (this->fpsMedian < 20){
Colors::noAnimations = true;
if (Colors::verbose)
@@ -376,7 +392,7 @@ void MainWindow::keyPressEvent(QKeyEvent *event)
this->loop = false;
QApplication::quit();
}
- else if (event->key() == Qt::Key_1){
+ else if (event->key() == Qt::Key_F1){
QString s("");
s += "Rendering system: ";
if (Colors::openGlRendering)
@@ -415,6 +431,7 @@ void MainWindow::keyPressEvent(QKeyEvent *event)
s += Colors::noScreenSync ? "no" : "yes";
QMessageBox::information(0, QString("Current configuration"), s);
}
+ QGraphicsView::keyPressEvent(event);
}
void MainWindow::focusInEvent(QFocusEvent *)
diff --git a/demos/qtdemo/mainwindow.h b/demos/qtdemo/mainwindow.h
index edcc14695d..e61326827f 100644
--- a/demos/qtdemo/mainwindow.h
+++ b/demos/qtdemo/mainwindow.h
@@ -43,6 +43,7 @@
#define MAIN_WINDOW_H
#include <QtGui>
+#include <QtDeclarative>
#include <QPixmap>
class DemoTextItem;
@@ -62,6 +63,8 @@ public:
void start();
QGraphicsScene *scene;
+ QGraphicsWidget* mainSceneRoot;
+
bool loop;
// FPS stuff:
diff --git a/demos/qtdemo/menumanager.cpp b/demos/qtdemo/menumanager.cpp
index 40af30fed0..9eb5664317 100644
--- a/demos/qtdemo/menumanager.cpp
+++ b/demos/qtdemo/menumanager.cpp
@@ -59,6 +59,8 @@ MenuManager::MenuManager()
this->tickerInAnim = 0;
this->upButton = 0;
this->downButton = 0;
+ this->mainSceneBlur = 0;
+ this->qmlShadow = 0;
this->helpEngine = 0;
this->score = new Score();
this->currentMenu = QLatin1String("[no menu visible]");
@@ -152,6 +154,9 @@ void MenuManager::itemSelected(int userCode, const QString &menuName)
case LAUNCH:
this->launchExample(this->currentInfo);
break;
+ case LAUNCH_QML:
+ this->launchQmlExample(this->currentInfo);
+ break;
case DOCUMENTATION:
this->showDocInAssistant(this->currentInfo);
break;
@@ -169,6 +174,8 @@ void MenuManager::itemSelected(int userCode, const QString &menuName)
this->score->queueMovie(this->currentInfo + " -out");
this->score->queueMovie(this->currentInfo + " -buttons -out", Score::NEW_ANIMATION_ONLY);
this->score->queueMovie("back -out", Score::ONLY_IF_VISIBLE);
+ if(qmlRoot)
+ qmlRoot->setProperty("show", QVariant(false));
// book-keeping:
this->currentMenuCode = ROOT;
this->currentMenu = menuName + " -menu1";
@@ -191,6 +198,8 @@ void MenuManager::itemSelected(int userCode, const QString &menuName)
this->score->queueMovie(this->currentMenu + " -out", Score::FROM_START, Score::LOCK_ITEMS);
this->score->queueMovie(this->currentMenuButtons + " -out", Score::FROM_START, Score::LOCK_ITEMS);
this->score->queueMovie(this->currentInfo + " -out");
+ if(qmlRoot)
+ qmlRoot->setProperty("show", QVariant(false));
// book-keeping:
this->currentMenuCode = MENU1;
this->currentCategory = menuName;
@@ -208,6 +217,8 @@ void MenuManager::itemSelected(int userCode, const QString &menuName)
// out:
this->score->queueMovie(this->currentInfo + " -out", Score::NEW_ANIMATION_ONLY);
this->score->queueMovie(this->currentInfo + " -buttons -out", Score::NEW_ANIMATION_ONLY);
+ if(qmlRoot)
+ qmlRoot->setProperty("show", QVariant(false));
// book-keeping:
this->currentMenuCode = MENU2;
this->currentInfo = menuName;
@@ -242,6 +253,8 @@ void MenuManager::itemSelected(int userCode, const QString &menuName)
// out:
this->score->queueMovie(this->currentInfo + " -out", Score::NEW_ANIMATION_ONLY);
this->score->queueMovie(this->currentInfo + " -buttons -out", Score::NEW_ANIMATION_ONLY);
+ if(qmlRoot)
+ qmlRoot->setProperty("show", QVariant(false));
// book-keeping:
this->currentMenuCode = MENU1;
this->currentMenuButtons = this->currentCategory + " -buttons";
@@ -343,6 +356,35 @@ void MenuManager::launchExample(const QString &name)
#endif
}
+void MenuManager::launchQmlExample(const QString &name)
+{
+ if(!qmlRoot){
+ exampleError(QProcess::UnknownError);
+ return;
+ }
+ //resolveQmlFilename - refactor to separate fn?
+ QString dirName = this->info[name]["dirname"];
+ QString category = this->info[name]["category"];
+ QString fileName = this->info[name]["filename"];
+ QDir dir;
+ if (category == "demos")
+ dir = QDir(QLibraryInfo::location(QLibraryInfo::DemosPath));
+ else
+ dir = QDir(QLibraryInfo::location(QLibraryInfo::ExamplesPath));
+ QFile file(dir.path() + "/" + dirName + "/" + fileName + "/" + fileName.split('/').last() + ".qml");
+ if(!file.exists()){
+ //try main.qml as well
+ file.setFileName(dir.path() + "/" + dirName + "/" + fileName + "/" + "main.qml");
+ if(!file.exists()){
+ exampleError(QProcess::UnknownError);
+ return;
+ }
+ }
+
+ qmlRoot->setProperty("show", QVariant(true));
+ qmlRoot->setProperty("source", file.fileName());
+}
+
void MenuManager::exampleFinished()
{
}
@@ -359,6 +401,15 @@ void MenuManager::init(MainWindow *window)
{
this->window = window;
+ //Create blur for later use
+ // Note that blur is DISABLED by default because it's too slow, even on Desktop machines
+ if(!Colors::noBlur){
+ this->mainSceneBlur = new QGraphicsBlurEffect(this);
+ this->mainSceneBlur->setEnabled(false);
+ this->mainSceneBlur->setBlurRadius(0);
+ this->window->mainSceneRoot->setGraphicsEffect(mainSceneBlur);
+ }
+
// Create div:
this->createTicker();
this->createUpnDownButtons();
@@ -385,6 +436,37 @@ void MenuManager::init(MainWindow *window)
level2MenuNode = level2MenuNode.nextSibling();
}
+
+ // Create QML Loader
+ qmlRegisterType<QGraphicsBlurEffect>("Effects", 1, 0, "Blur");
+ declarativeEngine = new QDeclarativeEngine(this);
+ MenuManager::instance()->declarativeEngine->rootContext()->setContextProperty("realBlur", this->mainSceneBlur);
+ QDeclarativeComponent component(declarativeEngine, QUrl("qrc:qml/qmlShell.qml"), this);
+ qmlRoot = 0;
+ if(component.isReady())
+ qmlRoot = qobject_cast<QDeclarativeItem*>(component.create());
+ else
+ qDebug() << component.status() << component.errorString();
+ if(qmlRoot){
+ qmlRoot->setHeight(this->window->scene->sceneRect().height());
+ qmlRoot->setWidth(this->window->scene->sceneRect().width());
+ qmlRoot->setZValue(1000);//Above other items
+ qmlRoot->setCursor(Qt::ArrowCursor);
+ window->scene->addItem(qmlRoot);
+ if(!Colors::noBlur){
+ qmlShadow = new QGraphicsDropShadowEffect(this);
+ qmlShadow->setOffset(4);
+ qmlRoot->setGraphicsEffect(qmlShadow);
+ }
+
+ //Note that QML adds key handling to the app.
+ window->viewport()->setFocusPolicy(Qt::NoFocus);//Correct keyboard focus handling
+ window->setFocusPolicy(Qt::StrongFocus);
+ window->scene->setStickyFocus(true);
+ window->setFocus();
+ }else{
+ qDebug() << "Error intializing QML subsystem, Declarative examples will not work";
+ }
}
void MenuManager::readInfoAboutExample(const QDomElement &example)
@@ -392,13 +474,14 @@ void MenuManager::readInfoAboutExample(const QDomElement &example)
QString name = example.attribute("name");
if (this->info.contains(name))
qWarning() << "__WARNING: MenuManager::readInfoAboutExample: Demo/example with name"
- << name << "appears twize in the xml-file!__";
+ << name << "appears twice in the xml-file!__";
this->info[name]["filename"] = example.attribute("filename");
this->info[name]["category"] = example.parentNode().toElement().tagName();
this->info[name]["dirname"] = example.parentNode().toElement().attribute("dirname");
this->info[name]["changedirectory"] = example.attribute("changedirectory");
this->info[name]["image"] = example.attribute("image");
+ this->info[name]["qml"] = example.attribute("qml");
}
QString MenuManager::resolveDataDir(const QString &name)
@@ -454,7 +537,7 @@ QString MenuManager::resolveDocUrl(const QString &name)
QString fileName = this->info[name]["filename"];
if (category == "demos")
- return this->helpRootUrl + "demos-" + fileName + ".html";
+ return this->helpRootUrl + "demos-" + fileName.replace("/", "-") + ".html";
else
return this->helpRootUrl + dirName.replace("/", "-") + "-" + fileName + ".html";
}
@@ -474,6 +557,9 @@ QByteArray MenuManager::getImage(const QString &name)
QString imageName = this->info[name]["image"];
QString category = this->info[name]["category"];
QString fileName = this->info[name]["filename"];
+ bool qml = (this->info[name]["qml"] == QLatin1String("true"));
+ if(qml)
+ fileName = QLatin1String("qml-") + fileName.split('/').last();
if (imageName.isEmpty()){
if (category == "demos")
@@ -493,7 +579,7 @@ void MenuManager::createRootMenu(const QDomElement &el)
{
QString name = el.attribute("name");
createMenu(el, MENU1);
- createInfo(new MenuContentItem(el, this->window->scene, 0), name + " -info");
+ createInfo(new MenuContentItem(el, this->window->scene, this->window->mainSceneRoot), name + " -info");
Movie *menuButtonsIn = this->score->insertMovie(name + " -buttons");
Movie *menuButtonsOut = this->score->insertMovie(name + " -buttons -out");
@@ -505,19 +591,21 @@ void MenuManager::createSubMenu(const QDomElement &el)
{
QString name = el.attribute("name");
createMenu(el, MENU2);
- createInfo(new MenuContentItem(el, this->window->scene, 0), name + " -info");
+ createInfo(new MenuContentItem(el, this->window->scene, this->window->mainSceneRoot), name + " -info");
}
void MenuManager::createLeafMenu(const QDomElement &el)
{
QString name = el.attribute("name");
- createInfo(new ExampleContent(name, this->window->scene, 0), name);
+ createInfo(new ExampleContent(name, this->window->scene, this->window->mainSceneRoot), name);
Movie *infoButtonsIn = this->score->insertMovie(name + " -buttons");
Movie *infoButtonsOut = this->score->insertMovie(name + " -buttons -out");
createLowRightLeafButton("Documentation", 600, DOCUMENTATION, infoButtonsIn, infoButtonsOut, 0);
if (el.attribute("executable") != "false")
createLowRightLeafButton("Launch", 405, LAUNCH, infoButtonsIn, infoButtonsOut, 0);
+ else if(el.attribute("qml") == "true")
+ createLowRightLeafButton("Display", 405, LAUNCH_QML, infoButtonsIn, infoButtonsOut, 0);
}
void MenuManager::createMenu(const QDomElement &category, BUTTON_TYPE type)
@@ -546,7 +634,7 @@ void MenuManager::createMenu(const QDomElement &category, BUTTON_TYPE type)
// create normal menu button
QString label = currentNode.toElement().attribute("name");
- item = new TextButton(label, TextButton::LEFT, type, this->window->scene, 0);
+ item = new TextButton(label, TextButton::LEFT, type, this->window->scene, this->window->mainSceneRoot);
currentNode = currentNode.nextSibling();
#ifndef QT_OPENGL_SUPPORT
@@ -646,7 +734,7 @@ void MenuManager::createMenu(const QDomElement &category, BUTTON_TYPE type)
void MenuManager::createLowLeftButton(const QString &label, BUTTON_TYPE type,
Movie *movieIn, Movie *movieOut, Movie *movieShake, const QString &menuString)
{
- TextButton *button = new TextButton(label, TextButton::RIGHT, type, this->window->scene, 0, TextButton::PANEL);
+ TextButton *button = new TextButton(label, TextButton::RIGHT, type, this->window->scene, this->window->mainSceneRoot, TextButton::PANEL);
if (!menuString.isNull())
button->setMenuString(menuString);
button->setRecursiveVisible(false);
@@ -688,7 +776,7 @@ void MenuManager::createLowLeftButton(const QString &label, BUTTON_TYPE type,
void MenuManager::createLowRightButton(const QString &label, BUTTON_TYPE type, Movie *movieIn, Movie *movieOut, Movie * /*movieShake*/)
{
- TextButton *item = new TextButton(label, TextButton::RIGHT, type, this->window->scene, 0, TextButton::PANEL);
+ TextButton *item = new TextButton(label, TextButton::RIGHT, type, this->window->scene, this->window->mainSceneRoot, TextButton::PANEL);
item->setRecursiveVisible(false);
item->setZValue(10);
@@ -715,7 +803,7 @@ void MenuManager::createLowRightButton(const QString &label, BUTTON_TYPE type, M
void MenuManager::createLowRightLeafButton(const QString &label, int xOffset, BUTTON_TYPE type, Movie *movieIn, Movie *movieOut, Movie * /*movieShake*/)
{
- TextButton *item = new TextButton(label, TextButton::RIGHT, type, this->window->scene, 0, TextButton::PANEL);
+ TextButton *item = new TextButton(label, TextButton::RIGHT, type, this->window->scene, this->window->mainSceneRoot, TextButton::PANEL);
item->setRecursiveVisible(false);
item->setZValue(10);
@@ -831,12 +919,12 @@ void MenuManager::createUpnDownButtons()
float xOffset = 15.0f;
float yOffset = 450.0f;
- this->upButton = new TextButton("", TextButton::LEFT, MenuManager::UP, this->window->scene, 0, TextButton::UP);
+ this->upButton = new TextButton("", TextButton::LEFT, MenuManager::UP, this->window->scene, this->window->mainSceneRoot, TextButton::UP);
this->upButton->prepare();
this->upButton->setPos(xOffset, yOffset);
this->upButton->setState(TextButton::DISABLED);
- this->downButton = new TextButton("", TextButton::LEFT, MenuManager::DOWN, this->window->scene, 0, TextButton::DOWN);
+ this->downButton = new TextButton("", TextButton::LEFT, MenuManager::DOWN, this->window->scene, this->window->mainSceneRoot, TextButton::DOWN);
this->downButton->prepare();
this->downButton->setPos(xOffset + 10 + this->downButton->sceneBoundingRect().width(), yOffset);
diff --git a/demos/qtdemo/menumanager.h b/demos/qtdemo/menumanager.h
index ff98341426..3524081ff0 100644
--- a/demos/qtdemo/menumanager.h
+++ b/demos/qtdemo/menumanager.h
@@ -61,7 +61,7 @@ class MenuManager : public QObject
Q_OBJECT
public:
- enum BUTTON_TYPE {ROOT, MENU1, MENU2, LAUNCH, DOCUMENTATION, QUIT, FULLSCREEN, UP, DOWN, BACK};
+ enum BUTTON_TYPE {ROOT, MENU1, MENU2, LAUNCH, DOCUMENTATION, QUIT, FULLSCREEN, UP, DOWN, BACK, LAUNCH_QML};
// singleton pattern:
static MenuManager *instance();
@@ -83,6 +83,11 @@ public:
Score *score;
int currentMenuCode;
+ QDeclarativeEngine* declarativeEngine;
+ QDeclarativeItem *qmlRoot;
+ QGraphicsBlurEffect *mainSceneBlur;
+ QGraphicsDropShadowEffect *qmlShadow;
+
private slots:
void exampleFinished();
void exampleError(QProcess::ProcessError error);
@@ -100,6 +105,7 @@ private:
void readInfoAboutExample(const QDomElement &example);
void showDocInAssistant(const QString &docFile);
void launchExample(const QString &uniqueName);
+ void launchQmlExample(const QString &uniqueName);
void createMenu(const QDomElement &category, BUTTON_TYPE type);
void createLowLeftButton(const QString &label, BUTTON_TYPE type,
@@ -128,6 +134,7 @@ private:
TextButton *upButton;
TextButton *downButton;
+
};
#endif // MENU_MANAGER_H
diff --git a/demos/qtdemo/qmlShell.qml b/demos/qtdemo/qmlShell.qml
new file mode 100644
index 0000000000..eb155c45c3
--- /dev/null
+++ b/demos/qtdemo/qmlShell.qml
@@ -0,0 +1,158 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the demonstration applications of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import Qt 4.7
+import Effects 1.0
+
+Item {
+ id: main
+ property alias source: loader.source
+ property bool show: false
+ x: 0
+ y: -500 //height and width set by program
+ opacity: 0
+ property QtObject blurEffect: realBlur == null ? dummyBlur : realBlur //Is there a better way to lose those error messages?
+ Loader{//Automatic FocusScope
+ focus: true
+ clip: true
+ id: loader //source set by program
+ anchors.centerIn: parent
+ onStatusChanged: if(status == Loader.Ready) {
+ if(loader.item.width > 640)
+ loader.item.width = 640;
+ if(loader.item.height > 480)
+ loader.item.height = 480;
+ }
+
+ }
+ Rectangle{
+ z: -1
+ anchors.fill: loader.status == Loader.Ready ? loader : errorTxt
+ anchors.margins: -10
+ radius: 12
+ smooth: true
+ gradient: Gradient{
+ GradientStop{ position: 0.0; color: "#14FFFFFF" }
+ GradientStop{ position: 1.0; color: "#5AFFFFFF" }
+ }
+ MouseArea{
+ anchors.fill: parent
+ onClicked: loader.focus=true;/* and don't propogate to the 'exit' area*/
+ }
+
+ }
+
+ MouseArea{
+ z: -2
+ hoverEnabled: true //To steal from the buttons
+ anchors.fill: parent
+ onClicked: main.show=false;
+ }
+
+ Text{
+ id: errorTxt
+ anchors.centerIn: parent
+ color: 'white'
+ smooth: true
+ visible: loader.status == Loader.Error
+ textFormat: Text.RichText //includes link for bugreport
+ //Note that if loader is Error, it is because the file was found but there was an error creating the component
+ //This means either we have a bug in our demos, or the required modules (which ship with Qt) did not deploy correctly
+ text: 'The example has failed to load. This is a bug!<br />'
+ +'Report it at <a href="http://bugreports.qt.nokia.com">http://bugreports.qt.nokia.com</a>';
+ onLinkActivated: Qt.openUrlExternally(link);
+ }
+
+
+ states: [
+ State {
+ name: "show"
+ when: show == true
+ PropertyChanges {
+ target: main
+ opacity: 1
+ y: 0
+ }
+ PropertyChanges {
+ target: blurEffect
+ enabled: true
+ blurRadius: 8
+ blurHints: Blur.AnimationHint | Blur.PerformanceHint
+ }
+ }
+ ]
+ MagicAnim{ id: magicAnim; target: main; from: -500; to: 0 }
+ transitions: [
+ Transition { from: ""; to: "show"
+ SequentialAnimation{
+ ScriptAction{ script: magicAnim.start() }
+ NumberAnimation{ properties: "opacity,blurRadius"; easing.type: Easing.OutCubic; duration: 1000}
+ PropertyAnimation{ target: main; property: "y"}
+ }
+
+ },
+ Transition { from: "show"; to: "" //Addtionally, unload the item
+ SequentialAnimation{
+ NumberAnimation{ properties: "y,opacity,blurRadius";duration: 500 }
+ ScriptAction{ script: loader.source = ''; }
+ }
+ /*Attempt to copy the exeunt animation. Looks bad
+ SequentialAnimation{
+ ParallelAnimation{
+ NumberAnimation{ properties: "opacity,blurRadius"; easing.type: Easing.InCubic; duration: 1000 }
+ SequentialAnimation{
+ NumberAnimation{ target: main; property: 'y'; to: 3.2*height/5; duration: 500}
+ ParallelAnimation{
+ NumberAnimation{ target: main; property: 'y'; to: 3.0*height/5; duration: 100}
+ NumberAnimation{ target: main; property: 'x'; to: 3.0*width/5; duration: 100}
+ }
+ NumberAnimation{ target: main; property: 'x'; to: 700; duration: 400}
+ }
+ }
+ ScriptAction{ script: loader.source = ''; }
+ PropertyAction{ properties: "x,y";}
+ }
+ */
+ }
+ ]
+ Item{ Blur{id: dummyBlur } }
+
+}
diff --git a/demos/qtdemo/qtdemo.pro b/demos/qtdemo/qtdemo.pro
index 2a776ace1d..5e64e1c097 100644
--- a/demos/qtdemo/qtdemo.pro
+++ b/demos/qtdemo/qtdemo.pro
@@ -6,7 +6,7 @@ DESTDIR = $$DEMO_DESTDIR/bin
INSTALLS += target sources
-QT += xml network
+QT += xml network declarative
contains(QT_CONFIG, opengl) {
DEFINES += QT_OPENGL_SUPPORT
@@ -74,3 +74,6 @@ target.path = $$[QT_INSTALL_BINS]
sources.files = $$SOURCES $$HEADERS $$FORMS $$RESOURCES qtdemo.pro images xml *.ico *.icns *.rc *.plist
sources.path = $$[QT_INSTALL_DEMOS]/qtdemo
+OTHER_FILES += \
+ qmlShell.qml \
+ MagicAnim.qml
diff --git a/demos/qtdemo/qtdemo.qrc b/demos/qtdemo/qtdemo.qrc
index b30dd5894e..7682ab5148 100644
--- a/demos/qtdemo/qtdemo.qrc
+++ b/demos/qtdemo/qtdemo.qrc
@@ -1,8 +1,12 @@
-<!DOCTYPE RCC><RCC version="1.0">
-<qresource prefix="/">
- <file>xml/examples.xml</file>
- <file>images/qtlogo_small.png</file>
- <file>images/trolltech-logo.png</file>
- <file>images/demobg.png</file>
-</qresource>
+<RCC>
+ <qresource prefix="/">
+ <file>xml/examples.xml</file>
+ <file>images/qtlogo_small.png</file>
+ <file>images/trolltech-logo.png</file>
+ <file>images/demobg.png</file>
+ </qresource>
+ <qresource prefix="/qml" lang="qml">
+ <file>qmlShell.qml</file>
+ <file>MagicAnim.qml</file>
+ </qresource>
</RCC>
diff --git a/demos/qtdemo/xml/examples.xml b/demos/qtdemo/xml/examples.xml
index 91218611a8..0ab048e0a1 100644
--- a/demos/qtdemo/xml/examples.xml
+++ b/demos/qtdemo/xml/examples.xml
@@ -1,25 +1,32 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<categories name="Qt Examples and Demos">
<demos dirname="." docname="demos" name="Demonstrations">
+ <example filename="declarative/samegame" name="SameGame" executable="false" qml="true"/>
+ <example filename="declarative/flickr" name="Flickr Client" executable="false" qml="true"/>
<example filename="affine" name="Affine Transformations" />
- <example filename="arthurplugin" name="Arthur Plugin" executable="false" />
<example filename="composition" name="Composition Modes" />
<example filename="gradients" name="Gradients" />
<example filename="pathstroke" name="Path Stroking" />
- <example filename="deform" name="Vector Deformation" />
- <example filename="books" name="Books" />
- <example filename="mainwindow" name="Main Window" />
- <example filename="spreadsheet" name="Spreadsheet" />
- <example filename="sqlbrowser" name="SQL Browser" />
<example filename="textedit" name="Text Edit" />
<example filename="chip" name="40000 Chips" />
<example filename="embeddeddialogs" name="Embedded Dialogs" />
<example filename="interview" name="Interview" />
+ <example filename="declarative/rssnews" name="Rss Client" executable="false" qml="true"/>
+ <example filename="declarative/twitter" name="Twitter Client" executable="false" qml="true"/>
<example filename="browser" name="Browser" />
<example filename="qmediaplayer" name="Media Player" />
<example filename="boxes" name="Boxes" />
<example filename="sub-attaq" name="Sub-attaq" />
<example filename="spectrum" name="Spectrum Analyzer" />
+ <example filename="declarative/minehunt" name="Minehunt" executable="false" qml="true"/>
+ <example filename="declarative/snake" name="Snake" executable="false" qml="true"/>
+ <example filename="deform" name="Vector Deformation" />
+ <example filename="books" name="Books" />
+ <example filename="mainwindow" name="Main Window" />
+ <example filename="spreadsheet" name="Spreadsheet" />
+ <example filename="sqlbrowser" name="SQL Browser" />
+ <example filename="arthurplugin" name="Arthur Plugin" executable="false" />
+
</demos>
<category dirname="animation" name="Animation Framework">
<example filename="animatedtiles" name="Animated Tiles" />
@@ -35,6 +42,13 @@
<example filename="runfunction" name="Run Function" executable="false"/>
<example filename="wordcount" name="Word Count" executable="false" />
</category>
+ <category dirname="declarative/toys" name="Qt Declarative Examples">
+ <example filename="dynamicscene" name="Dynamic Scene" executable="false" qml="true" />
+ <example filename="tic-tac-toe" name="Tic Tac Toe" executable="false" qml="true" />
+ <example filename="clocks" name="Clocks" executable="false" qml="true" />
+ <example filename="corkboards" name="Corkboards" executable="false" qml="true" />
+ <example filename="tvtennis" name="TV Tennis" executable="false" qml="true" />
+ </category>
<category dirname="designer" name="Qt Designer">
<example filename="calculatorbuilder" name="Calculator Builder" />
<example filename="calculatorform" name="Calculator Form" />
@@ -116,6 +130,16 @@
<example filename="menus" name="Menus" />
<example filename="recentfiles" name="Recent Files" />
</category>
+ <category dirname="declarative/ui-components" name="QML UI Components">
+ <example filename="dialcontrol" name="Dial" executable="false" qml="true" />
+ <example filename="flipable" name="Flipable" executable="false" qml="true" />
+ <example filename="progressbar" name="Progress bar" executable="false" qml="true" />
+ <example filename="scrollbar" name="Scroll bar" executable="false" qml="true" />
+ <example filename="searchbox" name="Search box" executable="false" qml="true" />
+ <example filename="slideswitch" name="Slide switch" executable="false" qml="true" />
+ <example filename="spinner" name="Spinner" executable="false" qml="true" />
+ <example filename="tabwidget" name="Tab widget" executable="false" qml="true" />
+ </category>
<category dirname="network" name="Networking">
<example filename="blockingfortuneclient" name="Blocking Fortune Client" />
<example filename="broadcastreceiver" name="Broadcast Receiver" />
diff --git a/doc/src/declarative/declarativeui.qdoc b/doc/src/declarative/declarativeui.qdoc
index 5283ba80c3..1199b264ac 100644
--- a/doc/src/declarative/declarativeui.qdoc
+++ b/doc/src/declarative/declarativeui.qdoc
@@ -98,7 +98,7 @@ application or to build completely new applications. QML is fully \l
\o \l {qdeclarativemodules.html}{Modules}
\o \l {qdeclarativefocus.html}{Keyboard Focus}
\o \l {Extending types from QML}
-\o \l {Dynamic Object Creation}
+\o \l {qdeclarativedynamicobjects.html}{Dynamic Object Creation}
\o \l {qmlruntime.html}{The Qt Declarative Runtime}
\endlist
diff --git a/doc/src/declarative/dynamicobjects.qdoc b/doc/src/declarative/dynamicobjects.qdoc
index 2688ee511d..633489bcc0 100644
--- a/doc/src/declarative/dynamicobjects.qdoc
+++ b/doc/src/declarative/dynamicobjects.qdoc
@@ -75,12 +75,12 @@ the parent later you can safely pass null to this function.
Here is an example. Here is a \c Sprite.qml, which defines a simple QML component:
-\quotefile doc/src/snippets/declarative/Sprite.qml
+\snippet doc/src/snippets/declarative/Sprite.qml 0
Our main application file, \c main.qml, imports a \c componentCreation.js JavaScript file
that will create \c Sprite objects:
-\quotefile doc/src/snippets/declarative/createComponent.qml
+\snippet doc/src/snippets/declarative/createComponent.qml 0
Here is \c componentCreation.js. Remember that QML files that might be loaded
over the network cannot be expected to be ready immediately:
diff --git a/doc/src/declarative/examples.qdoc b/doc/src/declarative/examples.qdoc
index a355f9f10e..6e0426ca09 100644
--- a/doc/src/declarative/examples.qdoc
+++ b/doc/src/declarative/examples.qdoc
@@ -56,17 +56,17 @@ sub-directory that show how to use various aspects of QML. In addition, the
applications. These demos are intended to show integrated functionality
rather than being instructive on specific elements.
-To run the examples and demos, you can use Qt Creator or the included \l {Qt Declarative UI Runtime}{qml}
+To run the examples and demos, you can use Qt Creator or the included \l {Qt Declarative UI Runtime}{qmlviewer}
command-line application. It has some useful options, revealed by:
\code
- bin/qml -help
+ bin/qmlviewer -help
\endcode
For example, from your build directory, run:
\code
- bin/qml $QTDIR/demos/declarative/samegame/samegame.qml
+ bin/qmlviewer $QTDIR/demos/declarative/samegame/samegame.qml
\endcode
\section1 Examples
diff --git a/doc/src/examples/qml-examples.qdoc b/doc/src/examples/qml-examples.qdoc
index c2237d685e..56ba1c70a7 100644
--- a/doc/src/examples/qml-examples.qdoc
+++ b/doc/src/examples/qml-examples.qdoc
@@ -271,6 +271,8 @@
This example displays a set of clocks with different times for different cities.
Each clock is created by combining \l Image elements with \l Rotation transforms
and \l SpringFollow animations.
+
+ \image qml-clocks-example.png
*/
/*!
@@ -280,14 +282,8 @@
This example presents a flickable set of interactive corkboards. It is created
through a combination of elements like \l ListModel, \l Repeater and \l TextEdit
together with rotation and scaling transforms, animation and mouse interaction.
-*/
-
-/*!
- \title Toys: Dial
- \example declarative/toys/dial
- This example presents an interactive speedometer-type dial by combining
- \l Image elements with \l Rotation transforms and \l SpringFollow animations.
+ \image qml-corkboards-example.png
*/
/*!
@@ -297,6 +293,8 @@
This example presents an interactive drag-and-drop scene. It demonstrates
how to use QML's \l{Dynamic Object Creation} support to dynamically create and
destroy objects.
+
+ \image qml-dynamicscene-example.png
*/
/*!
@@ -304,6 +302,8 @@
\example declarative/toys/tic-tac-toe
This example presents a simple implementation of Tic Tac Toe.
+
+ \image qml-tic-tac-toe-example.png
*/
/*!
@@ -312,6 +312,8 @@
This example shows how to use animation components such as \l SpringFollow,
\l SequentialAnimation and \l PropertyAction to create a game of TV tennis.
+
+ \image qml-tvtennis-example.png
*/
/*!
@@ -329,10 +331,23 @@
*/
/*!
+ \title UI Components: Dial
+ \example declarative/ui-components/dialcontrol
+
+ This example presents an interactive speedometer-type dial by combining
+ \l Image elements with \l Rotation transforms and \l SpringFollow animations.
+
+ \image qml-dialcontrol-example.png
+*/
+
+
+/*!
\title UI Components: Flipable
\example declarative/ui-components/flipable
This example shows how to use the Flipable element.
+
+ \image qml-flipable-example.png
*/
/*!
@@ -340,6 +355,8 @@
\example declarative/ui-components/progressbar
This example shows how to create a progress bar.
+
+ \image qml-progressbar-example.png
*/
/*!
@@ -349,6 +366,8 @@
This example shows how to create scroll bars for a Flickable element
using the \l {Flickable::visibleArea.xPosition}{Flickable::visibleArea}
properties.
+
+ \image qml-scrollbar-example.png
*/
/*!
@@ -356,6 +375,8 @@
\example declarative/ui-components/searchbox
This example shows how to create a search box.
+
+ \image qml-searchbox-example.png
*/
/*!
@@ -363,6 +384,8 @@
\example declarative/ui-components/slideswitch
This example shows how to create a slide switch.
+
+ \image qml-slideswitch-example.png
*/
/*!
@@ -370,6 +393,8 @@
\example declarative/ui-components/spinner
This example shows how to create a spinner-type component.
+
+ \image qml-spinner-example.png
*/
/*!
@@ -377,6 +402,8 @@
\example declarative/ui-components/tabwidget
This example shows how to create a tab widget.
+
+ \image qml-tabwidget-example.png
*/
/*!
diff --git a/doc/src/examples/qml-flickr.qdoc b/doc/src/examples/qml-flickr.qdoc
index ebf3250f0b..43fcf1f6cf 100644
--- a/doc/src/examples/qml-flickr.qdoc
+++ b/doc/src/examples/qml-flickr.qdoc
@@ -45,5 +45,5 @@
This demo shows how to write a mobile Flickr browser application in QML.
- \image qml-flickr-example.png
+ \image qml-flickr-demo.png
*/
diff --git a/doc/src/examples/qml-minehunt.qdoc b/doc/src/examples/qml-minehunt.qdoc
index 773f21646d..b2c662d91f 100644
--- a/doc/src/examples/qml-minehunt.qdoc
+++ b/doc/src/examples/qml-minehunt.qdoc
@@ -43,7 +43,8 @@
\title Minehunt
\example demos/declarative/minehunt
- This demo shows how to create a simple Minehunt game with QML and C++.
+ This demo shows how to create a simple Minehunt game, using QML for the
+ UI and a C++ plugin for the game logic.
- \image qml-minehunt-example.png
+ \image qml-minehunt-demo.png
*/
diff --git a/doc/src/examples/qml-photoviewer.qdoc b/doc/src/examples/qml-photoviewer.qdoc
index d1c3da287e..d2114b90f9 100644
--- a/doc/src/examples/qml-photoviewer.qdoc
+++ b/doc/src/examples/qml-photoviewer.qdoc
@@ -45,5 +45,5 @@
This demo shows how to write a Flickr photo viewer application in QML.
- \image qml-photoviewer-example.png
+ \image qml-photoviewer-demo.png
*/
diff --git a/doc/src/examples/qml-rssnews.qdoc b/doc/src/examples/qml-rssnews.qdoc
index 0e7bdef9f6..801efd9ab1 100644
--- a/doc/src/examples/qml-rssnews.qdoc
+++ b/doc/src/examples/qml-rssnews.qdoc
@@ -45,5 +45,5 @@
This demo shows how to write a RSS news reader in QML.
- \image qml-rssnews-example.png
+ \image qml-rssnews-demo.png
*/
diff --git a/doc/src/examples/qml-samegame.qdoc b/doc/src/examples/qml-samegame.qdoc
index d9a9c7c433..5b78b0cf42 100644
--- a/doc/src/examples/qml-samegame.qdoc
+++ b/doc/src/examples/qml-samegame.qdoc
@@ -43,7 +43,8 @@
\title Same Game
\example demos/declarative/samegame
- This demo shows how to write a Same Game in QML.
+ This demo shows how to write a 'Same Game' game in QML, using Javascript
+ for all the game logic.
- \image qml-samegame-example.png
+ \image qml-samegame-demo.png
*/
diff --git a/doc/src/examples/qml-snake.qdoc b/doc/src/examples/qml-snake.qdoc
index 373ca133af..3125f2d939 100644
--- a/doc/src/examples/qml-snake.qdoc
+++ b/doc/src/examples/qml-snake.qdoc
@@ -43,7 +43,8 @@
\title Snake
\example demos/declarative/snake
- This demo shows how to write a Snake game in QML.
+ This demo shows how to write a Snake game in QML, controlled by the
+ keyboard as well as the mouse.
- \image qml-snake-example.png
+ \image qml-snake-demo.png
*/
diff --git a/doc/src/examples/qml-twitter.qdoc b/doc/src/examples/qml-twitter.qdoc
new file mode 100644
index 0000000000..0e663606f0
--- /dev/null
+++ b/doc/src/examples/qml-twitter.qdoc
@@ -0,0 +1,50 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \title Twitter Mobile
+ \example demos/declarative/twitter
+
+ This demo shows how to write a mobile Twitter client in QML. Use it to
+ tweet us(@qtbynokia) how much you like our demos!
+
+ \image qml-twitter-demo.png
+*/
diff --git a/doc/src/images/qml-clocks-example.png b/doc/src/images/qml-clocks-example.png
new file mode 100644
index 0000000000..1b352b589b
--- /dev/null
+++ b/doc/src/images/qml-clocks-example.png
Binary files differ
diff --git a/doc/src/images/qml-corkboards-example.png b/doc/src/images/qml-corkboards-example.png
new file mode 100644
index 0000000000..8acffa7b64
--- /dev/null
+++ b/doc/src/images/qml-corkboards-example.png
Binary files differ
diff --git a/doc/src/images/qml-dialcontrol-example.png b/doc/src/images/qml-dialcontrol-example.png
new file mode 100644
index 0000000000..74cd645d3a
--- /dev/null
+++ b/doc/src/images/qml-dialcontrol-example.png
Binary files differ
diff --git a/doc/src/images/qml-dynamicscene-example.png b/doc/src/images/qml-dynamicscene-example.png
new file mode 100644
index 0000000000..1f725d1b09
--- /dev/null
+++ b/doc/src/images/qml-dynamicscene-example.png
Binary files differ
diff --git a/doc/src/images/qml-flickr-example.png b/doc/src/images/qml-flickr-demo.png
index 71ea567929..71ea567929 100644
--- a/doc/src/images/qml-flickr-example.png
+++ b/doc/src/images/qml-flickr-demo.png
Binary files differ
diff --git a/doc/src/images/qml-flipable-example.png b/doc/src/images/qml-flipable-example.png
new file mode 100644
index 0000000000..dd68a66cef
--- /dev/null
+++ b/doc/src/images/qml-flipable-example.png
Binary files differ
diff --git a/doc/src/images/qml-minehunt-example.png b/doc/src/images/qml-minehunt-demo.png
index 3b6956936f..3b6956936f 100644
--- a/doc/src/images/qml-minehunt-example.png
+++ b/doc/src/images/qml-minehunt-demo.png
Binary files differ
diff --git a/doc/src/images/qml-photoviewer-example.png b/doc/src/images/qml-photoviewer-demo.png
index be6f1bf1f9..be6f1bf1f9 100644
--- a/doc/src/images/qml-photoviewer-example.png
+++ b/doc/src/images/qml-photoviewer-demo.png
Binary files differ
diff --git a/doc/src/images/qml-progressbar-example.png b/doc/src/images/qml-progressbar-example.png
new file mode 100644
index 0000000000..3ddd6c64ad
--- /dev/null
+++ b/doc/src/images/qml-progressbar-example.png
Binary files differ
diff --git a/doc/src/images/qml-rssnews-example.png b/doc/src/images/qml-rssnews-demo.png
index 948ef4d87c..948ef4d87c 100644
--- a/doc/src/images/qml-rssnews-example.png
+++ b/doc/src/images/qml-rssnews-demo.png
Binary files differ
diff --git a/doc/src/images/qml-samegame-example.png b/doc/src/images/qml-samegame-demo.png
index c17b4e0775..c17b4e0775 100644
--- a/doc/src/images/qml-samegame-example.png
+++ b/doc/src/images/qml-samegame-demo.png
Binary files differ
diff --git a/doc/src/images/qml-searchbox-example.png b/doc/src/images/qml-searchbox-example.png
new file mode 100644
index 0000000000..97d12bba89
--- /dev/null
+++ b/doc/src/images/qml-searchbox-example.png
Binary files differ
diff --git a/doc/src/images/qml-slideswitch-example.png b/doc/src/images/qml-slideswitch-example.png
new file mode 100644
index 0000000000..17cb3eb36b
--- /dev/null
+++ b/doc/src/images/qml-slideswitch-example.png
Binary files differ
diff --git a/doc/src/images/qml-snake-example.png b/doc/src/images/qml-snake-demo.png
index d3c077d1f8..d3c077d1f8 100644
--- a/doc/src/images/qml-snake-example.png
+++ b/doc/src/images/qml-snake-demo.png
Binary files differ
diff --git a/doc/src/images/qml-spinner-example.png b/doc/src/images/qml-spinner-example.png
new file mode 100644
index 0000000000..ed381f8aa7
--- /dev/null
+++ b/doc/src/images/qml-spinner-example.png
Binary files differ
diff --git a/doc/src/images/qml-tabwidget-example.png b/doc/src/images/qml-tabwidget-example.png
new file mode 100644
index 0000000000..05887f3d1a
--- /dev/null
+++ b/doc/src/images/qml-tabwidget-example.png
Binary files differ
diff --git a/doc/src/images/qml-tic-tac-toe-example.png b/doc/src/images/qml-tic-tac-toe-example.png
new file mode 100644
index 0000000000..5a5cc8262b
--- /dev/null
+++ b/doc/src/images/qml-tic-tac-toe-example.png
Binary files differ
diff --git a/doc/src/images/qml-tvtennis-example.png b/doc/src/images/qml-tvtennis-example.png
new file mode 100644
index 0000000000..ac2b5276bd
--- /dev/null
+++ b/doc/src/images/qml-tvtennis-example.png
Binary files differ
diff --git a/doc/src/images/qml-twitter-demo.png b/doc/src/images/qml-twitter-demo.png
new file mode 100644
index 0000000000..63d6486a5a
--- /dev/null
+++ b/doc/src/images/qml-twitter-demo.png
Binary files differ
diff --git a/doc/src/snippets/declarative/Sprite.qml b/doc/src/snippets/declarative/Sprite.qml
index b306cb084d..5f32b0ae80 100644
--- a/doc/src/snippets/declarative/Sprite.qml
+++ b/doc/src/snippets/declarative/Sprite.qml
@@ -39,6 +39,8 @@
**
****************************************************************************/
+//![0]
import Qt 4.7
Rectangle { width: 80; height: 50; color: "red" }
+//![0]
diff --git a/doc/src/snippets/declarative/createComponent.qml b/doc/src/snippets/declarative/createComponent.qml
index 910ea95ef5..3686188c45 100644
--- a/doc/src/snippets/declarative/createComponent.qml
+++ b/doc/src/snippets/declarative/createComponent.qml
@@ -39,6 +39,7 @@
**
****************************************************************************/
+//![0]
import Qt 4.7
import "componentCreation.js" as MyModule
@@ -48,3 +49,4 @@ Rectangle {
Component.onCompleted: MyModule.createSpriteObjects();
}
+//![0]
diff --git a/doc/src/snippets/declarative/texteditor.qml b/doc/src/snippets/declarative/texteditor.qml
new file mode 100644
index 0000000000..0bd79b5b78
--- /dev/null
+++ b/doc/src/snippets/declarative/texteditor.qml
@@ -0,0 +1,71 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+import Qt 4.7
+
+//![0]
+Flickable {
+ id: flick
+
+ width: 300; height: 200;
+ contentHeight: edit.height
+ clip: true
+
+ function ensureVisible(r)
+ {
+ if (contentX >= r.x)
+ contentX = r.x;
+ else if (contentX+width <= r.x+r.width)
+ contentX = r.x+r.width-width;
+ if (contentY >= r.y)
+ contentY = r.y;
+ else if (contentY+height <= r.y+r.height)
+ contentY = r.y+r.height-height;
+ }
+
+ TextEdit {
+ id: edit
+ width: parent.width
+ focus: true
+ wrapMode: TextEdit.WrapAtWordBoundaryOrAnywhere
+ onCursorRectangleChanged: flick.ensureVisible(cursorRectangle)
+ }
+}
+//![0]
diff --git a/examples/declarative/README b/examples/declarative/README
index 9e0f4c4266..578c2458a6 100644
--- a/examples/declarative/README
+++ b/examples/declarative/README
@@ -1,5 +1,5 @@
The Qt Declarative module provides the ability to specify and implement
-your UI declaratively, using the Qt Meta-Object Language(QML). This
+your user interface declaratively, using the Qt Meta-Object Language (QML). This
language is very expressive and human readable, and can be used by
designers to actually implement their UI vision. QML UIs can integrate
with C++ code in many ways, including being loaded as a part of a C++ UI
@@ -9,7 +9,7 @@ The example launcher provided with Qt can be used to explore each of the
examples in this directory. But most can also be viewed directly with the
QML viewer utility, without requiring compilation.
-Documentation for these examples can be found via the Tutorial and Examples
+Documentation for these examples can be found via the Tutorials and Examples
link in the main Qt documentation.
diff --git a/examples/declarative/animation/easing/easing.qml b/examples/declarative/animation/easing/easing.qml
index 91802523d5..9cdbad142b 100644
--- a/examples/declarative/animation/easing/easing.qml
+++ b/examples/declarative/animation/easing/easing.qml
@@ -76,7 +76,7 @@ Rectangle {
ListElement { name: "Easing.InOutCirc"; type: Easing.InOutCirc; ballColor: "RosyBrown" }
ListElement { name: "Easing.OutInCirc"; type: Easing.OutInCirc; ballColor: "SandyBrown" }
ListElement { name: "Easing.InElastic"; type: Easing.InElastic; ballColor: "DarkGoldenRod" }
- ListElement { name: "Easing.InElastic"; type: Easing.OutElastic; ballColor: "Chocolate" }
+ ListElement { name: "Easing.OutElastic"; type: Easing.OutElastic; ballColor: "Chocolate" }
ListElement { name: "Easing.InOutElastic"; type: Easing.InOutElastic; ballColor: "SaddleBrown" }
ListElement { name: "Easing.OutInElastic"; type: Easing.OutInElastic; ballColor: "Brown" }
ListElement { name: "Easing.InBack"; type: Easing.InBack; ballColor: "Maroon" }
diff --git a/examples/declarative/modelviews/webview/content/Mapping/map.html b/examples/declarative/modelviews/webview/content/Mapping/map.html
index a8726fd654..a98da5430f 100755
--- a/examples/declarative/modelviews/webview/content/Mapping/map.html
+++ b/examples/declarative/modelviews/webview/content/Mapping/map.html
@@ -25,6 +25,14 @@
} else {
goToLatLng(new google.maps.LatLng(window.qml.lat,window.qml.lng));
}
+ if (navigator.geolocation) {
+ navigator.geolocation.getCurrentPosition(function(position) {
+ initialLocation = new google.maps.LatLng(position.coords.latitude,position.coords.longitude);
+ window.qml.lat = initialLocation.lat;
+ window.qml.lng = initialLocation.lng;
+ goToLatLng(initialLocation);
+ });
+ }
}
function goToAddress() {
if (geocoder) {
diff --git a/examples/declarative/toys/README b/examples/declarative/toys/README
index 7fd7eb0bbc..ff4d0242d7 100644
--- a/examples/declarative/toys/README
+++ b/examples/declarative/toys/README
@@ -1,4 +1,4 @@
-These pure QML examples create complete components to demonstrate
+These pure QML examples demonstrate
some of what can be easily done using just a few QML files.
The example launcher provided with Qt can be used to explore each of the
diff --git a/examples/declarative/ui-components/README b/examples/declarative/ui-components/README
new file mode 100644
index 0000000000..7eecec104a
--- /dev/null
+++ b/examples/declarative/ui-components/README
@@ -0,0 +1,39 @@
+With Qt Declarative, it is easy to implement the UI components that you need
+in exactly the way that you want. These examples demonstrate this by creating
+a selection of user interface components where the look and feel has been
+completely defined in a QML file.
+
+The example launcher provided with Qt can be used to explore each of the
+examples in this directory. But most can also be viewed directly with the
+QML viewer utility, without requiring compilation.
+
+Documentation for these examples can be found via the Tutorials and Examples
+link in the main Qt documentation.
+
+
+Finding the Qt Examples and Demos launcher
+==========================================
+
+On Windows:
+
+The launcher can be accessed via the Windows Start menu. Select the menu
+entry entitled "Qt Examples and Demos" entry in the submenu containing
+the Qt tools.
+
+On Mac OS X:
+
+For the binary distribution, the qtdemo executable is installed in the
+/Developer/Applications/Qt directory. For the source distribution, it is
+installed alongside the other Qt tools on the path specified when Qt is
+configured.
+
+On Unix/Linux:
+
+The qtdemo executable is installed alongside the other Qt tools on the path
+specified when Qt is configured.
+
+On all platforms:
+
+The source code for the launcher can be found in the demos/qtdemo directory
+in the Qt package. This example is built at the same time as the Qt libraries,
+tools, examples, and demonstrations.
diff --git a/examples/declarative/toys/dial-example/content/Dial.qml b/examples/declarative/ui-components/dialcontrol/content/Dial.qml
index 2b421bf7c8..2b421bf7c8 100644
--- a/examples/declarative/toys/dial-example/content/Dial.qml
+++ b/examples/declarative/ui-components/dialcontrol/content/Dial.qml
diff --git a/examples/declarative/toys/dial-example/content/background.png b/examples/declarative/ui-components/dialcontrol/content/background.png
index 75d555d7ab..75d555d7ab 100644
--- a/examples/declarative/toys/dial-example/content/background.png
+++ b/examples/declarative/ui-components/dialcontrol/content/background.png
Binary files differ
diff --git a/examples/declarative/toys/dial-example/content/needle.png b/examples/declarative/ui-components/dialcontrol/content/needle.png
index 2d19f75039..2d19f75039 100644
--- a/examples/declarative/toys/dial-example/content/needle.png
+++ b/examples/declarative/ui-components/dialcontrol/content/needle.png
Binary files differ
diff --git a/examples/declarative/toys/dial-example/content/needle_shadow.png b/examples/declarative/ui-components/dialcontrol/content/needle_shadow.png
index 8d8a928cc5..8d8a928cc5 100644
--- a/examples/declarative/toys/dial-example/content/needle_shadow.png
+++ b/examples/declarative/ui-components/dialcontrol/content/needle_shadow.png
Binary files differ
diff --git a/examples/declarative/toys/dial-example/content/overlay.png b/examples/declarative/ui-components/dialcontrol/content/overlay.png
index 3860a7b590..3860a7b590 100644
--- a/examples/declarative/toys/dial-example/content/overlay.png
+++ b/examples/declarative/ui-components/dialcontrol/content/overlay.png
Binary files differ
diff --git a/examples/declarative/toys/dial-example/dial.qmlproject b/examples/declarative/ui-components/dialcontrol/dial.qmlproject
index d4909f8685..d4909f8685 100644
--- a/examples/declarative/toys/dial-example/dial.qmlproject
+++ b/examples/declarative/ui-components/dialcontrol/dial.qmlproject
diff --git a/examples/declarative/toys/dial-example/dial-example.qml b/examples/declarative/ui-components/dialcontrol/dialcontrol.qml
index 95df68c638..95df68c638 100644
--- a/examples/declarative/toys/dial-example/dial-example.qml
+++ b/examples/declarative/ui-components/dialcontrol/dialcontrol.qml
diff --git a/examples/declarative/ui-components/flipable/flipable-example.qml b/examples/declarative/ui-components/flipable/flipable.qml
index 479e35b413..479e35b413 100644
--- a/examples/declarative/ui-components/flipable/flipable-example.qml
+++ b/examples/declarative/ui-components/flipable/flipable.qml
diff --git a/examples/declarative/ui-components/progressbar/progressbars.qml b/examples/declarative/ui-components/progressbar/main.qml
index 22f8dbdd4b..22f8dbdd4b 100644
--- a/examples/declarative/ui-components/progressbar/progressbars.qml
+++ b/examples/declarative/ui-components/progressbar/main.qml
diff --git a/examples/declarative/ui-components/scrollbar/display.qml b/examples/declarative/ui-components/scrollbar/main.qml
index 1f7992b542..1f7992b542 100644
--- a/examples/declarative/ui-components/scrollbar/display.qml
+++ b/examples/declarative/ui-components/scrollbar/main.qml
diff --git a/examples/declarative/ui-components/tabwidget/tabs.qml b/examples/declarative/ui-components/tabwidget/main.qml
index e11902a516..e11902a516 100644
--- a/examples/declarative/ui-components/tabwidget/tabs.qml
+++ b/examples/declarative/ui-components/tabwidget/main.qml
diff --git a/src/declarative/QmlChanges.txt b/src/declarative/QmlChanges.txt
index 25c2417899..3eed8d6d80 100644
--- a/src/declarative/QmlChanges.txt
+++ b/src/declarative/QmlChanges.txt
@@ -15,6 +15,7 @@ QList<QObject*> models no longer provide properties in model object. The
properties are now updated when the object changes. An object's property
"foo" may now be accessed as "foo", modelData.foo" or model.modelData.foo"
component.createObject has gained a mandatory "parent" argument
+TextEdit and TextInput now have a "selectByMouse" property that defaults to false.
C++ API
-------
diff --git a/src/declarative/graphicsitems/qdeclarativeitem.cpp b/src/declarative/graphicsitems/qdeclarativeitem.cpp
index 95478844bd..2841ac395c 100644
--- a/src/declarative/graphicsitems/qdeclarativeitem.cpp
+++ b/src/declarative/graphicsitems/qdeclarativeitem.cpp
@@ -2681,7 +2681,13 @@ bool QDeclarativeItem::sceneEvent(QEvent *event)
}
}
-/*! \internal */
+/*!
+ \reimp
+
+ Note that unlike QGraphicsItems, QDeclarativeItem::itemChange() is \e not called
+ during initial widget polishing. Items wishing to optimize start-up construction
+ should instead consider using componentComplete().
+*/
QVariant QDeclarativeItem::itemChange(GraphicsItemChange change,
const QVariant &value)
{
diff --git a/src/declarative/graphicsitems/qdeclarativetextedit.cpp b/src/declarative/graphicsitems/qdeclarativetextedit.cpp
index 40d37a2970..a154d53f7d 100644
--- a/src/declarative/graphicsitems/qdeclarativetextedit.cpp
+++ b/src/declarative/graphicsitems/qdeclarativetextedit.cpp
@@ -61,8 +61,9 @@ QT_BEGIN_NAMESPACE
/*!
\qmlclass TextEdit QDeclarativeTextEdit
- \since 4.7
+ \since 4.7
\brief The TextEdit item allows you to add editable formatted text to a scene.
+ \inherits Item
It can display both plain and rich text. For example:
@@ -80,6 +81,14 @@ TextEdit {
\image declarative-textedit.gif
+ Note that the TextEdit does not implement scrolling, following the cursor, or other behaviors specific
+ to a look-and-feel. For example, to add flickable scrolling that follows the cursor:
+
+ \snippet snippets/declarative/texteditor.qml 0
+
+ A particular look-and-feel might use smooth scrolling (eg. using SmoothedFollow), might have a visible
+ scrollbar, or a scrollbar that fades in to show location, etc.
+
\sa Text
*/
@@ -523,7 +532,7 @@ void QDeclarativeTextEdit::setCursorVisible(bool on)
QFocusEvent focusEvent(on ? QEvent::FocusIn : QEvent::FocusOut);
if (!on && !d->persistentSelection)
d->control->setCursorIsFocusIndicator(true);
- d->control->processEvent(&focusEvent, QPointF(0, 0));
+ d->control->processEvent(&focusEvent, QPointF(0, -d->yoff));
emit cursorVisibleChanged(d->cursorVisible);
}
@@ -574,7 +583,7 @@ void QDeclarativeTextEdit::setCursorDelegate(QDeclarativeComponent* c)
disconnect(d->control, SIGNAL(cursorPositionChanged()),
this, SLOT(moveCursorDelegate()));
d->control->setCursorWidth(-1);
- dirtyCache(cursorRect());
+ dirtyCache(cursorRectangle());
delete d->cursor;
d->cursor = 0;
}
@@ -601,7 +610,7 @@ void QDeclarativeTextEdit::loadCursorDelegate()
connect(d->control, SIGNAL(cursorPositionChanged()),
this, SLOT(moveCursorDelegate()));
d->control->setCursorWidth(0);
- dirtyCache(cursorRect());
+ dirtyCache(cursorRectangle());
QDeclarative_setParent_noEvent(d->cursor, this);
d->cursor->setParentItem(this);
d->cursor->setHeight(QFontMetrics(d->font).height());
@@ -773,7 +782,7 @@ void QDeclarativeTextEdit::componentComplete()
}
/*!
- \qmlproperty string TextEdit::selectByMouse
+ \qmlproperty bool TextEdit::selectByMouse
Defaults to false.
@@ -854,13 +863,15 @@ Qt::TextInteractionFlags QDeclarativeTextEdit::textInteractionFlags() const
}
/*!
- Returns the rectangle where the text cursor is rendered
- within the text edit.
+ \qmlproperty rectangle TextEdit::cursorRectangle
+
+ The rectangle where the text cursor is rendered
+ within the text edit. Read-only.
*/
-QRect QDeclarativeTextEdit::cursorRect() const
+QRect QDeclarativeTextEdit::cursorRectangle() const
{
Q_D(const QDeclarativeTextEdit);
- return d->control->cursorRect().toRect();
+ return d->control->cursorRect().toRect().translated(0,-d->yoff);
}
@@ -872,7 +883,7 @@ bool QDeclarativeTextEdit::event(QEvent *event)
{
Q_D(QDeclarativeTextEdit);
if (event->type() == QEvent::ShortcutOverride) {
- d->control->processEvent(event, QPointF(0, 0));
+ d->control->processEvent(event, QPointF(0, -d->yoff));
return event->isAccepted();
}
return QDeclarativePaintedItem::event(event);
@@ -887,7 +898,7 @@ void QDeclarativeTextEdit::keyPressEvent(QKeyEvent *event)
Q_D(QDeclarativeTextEdit);
keyPressPreHandler(event);
if (!event->isAccepted())
- d->control->processEvent(event, QPointF(0, 0));
+ d->control->processEvent(event, QPointF(0, -d->yoff));
if (!event->isAccepted())
QDeclarativePaintedItem::keyPressEvent(event);
}
@@ -901,7 +912,7 @@ void QDeclarativeTextEdit::keyReleaseEvent(QKeyEvent *event)
Q_D(QDeclarativeTextEdit);
keyReleasePreHandler(event);
if (!event->isAccepted())
- d->control->processEvent(event, QPointF(0, 0));
+ d->control->processEvent(event, QPointF(0, -d->yoff));
if (!event->isAccepted())
QDeclarativePaintedItem::keyReleaseEvent(event);
}
@@ -942,7 +953,7 @@ void QDeclarativeTextEdit::mousePressEvent(QGraphicsSceneMouseEvent *event)
if (!hadFocus && hasFocus())
d->clickCausedFocus = true;
if (event->type() != QEvent::GraphicsSceneMouseDoubleClick || d->selectByMouse)
- d->control->processEvent(event, QPointF(0, 0));
+ d->control->processEvent(event, QPointF(0, -d->yoff));
if (!event->isAccepted())
QDeclarativePaintedItem::mousePressEvent(event);
}
@@ -959,7 +970,7 @@ void QDeclarativeTextEdit::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
qt_widget_private(widget)->handleSoftwareInputPanel(event->button(), d->clickCausedFocus);
d->clickCausedFocus = false;
- d->control->processEvent(event, QPointF(0, 0));
+ d->control->processEvent(event, QPointF(0, -d->yoff));
if (!event->isAccepted())
QDeclarativePaintedItem::mouseReleaseEvent(event);
}
@@ -972,7 +983,7 @@ void QDeclarativeTextEdit::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event
{
Q_D(QDeclarativeTextEdit);
if (d->selectByMouse) {
- d->control->processEvent(event, QPointF(0, 0));
+ d->control->processEvent(event, QPointF(0, -d->yoff));
if (!event->isAccepted())
QDeclarativePaintedItem::mouseDoubleClickEvent(event);
} else {
@@ -988,7 +999,7 @@ void QDeclarativeTextEdit::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
Q_D(QDeclarativeTextEdit);
if (d->selectByMouse) {
- d->control->processEvent(event, QPointF(0, 0));
+ d->control->processEvent(event, QPointF(0, -d->yoff));
if (!event->isAccepted())
QDeclarativePaintedItem::mouseMoveEvent(event);
event->setAccepted(true);
@@ -1004,7 +1015,7 @@ Handles the given input method \a event.
void QDeclarativeTextEdit::inputMethodEvent(QInputMethodEvent *event)
{
Q_D(QDeclarativeTextEdit);
- d->control->processEvent(event, QPointF(0, 0));
+ d->control->processEvent(event, QPointF(0, -d->yoff));
}
/*!
@@ -1026,13 +1037,20 @@ void QDeclarativeTextEdit::drawContents(QPainter *painter, const QRect &bounds)
Q_D(QDeclarativeTextEdit);
painter->setRenderHint(QPainter::TextAntialiasing, true);
+ painter->translate(0,d->yoff);
+
+ d->control->drawContents(painter, bounds.translated(0,-d->yoff));
- d->control->drawContents(painter, bounds);
+ painter->translate(0,-d->yoff);
}
-void QDeclarativeTextEdit::updateImgCache(const QRectF &r)
+void QDeclarativeTextEdit::updateImgCache(const QRectF &rf)
{
- dirtyCache(r.toRect());
+ Q_D(const QDeclarativeTextEdit);
+ QRect r = rf.toRect();
+ if (r != QRect(0,0,INT_MAX,INT_MAX)) // Don't translate "everything"
+ r = r.translated(0,d->yoff);
+ dirtyCache(r);
emit update();
}
@@ -1069,6 +1087,7 @@ void QDeclarativeTextEditPrivate::init()
QObject::connect(control, SIGNAL(selectionChanged()), q, SLOT(updateSelectionMarkers()));
QObject::connect(control, SIGNAL(cursorPositionChanged()), q, SLOT(updateSelectionMarkers()));
QObject::connect(control, SIGNAL(cursorPositionChanged()), q, SIGNAL(cursorPositionChanged()));
+ QObject::connect(control, SIGNAL(cursorPositionChanged()), q, SIGNAL(cursorRectangleChanged()));
document = control->document();
document->setDefaultFont(font);
@@ -1141,18 +1160,20 @@ void QDeclarativeTextEdit::updateSize()
d->document->setTextWidth(width());
dy -= (int)d->document->size().height();
- int yoff = 0;
if (heightValid()) {
if (d->vAlign == AlignBottom)
- yoff = dy;
+ d->yoff = dy;
else if (d->vAlign == AlignVCenter)
- yoff = dy/2;
+ d->yoff = dy/2;
+ } else {
+ d->yoff = 0;
}
- setBaselineOffset(fm.ascent() + yoff + d->textMargin);
+ setBaselineOffset(fm.ascent() + d->yoff + d->textMargin);
//### need to comfirm cost of always setting these
int newWidth = qCeil(d->document->idealWidth());
- d->document->setTextWidth(newWidth); // ### QTextDoc> Alignment will not work unless textWidth is set. Does Text need this line as well?
+ if (!widthValid())
+ d->document->setTextWidth(newWidth); // ### Text does not align if width is not set (QTextDoc bug)
int cursorWidth = 1;
if(d->cursor)
cursorWidth = d->cursor->width();
@@ -1161,7 +1182,7 @@ void QDeclarativeTextEdit::updateSize()
newWidth += 3;// ### Need a better way of accounting for space between char and cursor
// ### Setting the implicitWidth triggers another updateSize(), and unless there are bindings nothing has changed.
setImplicitWidth(newWidth);
- setImplicitHeight(d->text.isEmpty() ? fm.height() : (int)d->document->size().height());
+ setImplicitHeight(d->document->isEmpty() ? fm.height() : (int)d->document->size().height());
setContentsSize(QSize(width(), height()));
} else {
diff --git a/src/declarative/graphicsitems/qdeclarativetextedit_p.h b/src/declarative/graphicsitems/qdeclarativetextedit_p.h
index 8848d47996..891b868657 100644
--- a/src/declarative/graphicsitems/qdeclarativetextedit_p.h
+++ b/src/declarative/graphicsitems/qdeclarativetextedit_p.h
@@ -78,6 +78,7 @@ class Q_DECLARATIVE_EXPORT QDeclarativeTextEdit : public QDeclarativePaintedItem
Q_PROPERTY(bool readOnly READ isReadOnly WRITE setReadOnly NOTIFY readOnlyChanged)
Q_PROPERTY(bool cursorVisible READ isCursorVisible WRITE setCursorVisible NOTIFY cursorVisibleChanged)
Q_PROPERTY(int cursorPosition READ cursorPosition WRITE setCursorPosition NOTIFY cursorPositionChanged)
+ Q_PROPERTY(QRect cursorRectangle READ cursorRectangle NOTIFY cursorRectangleChanged)
Q_PROPERTY(QDeclarativeComponent* cursorDelegate READ cursorDelegate WRITE setCursorDelegate NOTIFY cursorDelegateChanged)
Q_PROPERTY(int selectionStart READ selectionStart WRITE setSelectionStart NOTIFY selectionStartChanged)
Q_PROPERTY(int selectionEnd READ selectionEnd WRITE setSelectionEnd NOTIFY selectionEndChanged)
@@ -180,13 +181,14 @@ public:
void setTextInteractionFlags(Qt::TextInteractionFlags flags);
Qt::TextInteractionFlags textInteractionFlags() const;
- QRect cursorRect() const;
+ QRect cursorRectangle() const;
QVariant inputMethodQuery(Qt::InputMethodQuery property) const;
Q_SIGNALS:
void textChanged(const QString &);
void cursorPositionChanged();
+ void cursorRectangleChanged();
void selectionStartChanged();
void selectionEndChanged();
void selectionChanged();
diff --git a/src/declarative/graphicsitems/qdeclarativetextedit_p_p.h b/src/declarative/graphicsitems/qdeclarativetextedit_p_p.h
index 885620d404..d96796cdad 100644
--- a/src/declarative/graphicsitems/qdeclarativetextedit_p_p.h
+++ b/src/declarative/graphicsitems/qdeclarativetextedit_p_p.h
@@ -73,7 +73,8 @@ public:
persistentSelection(true), clickCausedFocus(false), textMargin(0.0), lastSelectionStart(0), lastSelectionEnd(0),
cursorComponent(0), cursor(0), format(QDeclarativeTextEdit::AutoText), document(0),
wrapMode(QDeclarativeTextEdit::NoWrap),
- selectByMouse(false)
+ selectByMouse(false),
+ yoff(0)
{
}
@@ -112,6 +113,7 @@ public:
QTextControl *control;
QDeclarativeTextEdit::WrapMode wrapMode;
bool selectByMouse;
+ int yoff;
};
QT_END_NAMESPACE
diff --git a/src/declarative/graphicsitems/qdeclarativetextinput.cpp b/src/declarative/graphicsitems/qdeclarativetextinput.cpp
index 2e7715fa71..1ac1b4e667 100644
--- a/src/declarative/graphicsitems/qdeclarativetextinput.cpp
+++ b/src/declarative/graphicsitems/qdeclarativetextinput.cpp
@@ -54,8 +54,9 @@ QT_BEGIN_NAMESPACE
/*!
\qmlclass TextInput QDeclarativeTextInput
- \since 4.7
+ \since 4.7
\brief The TextInput item allows you to add an editable line of text to a scene.
+ \inherits Item
TextInput can only display a single line of text, and can only display
plain text. However it can provide addition input constraints on the text.
@@ -1120,7 +1121,7 @@ QString QDeclarativeTextInput::displayText() const
}
/*!
- \qmlproperty string TextInput::selectByMouse
+ \qmlproperty bool TextInput::selectByMouse
Defaults to false.
diff --git a/src/declarative/qml/qdeclarativebinding.cpp b/src/declarative/qml/qdeclarativebinding.cpp
index 823094195c..882e981555 100644
--- a/src/declarative/qml/qdeclarativebinding.cpp
+++ b/src/declarative/qml/qdeclarativebinding.cpp
@@ -191,7 +191,9 @@ void QDeclarativeBinding::update(QDeclarativePropertyPrivate::WriteFlags flags)
data->error.setUrl(url);
data->error.setLine(line);
data->error.setColumn(-1);
- data->error.setDescription(QLatin1String("Unable to assign [undefined] to ") + QLatin1String(QMetaType::typeName(data->property.propertyType())));
+ data->error.setDescription(QLatin1String("Unable to assign [undefined] to ")
+ + QLatin1String(QMetaType::typeName(data->property.propertyType()))
+ + QLatin1String(" ") + data->property.name());
} else if (!scriptValue.isRegExp() && scriptValue.isFunction()) {
@@ -353,8 +355,6 @@ void QDeclarativeAbstractBinding::removeFromObject()
if (m_prevBinding) {
int index = propertyIndex();
- Q_ASSERT(m_object);
-
*m_prevBinding = m_nextBinding;
if (m_nextBinding) m_nextBinding->m_prevBinding = m_prevBinding;
m_prevBinding = 0;
@@ -363,7 +363,7 @@ void QDeclarativeAbstractBinding::removeFromObject()
if (index & 0xFF000000) {
// Value type - we don't remove the proxy from the object. It will sit their happily
// doing nothing for ever more.
- } else {
+ } else if (m_object) {
QDeclarativeData *data = QDeclarativeData::get(m_object, false);
if (data) data->clearBindingBit(index);
}
diff --git a/src/declarative/qml/qdeclarativecompiler.cpp b/src/declarative/qml/qdeclarativecompiler.cpp
index b5bf97204d..d27aceda7d 100644
--- a/src/declarative/qml/qdeclarativecompiler.cpp
+++ b/src/declarative/qml/qdeclarativecompiler.cpp
@@ -1089,6 +1089,23 @@ void QDeclarativeCompiler::genObjectBody(QDeclarativeParser::Object *obj)
fetch.line = prop->location.start.line;
output->bytecode << fetch;
+ if (!prop->value->metadata.isEmpty()) {
+ QDeclarativeInstruction meta;
+ meta.type = QDeclarativeInstruction::StoreMetaObject;
+ meta.line = 0;
+ meta.storeMeta.data = output->indexForByteArray(prop->value->metadata);
+ meta.storeMeta.aliasData = output->indexForByteArray(prop->value->synthdata);
+ meta.storeMeta.propertyCache = output->propertyCaches.count();
+ // ### Surely the creation of this property cache could be more efficient
+ QDeclarativePropertyCache *propertyCache =
+ enginePrivate->cache(prop->value->metaObject()->superClass())->copy();
+ propertyCache->append(engine, prop->value->metaObject(), QDeclarativePropertyCache::Data::NoFlags,
+ QDeclarativePropertyCache::Data::IsVMEFunction);
+
+ output->propertyCaches << propertyCache;
+ output->bytecode << meta;
+ }
+
genObjectBody(prop->value);
QDeclarativeInstruction pop;
diff --git a/src/declarative/qml/qdeclarativecomponent.cpp b/src/declarative/qml/qdeclarativecomponent.cpp
index 3b782e71d2..7aa17e8e6b 100644
--- a/src/declarative/qml/qdeclarativecomponent.cpp
+++ b/src/declarative/qml/qdeclarativecomponent.cpp
@@ -549,15 +549,19 @@ QDeclarativeComponent::QDeclarativeComponent(QDeclarativeComponentPrivate &dd, Q
Returns an object instance from this component, or null if object creation fails.
The object will be created in the same context as the one in which the component
- was created.
+ was created. This function will always return null when called on components
+ which were not created in QML.
Note that if the returned object is to be displayed, its \c parent must be set to
- an existing item in a scene, or else the object will not be visible.
+ an existing item in a scene, or else the object will not be visible. The parent
+ argument is required to help you avoid this, you must explicitly pass in null if
+ you wish to create an object without setting a parent.
*/
/*!
\internal
- A version of create which returns a scriptObject, for use in script
+ A version of create which returns a scriptObject, for use in script.
+ This function will only work on components created in QML.
Sets graphics object parent because forgetting to do this is a frequent
and serious problem.
diff --git a/src/declarative/qml/qdeclarativeengine.cpp b/src/declarative/qml/qdeclarativeengine.cpp
index df9aa593fb..a7384a95a6 100644
--- a/src/declarative/qml/qdeclarativeengine.cpp
+++ b/src/declarative/qml/qdeclarativeengine.cpp
@@ -1049,9 +1049,9 @@ If you are certain the files will be local, you could simplify to:
\snippet doc/src/snippets/declarative/componentCreation.js 2
-The methods and properties of the Component element are defined in its own
+The methods and properties of the \l {Component} element are defined in its own
page, but when using it dynamically only two methods are usually used.
-\c Component.createObject() returns the created object or \c null if there is an error.
+ \l {Component::createObject()}{Component.createObject()} returns the created object or \c null if there is an error.
If there is an error, \l {Component::errorString()}{Component.errorString()} describes
the error that occurred. Note that createObject() takes exactly one argument, which is set
to the parent of the created object. Graphical objects without a parent will not appear
diff --git a/src/declarative/qml/qdeclarativeobjectscriptclass.cpp b/src/declarative/qml/qdeclarativeobjectscriptclass.cpp
index 8b64e0e77e..aca01b2ace 100644
--- a/src/declarative/qml/qdeclarativeobjectscriptclass.cpp
+++ b/src/declarative/qml/qdeclarativeobjectscriptclass.cpp
@@ -623,7 +623,7 @@ private:
inline void cleanup();
- void *data[4];
+ char data[4 * sizeof(void *)];
int type;
};
}
diff --git a/src/declarative/qml/qdeclarativevmemetaobject.cpp b/src/declarative/qml/qdeclarativevmemetaobject.cpp
index 13e9c26a5b..7aea7cba41 100644
--- a/src/declarative/qml/qdeclarativevmemetaobject.cpp
+++ b/src/declarative/qml/qdeclarativevmemetaobject.cpp
@@ -381,7 +381,7 @@ QDeclarativeVMEMetaObject::QDeclarativeVMEMetaObject(QObject *obj,
const QMetaObject *other,
const QDeclarativeVMEMetaData *meta,
QDeclarativeCompiledData *cdata)
-: object(obj), compiledData(cdata), ctxt(QDeclarativeData::get(obj)->outerContext),
+: object(obj), compiledData(cdata), ctxt(QDeclarativeData::get(obj, true)->outerContext),
metaData(meta), data(0), methods(0), parent(0)
{
compiledData->addref();
diff --git a/src/declarative/util/qdeclarativestateoperations.cpp b/src/declarative/util/qdeclarativestateoperations.cpp
index 80ae5f5985..99f163e507 100644
--- a/src/declarative/util/qdeclarativestateoperations.cpp
+++ b/src/declarative/util/qdeclarativestateoperations.cpp
@@ -1128,8 +1128,8 @@ void QDeclarativeAnchorChanges::setObject(QDeclarativeItem *target)
\qml
AnchorChanges {
target: myItem
- left: undefined //remove myItem's left anchor
- right: otherItem.right
+ anchors.left: undefined //remove myItem's left anchor
+ anchors.right: otherItem.right
}
\endqml
*/
diff --git a/src/gui/graphicsview/qgraphicsscene.cpp b/src/gui/graphicsview/qgraphicsscene.cpp
index 344df3067b..ae0abf9467 100644
--- a/src/gui/graphicsview/qgraphicsscene.cpp
+++ b/src/gui/graphicsview/qgraphicsscene.cpp
@@ -2545,12 +2545,16 @@ void QGraphicsScene::addItem(QGraphicsItem *item)
return;
}
- if (d->unpolishedItems.isEmpty()) {
- QMetaMethod method = metaObject()->method(d->polishItemsIndex);
- method.invoke(this, Qt::QueuedConnection);
+ // QDeclarativeItems do not rely on initial itemChanged message, as the componentComplete
+ // function allows far more opportunity for delayed-construction optimization.
+ if (!item->d_ptr->isDeclarativeItem) {
+ if (d->unpolishedItems.isEmpty()) {
+ QMetaMethod method = metaObject()->method(d->polishItemsIndex);
+ method.invoke(this, Qt::QueuedConnection);
+ }
+ d->unpolishedItems.append(item);
+ item->d_ptr->pendingPolish = true;
}
- d->unpolishedItems.append(item);
- item->d_ptr->pendingPolish = true;
// Detach this item from its parent if the parent's scene is different
// from this scene.
diff --git a/src/gui/graphicsview/qgraphicswidget_p.cpp b/src/gui/graphicsview/qgraphicswidget_p.cpp
index 076e8626b2..28070da86c 100644
--- a/src/gui/graphicsview/qgraphicswidget_p.cpp
+++ b/src/gui/graphicsview/qgraphicswidget_p.cpp
@@ -79,7 +79,8 @@ void QGraphicsWidgetPrivate::init(QGraphicsItem *parentItem, Qt::WindowFlags wFl
resolveLayoutDirection();
q->unsetWindowFrameMargins();
- flags |= QGraphicsItem::ItemUsesExtendedStyleOption | QGraphicsItem::ItemSendsGeometryChanges;
+ flags |= QGraphicsItem::ItemUsesExtendedStyleOption;
+ flags |= QGraphicsItem::ItemSendsGeometryChanges;
if (windowFlags & Qt::Window)
flags |= QGraphicsItem::ItemIsPanel;
}
diff --git a/src/network/access/qnetworkaccessmanager.cpp b/src/network/access/qnetworkaccessmanager.cpp
index 1c7661d5c9..b7539daf5c 100644
--- a/src/network/access/qnetworkaccessmanager.cpp
+++ b/src/network/access/qnetworkaccessmanager.cpp
@@ -595,8 +595,9 @@ QNetworkCookieJar *QNetworkAccessManager::cookieJar() const
\note QNetworkAccessManager takes ownership of the \a cookieJar object.
- QNetworkAccessManager will set the parent of the \a cookieJar
- passed to itself, so that the cookie jar is deleted when this
+ If \a cookieJar is in the same thread as this QNetworkAccessManager,
+ it will set the parent of the \a cookieJar
+ so that the cookie jar is deleted when this
object is deleted as well. If you want to share cookie jars
between different QNetworkAccessManager objects, you may want to
set the cookie jar's parent to 0 after calling this function.
@@ -621,7 +622,8 @@ void QNetworkAccessManager::setCookieJar(QNetworkCookieJar *cookieJar)
if (d->cookieJar && d->cookieJar->parent() == this)
delete d->cookieJar;
d->cookieJar = cookieJar;
- d->cookieJar->setParent(this);
+ if (thread() == cookieJar->thread())
+ d->cookieJar->setParent(this);
}
}
diff --git a/tests/auto/declarative/qdeclarativebehaviors/data/groupedPropertyCrash.qml b/tests/auto/declarative/qdeclarativebehaviors/data/groupedPropertyCrash.qml
new file mode 100644
index 0000000000..c052366717
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativebehaviors/data/groupedPropertyCrash.qml
@@ -0,0 +1,10 @@
+import Qt 4.7
+
+Rectangle {
+ width: 200
+ height: 200
+ Text {
+ Behavior on anchors.verticalCenterOffset { NumberAnimation { duration: 300; } }
+ text: "Hello World"
+ }
+}
diff --git a/tests/auto/declarative/qdeclarativebehaviors/tst_qdeclarativebehaviors.cpp b/tests/auto/declarative/qdeclarativebehaviors/tst_qdeclarativebehaviors.cpp
index 1dc4b533d8..45e53042b6 100644
--- a/tests/auto/declarative/qdeclarativebehaviors/tst_qdeclarativebehaviors.cpp
+++ b/tests/auto/declarative/qdeclarativebehaviors/tst_qdeclarativebehaviors.cpp
@@ -72,6 +72,7 @@ private slots:
void disabled();
void dontStart();
void startup();
+ void groupedPropertyCrash();
};
void tst_qdeclarativebehaviors::simpleBehavior()
@@ -351,6 +352,15 @@ void tst_qdeclarativebehaviors::startup()
}
}
+//QTBUG-10799
+void tst_qdeclarativebehaviors::groupedPropertyCrash()
+{
+ QDeclarativeEngine engine;
+ QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/groupedPropertyCrash.qml"));
+ QDeclarativeRectangle *rect = qobject_cast<QDeclarativeRectangle*>(c.create());
+ QVERIFY(rect); //don't crash
+}
+
QTEST_MAIN(tst_qdeclarativebehaviors)
#include "tst_qdeclarativebehaviors.moc"
diff --git a/tests/auto/declarative/qdeclarativecomponent/data/createObject.qml b/tests/auto/declarative/qdeclarativecomponent/data/createObject.qml
new file mode 100644
index 0000000000..4ee1e75c89
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativecomponent/data/createObject.qml
@@ -0,0 +1,16 @@
+import Qt 4.7
+
+Item{
+ id: root
+ property QtObject qobject : null
+ property QtObject declarativeitem : null
+ property QtObject graphicswidget: null
+ Component{id: a; QtObject{} }
+ Component{id: b; Item{} }
+ Component{id: c; QGraphicsWidget{} }
+ Component.onCompleted: {
+ root.qobject = a.createObject(root);
+ root.declarativeitem = b.createObject(root);
+ root.graphicswidget = c.createObject(root);
+ }
+}
diff --git a/tests/auto/declarative/qdeclarativecomponent/tst_qdeclarativecomponent.cpp b/tests/auto/declarative/qdeclarativecomponent/tst_qdeclarativecomponent.cpp
index c9e304cc26..faa1c212cd 100644
--- a/tests/auto/declarative/qdeclarativecomponent/tst_qdeclarativecomponent.cpp
+++ b/tests/auto/declarative/qdeclarativecomponent/tst_qdeclarativecomponent.cpp
@@ -39,7 +39,9 @@
**
****************************************************************************/
#include <qtest.h>
+#include <QDebug>
+#include <QtGui/qgraphicsitem.h>
#include <QtDeclarative/qdeclarativeengine.h>
#include <QtDeclarative/qdeclarativecomponent.h>
@@ -51,6 +53,7 @@ public:
private slots:
void loadEmptyUrl();
+ void qmlCreateObject();
private:
QDeclarativeEngine engine;
@@ -70,6 +73,31 @@ void tst_qdeclarativecomponent::loadEmptyUrl()
QCOMPARE(error.description(), QLatin1String("Invalid empty URL"));
}
+void tst_qdeclarativecomponent::qmlCreateObject()
+{
+ QDeclarativeEngine engine;
+ QDeclarativeComponent component(&engine, QUrl::fromLocalFile(SRCDIR "/data/createObject.qml"));
+ QObject *object = component.create();
+ QVERIFY(object != 0);
+
+ QObject *testObject1 = object->property("qobject").value<QObject*>();
+ QVERIFY(testObject1);
+ QVERIFY(testObject1->parent() == object);
+
+ QObject *testObject2 = object->property("declarativeitem").value<QObject*>();
+ QVERIFY(testObject2);
+ QVERIFY(testObject2->parent() == object);
+ QCOMPARE(testObject2->metaObject()->className(), "QDeclarativeItem");
+
+ //Note that QGraphicsObjects are not exposed to QML for instantiation, and so can't be used in a component directly
+ //Also this is actually the extended type QDeclarativeGraphicsWidget, but it still doesn't inherit QDeclarativeItem
+ QGraphicsObject *testObject3 = qobject_cast<QGraphicsObject*>(object->property("graphicswidget").value<QObject*>());
+ QVERIFY(testObject3);
+ QVERIFY(testObject3->parent() == object);
+ QVERIFY(testObject3->parentItem() == qobject_cast<QGraphicsObject*>(object));
+ QCOMPARE(testObject3->metaObject()->className(), "QDeclarativeGraphicsWidget");
+}
+
QTEST_MAIN(tst_qdeclarativecomponent)
#include "tst_qdeclarativecomponent.moc"
diff --git a/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp b/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp
index 9a8ad647fe..e75abacc11 100644
--- a/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp
+++ b/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp
@@ -564,7 +564,7 @@ void tst_qdeclarativeecmascript::deferredPropertiesErrors()
QVERIFY(object->objectProperty() == 0);
QVERIFY(object->objectProperty2() == 0);
- QString warning = component.url().toString() + ":6: Unable to assign [undefined] to QObject*";
+ QString warning = component.url().toString() + ":6: Unable to assign [undefined] to QObject* objectProperty";
QTest::ignoreMessage(QtWarningMsg, qPrintable(warning));
qmlExecuteDeferred(object);
@@ -642,8 +642,8 @@ void tst_qdeclarativeecmascript::enums()
{
QDeclarativeComponent component(&engine, TEST_FILE("enums.2.qml"));
- QString warning1 = component.url().toString() + ":5: Unable to assign [undefined] to int";
- QString warning2 = component.url().toString() + ":6: Unable to assign [undefined] to int";
+ QString warning1 = component.url().toString() + ":5: Unable to assign [undefined] to int a";
+ QString warning2 = component.url().toString() + ":6: Unable to assign [undefined] to int b";
QTest::ignoreMessage(QtWarningMsg, qPrintable(warning1));
QTest::ignoreMessage(QtWarningMsg, qPrintable(warning2));
@@ -754,7 +754,7 @@ void tst_qdeclarativeecmascript::nonExistantAttachedObject()
{
QDeclarativeComponent component(&engine, TEST_FILE("nonExistantAttachedObject.qml"));
- QString warning = component.url().toString() + ":4: Unable to assign [undefined] to QString";
+ QString warning = component.url().toString() + ":4: Unable to assign [undefined] to QString stringProperty";
QTest::ignoreMessage(QtWarningMsg, qPrintable(warning));
QObject *object = component.create();
@@ -1001,7 +1001,7 @@ void tst_qdeclarativeecmascript::scriptErrors()
QString warning3 = url.left(url.length() - 3) + "js:4: Error: Invalid write to global property \"a\"";
QString warning4 = url + ":10: TypeError: Result of expression 'a' [undefined] is not an object.";
QString warning5 = url + ":8: TypeError: Result of expression 'a' [undefined] is not an object.";
- QString warning6 = url + ":7: Unable to assign [undefined] to int";
+ QString warning6 = url + ":7: Unable to assign [undefined] to int x";
QString warning7 = url + ":12: Error: Cannot assign to read-only property \"trueProperty\"";
QString warning8 = url + ":13: Error: Cannot assign to non-existent property \"fakeProperty\"";
diff --git a/tests/auto/declarative/qdeclarativeengine/tst_qdeclarativeengine.cpp b/tests/auto/declarative/qdeclarativeengine/tst_qdeclarativeengine.cpp
index b0db7710b4..0aebea1bdb 100644
--- a/tests/auto/declarative/qdeclarativeengine/tst_qdeclarativeengine.cpp
+++ b/tests/auto/declarative/qdeclarativeengine/tst_qdeclarativeengine.cpp
@@ -266,7 +266,7 @@ void tst_qdeclarativeengine::outputWarningsToStandardError()
delete o;
QCOMPARE(warnings.count(), 1);
- QCOMPARE(warnings.at(0), QLatin1String("<Unknown File>:1: Unable to assign [undefined] to int"));
+ QCOMPARE(warnings.at(0), QLatin1String("<Unknown File>:1: Unable to assign [undefined] to int a"));
warnings.clear();
diff --git a/tests/auto/declarative/qdeclarativetextedit/tst_qdeclarativetextedit.cpp b/tests/auto/declarative/qdeclarativetextedit/tst_qdeclarativetextedit.cpp
index 4befc4c0c8..b07849dc59 100644
--- a/tests/auto/declarative/qdeclarativetextedit/tst_qdeclarativetextedit.cpp
+++ b/tests/auto/declarative/qdeclarativetextedit/tst_qdeclarativetextedit.cpp
@@ -676,12 +676,12 @@ void tst_qdeclarativetextedit::cursorDelegate()
//Test Delegate gets moved
for(int i=0; i<= textEditObject->text().length(); i++){
textEditObject->setCursorPosition(i);
- QCOMPARE(textEditObject->cursorRect().x(), qRound(delegateObject->x()));
- QCOMPARE(textEditObject->cursorRect().y(), qRound(delegateObject->y()));
+ QCOMPARE(textEditObject->cursorRectangle().x(), qRound(delegateObject->x()));
+ QCOMPARE(textEditObject->cursorRectangle().y(), qRound(delegateObject->y()));
}
textEditObject->setCursorPosition(0);
- QCOMPARE(textEditObject->cursorRect().x(), qRound(delegateObject->x()));
- QCOMPARE(textEditObject->cursorRect().y(), qRound(delegateObject->y()));
+ QCOMPARE(textEditObject->cursorRectangle().x(), qRound(delegateObject->x()));
+ QCOMPARE(textEditObject->cursorRectangle().y(), qRound(delegateObject->y()));
//Test Delegate gets deleted
textEditObject->setCursorDelegate(0);
QVERIFY(!textEditObject->findChild<QDeclarativeItem*>("cursorInstance"));
diff --git a/tests/auto/declarative/qmlvisual/tst_qmlvisual.cpp b/tests/auto/declarative/qmlvisual/tst_qmlvisual.cpp
index f105692c52..71dc451619 100644
--- a/tests/auto/declarative/qmlvisual/tst_qmlvisual.cpp
+++ b/tests/auto/declarative/qmlvisual/tst_qmlvisual.cpp
@@ -81,11 +81,11 @@ QString tst_qmlvisual::viewer()
QString qmlruntime;
#if defined(Q_WS_MAC)
- qmlruntime = QDir(binaries).absoluteFilePath("qml.app/Contents/MacOS/qml");
+ qmlruntime = QDir(binaries).absoluteFilePath("QMLViewer.app/Contents/MacOS/QMLViewer");
#elif defined(Q_WS_WIN) || defined(Q_WS_S60)
- qmlruntime = QDir(binaries).absoluteFilePath("qml.exe");
+ qmlruntime = QDir(binaries).absoluteFilePath("qmlviewer.exe");
#else
- qmlruntime = QDir(binaries).absoluteFilePath("qml");
+ qmlruntime = QDir(binaries).absoluteFilePath("qmlviewer");
#endif
return qmlruntime;
diff --git a/tests/auto/headers/tst_headers.cpp b/tests/auto/headers/tst_headers.cpp
index 12c5843740..0538607498 100644
--- a/tests/auto/headers/tst_headers.cpp
+++ b/tests/auto/headers/tst_headers.cpp
@@ -64,7 +64,8 @@ private:
const QStringList dirFilters,
const QRegExp &exclude);
static QStringList getHeaders(const QString &path);
- static QStringList getSourceFiles(const QString &path);
+ static QStringList getQmlFiles(const QString &path);
+ static QStringList getCppFiles(const QString &path);
static QStringList getQDocFiles(const QString &path);
void allSourceFilesData();
@@ -107,11 +108,16 @@ QStringList tst_Headers::getHeaders(const QString &path)
return getFiles(path, QStringList("*.h"), QRegExp("^(?!ui_)"));
}
-QStringList tst_Headers::getSourceFiles(const QString &path)
+QStringList tst_Headers::getCppFiles(const QString &path)
{
return getFiles(path, QStringList("*.cpp"), QRegExp("^(?!(moc_|qrc_))"));
}
+QStringList tst_Headers::getQmlFiles(const QString &path)
+{
+ return getFiles(path, QStringList("*.qml"), QRegExp("."));
+}
+
QStringList tst_Headers::getQDocFiles(const QString &path)
{
return getFiles(path, QStringList("*.qdoc"), QRegExp("."));
@@ -153,7 +159,9 @@ void tst_Headers::allSourceFilesData()
};
for (int i = 0; i < sizeof(subdirs) / sizeof(subdirs[0]); ++i) {
- sourceFiles << getSourceFiles(qtSrcDir + subdirs[i]);
+ sourceFiles << getCppFiles(qtSrcDir + subdirs[i]);
+ if (subdirs[i] != QLatin1String("/tests"))
+ sourceFiles << getQmlFiles(qtSrcDir + subdirs[i]);
sourceFiles << getHeaders(qtSrcDir + subdirs[i]);
sourceFiles << getQDocFiles(qtSrcDir + subdirs[i]);
}
diff --git a/tests/benchmarks/declarative/binding/testtypes.h b/tests/benchmarks/declarative/binding/testtypes.h
index 523f94dd09..0cbaa42aef 100644
--- a/tests/benchmarks/declarative/binding/testtypes.h
+++ b/tests/benchmarks/declarative/binding/testtypes.h
@@ -47,11 +47,11 @@
class MyQmlObject : public QObject
{
Q_OBJECT
- Q_PROPERTY(int result READ result WRITE setResult);
- Q_PROPERTY(int value READ value WRITE setValue NOTIFY valueChanged);
- Q_PROPERTY(MyQmlObject *object READ object WRITE setObject NOTIFY objectChanged);
- Q_PROPERTY(QDeclarativeListProperty<QObject> data READ data);
- Q_CLASSINFO("DefaultProperty", "data");
+ Q_PROPERTY(int result READ result WRITE setResult)
+ Q_PROPERTY(int value READ value WRITE setValue NOTIFY valueChanged)
+ Q_PROPERTY(MyQmlObject *object READ object WRITE setObject NOTIFY objectChanged)
+ Q_PROPERTY(QDeclarativeListProperty<QObject> data READ data)
+ Q_CLASSINFO("DefaultProperty", "data")
public:
MyQmlObject() : m_result(0), m_value(0), m_object(0) {}
diff --git a/tests/benchmarks/declarative/creation/tst_creation.cpp b/tests/benchmarks/declarative/creation/tst_creation.cpp
index 83f66de9a8..94a67fd455 100644
--- a/tests/benchmarks/declarative/creation/tst_creation.cpp
+++ b/tests/benchmarks/declarative/creation/tst_creation.cpp
@@ -91,8 +91,8 @@ private:
class TestType : public QObject
{
Q_OBJECT
-Q_PROPERTY(QDeclarativeListProperty<QObject> resources READ resources);
-Q_CLASSINFO("DefaultProperty", "resources");
+Q_PROPERTY(QDeclarativeListProperty<QObject> resources READ resources)
+Q_CLASSINFO("DefaultProperty", "resources")
public:
TestType(QObject *parent = 0)
: QObject(parent) {}
diff --git a/tests/benchmarks/declarative/qdeclarativecomponent/testtypes.h b/tests/benchmarks/declarative/qdeclarativecomponent/testtypes.h
index 523f94dd09..0cbaa42aef 100644
--- a/tests/benchmarks/declarative/qdeclarativecomponent/testtypes.h
+++ b/tests/benchmarks/declarative/qdeclarativecomponent/testtypes.h
@@ -47,11 +47,11 @@
class MyQmlObject : public QObject
{
Q_OBJECT
- Q_PROPERTY(int result READ result WRITE setResult);
- Q_PROPERTY(int value READ value WRITE setValue NOTIFY valueChanged);
- Q_PROPERTY(MyQmlObject *object READ object WRITE setObject NOTIFY objectChanged);
- Q_PROPERTY(QDeclarativeListProperty<QObject> data READ data);
- Q_CLASSINFO("DefaultProperty", "data");
+ Q_PROPERTY(int result READ result WRITE setResult)
+ Q_PROPERTY(int value READ value WRITE setValue NOTIFY valueChanged)
+ Q_PROPERTY(MyQmlObject *object READ object WRITE setObject NOTIFY objectChanged)
+ Q_PROPERTY(QDeclarativeListProperty<QObject> data READ data)
+ Q_CLASSINFO("DefaultProperty", "data")
public:
MyQmlObject() : m_result(0), m_value(0), m_object(0) {}
diff --git a/tests/benchmarks/declarative/qmltime/qmltime.cpp b/tests/benchmarks/declarative/qmltime/qmltime.cpp
index 3932e010cb..e1b73ca84b 100644
--- a/tests/benchmarks/declarative/qmltime/qmltime.cpp
+++ b/tests/benchmarks/declarative/qmltime/qmltime.cpp
@@ -50,7 +50,7 @@
class Timer : public QObject
{
Q_OBJECT
- Q_PROPERTY(QDeclarativeComponent *component READ component WRITE setComponent);
+ Q_PROPERTY(QDeclarativeComponent *component READ component WRITE setComponent)
public:
Timer();
diff --git a/tools/qml/qml.pri b/tools/qml/qml.pri
index 5e3e74bf1d..cff65be9b9 100644
--- a/tools/qml/qml.pri
+++ b/tools/qml/qml.pri
@@ -23,10 +23,5 @@ maemo5 {
SOURCES += $$PWD/deviceorientation.cpp
}
-symbian {
- INCLUDEPATH += $$QT_SOURCE_TREE/examples/network/qftp/
- LIBS += -lesock -lcommdb -lconnmon -linsock
-}
-
FORMS = $$PWD/recopts.ui \
$$PWD/proxysettings.ui
diff --git a/tools/qml/qmlruntime.cpp b/tools/qml/qmlruntime.cpp
index 8df250f58d..5308e98fb3 100644
--- a/tools/qml/qmlruntime.cpp
+++ b/tools/qml/qmlruntime.cpp
@@ -92,19 +92,6 @@
#include <qdeclarativetester.h>
-#if defined (Q_OS_SYMBIAN)
-#define SYMBIAN_NETWORK_INIT
-#endif
-
-#if defined (SYMBIAN_NETWORK_INIT)
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <QTextCodec>
-#include "sym_iap_util.h"
-#endif
-
QT_BEGIN_NAMESPACE
class Runtime : public QObject
@@ -522,12 +509,6 @@ void QDeclarativeViewer::createMenu(QMenuBar *menu, QMenu *flatmenu)
connect(reloadAction, SIGNAL(triggered()), this, SLOT(reload()));
fileMenu->addAction(reloadAction);
-#if defined(Q_OS_SYMBIAN)
- QAction *networkAction = new QAction(tr("Start &Network"), parent);
- connect(networkAction, SIGNAL(triggered()), this, SLOT(startNetwork()));
- fileMenu->addAction(networkAction);
-#endif
-
#if !defined(Q_OS_SYMBIAN)
if (flatmenu) flatmenu->addSeparator();
@@ -930,13 +911,6 @@ bool QDeclarativeViewer::open(const QString& file_or_url)
return true;
}
-void QDeclarativeViewer::startNetwork()
-{
-#if defined(SYMBIAN_NETWORK_INIT)
- qt_SetDefaultIap();
-#endif
-}
-
void QDeclarativeViewer::setAutoRecord(int from, int to)
{
if (from==0) from=1; // ensure resized
@@ -1240,7 +1214,8 @@ void QDeclarativeViewer::setUseGL(bool useGL)
#endif
QGLWidget *glWidget = new QGLWidget(format);
- glWidget->setAutoFillBackground(false);
+ //### potentially faster, but causes junk to appear if top-level is Item, not Rectangle
+ //glWidget->setAutoFillBackground(false);
canvas->setViewport(glWidget);
}
diff --git a/tools/qml/qmlruntime.h b/tools/qml/qmlruntime.h
index 0416b32a4d..5086e02e24 100644
--- a/tools/qml/qmlruntime.h
+++ b/tools/qml/qmlruntime.h
@@ -142,7 +142,6 @@ private slots:
void pickRecordingFile();
void setPortrait();
void setLandscape();
- void startNetwork();
void toggleFullScreen();
void orientationChanged();