From 64697b6a39c873321d9f78907fd3a5204ea7ef45 Mon Sep 17 00:00:00 2001 From: Martin Jones Date: Wed, 7 Oct 2009 16:41:42 +1000 Subject: Remove some unneeded semicolons --- src/declarative/fx/qfxitem.h | 2 +- src/declarative/util/qmlstateoperations.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/declarative/fx/qfxitem.h b/src/declarative/fx/qfxitem.h index 30c522f..bde0c9e 100644 --- a/src/declarative/fx/qfxitem.h +++ b/src/declarative/fx/qfxitem.h @@ -93,7 +93,7 @@ class Q_DECLARATIVE_EXPORT QFxItem : public QGraphicsObject, public QmlParserSta Q_PROPERTY(QmlList* transform READ transform DESIGNABLE false FINAL) Q_PROPERTY(TransformOrigin transformOrigin READ transformOrigin WRITE setTransformOrigin) Q_PROPERTY(bool smooth READ smoothTransform WRITE setSmoothTransform) - Q_PROPERTY(QGraphicsEffect *effect READ graphicsEffect WRITE setGraphicsEffect); + Q_PROPERTY(QGraphicsEffect *effect READ graphicsEffect WRITE setGraphicsEffect) Q_ENUMS(TransformOrigin) Q_CLASSINFO("DefaultProperty", "data") diff --git a/src/declarative/util/qmlstateoperations.cpp b/src/declarative/util/qmlstateoperations.cpp index a9a5bd5..4810a92 100644 --- a/src/declarative/util/qmlstateoperations.cpp +++ b/src/declarative/util/qmlstateoperations.cpp @@ -189,7 +189,7 @@ QmlStateOperation::ActionList QmlParentChange::actions() class AccessibleFxItem : public QFxItem { Q_OBJECT - Q_DECLARE_PRIVATE_D(QGraphicsItem::d_ptr.data(), QFxItem); + Q_DECLARE_PRIVATE_D(QGraphicsItem::d_ptr.data(), QFxItem) public: int siblingIndex() { Q_D(QFxItem); -- cgit v0.12 From 83ebad552bfdb9ac057fbf49316ed5becf70426d Mon Sep 17 00:00:00 2001 From: Martin Jones Date: Wed, 7 Oct 2009 16:42:51 +1000 Subject: Merge --- .../contacts/1_Drawing_and_Animation/1/RemoveButton.qml | 11 ----------- 1 file changed, 11 deletions(-) delete mode 100644 examples/declarative/tutorials/contacts/1_Drawing_and_Animation/1/RemoveButton.qml diff --git a/examples/declarative/tutorials/contacts/1_Drawing_and_Animation/1/RemoveButton.qml b/examples/declarative/tutorials/contacts/1_Drawing_and_Animation/1/RemoveButton.qml deleted file mode 100644 index a8ac7fe..0000000 --- a/examples/declarative/tutorials/contacts/1_Drawing_and_Animation/1/RemoveButton.qml +++ /dev/null @@ -1,11 +0,0 @@ -import Qt 4.6 - -//! [0] -Rectangle { - id: removeButton - width: 30 - height: 30 - color: "red" - radius: 5 -} -//! [0] -- cgit v0.12 From 8d8089299507bbb4edbb94f21e29032a46bccc0a Mon Sep 17 00:00:00 2001 From: Martin Jones Date: Fri, 9 Oct 2009 10:30:39 +1000 Subject: Make QML type registration work on Symbian --- src/declarative/qml/qml.h | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/declarative/qml/qml.h b/src/declarative/qml/qml.h index 23f2f1e..c437ef1 100644 --- a/src/declarative/qml/qml.h +++ b/src/declarative/qml/qml.h @@ -74,6 +74,24 @@ QT_MODULE(Declarative) QT_BEGIN_NAMESPACE +#if defined(Q_OS_SYMBIAN) +#define QML_DEFINE_INTERFACE(INTERFACE) \ + static int defineInterface##INTERFACE = qmlRegisterInterface(#INTERFACE); + +#define QML_DEFINE_EXTENDED_TYPE(URI, VERSION_MAJ, VERSION_MIN_FROM, VERSION_MIN_TO, NAME, TYPE, EXTENSION) \ + static int registerExtended##TYPE = qmlRegisterExtendedType(#URI, VERSION_MAJ, VERSION_MIN_FROM, VERSION_MIN_TO, #NAME, #TYPE); + +#define QML_DEFINE_TYPE(URI, VERSION_MAJ, VERSION_MIN_FROM, VERSION_MIN_TO, NAME, TYPE) \ + static int defineType##TYPE = qmlRegisterType(#URI, VERSION_MAJ, VERSION_MIN_FROM, VERSION_MIN_TO, #NAME, #TYPE); + +#define QML_DEFINE_EXTENDED_NOCREATE_TYPE(TYPE, EXTENSION) \ + static int registerExtendedNoCreate##TYPE = qmlRegisterExtendedType(#TYPE); + +#define QML_DEFINE_NOCREATE_TYPE(TYPE) \ + static int registerNoCreate##TYPE = qmlRegisterType(#TYPE); + +#else + #define QML_DEFINE_INTERFACE(INTERFACE) \ template<> QmlPrivate::InstanceType QmlPrivate::Define::instance(qmlRegisterInterface(#INTERFACE)); @@ -89,6 +107,8 @@ QT_BEGIN_NAMESPACE #define QML_DEFINE_NOCREATE_TYPE(TYPE) \ template<> QmlPrivate::InstanceType QmlPrivate::Define::instance(qmlRegisterType(#TYPE)); +#endif + class QmlContext; class QmlEngine; Q_DECLARATIVE_EXPORT void qmlExecuteDeferred(QObject *); -- cgit v0.12 From ba3ee12e8b7c73084ecfe8e045e4ca361df960d3 Mon Sep 17 00:00:00 2001 From: Martin Jones Date: Fri, 9 Oct 2009 10:33:39 +1000 Subject: More QML type registration on Symbian. --- src/declarative/qml/qmlcustomparser_p.h | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/declarative/qml/qmlcustomparser_p.h b/src/declarative/qml/qmlcustomparser_p.h index 5be0680..eb3e579 100644 --- a/src/declarative/qml/qmlcustomparser_p.h +++ b/src/declarative/qml/qmlcustomparser_p.h @@ -127,8 +127,14 @@ protected: private: QList exceptions; }; -#define QML_DEFINE_CUSTOM_TYPE(URI, VERSION_MAJ, VERSION_MIN_FROM, VERSION_MAJ_TO, NAME, TYPE, CUSTOMTYPE) \ + +#if defined(Q_OS_SYMBIAN) +# define QML_DEFINE_CUSTOM_TYPE(URI, VERSION_MAJ, VERSION_MIN_FROM, VERSION_MAJ_TO, NAME, TYPE, CUSTOMTYPE) \ + static int defineCustomType##NAME = qmlRegisterCustomType(#URI, VERSION_MAJ, VERSION_MIN_FROM, VERSION_MAJ_TO, #NAME, #TYPE, new CUSTOMTYPE); +#else +# define QML_DEFINE_CUSTOM_TYPE(URI, VERSION_MAJ, VERSION_MIN_FROM, VERSION_MAJ_TO, NAME, TYPE, CUSTOMTYPE) \ template<> QmlPrivate::InstanceType QmlPrivate::Define::instance(qmlRegisterCustomType(#URI, VERSION_MAJ, VERSION_MIN_FROM, VERSION_MAJ_TO, #NAME, #TYPE, new CUSTOMTYPE)); +#endif QT_END_NAMESPACE -- cgit v0.12 From d9286e5e0e0a6688960f04600dfaefa5f1247934 Mon Sep 17 00:00:00 2001 From: Martin Jones Date: Sat, 10 Oct 2009 19:11:26 +1000 Subject: Remove warning. --- src/declarative/qml/qmlinfo.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/declarative/qml/qmlinfo.cpp b/src/declarative/qml/qmlinfo.cpp index bae1682..7d7f3b8 100644 --- a/src/declarative/qml/qmlinfo.cpp +++ b/src/declarative/qml/qmlinfo.cpp @@ -88,7 +88,7 @@ QmlInfo::QmlInfo(QObject *object) if (ddata->outerContext) { location += ddata->outerContext->baseUrl().toString(); } else { - location += "unknown"; + location += QLatin1String("unknown"); } location += QLatin1String(":"); location += QString::number(ddata->lineNumber); -- cgit v0.12 From bea38f654ee042946f45e3bdb628c02225a650b9 Mon Sep 17 00:00:00 2001 From: Alan Alpert Date: Thu, 15 Oct 2009 13:17:50 +1000 Subject: Make tests 'pass' for qfxtextedit and qfxtextinput One test is acutally XFAIL instead of PASS, because what it is 'testing' hasn't been implemented yet. --- tests/auto/declarative/qfxtextedit/tst_qfxtextedit.cpp | 2 ++ tests/auto/declarative/qfxtextinput/tst_qfxtextinput.cpp | 1 + 2 files changed, 3 insertions(+) diff --git a/tests/auto/declarative/qfxtextedit/tst_qfxtextedit.cpp b/tests/auto/declarative/qfxtextedit/tst_qfxtextedit.cpp index 7ab598f..1433bf2 100644 --- a/tests/auto/declarative/qfxtextedit/tst_qfxtextedit.cpp +++ b/tests/auto/declarative/qfxtextedit/tst_qfxtextedit.cpp @@ -467,6 +467,7 @@ void tst_qfxtextedit::navigation() QmlView *canvas = createView(SRCDIR "/data/navigation.qml"); canvas->execute(); canvas->show(); + canvas->setFocus(); QVERIFY(canvas->root() != 0); @@ -474,6 +475,7 @@ void tst_qfxtextedit::navigation() QVERIFY(input != 0); QTRY_VERIFY(input->hasFocus() == true); + QEXPECT_FAIL("", "Depends on QT-2236", Abort); simulateKey(canvas, Qt::Key_Left); QVERIFY(input->hasFocus() == false); simulateKey(canvas, Qt::Key_Right); diff --git a/tests/auto/declarative/qfxtextinput/tst_qfxtextinput.cpp b/tests/auto/declarative/qfxtextinput/tst_qfxtextinput.cpp index bd0b9c3..81b4ac8 100644 --- a/tests/auto/declarative/qfxtextinput/tst_qfxtextinput.cpp +++ b/tests/auto/declarative/qfxtextinput/tst_qfxtextinput.cpp @@ -310,6 +310,7 @@ void tst_qfxtextinput::navigation() QmlView *canvas = createView(SRCDIR "/data/navigation.qml"); canvas->execute(); canvas->show(); + canvas->setFocus(); QVERIFY(canvas->root() != 0); -- cgit v0.12 From 2e1b1d35127c66a20645b65ae293299c5a67c4e9 Mon Sep 17 00:00:00 2001 From: Warwick Allison Date: Thu, 15 Oct 2009 13:25:52 +1000 Subject: Fix (was creating lower-case). --- tests/auto/declarative/qmllanguage/tst_qmllanguage.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/auto/declarative/qmllanguage/tst_qmllanguage.cpp b/tests/auto/declarative/qmllanguage/tst_qmllanguage.cpp index b68d9bf..3dedb79 100644 --- a/tests/auto/declarative/qmllanguage/tst_qmllanguage.cpp +++ b/tests/auto/declarative/qmllanguage/tst_qmllanguage.cpp @@ -126,14 +126,14 @@ void tst_qmllanguage::initTestCase() // For utf-8 locale, this will be data/I18nType??????????.qml where ?????????? is 5 8-bit characters, UTF-8 encoded QFile in(TEST_FILE(QLatin1String("I18nType30.qml")).toLocalFile()); QVERIFY(in.open(QIODevice::ReadOnly)); - QFile out(TEST_FILE(QString::fromUtf8("I18nType\303\241\303\242\303\243\303\244\303\245.qml")).toLocalFile()); + QFile out(TEST_FILE(QString::fromUtf8("I18nType\303\201\303\242\303\243\303\244\303\245.qml")).toLocalFile()); QVERIFY(out.open(QIODevice::WriteOnly)); out.write(in.readAll()); } void tst_qmllanguage::cleanupTestCase() { - QVERIFY(QFile::remove(TEST_FILE(QString::fromUtf8("I18nType\303\241\303\242\303\243\303\244\303\245.qml")).toLocalFile())); + QVERIFY(QFile::remove(TEST_FILE(QString::fromUtf8("I18nType\303\201\303\242\303\243\303\244\303\245.qml")).toLocalFile())); } void tst_qmllanguage::errors_data() -- cgit v0.12 From 14f7463ceb008269a50d7108b983c6be5c34c8b0 Mon Sep 17 00:00:00 2001 From: Warwick Allison Date: Thu, 15 Oct 2009 13:50:52 +1000 Subject: Unicode namespace fix. (no bug reported) --- src/declarative/qml/qmlengine.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/declarative/qml/qmlengine.cpp b/src/declarative/qml/qmlengine.cpp index f0ecf1d..528e8c9 100644 --- a/src/declarative/qml/qmlengine.cpp +++ b/src/declarative/qml/qmlengine.cpp @@ -1099,7 +1099,7 @@ public: int slash = type.indexOf('/'); if (slash >= 0) { while (!s) { - s = set.value(QString::fromLatin1(type.left(slash))); + s = set.value(QString::fromUtf8(type.left(slash))); int nslash = type.indexOf('/',slash+1); if (nslash > 0) slash = nslash; -- cgit v0.12 From 5f24950397d078b74144b542c0eff6169aae68b3 Mon Sep 17 00:00:00 2001 From: Warwick Allison Date: Thu, 15 Oct 2009 13:55:09 +1000 Subject: Test Unicode namespace --- tests/auto/declarative/qmllanguage/data/i18nNameSpace.qml | 5 +++++ tests/auto/declarative/qmllanguage/tst_qmllanguage.cpp | 1 + 2 files changed, 6 insertions(+) create mode 100644 tests/auto/declarative/qmllanguage/data/i18nNameSpace.qml diff --git a/tests/auto/declarative/qmllanguage/data/i18nNameSpace.qml b/tests/auto/declarative/qmllanguage/data/i18nNameSpace.qml new file mode 100644 index 0000000..c0b2f94 --- /dev/null +++ b/tests/auto/declarative/qmllanguage/data/i18nNameSpace.qml @@ -0,0 +1,5 @@ +import Test 1.0 as Áâãäå + +Áâãäå.MyTypeObject { + stringProperty: "Test áâãäå: 40" +} diff --git a/tests/auto/declarative/qmllanguage/tst_qmllanguage.cpp b/tests/auto/declarative/qmllanguage/tst_qmllanguage.cpp index 3dedb79..8d4ae65 100644 --- a/tests/auto/declarative/qmllanguage/tst_qmllanguage.cpp +++ b/tests/auto/declarative/qmllanguage/tst_qmllanguage.cpp @@ -711,6 +711,7 @@ void tst_qmllanguage::i18n_data() QTest::newRow("i18nDeclaredPropertyUse") << "i18nDeclaredPropertyUse.qml" << QString::fromUtf8("Test \303\241\303\242\303\243\303\244\303\245: 15"); QTest::newRow("i18nScript") << "i18nScript.qml" << QString::fromUtf8("Test \303\241\303\242\303\243\303\244\303\245: 20"); QTest::newRow("i18nType") << "i18nType.qml" << QString::fromUtf8("Test \303\241\303\242\303\243\303\244\303\245: 30"); + QTest::newRow("i18nNameSpace") << "i18nNameSpace.qml" << QString::fromUtf8("Test \303\241\303\242\303\243\303\244\303\245: 40"); } void tst_qmllanguage::i18n() -- cgit v0.12 From 25f5008d6bc6788e68e34f24af196f12de052567 Mon Sep 17 00:00:00 2001 From: Alan Alpert Date: Thu, 15 Oct 2009 13:39:25 +1000 Subject: Add cursorRect function to QFxTextInput similar to the cursorRect in QFxTextEdit --- src/declarative/fx/qfxtextinput.cpp | 12 ++++++++++++ src/declarative/fx/qfxtextinput.h | 2 ++ 2 files changed, 14 insertions(+) diff --git a/src/declarative/fx/qfxtextinput.cpp b/src/declarative/fx/qfxtextinput.cpp index f5bf911..c694133 100644 --- a/src/declarative/fx/qfxtextinput.cpp +++ b/src/declarative/fx/qfxtextinput.cpp @@ -289,6 +289,18 @@ void QFxTextInput::setCursorPosition(int cp) } /*! + \internal + + Returns a Rect which encompasses the cursor, but which may be larger than is + required. Ignores custom cursor delegates. +*/ +QRect QFxTextInput::cursorRect() const +{ + Q_D(const QFxTextInput); + return d->control->cursorRect(); +} + +/*! \qmlproperty int TextInput::selectionStart The cursor position before the first character in the current selection. diff --git a/src/declarative/fx/qfxtextinput.h b/src/declarative/fx/qfxtextinput.h index d5d0450..2540d41 100644 --- a/src/declarative/fx/qfxtextinput.h +++ b/src/declarative/fx/qfxtextinput.h @@ -131,6 +131,8 @@ public: int cursorPosition() const; void setCursorPosition(int cp); + QRect cursorRect() const; + int selectionStart() const; void setSelectionStart(int); -- cgit v0.12 From 0f97a4fbcab5972f47a8a6cc3b501446df94bedb Mon Sep 17 00:00:00 2001 From: Alan Alpert Date: Thu, 15 Oct 2009 14:07:24 +1000 Subject: Add cursorDelegate test to QFxTextInput autotests Also cleaned up the QFxTextEdit version, and fixed a bug the new test uncovered. --- src/declarative/fx/qfxtextinput.cpp | 14 ++++++------ .../declarative/qfxtextedit/tst_qfxtextedit.cpp | 6 +++--- .../declarative/qfxtextinput/tst_qfxtextinput.cpp | 25 +++++++++++++++++++++- 3 files changed, 35 insertions(+), 10 deletions(-) diff --git a/src/declarative/fx/qfxtextinput.cpp b/src/declarative/fx/qfxtextinput.cpp index c694133..e9ddd3f 100644 --- a/src/declarative/fx/qfxtextinput.cpp +++ b/src/declarative/fx/qfxtextinput.cpp @@ -501,17 +501,19 @@ void QFxTextInput::setCursorDelegate(QmlComponent* c) { Q_D(QFxTextInput); d->cursorComponent = c; - d->startCreatingCursor(); + if(!c){ + //note that the components are owned by something else + disconnect(d->control, SIGNAL(cursorPositionChanged(int, int)), + this, SLOT(moveCursor())); + delete d->cursorItem; + }else{ + d->startCreatingCursor(); + } } void QFxTextInputPrivate::startCreatingCursor() { Q_Q(QFxTextInput); - if(!cursorComponent){ - q->disconnect(control, SIGNAL(cursorPositionChanged(int, int)), - q, SLOT(moveCursor())); - return; - } q->connect(control, SIGNAL(cursorPositionChanged(int, int)), q, SLOT(moveCursor())); if(cursorComponent->isReady()){ diff --git a/tests/auto/declarative/qfxtextedit/tst_qfxtextedit.cpp b/tests/auto/declarative/qfxtextedit/tst_qfxtextedit.cpp index 1433bf2..f78e564 100644 --- a/tests/auto/declarative/qfxtextedit/tst_qfxtextedit.cpp +++ b/tests/auto/declarative/qfxtextedit/tst_qfxtextedit.cpp @@ -433,10 +433,10 @@ void tst_qfxtextedit::selection() void tst_qfxtextedit::cursorDelegate() { - QmlView* view = new QmlView(0); - view->show(); - view->setUrl(QUrl("data/cursorTest.qml")); + QmlView* view = createView(SRCDIR "/data/cursorTest.qml"); view->execute(); + view->show(); + view->setFocus(); QFxTextEdit *textEditObject = view->root()->findChild("textEditObject"); QVERIFY(textEditObject != 0); QVERIFY(textEditObject->findChild("cursorInstance")); diff --git a/tests/auto/declarative/qfxtextinput/tst_qfxtextinput.cpp b/tests/auto/declarative/qfxtextinput/tst_qfxtextinput.cpp index 81b4ac8..069574c 100644 --- a/tests/auto/declarative/qfxtextinput/tst_qfxtextinput.cpp +++ b/tests/auto/declarative/qfxtextinput/tst_qfxtextinput.cpp @@ -330,7 +330,30 @@ void tst_qfxtextinput::navigation() void tst_qfxtextinput::cursorDelegate() { - //TODO:Get the QFxTextEdit test passing first + QmlView* view = createView(SRCDIR "/data/cursorTest.qml"); + view->execute(); + view->show(); + view->setFocus(); + QFxTextInput *textInputObject = view->root()->findChild("textInputObject"); + QVERIFY(textInputObject != 0); + QVERIFY(textInputObject->findChild("cursorInstance")); + //Test Delegate gets created + textInputObject->setFocus(true); + QFxItem* delegateObject = textInputObject->findChild("cursorInstance"); + QVERIFY(delegateObject); + //Test Delegate gets moved + for(int i=0; i<= textInputObject->text().length(); i++){ + textInputObject->setCursorPosition(i); + //+5 is because the TextInput cursorRect is just a 10xHeight area centered on cursor position + QCOMPARE(textInputObject->cursorRect().x() + 5, qRound(delegateObject->x())); + QCOMPARE(textInputObject->cursorRect().y(), qRound(delegateObject->y())); + } + textInputObject->setCursorPosition(0); + QCOMPARE(textInputObject->cursorRect().x()+5, qRound(delegateObject->x())); + QCOMPARE(textInputObject->cursorRect().y(), qRound(delegateObject->y())); + //Test Delegate gets deleted + textInputObject->setCursorDelegate(0); + QVERIFY(!textInputObject->findChild("cursorInstance")); } void tst_qfxtextinput::simulateKey(QmlView *view, int key) -- cgit v0.12 From 343535d7cbae16c02517664ce0d363e9834bd74d Mon Sep 17 00:00:00 2001 From: Martin Jones Date: Thu, 15 Oct 2009 14:16:42 +1000 Subject: Use Q_GLOBAL_STATIC for global static. --- src/declarative/qml/qmlcompiler.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/declarative/qml/qmlcompiler.cpp b/src/declarative/qml/qmlcompiler.cpp index c744509..e2fd7cb 100644 --- a/src/declarative/qml/qmlcompiler.cpp +++ b/src/declarative/qml/qmlcompiler.cpp @@ -2039,7 +2039,7 @@ bool QmlCompiler::mergeDynamicMetaProperties(QmlParser::Object *obj) return true; } -static QAtomicInt classIndexCounter; +Q_GLOBAL_STATIC(QAtomicInt, classIndexCounter) bool QmlCompiler::buildDynamicMeta(QmlParser::Object *obj, DynamicMetaMode mode) { @@ -2058,7 +2058,7 @@ bool QmlCompiler::buildDynamicMeta(QmlParser::Object *obj, DynamicMetaMode mode) QByteArray newClassName = obj->metatype->className(); newClassName.append("_QML_"); - int idx = classIndexCounter.fetchAndAddRelaxed(1); + int idx = classIndexCounter()->fetchAndAddRelaxed(1); newClassName.append(QByteArray::number(idx)); QMetaObjectBuilder builder; -- cgit v0.12 From 5ab4ccf0e0d3618e799dcfc82bd7fcf3fd560e78 Mon Sep 17 00:00:00 2001 From: Warwick Allison Date: Thu, 15 Oct 2009 14:45:49 +1000 Subject: Fix for when multiple tests share a data director. --- tests/auto/declarative/visual/tst_visual.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/auto/declarative/visual/tst_visual.cpp b/tests/auto/declarative/visual/tst_visual.cpp index 367166d..cb32085 100644 --- a/tests/auto/declarative/visual/tst_visual.cpp +++ b/tests/auto/declarative/visual/tst_visual.cpp @@ -112,7 +112,7 @@ QString tst_visual::toTestScript(const QString &file, Mode mode) QString("data"); QString testname = file.mid(index + 1, file.length() - index - 5); - if (platformsuffix && (mode == UpdatePlatformVisuals || QDir(testdata+QLatin1String(platformsuffix)).exists())) { + if (platformsuffix && (mode == UpdatePlatformVisuals || QFile::exists(testdata+QLatin1String(platformsuffix)+QDir::separator()+testname))) { QString platformdir = testdata + QLatin1String(platformsuffix); if (mode == UpdatePlatformVisuals) { Q_ASSERT(QDir().mkpath(platformdir)); -- cgit v0.12 From e61b7c6d8194ce42eb0021c4b59788d42c04ec0e Mon Sep 17 00:00:00 2001 From: Warwick Allison Date: Thu, 15 Oct 2009 14:46:13 +1000 Subject: Multilength strings test. --- .../declarative/visual/qfxtext/elide/multilength.qml | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 tests/auto/declarative/visual/qfxtext/elide/multilength.qml diff --git a/tests/auto/declarative/visual/qfxtext/elide/multilength.qml b/tests/auto/declarative/visual/qfxtext/elide/multilength.qml new file mode 100644 index 0000000..3382524 --- /dev/null +++ b/tests/auto/declarative/visual/qfxtext/elide/multilength.qml @@ -0,0 +1,20 @@ +import Qt 4.6 + +Rectangle { + width: 500 + height: 50 + color: "lightBlue" + Rectangle { + width: MyText.width + height: MyText.height + color: "white" + anchors.centerIn: parent + Text { + id: MyText + width: NumberAnimation { from: 500; to: 0; running: true; repeat: true; duration: 1000 } + elide: "ElideRight" + text: "aaaaaaa bbbbbbb ccccccc\x9Caaaaa bbbbb ccccc\x9Caaa bbb ccc\x9Ca b c" + text: "Brevity is the soul of wit, and tediousness the limbs and outward flourishes.\x9CBrevity is a great charm of eloquence.\x9CBe concise!" + } + } +} -- cgit v0.12 From 8fc45851858d748732b340705c26413ee7754291 Mon Sep 17 00:00:00 2001 From: Warwick Allison Date: Thu, 15 Oct 2009 15:00:11 +1000 Subject: Final can be longer. --- tests/auto/declarative/visual/qfxtext/elide/multilength.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/auto/declarative/visual/qfxtext/elide/multilength.qml b/tests/auto/declarative/visual/qfxtext/elide/multilength.qml index 3382524..6cd37b4 100644 --- a/tests/auto/declarative/visual/qfxtext/elide/multilength.qml +++ b/tests/auto/declarative/visual/qfxtext/elide/multilength.qml @@ -14,7 +14,7 @@ Rectangle { width: NumberAnimation { from: 500; to: 0; running: true; repeat: true; duration: 1000 } elide: "ElideRight" text: "aaaaaaa bbbbbbb ccccccc\x9Caaaaa bbbbb ccccc\x9Caaa bbb ccc\x9Ca b c" - text: "Brevity is the soul of wit, and tediousness the limbs and outward flourishes.\x9CBrevity is a great charm of eloquence.\x9CBe concise!" + text: "Brevity is the soul of wit, and tediousness the limbs and outward flourishes.\x9CBrevity is a great charm of eloquence.\x9CBe concise!\x9CSHHHHHHHHHHHHHHHHHHHHHHHHHHHH" } } } -- cgit v0.12 From 0a0456bda6d730242267dec7dd6861702bab3877 Mon Sep 17 00:00:00 2001 From: Martin Jones Date: Thu, 15 Oct 2009 15:18:14 +1000 Subject: Fix more compiler warnings. --- src/declarative/debugger/qmldebugclient.cpp | 2 +- src/declarative/fx/qfxlistview.cpp | 2 +- src/declarative/fx/qfxtextinput_p.h | 2 +- src/declarative/qml/qmlinfo.cpp | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/declarative/debugger/qmldebugclient.cpp b/src/declarative/debugger/qmldebugclient.cpp index d13de57..3171808 100644 --- a/src/declarative/debugger/qmldebugclient.cpp +++ b/src/declarative/debugger/qmldebugclient.cpp @@ -104,7 +104,7 @@ bool QmlDebugConnection::isConnected() const class QmlDebugClientPrivate : public QObjectPrivate { - Q_DECLARE_PUBLIC(QmlDebugClient); + Q_DECLARE_PUBLIC(QmlDebugClient) public: QmlDebugClientPrivate(); diff --git a/src/declarative/fx/qfxlistview.cpp b/src/declarative/fx/qfxlistview.cpp index 604d16b..4fb0ec1 100644 --- a/src/declarative/fx/qfxlistview.cpp +++ b/src/declarative/fx/qfxlistview.cpp @@ -166,7 +166,7 @@ public: class QFxListViewPrivate : public QFxFlickablePrivate { - Q_DECLARE_PUBLIC(QFxListView); + Q_DECLARE_PUBLIC(QFxListView) public: QFxListViewPrivate() diff --git a/src/declarative/fx/qfxtextinput_p.h b/src/declarative/fx/qfxtextinput_p.h index a2b45bb..3978be4 100644 --- a/src/declarative/fx/qfxtextinput_p.h +++ b/src/declarative/fx/qfxtextinput_p.h @@ -61,7 +61,7 @@ QT_BEGIN_NAMESPACE class QFxTextInputPrivate : public QFxPaintedItemPrivate { - Q_DECLARE_PUBLIC(QFxTextInput); + Q_DECLARE_PUBLIC(QFxTextInput) public: QFxTextInputPrivate() : control(new QLineControl(QString())), color((QRgb)0), style(QFxText::Normal), diff --git a/src/declarative/qml/qmlinfo.cpp b/src/declarative/qml/qmlinfo.cpp index 862d6ba..e68deae 100644 --- a/src/declarative/qml/qmlinfo.cpp +++ b/src/declarative/qml/qmlinfo.cpp @@ -77,7 +77,7 @@ void qmlInfo(const QString& msg, QObject* object) { QString pos = QLatin1String("QML"); if (object) { - pos += " "; + pos += QLatin1String(" "); pos += QLatin1String(object->metaObject()->className()); } QmlDeclarativeData *ddata = QmlDeclarativeData::get(object); -- cgit v0.12 From db695ff137e53f5285f5bb90f1a50281c27a4281 Mon Sep 17 00:00:00 2001 From: Warwick Allison Date: Thu, 15 Oct 2009 16:29:57 +1000 Subject: doc --- src/declarative/fx/qfxtext.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/declarative/fx/qfxtext.cpp b/src/declarative/fx/qfxtext.cpp index c26ed2c..4d02f0d 100644 --- a/src/declarative/fx/qfxtext.cpp +++ b/src/declarative/fx/qfxtext.cpp @@ -427,9 +427,13 @@ void QFxText::setTextFormat(TextFormat format) This property cannot be used with wrap enabled or with rich text. - Eliding can be ElideNone, ElideLeft, ElideMiddle, or ElideRight. + Eliding can be ElideNone (the default), ElideLeft, ElideMiddle, or ElideRight. - ElideNone is the default. + If the text is a multi-length string, and the mode is not ElideNone, + the first string that fits will be used, otherwise the last will be elided. + + Multi-length strings are ordered from longest to shortest, separated by the + Unicode "String Terminator" character U009C (write this in QML with "\\x9C"). */ Qt::TextElideMode QFxText::elideMode() const { -- cgit v0.12 From 7cc04115db6f9fa2d79d02d32cff38e4ecd8c52b Mon Sep 17 00:00:00 2001 From: Martin Jones Date: Thu, 15 Oct 2009 17:09:38 +1000 Subject: Some improvements to loader --- examples/declarative/loader/Browser.qml | 58 ++++++++++++++++++---------- examples/declarative/loader/loader.pro | 9 +++++ examples/declarative/loader/main.cpp | 42 +++++++++++++++----- src/declarative/extra/qmlfolderlistmodel.cpp | 9 +++++ src/declarative/extra/qmlfolderlistmodel.h | 3 ++ 5 files changed, 90 insertions(+), 31 deletions(-) diff --git a/examples/declarative/loader/Browser.qml b/examples/declarative/loader/Browser.qml index 5f972f1..9eedd4e 100644 --- a/examples/declarative/loader/Browser.qml +++ b/examples/declarative/loader/Browser.qml @@ -2,13 +2,14 @@ import Qt 4.6 Rectangle { id: root + property bool keyPressed: false width: parent.width height: parent.height - color: palette.base + color: palette.window FolderListModel { id: folders nameFilters: [ "*.qml" ] -// folder: "E:" + folder: "E:" } SystemPalette { id: palette; colorGroup: Qt.Active } @@ -25,7 +26,7 @@ Rectangle { } } width: root.width - height: 32 + height: 48 color: "transparent" Rectangle { id: highlight; visible: false @@ -36,15 +37,15 @@ Rectangle { } } Item { - width: 32; height: 32 + width: 46; height: 46 Image { source: "images/fileopen.png"; anchors.centerIn: parent; visible: folders.isFolder(index)} } Text { id: nameText anchors.fill: parent; verticalAlignment: "AlignVCenter" - text: fileName; anchors.leftMargin: 32 - font.pointSize: 10 - color: palette.windowText + text: fileName; anchors.leftMargin: 48 + font.pixelSize: 32 + color: wrapper.isCurrentItem ? palette.highlightedText : palette.text } MouseRegion { id: mouseRegion @@ -62,13 +63,6 @@ Rectangle { } } - Script { - function up(path) { - var pos = path.toString().lastIndexOf("/"); - return path.toString().substring(0, pos); - } - } - ListView { id: view anchors.top: titleBar.bottom @@ -77,37 +71,59 @@ Rectangle { anchors.bottom: parent.bottom model: folders delegate: folderDelegate - highlight: Rectangle { color: "#FFFBAF" } + highlight: Rectangle { color: palette.highlight; visible: root.keyPressed } clip: true focus: true + pressDelay: 100 + Keys.onPressed: { - if (event.key == Qt.Key_Return || event.key == Qt.Key_Select) { + root.keyPressed = true; + if (event.key == Qt.Key_Return || event.key == Qt.Key_Select || event.key == Qt.Key_Right) { view.currentItem.launch(); event.accepted = true; } } + Keys.onLeftPressed: folders.folder = up(folders.folder) } Rectangle { id: titleBar width: parent.width - height: 32 - color: palette.button; border.color: palette.mid + height: 48 + color: palette.lighter(palette.window); border.color: palette.mid Rectangle { id: upButton - width: 30 + width: 48 height: titleBar.height border.color: palette.mid; color: "transparent" - MouseRegion { anchors.fill: parent; onClicked: folders.folder = up(folders.folder) } + + Script { + function up(path) { + var pos = path.toString().lastIndexOf("/"); + return path.toString().substring(0, pos); + } + } + Image { anchors.centerIn: parent; source: "images/up.png" } + MouseRegion { id: upRegion; anchors.fill: parent + onClicked: if (folders.parentFolder != "") folders.folder = folders.parentFolder + } + states: [ + State { + name: "pressed" + when: upRegion.pressed + PropertyChanges { target: upButton; color: palette.highlightedText } + } + ] } Text { anchors.left: upButton.right; anchors.right: parent.right; height: parent.height anchors.leftMargin: 4; anchors.rightMargin: 4 - text: folders.folder; color: palette.buttonText + text: folders.folder; color: palette.text elide: "ElideLeft"; horizontalAlignment: "AlignRight"; verticalAlignment: "AlignVCenter" + font.pixelSize: 32 } } } diff --git a/examples/declarative/loader/loader.pro b/examples/declarative/loader/loader.pro index 089eaff..9b03b8f 100644 --- a/examples/declarative/loader/loader.pro +++ b/examples/declarative/loader/loader.pro @@ -7,3 +7,12 @@ target.path = $$[QT_INSTALL_EXAMPLES]/declarative/loader sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS loader.pro sources.path = $$[QT_INSTALL_EXAMPLES]/declarative/loader INSTALLS += target sources + +symbian { +# TARGET.UID3 = + include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri) + TARGET.EPOCHEAPSIZE = 100000 20000000 + HEADERS += $$QT_SOURCE_TREE/examples/network/ftp/sym_iap_util.h + LIBS += -lesock -lconnmon -linsock + TARGET.CAPABILITY = NetworkServices +} diff --git a/examples/declarative/loader/main.cpp b/examples/declarative/loader/main.cpp index fbae5f1..0993814 100644 --- a/examples/declarative/loader/main.cpp +++ b/examples/declarative/loader/main.cpp @@ -15,6 +15,15 @@ #include #include #include +#include + +#if defined (Q_OS_SYMBIAN) +#define SYMBIAN_NETWORK_INIT +#endif + +#if defined (SYMBIAN_NETWORK_INIT) +#include "sym_iap_util.h" +#endif QmlView *canvas = 0; @@ -30,13 +39,11 @@ public: setLayout(layout); #ifdef Q_OS_SYMBIAN QAction *closeAction = new QAction("Close", this); - closeAction->setSoftKeyRole(QAction::BackSoftKey); + closeAction->setSoftKeyRole(QAction::NegativeSoftKey); connect(closeAction, SIGNAL(triggered()), this, SLOT(close())); - - QList softKeys; - softKeys.append(closeAction); - setSoftKeys(softKeys); + addAction(closeAction); #endif + connect(logText, SIGNAL(textChanged()), this, SIGNAL(textChanged())); } void append(const QString &text) { @@ -50,6 +57,9 @@ public: return logger; } +signals: + void textChanged(); + private: QPlainTextEdit *logText; }; @@ -112,7 +122,7 @@ public: } } - canvas->setUrl(fileName); + canvas->setUrl(url); canvas->execute(); } @@ -124,8 +134,9 @@ class MainWindow : public QMainWindow { Q_OBJECT public: - MainWindow() : QMainWindow() {} - + MainWindow() : QMainWindow() + { + } public slots: void toggleFullScreen() @@ -149,6 +160,13 @@ public slots: Logger::instance()->show(); #endif } + + void enableNetwork() + { +#if defined(SYMBIAN_NETWORK_INIT) + qt_SetDefaultIap(); +#endif + } }; class ConfiguredNetworkAccessManager : public QNetworkAccessManager { @@ -185,8 +203,6 @@ int main(int argc, char *argv[]) canvas->setFocusPolicy(Qt::StrongFocus); canvas->engine()->setNetworkAccessManager(new ConfiguredNetworkAccessManager); - mw->setCentralWidget(canvas); - QMenuBar *mb = mw->menuBar(); QAction *showLogAction = new QAction("View Log...", mw); mb->addAction(showLogAction); @@ -194,6 +210,11 @@ int main(int argc, char *argv[]) QAction *toggleFSAction = new QAction("Fullscreen", mw); mb->addAction(toggleFSAction); QObject::connect(toggleFSAction, SIGNAL(triggered()), mw, SLOT(toggleFullScreen())); +#if defined(SYMBIAN_NETWORK_INIT) + QAction *enableNetworkAction = new QAction("Enable Network", mw); + mb->addAction(enableNetworkAction); + QObject::connect(enableNetworkAction, SIGNAL(triggered()), mw, SLOT(enableNetwork())); +#endif QmlContext *ctxt = canvas->rootContext(); ctxt->setContextProperty("qmlLauncher", launcher); @@ -205,6 +226,7 @@ int main(int argc, char *argv[]) mw->show(); #endif canvas->execute(); + mw->setCentralWidget(canvas); return app.exec(); } diff --git a/src/declarative/extra/qmlfolderlistmodel.cpp b/src/declarative/extra/qmlfolderlistmodel.cpp index bdea03f..4a7c2f1 100644 --- a/src/declarative/extra/qmlfolderlistmodel.cpp +++ b/src/declarative/extra/qmlfolderlistmodel.cpp @@ -195,6 +195,15 @@ void QmlFolderListModel::setFolder(const QString &folder) } } +QString QmlFolderListModel::parentFolder() const +{ + Q_D(const QmlFolderListModel); + int pos = d->folder.lastIndexOf('/'); + if (pos == -1) + return QString(); + return d->folder.left(pos); +} + /*! \qmlproperty list FolderListModel::nameFilters diff --git a/src/declarative/extra/qmlfolderlistmodel.h b/src/declarative/extra/qmlfolderlistmodel.h index 24a3ac6..6bb1c4b 100644 --- a/src/declarative/extra/qmlfolderlistmodel.h +++ b/src/declarative/extra/qmlfolderlistmodel.h @@ -61,6 +61,7 @@ class Q_DECLARATIVE_EXPORT QmlFolderListModel : public QListModelInterface, publ Q_INTERFACES(QmlParserStatus) Q_PROPERTY(QString folder READ folder WRITE setFolder NOTIFY folderChanged) + Q_PROPERTY(QString parentFolder READ parentFolder NOTIFY folderChanged) Q_PROPERTY(QStringList nameFilters READ nameFilters WRITE setNameFilters) Q_PROPERTY(SortField sortField READ sortField WRITE setSortField) Q_PROPERTY(bool sortReversed READ sortReversed WRITE setSortReversed) @@ -77,6 +78,8 @@ public: QString folder() const; void setFolder(const QString &folder); + QString parentFolder() const; + QStringList nameFilters() const; void setNameFilters(const QStringList &filters); -- cgit v0.12 From 338d6ca0d2d98c8c3ffc8c29b8135de8e0bb8a7b Mon Sep 17 00:00:00 2001 From: Aaron Kennedy Date: Thu, 15 Oct 2009 17:42:11 +1000 Subject: Fix failing test on case insensitive filesystems --- tests/auto/declarative/qmllanguage/data/unregisteredObject.errors.txt | 2 +- tests/auto/declarative/qmllanguage/data/unregisteredObject.qml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/auto/declarative/qmllanguage/data/unregisteredObject.errors.txt b/tests/auto/declarative/qmllanguage/data/unregisteredObject.errors.txt index bc4f7f4..347db05 100644 --- a/tests/auto/declarative/qmllanguage/data/unregisteredObject.errors.txt +++ b/tests/auto/declarative/qmllanguage/data/unregisteredObject.errors.txt @@ -1 +1 @@ -2:1:Type UnregisteredObject unavailable +2:1:Type UnregisteredObjectType unavailable diff --git a/tests/auto/declarative/qmllanguage/data/unregisteredObject.qml b/tests/auto/declarative/qmllanguage/data/unregisteredObject.qml index 9498e31..4969f62 100644 --- a/tests/auto/declarative/qmllanguage/data/unregisteredObject.qml +++ b/tests/auto/declarative/qmllanguage/data/unregisteredObject.qml @@ -1,2 +1,2 @@ import Test 1.0 -UnregisteredObject {} +UnregisteredObjectType {} -- cgit v0.12 From 2967e68f9a3bae4f5a2865ac901b08d8b6f0f0f1 Mon Sep 17 00:00:00 2001 From: Roberto Raggi Date: Thu, 15 Oct 2009 10:18:09 +0200 Subject: Simplified the bindings rewriter. The rewriter needs to know if an ExpressionStatement is part of a loop and an integer is definitely enough for that. --- src/declarative/qml/qmlrewrite.cpp | 27 ++++++++++++++------------- src/declarative/qml/qmlrewrite_p.h | 2 +- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/src/declarative/qml/qmlrewrite.cpp b/src/declarative/qml/qmlrewrite.cpp index 19b88cc..43b2529 100644 --- a/src/declarative/qml/qmlrewrite.cpp +++ b/src/declarative/qml/qmlrewrite.cpp @@ -71,6 +71,7 @@ QString RewriteBinding::rewrite(QString code, unsigned position, TextWriter w; _writer = &w; _position = position; + _inLoop = 0; accept(node); @@ -111,7 +112,7 @@ bool RewriteBinding::visit(AST::Block *ast) bool RewriteBinding::visit(AST::ExpressionStatement *ast) { - if (_loopStack.isEmpty()) { + if (! _inLoop) { unsigned startOfExpressionStatement = ast->firstSourceLocation().begin() - _position; _writer->replace(startOfExpressionStatement, 0, QLatin1String("return ")); } @@ -121,68 +122,68 @@ bool RewriteBinding::visit(AST::ExpressionStatement *ast) bool RewriteBinding::visit(AST::DoWhileStatement *ast) { - _loopStack.append(ast); + ++_inLoop; return true; } void RewriteBinding::endVisit(AST::DoWhileStatement *) { - _loopStack.removeLast(); + --_inLoop; } bool RewriteBinding::visit(AST::WhileStatement *ast) { - _loopStack.append(ast); + ++_inLoop; return true; } void RewriteBinding::endVisit(AST::WhileStatement *) { - _loopStack.removeLast(); + --_inLoop; } bool RewriteBinding::visit(AST::ForStatement *ast) { - _loopStack.append(ast); + ++_inLoop; return true; } void RewriteBinding::endVisit(AST::ForStatement *) { - _loopStack.removeLast(); + --_inLoop; } bool RewriteBinding::visit(AST::LocalForStatement *ast) { - _loopStack.append(ast); + ++_inLoop; return true; } void RewriteBinding::endVisit(AST::LocalForStatement *) { - _loopStack.removeLast(); + --_inLoop; } bool RewriteBinding::visit(AST::ForEachStatement *ast) { - _loopStack.append(ast); + ++_inLoop; return true; } void RewriteBinding::endVisit(AST::ForEachStatement *) { - _loopStack.removeLast(); + --_inLoop; } bool RewriteBinding::visit(AST::LocalForEachStatement *ast) { - _loopStack.append(ast); + ++_inLoop; return true; } void RewriteBinding::endVisit(AST::LocalForEachStatement *) { - _loopStack.removeLast(); + --_inLoop; } } // namespace QmlRewrite diff --git a/src/declarative/qml/qmlrewrite_p.h b/src/declarative/qml/qmlrewrite_p.h index 449b219..59057d5 100644 --- a/src/declarative/qml/qmlrewrite_p.h +++ b/src/declarative/qml/qmlrewrite_p.h @@ -99,7 +99,7 @@ protected: virtual void endVisit(AST::LocalForEachStatement *ast); private: - QList _loopStack; + int _inLoop; }; } // namespace QmlRewrite -- cgit v0.12 From 2eb67032ea81aa105a854644f337ad5377c2994e Mon Sep 17 00:00:00 2001 From: Alan Alpert Date: Thu, 15 Oct 2009 18:28:03 +1000 Subject: Fix dynamic example Had some accidental global vars Task-number: One of the QT-2270s --- examples/declarative/dynamic/dynamic.qml | 8 +++++--- src/declarative/qml/qmlobjectscriptclass.cpp | 1 + 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/examples/declarative/dynamic/dynamic.qml b/examples/declarative/dynamic/dynamic.qml index 66fdf87..2c6a8e0 100644 --- a/examples/declarative/dynamic/dynamic.qml +++ b/examples/declarative/dynamic/dynamic.qml @@ -8,6 +8,7 @@ Rectangle { Script { source: "dynamic.js" } property bool extendStars: false + property var fourthBox: undefined Item { id: targetItem; x: 100; y: 100; } Item { id: targetItem2; x: 0; y: 300; } @@ -20,7 +21,7 @@ Rectangle { MouseRegion { anchors.fill: parent - onClicked: { a = createWithComponent(); } + onClicked: { var a = createWithComponent(); } } } @@ -47,8 +48,8 @@ Rectangle { MouseRegion { anchors.fill: parent onClicked: { - if (fourthBox == null) { - a = createQml(targetItem2); + if (fourthBox == null || fourthBox == undefined) { + var a = createQml(targetItem2); if (a != null) { a.parent = targetItem2;//BUG: this should happen automatically fourthBox = a; @@ -68,6 +69,7 @@ Rectangle { Particles { x: 0 y: 0 + z: 10 count: 20 lifeSpan: 500 width: 100 diff --git a/src/declarative/qml/qmlobjectscriptclass.cpp b/src/declarative/qml/qmlobjectscriptclass.cpp index 122db51..ae2cfcc 100644 --- a/src/declarative/qml/qmlobjectscriptclass.cpp +++ b/src/declarative/qml/qmlobjectscriptclass.cpp @@ -250,6 +250,7 @@ void QmlObjectScriptClass::setProperty(QObject *obj, Q_ASSERT(lastData); QmlEnginePrivate *enginePriv = QmlEnginePrivate::get(engine); + Q_ASSERT(enginePriv->currentExpression); // ### Can well known types be optimized? QVariant v = QmlScriptClass::toVariant(engine, value); -- cgit v0.12 From 3e86171f03ff295c0c77ade7ef49e8c395063bd8 Mon Sep 17 00:00:00 2001 From: Warwick Allison Date: Fri, 16 Oct 2009 09:41:37 +1000 Subject: spel --- doc/src/declarative/network.qdoc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/src/declarative/network.qdoc b/doc/src/declarative/network.qdoc index da4495f..e88dfdc 100644 --- a/doc/src/declarative/network.qdoc +++ b/doc/src/declarative/network.qdoc @@ -47,7 +47,7 @@ QML supports network transparency by using URLs (rather than file names) for all references from a QML document to other content. Since a \i relative URL is the same as a relative file, development of QML on regular file systems remains simple. -\section1 Accessing Network Reesources from QML +\section1 Accessing Network Resources from QML Whenever an object has a property of type URL (QUrl), assigning a string to that property will actually assign an absolute URL - by resolving the string against @@ -105,7 +105,7 @@ The \c import statement only works network transparently if it has an "as" claus All network access from QML is managed by a QNetworkAccessManager set on the QmlEngine which executes the QML. By default, this is an unmodified Qt QNetworkAccessManager. You may set a different manager using QmlEngine::setNetworkAccessManager() as appropriate for the policies of your application. -For eample, the \l qmlviewer tool sets a new QNetworkAccessManager which +For example, the \l qmlviewer tool sets a new QNetworkAccessManager which trusts HTTP Expiry headers to avoid network cache checks, allows HTTP Pipelining, adds a persistent HTTP CookieJar, a simple disk cache, and supports proxy settings. -- cgit v0.12 From 8eec0b69e303d10582d04784a0bb200418272c4d Mon Sep 17 00:00:00 2001 From: Aaron Kennedy Date: Fri, 16 Oct 2009 10:29:16 +1000 Subject: Correctly pass context to QmlObjectScriptClass --- src/declarative/qml/qmlcontextscriptclass.cpp | 9 +++++---- src/declarative/qml/qmlobjectscriptclass.cpp | 15 ++++++++++++--- src/declarative/qml/qmlobjectscriptclass_p.h | 3 ++- 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/declarative/qml/qmlcontextscriptclass.cpp b/src/declarative/qml/qmlcontextscriptclass.cpp index 939d008..ae86fb1 100644 --- a/src/declarative/qml/qmlcontextscriptclass.cpp +++ b/src/declarative/qml/qmlcontextscriptclass.cpp @@ -144,7 +144,7 @@ QmlContextScriptClass::queryProperty(QmlContext *bindContext, QObject *scopeObje if (scopeObject) { QScriptClass::QueryFlags rv = - ep->objectClass->queryProperty(scopeObject, name, flags, 0); + ep->objectClass->queryProperty(scopeObject, name, flags, bindContext); if (rv) { lastScopeObject = scopeObject; lastContext = bindContext; @@ -154,7 +154,7 @@ QmlContextScriptClass::queryProperty(QmlContext *bindContext, QObject *scopeObje for (int ii = 0; ii < cp->defaultObjects.count(); ++ii) { QScriptClass::QueryFlags rv = - ep->objectClass->queryProperty(cp->defaultObjects.at(ii), name, flags, 0); + ep->objectClass->queryProperty(cp->defaultObjects.at(ii), name, flags, bindContext); if (rv) { lastDefaultObject = ii; @@ -225,9 +225,10 @@ void QmlContextScriptClass::setProperty(Object *object, const Identifier &name, QmlContextPrivate *cp = QmlContextPrivate::get(bindContext); if (lastScopeObject) { - ep->objectClass->setProperty(lastScopeObject, name, value); + ep->objectClass->setProperty(lastScopeObject, name, value, bindContext); } else { - ep->objectClass->setProperty(cp->defaultObjects.at(lastDefaultObject), name, value); + ep->objectClass->setProperty(cp->defaultObjects.at(lastDefaultObject), name, value, + bindContext); } } diff --git a/src/declarative/qml/qmlobjectscriptclass.cpp b/src/declarative/qml/qmlobjectscriptclass.cpp index ae2cfcc..c356a3f 100644 --- a/src/declarative/qml/qmlobjectscriptclass.cpp +++ b/src/declarative/qml/qmlobjectscriptclass.cpp @@ -242,7 +242,8 @@ void QmlObjectScriptClass::setProperty(Object *object, void QmlObjectScriptClass::setProperty(QObject *obj, const Identifier &name, - const QScriptValue &value) + const QScriptValue &value, + QmlContext *evalContext) { Q_UNUSED(name); @@ -250,12 +251,20 @@ void QmlObjectScriptClass::setProperty(QObject *obj, Q_ASSERT(lastData); QmlEnginePrivate *enginePriv = QmlEnginePrivate::get(engine); - Q_ASSERT(enginePriv->currentExpression); + + if (!evalContext && context()) { + // Global object, QScriptContext activation object, QmlContext object + QScriptValue scopeNode = scopeChainValue(context(), -3); + Q_ASSERT(scopeNode.isValid()); + Q_ASSERT(scriptClass(scopeNode) == enginePriv->contextClass); + + evalContext = enginePriv->contextClass->contextFromValue(scopeNode); + } // ### Can well known types be optimized? QVariant v = QmlScriptClass::toVariant(engine, value); delete QmlMetaPropertyPrivate::setBinding(obj, *lastData, 0); - QmlMetaPropertyPrivate::write(obj, *lastData, v, enginePriv->currentExpression->context()); + QmlMetaPropertyPrivate::write(obj, *lastData, v, evalContext); } QObject *QmlObjectScriptClass::toQObject(Object *object, bool *ok) diff --git a/src/declarative/qml/qmlobjectscriptclass_p.h b/src/declarative/qml/qmlobjectscriptclass_p.h index 3fcf009..8d5b5f6 100644 --- a/src/declarative/qml/qmlobjectscriptclass_p.h +++ b/src/declarative/qml/qmlobjectscriptclass_p.h @@ -79,7 +79,8 @@ public: QScriptClass::QueryFlags flags, QmlContext *evalContext); QScriptValue property(QObject *, const Identifier &); - void setProperty(QObject *, const Identifier &name, const QScriptValue &); + void setProperty(QObject *, const Identifier &name, const QScriptValue &, + QmlContext *evalContext = 0); protected: virtual QScriptClass::QueryFlags queryProperty(Object *, const Identifier &, -- cgit v0.12 From 768c642574cc6ee1748c165ab60d027830a45d43 Mon Sep 17 00:00:00 2001 From: Warwick Allison Date: Fri, 16 Oct 2009 11:28:30 +1000 Subject: doc --- src/declarative/qml/qmlcontext.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/declarative/qml/qmlcontext.cpp b/src/declarative/qml/qmlcontext.cpp index 43a4741..31d4e1f 100644 --- a/src/declarative/qml/qmlcontext.cpp +++ b/src/declarative/qml/qmlcontext.cpp @@ -469,7 +469,7 @@ QUrl QmlContext::resolvedUrl(const QUrl &src) } /*! - Explicitly sets the url resolveUrl() will use for relative references to \a baseUrl. + Explicitly sets the url resolvedUrl() will use for relative references to \a baseUrl. Calling this function will override the url of the containing component used by default. -- cgit v0.12 From cf822676f9198b532b324b82855ecb6cae7c6968 Mon Sep 17 00:00:00 2001 From: Warwick Allison Date: Fri, 16 Oct 2009 12:32:10 +1000 Subject: Improve FolderListModel a little File -> Url Support the useful filters --- examples/declarative/loader/Browser.qml | 2 +- src/declarative/extra/qmlfolderlistmodel.cpp | 104 +++++++++++++++++++++++---- src/declarative/extra/qmlfolderlistmodel.h | 18 +++-- 3 files changed, 107 insertions(+), 17 deletions(-) diff --git a/examples/declarative/loader/Browser.qml b/examples/declarative/loader/Browser.qml index 9eedd4e..3e61de0 100644 --- a/examples/declarative/loader/Browser.qml +++ b/examples/declarative/loader/Browser.qml @@ -9,7 +9,7 @@ Rectangle { FolderListModel { id: folders nameFilters: [ "*.qml" ] - folder: "E:" + folder: "file:///E:/" // Documents on your S60 phone (or Windows E: drive) } SystemPalette { id: palette; colorGroup: Qt.Active } diff --git a/src/declarative/extra/qmlfolderlistmodel.cpp b/src/declarative/extra/qmlfolderlistmodel.cpp index 4a7c2f1..0e5c275 100644 --- a/src/declarative/extra/qmlfolderlistmodel.cpp +++ b/src/declarative/extra/qmlfolderlistmodel.cpp @@ -43,6 +43,7 @@ #include #include #include "qmlfolderlistmodel.h" +#include QT_BEGIN_NAMESPACE @@ -51,7 +52,6 @@ class QmlFolderListModelPrivate : public QObjectPrivate public: QmlFolderListModelPrivate() : sortField(QmlFolderListModel::Name), sortReversed(false), count(0) { - folder = QDir::currentPath(); nameFilters << QLatin1String("*"); } @@ -82,7 +82,7 @@ public: } QDirModel model; - QString folder; + QUrl folder; QStringList nameFilters; QModelIndex folderIndex; QmlFolderListModel::SortField sortField; @@ -116,7 +116,7 @@ QmlFolderListModel::QmlFolderListModel(QObject *parent) : QListModelInterface(*(new QmlFolderListModelPrivate), parent) { Q_D(QmlFolderListModel); - d->model.setFilter(QDir::AllDirs | QDir::Files | QDir::Drives); + d->model.setFilter(QDir::AllDirs | QDir::Files | QDir::Drives | QDir::NoDotAndDotDot); connect(&d->model, SIGNAL(rowsInserted(const QModelIndex&,int,int)) , this, SLOT(inserted(const QModelIndex&,int,int))); connect(&d->model, SIGNAL(rowsRemoved(const QModelIndex&,int,int)) @@ -139,7 +139,7 @@ QHash QmlFolderListModel::data(int index, const QList &roles) QModelIndex modelIndex = d->model.index(index, 0, d->folderIndex); if (modelIndex.isValid()) { folderData[QDirModel::FileNameRole] = d->model.data(modelIndex, QDirModel::FileNameRole); - folderData[QDirModel::FilePathRole] = d->model.data(modelIndex, QDirModel::FilePathRole); + folderData[QDirModel::FilePathRole] = QUrl::fromLocalFile(d->model.data(modelIndex, QDirModel::FilePathRole).toString()); } return folderData; @@ -175,19 +175,21 @@ QString QmlFolderListModel::toString(int role) const \qmlproperty string FolderListModel::folder The \a folder property holds the folder the model is currently providing. + + It is a URL, but must be a file: or qrc: URL (or relative to such a URL). */ -QString QmlFolderListModel::folder() const +QUrl QmlFolderListModel::folder() const { Q_D(const QmlFolderListModel); return d->folder; } -void QmlFolderListModel::setFolder(const QString &folder) +void QmlFolderListModel::setFolder(const QUrl &folder) { Q_D(QmlFolderListModel); if (folder == d->folder) return; - QModelIndex index = d->model.index(folder); + QModelIndex index = d->model.index(folder.toLocalFile()); if (index.isValid() && d->model.isDir(index)) { d->folder = folder; QMetaObject::invokeMethod(this, "refresh", Qt::QueuedConnection); @@ -195,13 +197,15 @@ void QmlFolderListModel::setFolder(const QString &folder) } } -QString QmlFolderListModel::parentFolder() const +QUrl QmlFolderListModel::parentFolder() const { Q_D(const QmlFolderListModel); - int pos = d->folder.lastIndexOf('/'); + int pos = d->folder.path().lastIndexOf(QLatin1Char('/')); if (pos == -1) - return QString(); - return d->folder.left(pos); + return QUrl(); + QUrl r = d->folder; + r.setPath(d->folder.path().left(pos)); + return r; } /*! @@ -234,6 +238,9 @@ void QmlFolderListModel::setNameFilters(const QStringList &filters) void QmlFolderListModel::componentComplete() { Q_D(QmlFolderListModel); + if (!d->folder.isValid() || !QDir().exists(d->folder.toLocalFile())) + setFolder(QUrl(QLatin1String("file://")+QDir::currentPath())); + if (!d->folderIndex.isValid()) QMetaObject::invokeMethod(this, "refresh", Qt::QueuedConnection); } @@ -294,7 +301,7 @@ void QmlFolderListModel::refresh() d->count = 0; emit itemsRemoved(0, tmpCount); } - d->folderIndex = d->model.index(d->folder); + d->folderIndex = d->model.index(d->folder.toLocalFile()); d->count = d->model.rowCount(d->folderIndex); if (d->count) { emit itemsInserted(0, d->count); @@ -327,6 +334,79 @@ void QmlFolderListModel::dataChanged(const QModelIndex &start, const QModelIndex emit itemsChanged(start.row(), end.row() - start.row() + 1, roles()); } +/*! + \qmlproperty bool FolderListModel::showDirs + + If true (the default), directories are included in the model. + + Note that the nameFilters are ignored for directories. +*/ +bool QmlFolderListModel::showDirs() const +{ + Q_D(const QmlFolderListModel); + return d->model.filter() & QDir::AllDirs; +} + +void QmlFolderListModel::setShowDirs(bool on) +{ + Q_D(QmlFolderListModel); + if (!(d->model.filter() & QDir::AllDirs) == !on) + return; + if (on) + d->model.setFilter(d->model.filter() | QDir::AllDirs | QDir::Drives); + else + d->model.setFilter(d->model.filter() & ~(QDir::AllDirs | QDir::Drives)); +} + +/*! + \qmlproperty bool FolderListModel::showDotAndDotDot + + If true, the "." and ".." directories are included in the model. + + The default is false. +*/ +bool QmlFolderListModel::showDotAndDotDot() const +{ + Q_D(const QmlFolderListModel); + return !(d->model.filter() & QDir::NoDotAndDotDot); +} + +void QmlFolderListModel::setShowDotAndDotDot(bool on) +{ + Q_D(QmlFolderListModel); + if (!(d->model.filter() & QDir::NoDotAndDotDot) == on) + return; + if (on) + d->model.setFilter(d->model.filter() & ~QDir::NoDotAndDotDot); + else + d->model.setFilter(d->model.filter() | QDir::NoDotAndDotDot); +} + +/*! + \qmlproperty bool FolderListModel::showOnlyReadable + + If true, only readable files and directories are shown. + + The default is false. +*/ +bool QmlFolderListModel::showOnlyReadable() const +{ + Q_D(const QmlFolderListModel); + return d->model.filter() & QDir::Readable; +} + +void QmlFolderListModel::setShowOnlyReadable(bool on) +{ + Q_D(QmlFolderListModel); + if (!(d->model.filter() & QDir::Readable) == !on) + return; + if (on) + d->model.setFilter(d->model.filter() | QDir::Readable); + else + d->model.setFilter(d->model.filter() & ~QDir::Readable); +} + + QML_DEFINE_TYPE(Qt,4,6,(QT_VERSION&0x00ff00)>>8,FolderListModel,QmlFolderListModel) QT_END_NAMESPACE diff --git a/src/declarative/extra/qmlfolderlistmodel.h b/src/declarative/extra/qmlfolderlistmodel.h index 6bb1c4b..cee44e8 100644 --- a/src/declarative/extra/qmlfolderlistmodel.h +++ b/src/declarative/extra/qmlfolderlistmodel.h @@ -60,11 +60,14 @@ class Q_DECLARATIVE_EXPORT QmlFolderListModel : public QListModelInterface, publ Q_OBJECT Q_INTERFACES(QmlParserStatus) - Q_PROPERTY(QString folder READ folder WRITE setFolder NOTIFY folderChanged) + Q_PROPERTY(QUrl folder READ folder WRITE setFolder NOTIFY folderChanged) Q_PROPERTY(QString parentFolder READ parentFolder NOTIFY folderChanged) Q_PROPERTY(QStringList nameFilters READ nameFilters WRITE setNameFilters) Q_PROPERTY(SortField sortField READ sortField WRITE setSortField) Q_PROPERTY(bool sortReversed READ sortReversed WRITE setSortReversed) + Q_PROPERTY(bool showDirs READ showDirs WRITE setShowDirs) + Q_PROPERTY(bool showDotAndDotDot READ showDotAndDotDot WRITE setShowDotAndDotDot) + Q_PROPERTY(bool showOnlyReadable READ showOnlyReadable WRITE setShowOnlyReadable) public: QmlFolderListModel(QObject *parent = 0); @@ -75,10 +78,10 @@ public: virtual QList roles() const; virtual QString toString(int role) const; - QString folder() const; - void setFolder(const QString &folder); + QUrl folder() const; + void setFolder(const QUrl &folder); - QString parentFolder() const; + QUrl parentFolder() const; QStringList nameFilters() const; void setNameFilters(const QStringList &filters); @@ -95,6 +98,13 @@ public: bool sortReversed() const; void setSortReversed(bool rev); + bool showDirs() const; + void setShowDirs(bool); + bool showDotAndDotDot() const; + void setShowDotAndDotDot(bool); + bool showOnlyReadable() const; + void setShowOnlyReadable(bool); + Q_SIGNALS: void folderChanged(); -- cgit v0.12 From 9e94da3f1e49ba61c1ce8d42164addf6c1c75455 Mon Sep 17 00:00:00 2001 From: Martin Jones Date: Fri, 16 Oct 2009 15:58:15 +1000 Subject: Make sure we remove keepMouseGrab once the button is released. --- src/declarative/fx/qfxmouseregion.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/declarative/fx/qfxmouseregion.cpp b/src/declarative/fx/qfxmouseregion.cpp index d3c776f..4b31fd4 100644 --- a/src/declarative/fx/qfxmouseregion.cpp +++ b/src/declarative/fx/qfxmouseregion.cpp @@ -440,6 +440,7 @@ void QFxMouseRegion::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) // If we don't accept hover, we need to reset containsMouse. if (!acceptHoverEvents()) setHovered(false); + setKeepMouseGrab(false); } } -- cgit v0.12 From 5d261870c2c208027fd4fd90d66b2e734235ba3d Mon Sep 17 00:00:00 2001 From: Aaron Kennedy Date: Fri, 16 Oct 2009 16:13:32 +1000 Subject: Add binding assignment warnings --- src/declarative/qml/qmlbasicscript.cpp | 11 ++- src/declarative/qml/qmlbinding.cpp | 13 ++- src/declarative/qml/qmlexpression.cpp | 41 ++++++--- src/declarative/qml/qmlexpression.h | 2 + src/declarative/qml/qmlmetaproperty.cpp | 130 ++++++++++++++++----------- src/declarative/qml/qmlmetaproperty.h | 4 +- src/declarative/qml/qmlmetaproperty_p.h | 5 +- src/declarative/qml/qmlmetatype.cpp | 3 + src/declarative/qml/qmlobjectscriptclass.cpp | 23 +++-- src/declarative/qml/qmlobjectscriptclass_p.h | 3 +- 10 files changed, 156 insertions(+), 79 deletions(-) diff --git a/src/declarative/qml/qmlbasicscript.cpp b/src/declarative/qml/qmlbasicscript.cpp index a0d749f..b7aac54 100644 --- a/src/declarative/qml/qmlbasicscript.cpp +++ b/src/declarative/qml/qmlbasicscript.cpp @@ -181,19 +181,24 @@ static QVariant fetch_value(QObject *o, int idx, int type) break; default: { + // If the object is null, we extract the predicted type. While this isn't + // 100% reliable, in many cases it gives us better error messages if we + // assign this null-object to an incompatible property if (QmlMetaType::isObject(type)) { // NOTE: This assumes a cast to QObject does not alter the // object pointer QObject *val = 0; void *args[] = { &val, 0 }; QMetaObject::metacall(o, QMetaObject::ReadProperty, idx, args); - return QVariant::fromValue(val); + if (!val) return QVariant(type, &val); + else return QVariant::fromValue(val); } else { QVariant var = o->metaObject()->property(idx).read(o); if (QmlMetaType::isObject(var.userType())) { QObject *obj = 0; obj = *(QObject **)var.data(); - var = QVariant::fromValue(obj); + if (!obj) var = QVariant(var.userType(), &obj); + else var = QVariant::fromValue(obj); } return var; } @@ -665,7 +670,7 @@ QVariant QmlBasicScript::run(QmlContext *context, QObject *me) case ScriptInstruction::FetchConstant: { QVariant o = stack.pop(); - QObject *obj = qvariant_cast(o); + QObject *obj = *(QObject **)o.constData(); stack.push(fetch_value(obj, instr.constant.idx, instr.constant.type)); if (obj && instr.constant.notify != 0) diff --git a/src/declarative/qml/qmlbinding.cpp b/src/declarative/qml/qmlbinding.cpp index 6a70c1e..2b4e723 100644 --- a/src/declarative/qml/qmlbinding.cpp +++ b/src/declarative/qml/qmlbinding.cpp @@ -129,7 +129,18 @@ void QmlBinding::update(QmlMetaProperty::WriteFlags flags) } else { QVariant value = this->value(); - data->property.write(value, flags); + if (data->property.object() && !data->property.write(value, flags)) { + QString fileName = data->fileName; + int line = data->line; + if (fileName.isEmpty()) fileName = QLatin1String(""); + + const char *valueType = 0; + if (value.userType() == QVariant::Invalid) valueType = "null"; + else valueType = QMetaType::typeName(value.userType()); + qWarning().nospace() << qPrintable(fileName) << ":" << line + << " Unable to assign " << valueType << " to " + << QMetaType::typeName(data->property.propertyType()); + } } data->updating = false; diff --git a/src/declarative/qml/qmlexpression.cpp b/src/declarative/qml/qmlexpression.cpp index 76ca2c1..3698417 100644 --- a/src/declarative/qml/qmlexpression.cpp +++ b/src/declarative/qml/qmlexpression.cpp @@ -332,20 +332,17 @@ QVariant QmlExpressionPrivate::evalQtScript(QObject *secondaryScope) rv = QVariant::fromValue(list); } } else if (svalue.isObject() && - !svalue.isNumber() && - !svalue.isString() && - !svalue.isDate() && - !svalue.isError() && - !svalue.isFunction() && - !svalue.isNull() && - !svalue.isQMetaObject() && - !svalue.isQObject() && - !svalue.isRegExp()) { - + ep->objectClass->scriptClass(svalue) == ep->objectClass) { QObject *o = svalue.toQObject(); - if (o) - return qVariantFromValue(o); + int type = QMetaType::QObjectStar; + // If the object is null, we extract the predicted type. While this isn't + // 100% reliable, in many cases it gives us better error messages if we + // assign this null-object to an incompatible property + if (!o) type = ep->objectClass->objectType(svalue); + + return QVariant(type, &o); } + if (rv.isNull()) rv = svalue.toVariant(); @@ -452,6 +449,26 @@ void QmlExpression::setTrackChange(bool trackChange) } /*! + Returns the source file URL for this expression. The source location must + have been previously set by calling setSourceLocation(). +*/ +QUrl QmlExpression::sourceFile() const +{ + Q_D(const QmlExpression); + return QUrl(d->data->fileName); +} + +/*! + Returns the source file line number for this expression. The source location + must have been previously set by calling setSourceLocation(). +*/ +int QmlExpression::lineNumber() const +{ + Q_D(const QmlExpression); + return d->data->line; +} + +/*! Set the location of this expression to \a line of \a fileName. This information is used by the script engine. */ diff --git a/src/declarative/qml/qmlexpression.h b/src/declarative/qml/qmlexpression.h index b85e0a7..73682f1 100644 --- a/src/declarative/qml/qmlexpression.h +++ b/src/declarative/qml/qmlexpression.h @@ -76,6 +76,8 @@ public: bool trackChange() const; void setTrackChange(bool); + QUrl sourceFile() const; + int lineNumber() const; void setSourceLocation(const QUrl &fileName, int line); QObject *scopeObject() const; diff --git a/src/declarative/qml/qmlmetaproperty.cpp b/src/declarative/qml/qmlmetaproperty.cpp index 5635016..feedf13 100644 --- a/src/declarative/qml/qmlmetaproperty.cpp +++ b/src/declarative/qml/qmlmetaproperty.cpp @@ -768,13 +768,14 @@ bool QmlMetaPropertyPrivate::writeEnumProperty(const QMetaProperty &prop, int id return status; } -void QmlMetaPropertyPrivate::writeValueProperty(const QVariant &value, +bool QmlMetaPropertyPrivate::writeValueProperty(const QVariant &value, QmlMetaProperty::WriteFlags flags) { // Remove any existing bindings on this property if (!(flags & QmlMetaProperty::DontRemoveBinding)) delete q->setBinding(0); + bool rv = false; uint type = q->type(); if (type & QmlMetaProperty::ValueTypeProperty) { QmlEnginePrivate *ep = @@ -792,20 +793,23 @@ void QmlMetaPropertyPrivate::writeValueProperty(const QVariant &value, QmlPropertyCache::Data data = core; data.coreIndex = valueTypeCoreIdx; data.propType = valueTypePropType; - write(writeBack, data, value, context, flags); + rv = write(writeBack, data, value, context, flags); writeBack->write(object, core.coreIndex, flags); if (!ep) delete writeBack; } else { - write(object, core, value, context, flags); + rv = write(object, core, value, context, flags); } + + return rv; } -void QmlMetaPropertyPrivate::write(QObject *object, const QmlPropertyCache::Data &property, - const QVariant &value, QmlContext *context, QmlMetaProperty::WriteFlags flags) +bool QmlMetaPropertyPrivate::write(QObject *object, const QmlPropertyCache::Data &property, + const QVariant &value, QmlContext *context, + QmlMetaProperty::WriteFlags flags) { int coreIdx = property.coreIndex; int status = -1; //for dbus @@ -820,14 +824,16 @@ void QmlMetaPropertyPrivate::write(QObject *object, const QmlPropertyCache::Data if (qFuzzyCompare(fractional, (double)0.0)) v.convert(QVariant::Int); } - writeEnumProperty(prop, coreIdx, object, v, flags); - - return; + return writeEnumProperty(prop, coreIdx, object, v, flags); } int t = property.propType; int vt = value.userType(); + QmlEnginePrivate *enginePriv = 0; + if (context && context->engine()) + enginePriv = QmlEnginePrivate::get(context->engine()); + if (t == QVariant::Url) { QUrl u; @@ -843,13 +849,14 @@ void QmlMetaPropertyPrivate::write(QObject *object, const QmlPropertyCache::Data found = true; } - if (found) { - if (context && u.isRelative() && !u.isEmpty()) - u = context->baseUrl().resolved(u); - int status = -1; - void *argv[] = { &u, 0, &status, &flags }; - QMetaObject::metacall(object, QMetaObject::WriteProperty, coreIdx, argv); - } + if (!found) + return false; + + if (context && u.isRelative() && !u.isEmpty()) + u = context->baseUrl().resolved(u); + int status = -1; + void *argv[] = { &u, 0, &status, &flags }; + QMetaObject::metacall(object, QMetaObject::WriteProperty, coreIdx, argv); } else if (vt == t) { @@ -863,29 +870,33 @@ void QmlMetaPropertyPrivate::write(QObject *object, const QmlPropertyCache::Data } else if (property.flags & QmlPropertyCache::Data::IsQObjectDerived) { - QObject *o = QmlMetaType::toQObject(value); - const QMetaObject *valMo = 0; + if (enginePriv) valMo = enginePriv->rawMetaObjectForType(value.userType()); + else valMo = QmlMetaType::rawMetaObjectForType(value.userType()); + + if (!valMo) + return false; - if (o) { + QObject *o = *(QObject **)value.constData(); + const QMetaObject *propMo = 0; + if (enginePriv) propMo = enginePriv->rawMetaObjectForType(t); + else propMo = QmlMetaType::rawMetaObjectForType(t); - valMo = o->metaObject(); - const QMetaObject *propMo = QmlMetaType::rawMetaObjectForType(t); - - while (valMo) { - if (equal(valMo, propMo)) - break; - valMo = valMo->superClass(); - } - - } - - if (valMo || !o) { + if (o) valMo = o->metaObject(); + if (canConvert(valMo, propMo)) { void *args[] = { &o, 0, &status, &flags }; QMetaObject::metacall(object, QMetaObject::WriteProperty, coreIdx, args); - + } else if (!o && canConvert(propMo, valMo)) { + // In the case of a null QObject, we assign the null if there is + // any change that the null variant type could be up or down cast to + // the property type. + void *args[] = { &o, 0, &status, &flags }; + QMetaObject::metacall(object, QMetaObject::WriteProperty, coreIdx, + args); + } else { + return false; } } else if (property.flags & QmlPropertyCache::Data::IsQList) { @@ -932,10 +943,8 @@ void QmlMetaPropertyPrivate::write(QObject *object, const QmlPropertyCache::Data objMo = objMo->superClass(); } - if (!found) { - qWarning() << "Unable to assign object to list"; - return; - } + if (!found) + return false; // NOTE: This assumes a cast to QObject does not alter // the object pointer @@ -951,35 +960,36 @@ void QmlMetaPropertyPrivate::write(QObject *object, const QmlPropertyCache::Data QMetaObject::metacall(object, QMetaObject::WriteProperty, coreIdx, a); } else if ((uint)t >= QVariant::UserType && vt == QVariant::String) { QmlMetaType::StringConverter con = QmlMetaType::customStringConverter(t); - if (con) { - QVariant v = con(value.toString()); - if (v.userType() == t) { - void *a[] = { (void *)v.constData(), 0, &status, &flags}; - QMetaObject::metacall(object, QMetaObject::WriteProperty, coreIdx, a); - } + if (!con) + return false; + + QVariant v = con(value.toString()); + if (v.userType() == t) { + void *a[] = { (void *)v.constData(), 0, &status, &flags}; + QMetaObject::metacall(object, QMetaObject::WriteProperty, coreIdx, a); } + } else { + return false; } } + + return true; } /*! Set the property value to \a value. */ -void QmlMetaProperty::write(const QVariant &value) const +bool QmlMetaProperty::write(const QVariant &value) const { - write(value, 0); + return write(value, 0); } -void QmlMetaProperty::write(const QVariant &value, QmlMetaProperty::WriteFlags flags) const +bool QmlMetaProperty::write(const QVariant &value, QmlMetaProperty::WriteFlags flags) const { - if (!d->object) - return; - - if (type() & Property && d->core.isValid()) { - - d->writeValueProperty(value, flags); - - } + if (d->object && type() & Property && d->core.isValid()) + return d->writeValueProperty(value, flags); + else + return false; } /*! @@ -1217,5 +1227,21 @@ bool QmlMetaPropertyPrivate::equal(const QMetaObject *lhs, const QMetaObject *rh return lhs == rhs || (1 && lhs && rhs && lhs->d.stringdata == rhs->d.stringdata); } +/*! + Returns true if from inherits to. +*/ +bool QmlMetaPropertyPrivate::canConvert(const QMetaObject *from, const QMetaObject *to) +{ + if (from && to == &QObject::staticMetaObject) + return true; + + while (from) { + if (equal(from, to)) + return true; + from = from->superClass(); + } + + return false; +} QT_END_NAMESPACE diff --git a/src/declarative/qml/qmlmetaproperty.h b/src/declarative/qml/qmlmetaproperty.h index b0ae28c..fcc020e 100644 --- a/src/declarative/qml/qmlmetaproperty.h +++ b/src/declarative/qml/qmlmetaproperty.h @@ -87,10 +87,10 @@ public: QString name() const; QVariant read() const; - void write(const QVariant &) const; + bool write(const QVariant &) const; enum WriteFlag { BypassInterceptor = 0x01, DontRemoveBinding = 0x02 }; Q_DECLARE_FLAGS(WriteFlags, WriteFlag) - void write(const QVariant &, QmlMetaProperty::WriteFlags) const; + bool write(const QVariant &, QmlMetaProperty::WriteFlags) const; bool hasChangedNotifier() const; bool needsChangedNotifier() const; diff --git a/src/declarative/qml/qmlmetaproperty_p.h b/src/declarative/qml/qmlmetaproperty_p.h index 7288266..368ca30 100644 --- a/src/declarative/qml/qmlmetaproperty_p.h +++ b/src/declarative/qml/qmlmetaproperty_p.h @@ -97,9 +97,9 @@ public: QmlMetaProperty::PropertyCategory propertyCategory() const; QVariant readValueProperty(); - void writeValueProperty(const QVariant &, QmlMetaProperty::WriteFlags); + bool writeValueProperty(const QVariant &, QmlMetaProperty::WriteFlags); static bool writeEnumProperty(const QMetaProperty &prop, int idx, QObject *object, const QVariant &value, int flags); - static void write(QObject *, const QmlPropertyCache::Data &, const QVariant &, QmlContext *, + static bool write(QObject *, const QmlPropertyCache::Data &, const QVariant &, QmlContext *, QmlMetaProperty::WriteFlags flags = 0); static QmlAbstractBinding *setBinding(QObject *, const QmlPropertyCache::Data &, QmlAbstractBinding *, QmlMetaProperty::WriteFlags flags = QmlMetaProperty::DontRemoveBinding); @@ -108,6 +108,7 @@ public: static quint32 saveProperty(int); static bool equal(const QMetaObject *, const QMetaObject *); + static bool canConvert(const QMetaObject *from, const QMetaObject *to); }; QT_END_NAMESPACE diff --git a/src/declarative/qml/qmlmetatype.cpp b/src/declarative/qml/qmlmetatype.cpp index 5198f9f..1ab7aff 100644 --- a/src/declarative/qml/qmlmetatype.cpp +++ b/src/declarative/qml/qmlmetatype.cpp @@ -642,6 +642,9 @@ QVariant QmlMetaType::fromObject(QObject *obj, int typeId) const QMetaObject *QmlMetaType::rawMetaObjectForType(int id) { + if (id == QMetaType::QObjectStar) + return &QObject::staticMetaObject; + QReadLocker lock(metaTypeDataLock()); QmlMetaTypeData *data = metaTypeData(); diff --git a/src/declarative/qml/qmlobjectscriptclass.cpp b/src/declarative/qml/qmlobjectscriptclass.cpp index c356a3f..a6edd3b 100644 --- a/src/declarative/qml/qmlobjectscriptclass.cpp +++ b/src/declarative/qml/qmlobjectscriptclass.cpp @@ -52,8 +52,9 @@ QT_BEGIN_NAMESPACE struct ObjectData : public QScriptDeclarativeClass::Object { - ObjectData(QObject *o) : object(o) {} + ObjectData(QObject *o, int t) : object(o), type(t) {} QGuard object; + int type; }; /* @@ -77,22 +78,22 @@ QmlObjectScriptClass::~QmlObjectScriptClass() { } -QScriptValue QmlObjectScriptClass::newQObject(QObject *object) +QScriptValue QmlObjectScriptClass::newQObject(QObject *object, int type) { QScriptEngine *scriptEngine = QmlEnginePrivate::getScriptEngine(engine); if (!object) - return newObject(scriptEngine, this, new ObjectData(object)); + return newObject(scriptEngine, this, new ObjectData(object, type)); QmlDeclarativeData *ddata = QmlDeclarativeData::get(object, true); if (!ddata->scriptValue.isValid()) { - ddata->scriptValue = newObject(scriptEngine, this, new ObjectData(object)); + ddata->scriptValue = newObject(scriptEngine, this, new ObjectData(object, type)); return ddata->scriptValue; } else if (ddata->scriptValue.engine() == QmlEnginePrivate::getScriptEngine(engine)) { return ddata->scriptValue; } else { - return newObject(scriptEngine, this, new ObjectData(object)); + return newObject(scriptEngine, this, new ObjectData(object, type)); } } @@ -101,6 +102,15 @@ QObject *QmlObjectScriptClass::toQObject(const QScriptValue &value) const return value.toQObject(); } +int QmlObjectScriptClass::objectType(const QScriptValue &value) const +{ + if (scriptClass(value) != this) + return QVariant::Invalid; + + Object *o = object(value); + return ((ObjectData*)(o))->type; +} + QScriptClass::QueryFlags QmlObjectScriptClass::queryProperty(Object *object, const Identifier &name, QScriptClass::QueryFlags flags) @@ -224,7 +234,8 @@ QScriptValue QmlObjectScriptClass::property(QObject *obj, const Identifier &name QObject *rv = 0; void *args[] = { &rv, 0 }; QMetaObject::metacall(obj, QMetaObject::ReadProperty, lastData->coreIndex, args); - return newQObject(rv); + + return newQObject(rv, lastData->propType); } else { QVariant var = obj->metaObject()->property(lastData->coreIndex).read(obj); return enginePriv->scriptValueFromVariant(var); diff --git a/src/declarative/qml/qmlobjectscriptclass_p.h b/src/declarative/qml/qmlobjectscriptclass_p.h index 8d5b5f6..7fb727e 100644 --- a/src/declarative/qml/qmlobjectscriptclass_p.h +++ b/src/declarative/qml/qmlobjectscriptclass_p.h @@ -70,8 +70,9 @@ public: QmlObjectScriptClass(QmlEngine *); ~QmlObjectScriptClass(); - QScriptValue newQObject(QObject *); + QScriptValue newQObject(QObject *, int type = QMetaType::QObjectStar); QObject *toQObject(const QScriptValue &) const; + int objectType(const QScriptValue &) const; enum QueryMode { IncludeAttachedProperties, SkipAttachedProperties }; -- cgit v0.12 From dc66752f24442a0bb219a9a4810b47ba4ece3d5c Mon Sep 17 00:00:00 2001 From: Martin Jones Date: Fri, 16 Oct 2009 16:17:55 +1000 Subject: Fixes for Symbian. --- src/declarative/fx/qfxgridview.h | 1 + src/declarative/fx/qfxitem.cpp | 1 + src/declarative/fx/qfxlistview.h | 1 + src/declarative/fx/qfxpathview.h | 2 +- src/declarative/fx/qfxvisualitemmodel.h | 1 + src/declarative/fx/qfxwebview.h | 1 + src/declarative/qml/qml.h | 14 ++++++++++++++ src/declarative/qml/qmlcomponent.h | 1 + src/declarative/qml/qmlexpression.cpp | 8 +++++++- src/declarative/qml/qmlprivate.h | 27 +++++++++++++++++++++------ src/declarative/util/qmlpackage.h | 1 + src/declarative/widgets/graphicslayouts.h | 2 ++ 12 files changed, 52 insertions(+), 8 deletions(-) diff --git a/src/declarative/fx/qfxgridview.h b/src/declarative/fx/qfxgridview.h index 7f30f03..1c0a700 100644 --- a/src/declarative/fx/qfxgridview.h +++ b/src/declarative/fx/qfxgridview.h @@ -150,6 +150,7 @@ private: QT_END_NAMESPACE QML_DECLARE_TYPE(QFxGridView) +QML_DECLARE_TYPEINFO(QFxGridView, QML_HAS_ATTACHED_PROPERTIES) QT_END_HEADER diff --git a/src/declarative/fx/qfxitem.cpp b/src/declarative/fx/qfxitem.cpp index 903fad7..bd94b8c 100644 --- a/src/declarative/fx/qfxitem.cpp +++ b/src/declarative/fx/qfxitem.cpp @@ -2860,6 +2860,7 @@ int QFxItemPrivate::restart(QTime &t) QT_END_NAMESPACE QML_DECLARE_TYPE(QFxKeysAttached) +QML_DECLARE_TYPEINFO(QFxKeysAttached, QML_HAS_ATTACHED_PROPERTIES) QML_DEFINE_TYPE(Qt,4,6,(QT_VERSION&0x00ff00)>>8,Keys,QFxKeysAttached) QML_DECLARE_TYPE(QFxKeyNavigationAttached) QML_DEFINE_TYPE(Qt,4,6,(QT_VERSION&0x00ff00)>>8,KeyNavigation,QFxKeyNavigationAttached) diff --git a/src/declarative/fx/qfxlistview.h b/src/declarative/fx/qfxlistview.h index 5a83604..1ff0e27 100644 --- a/src/declarative/fx/qfxlistview.h +++ b/src/declarative/fx/qfxlistview.h @@ -174,6 +174,7 @@ private Q_SLOTS: QT_END_NAMESPACE +QML_DECLARE_TYPEINFO(QFxListView, QML_HAS_ATTACHED_PROPERTIES) QML_DECLARE_TYPE(QFxListView) QT_END_HEADER diff --git a/src/declarative/fx/qfxpathview.h b/src/declarative/fx/qfxpathview.h index 3ee352a..c8c0ac0 100644 --- a/src/declarative/fx/qfxpathview.h +++ b/src/declarative/fx/qfxpathview.h @@ -132,7 +132,7 @@ private: QT_END_NAMESPACE QML_DECLARE_TYPE(QFxPathView) - +QML_DECLARE_TYPEINFO(QFxPathView, QML_HAS_ATTACHED_PROPERTIES) QT_END_HEADER #endif // QFXPATHVIEW_H diff --git a/src/declarative/fx/qfxvisualitemmodel.h b/src/declarative/fx/qfxvisualitemmodel.h index f519a9e..5b613d8 100644 --- a/src/declarative/fx/qfxvisualitemmodel.h +++ b/src/declarative/fx/qfxvisualitemmodel.h @@ -192,6 +192,7 @@ QT_END_NAMESPACE QML_DECLARE_TYPE(QFxVisualModel) QML_DECLARE_TYPE(QFxVisualItemModel) +QML_DECLARE_TYPEINFO(QFxVisualItemModel, QML_HAS_ATTACHED_PROPERTIES) QML_DECLARE_TYPE(QFxVisualDataModel) QT_END_HEADER diff --git a/src/declarative/fx/qfxwebview.h b/src/declarative/fx/qfxwebview.h index f136e2d..a31b2b0 100644 --- a/src/declarative/fx/qfxwebview.h +++ b/src/declarative/fx/qfxwebview.h @@ -243,6 +243,7 @@ private: QT_END_NAMESPACE QML_DECLARE_TYPE(QFxWebView) +QML_DECLARE_TYPEINFO(QFxWebView, QML_HAS_ATTACHED_PROPERTIES) QML_DECLARE_TYPE(QAction) QT_END_HEADER diff --git a/src/declarative/qml/qml.h b/src/declarative/qml/qml.h index c437ef1..818b4e7 100644 --- a/src/declarative/qml/qml.h +++ b/src/declarative/qml/qml.h @@ -72,6 +72,20 @@ QT_MODULE(Declarative) #define QML_DECLARE_INTERFACE_HASMETATYPE(INTERFACE) \ QML_DECLARE_TYPE_HASMETATYPE(INTERFACE) +enum { /* TYPEINFO flags */ + QML_HAS_ATTACHED_PROPERTIES = 0x01, +}; + +#define QML_DECLARE_TYPEINFO(TYPE, FLAGS) \ +template <> \ +class QmlTypeInfo \ +{ \ +public: \ + enum { \ + hasAttachedProperties = (((FLAGS) & QML_HAS_ATTACHED_PROPERTIES) == QML_HAS_ATTACHED_PROPERTIES) \ + }; \ +}; + QT_BEGIN_NAMESPACE #if defined(Q_OS_SYMBIAN) diff --git a/src/declarative/qml/qmlcomponent.h b/src/declarative/qml/qmlcomponent.h index dcf9347..7470f31 100644 --- a/src/declarative/qml/qmlcomponent.h +++ b/src/declarative/qml/qmlcomponent.h @@ -116,6 +116,7 @@ QT_END_NAMESPACE Q_DECLARE_METATYPE(QmlComponent::Status) QML_DECLARE_TYPE(QmlComponent) +QML_DECLARE_TYPEINFO(QmlComponent, QML_HAS_ATTACHED_PROPERTIES) QT_END_HEADER diff --git a/src/declarative/qml/qmlexpression.cpp b/src/declarative/qml/qmlexpression.cpp index 76ca2c1..d73d51a 100644 --- a/src/declarative/qml/qmlexpression.cpp +++ b/src/declarative/qml/qmlexpression.cpp @@ -109,15 +109,21 @@ void QmlExpressionPrivate::init(QmlContext *ctxt, void *expr, QmlRefCount *rc, QmlEngine *engine = ctxt->engine(); QmlEnginePrivate *ep = QmlEnginePrivate::get(engine); QScriptEngine *scriptEngine = QmlEnginePrivate::getScriptEngine(engine); +#ifndef Q_OS_SYMBIAN //XXX Why doesn't this work? if (!dd->programs.at(progIdx)) { - dd->programs[progIdx] = + dd->programs[progIdx] = new QScriptProgram(scriptEngine->compile(data->expression, data->fileName, data->line)); } +#endif QScriptContext *scriptContext = scriptEngine->pushCleanContext(); scriptContext->pushScope(ep->contextClass->newContext(ctxt, me)); +#ifndef Q_OS_SYMBIAN data->expressionFunction = scriptEngine->evaluate(*dd->programs[progIdx]); +#else + data->expressionFunction = scriptEngine->evaluate(data->expression); +#endif data->expressionFunctionValid = true; scriptEngine->popContext(); diff --git a/src/declarative/qml/qmlprivate.h b/src/declarative/qml/qmlprivate.h index e821759..3e1a7e0 100644 --- a/src/declarative/qml/qmlprivate.h +++ b/src/declarative/qml/qmlprivate.h @@ -56,6 +56,19 @@ QT_MODULE(Declarative) typedef QObject *(*QmlAttachedPropertiesFunc)(QObject *); +//template +//struct qml_hasAttached { static bool const value = false; }; + +template +class QmlTypeInfo +{ +public: + enum { + hasAttachedProperties = 0 + }; +}; + + namespace QmlPrivate { class ListInterface @@ -101,11 +114,7 @@ namespace QmlPrivate template struct StaticCastSelectorClass { -#ifndef Q_OS_SYMBIAN static inline int cast() { return (int)((intptr_t)static_cast((From *)0x10000000)) - 0x10000000; } -#else - static inline int cast() { return (int)(static_cast((From *)0x10000000)) - 0x10000000; } -#endif }; template @@ -135,6 +144,12 @@ namespace QmlPrivate static bool const value = false; } }; +#elif defined(Q_OS_SYMBIAN) + template + struct has_attachedPropertiesMember + { + static bool const value = QmlTypeInfo::hasAttachedProperties; + }; #else template class has_attachedPropertiesMember @@ -147,8 +162,8 @@ namespace QmlPrivate template static yes_type test(Selector*); - template - static no_type test(...); + template + static no_type test(...); public: static bool const value = sizeof(test(0)) == sizeof(yes_type); diff --git a/src/declarative/util/qmlpackage.h b/src/declarative/util/qmlpackage.h index 9f7a623..7cceaa7 100644 --- a/src/declarative/util/qmlpackage.h +++ b/src/declarative/util/qmlpackage.h @@ -81,6 +81,7 @@ public: QT_END_NAMESPACE QML_DECLARE_TYPE(QmlPackage) +QML_DECLARE_TYPEINFO(QmlPackage, QML_HAS_ATTACHED_PROPERTIES) QT_END_HEADER diff --git a/src/declarative/widgets/graphicslayouts.h b/src/declarative/widgets/graphicslayouts.h index 863f846..45f1439 100644 --- a/src/declarative/widgets/graphicslayouts.h +++ b/src/declarative/widgets/graphicslayouts.h @@ -184,7 +184,9 @@ QML_DECLARE_INTERFACE(QGraphicsLayoutItem) QML_DECLARE_INTERFACE(QGraphicsLayout) QML_DECLARE_TYPE(QGraphicsLinearLayoutStretchItemObject) QML_DECLARE_TYPE(QGraphicsLinearLayoutObject) +QML_DECLARE_TYPEINFO(QGraphicsLinearLayoutObject, QML_HAS_ATTACHED_PROPERTIES) QML_DECLARE_TYPE(QGraphicsGridLayoutObject) +QML_DECLARE_TYPEINFO(QGraphicsGridLayoutObject, QML_HAS_ATTACHED_PROPERTIES) QT_END_HEADER -- cgit v0.12 From 5094685a683ca81d7d0f4325e8a27f7d5a48439d Mon Sep 17 00:00:00 2001 From: Martin Jones Date: Fri, 16 Oct 2009 16:59:21 +1000 Subject: Playing with loader UI. --- examples/declarative/loader/Browser.diff | 60 ++++++++++ examples/declarative/loader/Browser.qml | 140 ++++++++++++++++++++---- examples/declarative/loader/images/fileopen.png | Bin 953 -> 0 bytes examples/declarative/loader/images/folder.png | Bin 0 -> 1841 bytes examples/declarative/loader/loader.qrc | 4 +- 5 files changed, 181 insertions(+), 23 deletions(-) create mode 100644 examples/declarative/loader/Browser.diff delete mode 100644 examples/declarative/loader/images/fileopen.png create mode 100644 examples/declarative/loader/images/folder.png diff --git a/examples/declarative/loader/Browser.diff b/examples/declarative/loader/Browser.diff new file mode 100644 index 0000000..adc0f60 --- /dev/null +++ b/examples/declarative/loader/Browser.diff @@ -0,0 +1,60 @@ +diff --git a/examples/declarative/loader/Browser.qml b/examples/declarative/loader/Browser.qml +index 96c2a76..00e1bb6 100644 +--- a/examples/declarative/loader/Browser.qml ++++ b/examples/declarative/loader/Browser.qml +@@ -17,9 +17,16 @@ Rect { + id: FolderDelegate + Rect { + id: Wrapper ++ function launch() { ++ if (folders.isFolder(index)) { ++ folders.folder = filePath; ++ } else { ++ qmlLauncher.launch(filePath); ++ } ++ } + width: Root.width + height: 32 +- color: activePalette.base ++ color: "transparent" + Rect { + id: Highlight; visible: false + anchors.fill: parent +@@ -42,13 +49,7 @@ Rect { + MouseRegion { + id: Mouse + anchors.fill: parent +- onClicked: { +- if (folders.isFolder(index)) { +- folders.folder = filePath; +- } else { +- qmlLauncher.launch(filePath); +- } +- } ++ onClicked: { launch() } + } + states: [ + State { +@@ -69,13 +70,22 @@ Rect { + } + + ListView { ++ id: View + anchors.top: TitleBar.bottom + anchors.left: parent.left + anchors.right: parent.right + anchors.bottom: parent.bottom + model: folders + delegate: FolderDelegate ++ highlight: Rect { color: "#FFFBAF" } + clip: true ++ focus: true ++ onKeyPress: { ++ if (event.key == Qt.Key_Return || event.key == Qt.Key_Select) { ++ View.current.launch(); ++ event.accepted = true; ++ } ++ } + } + + Rect { diff --git a/examples/declarative/loader/Browser.qml b/examples/declarative/loader/Browser.qml index 3e61de0..464c994 100644 --- a/examples/declarative/loader/Browser.qml +++ b/examples/declarative/loader/Browser.qml @@ -3,24 +3,63 @@ import Qt 4.6 Rectangle { id: root property bool keyPressed: false + property var folders: folders1 + property var view: view1 width: parent.width height: parent.height color: palette.window FolderListModel { - id: folders + id: folders1 + nameFilters: [ "*.qml" ] + folder: "file:///E:/" // Documents on your S60 phone (or Windows E: drive) + } + FolderListModel { + id: folders2 nameFilters: [ "*.qml" ] folder: "file:///E:/" // Documents on your S60 phone (or Windows E: drive) } SystemPalette { id: palette; colorGroup: Qt.Active } + Script { + function down(path) { + if (folders == folders1) { + view = view2 + folders = folders2; + view1.state = "exitLeft"; + } else { + view = view1 + folders = folders1; + view2.state = "exitLeft"; + } + view.x = root.width; + view.state = "current"; + folders.folder = path; + } + function up() { + var path = folders.parentFolder; + if (folders == folders1) { + view = view2 + folders = folders2; + view1.state = "exitRight"; + } else { + view = view1 + folders = folders1; + view2.state = "exitRight"; + } + view.x = -root.width; + view.state = "current"; + folders.folder = path; + } + } + Component { id: folderDelegate Rectangle { id: wrapper function launch() { if (folders.isFolder(index)) { - folders.folder = filePath; + down(filePath); } else { qmlLauncher.launch(filePath); } @@ -38,7 +77,7 @@ Rectangle { } Item { width: 46; height: 46 - Image { source: "images/fileopen.png"; anchors.centerIn: parent; visible: folders.isFolder(index)} + Image { source: "images/folder.png"; anchors.centerIn: parent; visible: folders.isFolder(index)} } Text { id: nameText @@ -64,27 +103,93 @@ Rectangle { } ListView { - id: view + id: view1 anchors.top: titleBar.bottom - anchors.left: parent.left - anchors.right: parent.right anchors.bottom: parent.bottom - model: folders + x: parent.left + width: parent.width + model: folders1 delegate: folderDelegate highlight: Rectangle { color: palette.highlight; visible: root.keyPressed } clip: true focus: true pressDelay: 100 + state: current + states: [ + State { + name: "current" + PropertyChanges { target: view1; x: 0 } + }, + State { + name: "exitLeft" + PropertyChanges { target: view1; x: -root.width } + }, + State { + name: "exitRight" + PropertyChanges { target: view1; x: root.width } + } + ] + transitions: [ + Transition { + to: "current" + SequentialAnimation { + NumberAnimation { properties: "x"; duration: 250 } + } + }, + Transition { + NumberAnimation { properties: "x"; duration: 250 } + NumberAnimation { properties: "x"; duration: 250 } + } + ] + } - Keys.onPressed: { - root.keyPressed = true; - if (event.key == Qt.Key_Return || event.key == Qt.Key_Select || event.key == Qt.Key_Right) { - view.currentItem.launch(); - event.accepted = true; + ListView { + id: view2 + anchors.top: titleBar.bottom + anchors.bottom: parent.bottom + x: parent.right + width: parent.width + model: folders2 + delegate: folderDelegate + highlight: Rectangle { color: palette.highlight; visible: root.keyPressed } + clip: true + focus: true + pressDelay: 100 + states: [ + State { + name: "current" + PropertyChanges { target: view2; x: 0 } + }, + State { + name: "exitLeft" + PropertyChanges { target: view2; x: -root.width } + }, + State { + name: "exitRight" + PropertyChanges { target: view2; x: root.width } } + ] + transitions: [ + Transition { + to: "current" + SequentialAnimation { + NumberAnimation { properties: "x"; duration: 250 } + } + }, + Transition { + NumberAnimation { properties: "x"; duration: 250 } + } + ] + } + + Keys.onPressed: { + root.keyPressed = true; + if (event.key == Qt.Key_Return || event.key == Qt.Key_Select || event.key == Qt.Key_Right) { + view.currentItem.launch(); + event.accepted = true; } - Keys.onLeftPressed: folders.folder = up(folders.folder) } + Keys.onLeftPressed: up() Rectangle { id: titleBar @@ -98,16 +203,9 @@ Rectangle { height: titleBar.height border.color: palette.mid; color: "transparent" - Script { - function up(path) { - var pos = path.toString().lastIndexOf("/"); - return path.toString().substring(0, pos); - } - } - Image { anchors.centerIn: parent; source: "images/up.png" } MouseRegion { id: upRegion; anchors.fill: parent - onClicked: if (folders.parentFolder != "") folders.folder = folders.parentFolder + onClicked: if (folders.parentFolder != "") up() } states: [ State { diff --git a/examples/declarative/loader/images/fileopen.png b/examples/declarative/loader/images/fileopen.png deleted file mode 100644 index 4aaf149..0000000 Binary files a/examples/declarative/loader/images/fileopen.png and /dev/null differ diff --git a/examples/declarative/loader/images/folder.png b/examples/declarative/loader/images/folder.png new file mode 100644 index 0000000..e53e2ad Binary files /dev/null and b/examples/declarative/loader/images/folder.png differ diff --git a/examples/declarative/loader/loader.qrc b/examples/declarative/loader/loader.qrc index 73ee253..671940f 100644 --- a/examples/declarative/loader/loader.qrc +++ b/examples/declarative/loader/loader.qrc @@ -1,9 +1,9 @@ - + loader.qml Browser.qml - images/fileopen.png images/up.png Button.qml + images/folder.png -- cgit v0.12 From 1446783d7bc757eaff1291861d7a90a4a8c7ad42 Mon Sep 17 00:00:00 2001 From: Martin Jones Date: Fri, 16 Oct 2009 17:15:11 +1000 Subject: Symbian build fixes --- src/declarative/extra/qmlfolderlistmodel.h | 2 +- src/s60installs/qt.iby | 2 ++ src/s60installs/s60installs.pro | 8 ++++++++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/declarative/extra/qmlfolderlistmodel.h b/src/declarative/extra/qmlfolderlistmodel.h index cee44e8..66e600b 100644 --- a/src/declarative/extra/qmlfolderlistmodel.h +++ b/src/declarative/extra/qmlfolderlistmodel.h @@ -61,7 +61,7 @@ class Q_DECLARATIVE_EXPORT QmlFolderListModel : public QListModelInterface, publ Q_INTERFACES(QmlParserStatus) Q_PROPERTY(QUrl folder READ folder WRITE setFolder NOTIFY folderChanged) - Q_PROPERTY(QString parentFolder READ parentFolder NOTIFY folderChanged) + Q_PROPERTY(QUrl parentFolder READ parentFolder NOTIFY folderChanged) Q_PROPERTY(QStringList nameFilters READ nameFilters WRITE setNameFilters) Q_PROPERTY(SortField sortField READ sortField WRITE setSortField) Q_PROPERTY(bool sortReversed READ sortReversed WRITE setSortReversed) diff --git a/src/s60installs/qt.iby b/src/s60installs/qt.iby index 3a7f008..db469e4 100644 --- a/src/s60installs/qt.iby +++ b/src/s60installs/qt.iby @@ -53,6 +53,8 @@ file=ABI_DIR\BUILD_DIR\QtXml.dll SHARED_LIB_DIR\QtXml.dll PAG file=ABI_DIR\BUILD_DIR\QtNetwork.dll SHARED_LIB_DIR\QtNetwork.dll PAGED file=ABI_DIR\BUILD_DIR\QtScript.dll SHARED_LIB_DIR\QtScript.dll PAGED file=ABI_DIR\BUILD_DIR\QtTest.dll SHARED_LIB_DIR\QtTest.dll PAGED +file=ABI_DIR\BUILD_DIR\QtXmlPatterns.dll SHARED_LIB_DIR\QtXmlPatterns.dll PAGED +file=ABI_DIR\BUILD_DIR\QtDeclarative.dll SHARED_LIB_DIR\QtDeclarative.dll PAGED // imageformats file=ABI_DIR\BUILD_DIR\qgif.dll SHARED_LIB_DIR\qgif.dll PAGED diff --git a/src/s60installs/s60installs.pro b/src/s60installs/s60installs.pro index 3aef05e..9a7afac 100644 --- a/src/s60installs/s60installs.pro +++ b/src/s60installs/s60installs.pro @@ -98,6 +98,14 @@ symbian: { qtlibraries.sources += QtWebKit.dll } + contains(QT_CONFIG, xmlpatterns): { + qtlibraries.sources += QtXmlPatterns.dll + } + + contains(QT_CONFIG, declarative): { + qtlibraries.sources += QtDeclarative.dll + } + graphicssystems_plugins.path = $$QT_PLUGINS_BASE_DIR/graphicssystems contains(QT_CONFIG, openvg) { qtlibraries.sources = QtOpenVG.dll -- cgit v0.12 From 80c1dbf6799be4d62b399fb8e1e15052069adc81 Mon Sep 17 00:00:00 2001 From: Martin Jones Date: Fri, 16 Oct 2009 17:18:53 +1000 Subject: More loader improvement --- examples/declarative/loader/Browser.qml | 14 +++++++------- examples/declarative/loader/images/titlebar.png | Bin 0 -> 1436 bytes examples/declarative/loader/images/titlebar.sci | 5 +++++ examples/declarative/loader/loader.qrc | 2 ++ 4 files changed, 14 insertions(+), 7 deletions(-) create mode 100644 examples/declarative/loader/images/titlebar.png create mode 100644 examples/declarative/loader/images/titlebar.sci diff --git a/examples/declarative/loader/Browser.qml b/examples/declarative/loader/Browser.qml index 464c994..15e7b12 100644 --- a/examples/declarative/loader/Browser.qml +++ b/examples/declarative/loader/Browser.qml @@ -111,7 +111,6 @@ Rectangle { model: folders1 delegate: folderDelegate highlight: Rectangle { color: palette.highlight; visible: root.keyPressed } - clip: true focus: true pressDelay: 100 state: current @@ -149,10 +148,10 @@ Rectangle { anchors.bottom: parent.bottom x: parent.right width: parent.width +// state: "exitRight" model: folders2 delegate: folderDelegate highlight: Rectangle { color: palette.highlight; visible: root.keyPressed } - clip: true focus: true pressDelay: 100 states: [ @@ -191,11 +190,12 @@ Rectangle { } Keys.onLeftPressed: up() - Rectangle { - id: titleBar - width: parent.width + BorderImage { + source: "images/titlebar.sci"; + width: parent.width; height: 48 - color: palette.lighter(palette.window); border.color: palette.mid + y: -7 + id: titleBar Rectangle { id: upButton @@ -219,7 +219,7 @@ Rectangle { Text { anchors.left: upButton.right; anchors.right: parent.right; height: parent.height anchors.leftMargin: 4; anchors.rightMargin: 4 - text: folders.folder; color: palette.text + text: folders.folder; color: "white" elide: "ElideLeft"; horizontalAlignment: "AlignRight"; verticalAlignment: "AlignVCenter" font.pixelSize: 32 } diff --git a/examples/declarative/loader/images/titlebar.png b/examples/declarative/loader/images/titlebar.png new file mode 100644 index 0000000..51c9008 Binary files /dev/null and b/examples/declarative/loader/images/titlebar.png differ diff --git a/examples/declarative/loader/images/titlebar.sci b/examples/declarative/loader/images/titlebar.sci new file mode 100644 index 0000000..0418d94 --- /dev/null +++ b/examples/declarative/loader/images/titlebar.sci @@ -0,0 +1,5 @@ +border.left: 10 +border.top: 12 +border.bottom: 12 +border.right: 10 +source: titlebar.png diff --git a/examples/declarative/loader/loader.qrc b/examples/declarative/loader/loader.qrc index 671940f..94d7b92 100644 --- a/examples/declarative/loader/loader.qrc +++ b/examples/declarative/loader/loader.qrc @@ -5,5 +5,7 @@ images/up.png Button.qml images/folder.png + images/titlebar.sci + images/titlebar.png -- cgit v0.12 From 9d22aa7aa14a200d8c1fc0f1b4b1ead540e45e67 Mon Sep 17 00:00:00 2001 From: Martin Jones Date: Fri, 16 Oct 2009 17:28:15 +1000 Subject: More loader improvement. --- examples/declarative/loader/Browser.qml | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/examples/declarative/loader/Browser.qml b/examples/declarative/loader/Browser.qml index 15e7b12..18dc206 100644 --- a/examples/declarative/loader/Browser.qml +++ b/examples/declarative/loader/Browser.qml @@ -146,9 +146,8 @@ Rectangle { id: view2 anchors.top: titleBar.bottom anchors.bottom: parent.bottom - x: parent.right + x: parent.width width: parent.width -// state: "exitRight" model: folders2 delegate: folderDelegate highlight: Rectangle { color: palette.highlight; visible: root.keyPressed } @@ -199,9 +198,9 @@ Rectangle { Rectangle { id: upButton - width: 48 - height: titleBar.height - border.color: palette.mid; color: "transparent" + width: 40 + height: titleBar.height - 7 + color: "transparent" Image { anchors.centerIn: parent; source: "images/up.png" } MouseRegion { id: upRegion; anchors.fill: parent @@ -215,6 +214,12 @@ Rectangle { } ] } + Rectangle { + color: "gray" + x: 40 + width: 1 + height: 40 + } Text { anchors.left: upButton.right; anchors.right: parent.right; height: parent.height -- cgit v0.12