From ba55b1fee6d7f1d7d669e291fd0e0db17b6c40ed Mon Sep 17 00:00:00 2001 From: Michael Brasser Date: Thu, 17 Dec 2009 11:21:18 +1000 Subject: Correctly determine QScriptValue::isQObject() for QObjects using the QScriptDeclarativeClass. This allows us to pass QObjects to QML-defined functions which expect a QVariant (and will presumably help in other cases where we expect transparent QObject <-> QVariant conversion in the engine). Task-number: QTBUG-6178 Reviewed-by: Aaron Kennedy --- src/declarative/qml/qmlobjectscriptclass.cpp | 5 +++++ src/declarative/qml/qmlobjectscriptclass_p.h | 1 + src/script/api/qscriptvalue.cpp | 12 ++++++++---- src/script/bridge/qscriptdeclarativeclass.cpp | 5 +++++ src/script/bridge/qscriptdeclarativeclass_p.h | 1 + 5 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/declarative/qml/qmlobjectscriptclass.cpp b/src/declarative/qml/qmlobjectscriptclass.cpp index 3d0581d..30d4422 100644 --- a/src/declarative/qml/qmlobjectscriptclass.cpp +++ b/src/declarative/qml/qmlobjectscriptclass.cpp @@ -306,6 +306,11 @@ void QmlObjectScriptClass::setProperty(QObject *obj, QmlMetaPropertyPrivate::write(obj, *lastData, v, evalContext); } +bool QmlObjectScriptClass::isQObject() const +{ + return true; +} + QObject *QmlObjectScriptClass::toQObject(Object *object, bool *ok) { if (ok) *ok = true; diff --git a/src/declarative/qml/qmlobjectscriptclass_p.h b/src/declarative/qml/qmlobjectscriptclass_p.h index 20c68ce..923be73 100644 --- a/src/declarative/qml/qmlobjectscriptclass_p.h +++ b/src/declarative/qml/qmlobjectscriptclass_p.h @@ -96,6 +96,7 @@ protected: virtual QScriptValue property(Object *, const Identifier &); virtual void setProperty(Object *, const Identifier &name, const QScriptValue &); + virtual bool isQObject() const; virtual QObject *toQObject(Object *, bool *ok = 0); private: diff --git a/src/script/api/qscriptvalue.cpp b/src/script/api/qscriptvalue.cpp index 286230f..b9be285 100644 --- a/src/script/api/qscriptvalue.cpp +++ b/src/script/api/qscriptvalue.cpp @@ -54,6 +54,7 @@ #include "bridge/qscriptvariant_p.h" #include "bridge/qscriptqobject_p.h" #include "bridge/qscriptdeclarativeclass_p.h" +#include "bridge/qscriptdeclarativeobject_p.h" /*! \since 4.3 @@ -1570,9 +1571,10 @@ QObject *QScriptValue::toQObject() const Q_D(const QScriptValue); if (isQObject()) { QScriptObject *object = static_cast(JSC::asObject(d->jscValue)); - return static_cast(object->delegate())->value(); - } else if (QScriptDeclarativeClass *dc = QScriptDeclarativeClass::scriptClass(*this)) { - return dc->toQObject(QScriptDeclarativeClass::object(*this)); + QScriptObjectDelegate *delegate = object->delegate(); + if (delegate->type() == QScriptObjectDelegate::DeclarativeClassObject) + return static_cast(delegate)->scriptClass()->toQObject(QScriptDeclarativeClass::object(*this)); + return static_cast(delegate)->value(); } else if (isVariant()) { QVariant var = toVariant(); int type = var.userType(); @@ -2245,7 +2247,9 @@ bool QScriptValue::isQObject() const return false; QScriptObject *object = static_cast(JSC::asObject(d->jscValue)); QScriptObjectDelegate *delegate = object->delegate(); - return (delegate && (delegate->type() == QScriptObjectDelegate::QtObject)); + return (delegate && (delegate->type() == QScriptObjectDelegate::QtObject || + (delegate->type() == QScriptObjectDelegate::DeclarativeClassObject && + static_cast(delegate)->scriptClass()->isQObject()))); } /*! diff --git a/src/script/bridge/qscriptdeclarativeclass.cpp b/src/script/bridge/qscriptdeclarativeclass.cpp index 98b3e26..2c13066 100644 --- a/src/script/bridge/qscriptdeclarativeclass.cpp +++ b/src/script/bridge/qscriptdeclarativeclass.cpp @@ -320,6 +320,11 @@ QStringList QScriptDeclarativeClass::propertyNames(Object *object) return QStringList(); } +bool QScriptDeclarativeClass::isQObject() const +{ + return false; +} + QObject *QScriptDeclarativeClass::toQObject(Object *, bool *ok) { if (ok) *ok = false; diff --git a/src/script/bridge/qscriptdeclarativeclass_p.h b/src/script/bridge/qscriptdeclarativeclass_p.h index 40e5051..f2557bd 100644 --- a/src/script/bridge/qscriptdeclarativeclass_p.h +++ b/src/script/bridge/qscriptdeclarativeclass_p.h @@ -97,6 +97,7 @@ public: virtual QStringList propertyNames(Object *); + virtual bool isQObject() const; virtual QObject *toQObject(Object *, bool *ok = 0); virtual QVariant toVariant(Object *, bool *ok = 0); -- cgit v0.12 From e757e999bbc5a65e6cdc2f1c53a77f7918e88928 Mon Sep 17 00:00:00 2001 From: Michael Brasser Date: Thu, 17 Dec 2009 11:38:50 +1000 Subject: Fix regression introduced in 6fe6e803f08750534a6c14b4a2847a6ec1b29350. Only use the component name if it is actually a type. --- src/declarative/qml/qmlcompiler.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/declarative/qml/qmlcompiler.cpp b/src/declarative/qml/qmlcompiler.cpp index aeda573..bd46bbe 100644 --- a/src/declarative/qml/qmlcompiler.cpp +++ b/src/declarative/qml/qmlcompiler.cpp @@ -2195,7 +2195,8 @@ bool QmlCompiler::buildDynamicMeta(QmlParser::Object *obj, DynamicMetaMode mode) int lastSlash = path.lastIndexOf(QLatin1Char('/')); if (lastSlash > -1) { QString nameBase = path.mid(lastSlash + 1, path.length()-lastSlash-5); - newClassName = nameBase.toUtf8() + "_QMLTYPE_" + QByteArray::number(idx); + if (!nameBase.isEmpty() && nameBase.at(0).isUpper()) + newClassName = nameBase.toUtf8() + "_QMLTYPE_" + QByteArray::number(idx); } } -- cgit v0.12 From 1178d3d62008873d7e8ce28e1671dd6c2b43b581 Mon Sep 17 00:00:00 2001 From: Michael Brasser Date: Thu, 17 Dec 2009 12:02:58 +1000 Subject: Use destroy() to destroy bindings. --- src/declarative/qml/qmlmetaproperty.cpp | 3 ++- src/declarative/util/qmlstate.cpp | 6 ++++-- src/declarative/util/qmltransitionmanager.cpp | 2 +- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/declarative/qml/qmlmetaproperty.cpp b/src/declarative/qml/qmlmetaproperty.cpp index 9c7aff8..a315141 100644 --- a/src/declarative/qml/qmlmetaproperty.cpp +++ b/src/declarative/qml/qmlmetaproperty.cpp @@ -549,7 +549,8 @@ QmlAbstractBinding * QmlMetaProperty::setBinding(QmlAbstractBinding *newBinding, QmlMetaProperty::WriteFlags flags) const { if (!isProperty() || (type() & Attached) || !d->object) { - delete newBinding; + if (newBinding) + newBinding->destroy(); return 0; } diff --git a/src/declarative/util/qmlstate.cpp b/src/declarative/util/qmlstate.cpp index 1749c3a..c2201a6 100644 --- a/src/declarative/util/qmlstate.cpp +++ b/src/declarative/util/qmlstate.cpp @@ -320,7 +320,7 @@ void Action::deleteFromBinding() { if (fromBinding) { property.setBinding(0); - delete fromBinding; + fromBinding->destroy(); fromBinding = 0; } } @@ -419,7 +419,9 @@ void QmlState::apply(QmlStateGroup *group, QmlTransition *trans, QmlState *rever } if (!found) { QVariant cur = d->revertList.at(ii).property.read(); - delete d->revertList.at(ii).property.setBinding(0); + QmlAbstractBinding *delBinding = d->revertList.at(ii).property.setBinding(0); + if (delBinding) + delBinding->destroy(); Action a; a.property = d->revertList.at(ii).property; diff --git a/src/declarative/util/qmltransitionmanager.cpp b/src/declarative/util/qmltransitionmanager.cpp index 8ae5785..5527fe5 100644 --- a/src/declarative/util/qmltransitionmanager.cpp +++ b/src/declarative/util/qmltransitionmanager.cpp @@ -254,7 +254,7 @@ void QmlTransitionManager::cancel() Action action = d->bindingsList[i]; if (action.toBinding && action.deletableToBinding) { action.property.setBinding(0); - delete action.toBinding; + action.toBinding->destroy(); action.toBinding = 0; action.deletableToBinding = false; } else if (action.event) { -- cgit v0.12