diff options
Diffstat (limited to 'src/declarative')
48 files changed, 368 insertions, 204 deletions
diff --git a/src/declarative/debugger/qmldebugger.cpp b/src/declarative/debugger/qmldebugger.cpp index aad11de..9122d87 100644 --- a/src/declarative/debugger/qmldebugger.cpp +++ b/src/declarative/debugger/qmldebugger.cpp @@ -262,7 +262,7 @@ bool QmlDebugger::makeItem(QObject *obj, QmlDebuggerItem *item) delete item; return false; - } else if(QmlBoundSignal *bs = qobject_cast<QmlBoundSignal *>(obj)) { + } else if(qobject_cast<QmlBoundSignal *>(obj)) { delete item; return false; } else { diff --git a/src/declarative/declarative.pro b/src/declarative/declarative.pro index 9f555fe..4bf267c 100644 --- a/src/declarative/declarative.pro +++ b/src/declarative/declarative.pro @@ -19,7 +19,6 @@ include(util/util.pri) include(fx/fx.pri) include(canvas/canvas.pri) include(qml/qml.pri) -include(timeline/timeline.pri) include(extra/extra.pri) include(widgets/widgets.pri) include(test/test.pri) diff --git a/src/declarative/extra/qfxflowview.cpp b/src/declarative/extra/qfxflowview.cpp index 254e423..412cbc8 100644 --- a/src/declarative/extra/qfxflowview.cpp +++ b/src/declarative/extra/qfxflowview.cpp @@ -199,8 +199,6 @@ void QFxFlowView::reflowDrag(const QPointF &dp) qreal maxY = 0; qreal x = 0; - int flowedItems = 0; - clearTimeLine(); QList<QFxItem *> items; @@ -316,6 +314,7 @@ QRectF QFxFlowView::rectForItem(int idx) const void QFxFlowView::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) { + Q_UNUSED(event); if (m_dragItem) { m_dragItem->setZ(0); diff --git a/src/declarative/extra/qfxflowview.h b/src/declarative/extra/qfxflowview.h index 2bec6a1..126f567 100644 --- a/src/declarative/extra/qfxflowview.h +++ b/src/declarative/extra/qfxflowview.h @@ -42,7 +42,7 @@ #ifndef QFXFLOWVIEW_H #define QFXFLOWVIEW_H -#include <QtDeclarative/QmlTimeLine> +#include <private/qmltimeline_p.h> #include <QtDeclarative/qfxitem.h> QT_BEGIN_HEADER diff --git a/src/declarative/extra/qfxparticles.cpp b/src/declarative/extra/qfxparticles.cpp index 62fe4c1..3130f06 100644 --- a/src/declarative/extra/qfxparticles.cpp +++ b/src/declarative/extra/qfxparticles.cpp @@ -54,7 +54,7 @@ #define INT_MAX 2147483647 #endif #include <qfxpixmap.h> -#include <qfxperf.h> +#include <private/qfxperf_p.h> #include <private/qmlanimation_p.h> #include "qfxparticles.h" diff --git a/src/declarative/extra/qmlfolderlistmodel.cpp b/src/declarative/extra/qmlfolderlistmodel.cpp index 8b008a5..acee5e1 100644 --- a/src/declarative/extra/qmlfolderlistmodel.cpp +++ b/src/declarative/extra/qmlfolderlistmodel.cpp @@ -51,7 +51,7 @@ class QmlFolderListModelPrivate : public QObjectPrivate public: QmlFolderListModelPrivate() : count(0) { folder = QDir::currentPath(); - nameFilters << "*"; + nameFilters << QLatin1String("*"); } QDirModel model; @@ -81,6 +81,7 @@ QmlFolderListModel::~QmlFolderListModel() QHash<int,QVariant> QmlFolderListModel::data(int index, const QList<int> &roles) const { + Q_UNUSED(roles); Q_D(const QmlFolderListModel); QHash<int,QVariant> folderData; QModelIndex modelIndex = d->model.index(index, 0, d->folderIndex); diff --git a/src/declarative/extra/qmlxmllistmodel.cpp b/src/declarative/extra/qmlxmllistmodel.cpp index 48949b3..95c3de6 100644 --- a/src/declarative/extra/qmlxmllistmodel.cpp +++ b/src/declarative/extra/qmlxmllistmodel.cpp @@ -289,11 +289,11 @@ class QmlXmlListModelPrivate : public QObjectPrivate Q_DECLARE_PUBLIC(QmlXmlListModel) public: QmlXmlListModelPrivate() - : isClassComplete(false), size(-1), highestRole(Qt::UserRole) + : isComponentComplete(true), size(-1), highestRole(Qt::UserRole) , reply(0), status(QmlXmlListModel::Idle), progress(0.0) , queryId(-1), roleObjects(this) {} - bool isClassComplete; + bool isComponentComplete; QUrl src; QString query; QString namespaces; @@ -549,10 +549,16 @@ qreal QmlXmlListModel::progress() const return d->progress; } -void QmlXmlListModel::classComplete() +void QmlXmlListModel::classBegin() { Q_D(QmlXmlListModel); - d->isClassComplete = true; + d->isComponentComplete = false; +} + +void QmlXmlListModel::componentComplete() +{ + Q_D(QmlXmlListModel); + d->isComponentComplete = true; reload(); } @@ -566,7 +572,7 @@ void QmlXmlListModel::reload() { Q_D(QmlXmlListModel); - if (!d->isClassComplete) + if (!d->isComponentComplete) return; d->qmlXmlQuery.abort(); diff --git a/src/declarative/extra/qmlxmllistmodel.h b/src/declarative/extra/qmlxmllistmodel.h index 804f13f..d9871ab 100644 --- a/src/declarative/extra/qmlxmllistmodel.h +++ b/src/declarative/extra/qmlxmllistmodel.h @@ -124,7 +124,8 @@ public: Status status() const; qreal progress() const; - virtual void classComplete(); + virtual void classBegin(); + virtual void componentComplete(); signals: void statusChanged(Status); diff --git a/src/declarative/fx/qfxcomponentinstance.cpp b/src/declarative/fx/qfxcomponentinstance.cpp index d3f7061..7f592a9 100644 --- a/src/declarative/fx/qfxcomponentinstance.cpp +++ b/src/declarative/fx/qfxcomponentinstance.cpp @@ -41,7 +41,7 @@ #include "qfxcomponentinstance.h" #include "qfxcomponentinstance_p.h" -#include <qfxperf.h> +#include <private/qfxperf_p.h> #include <qfxcontentwrapper.h> #include <QtDeclarative/qmlinfo.h> diff --git a/src/declarative/fx/qfxflickable_p.h b/src/declarative/fx/qfxflickable_p.h index a3b1500..28ec6d8 100644 --- a/src/declarative/fx/qfxflickable_p.h +++ b/src/declarative/fx/qfxflickable_p.h @@ -57,7 +57,7 @@ #include "qfxflickable.h" #include "qfxitem_p.h" #include "qml.h" -#include "qmltimelinevalueproxy.h" +#include "private/qmltimeline_p.h" #include "private/qmlanimation_p.h" QT_BEGIN_NAMESPACE diff --git a/src/declarative/fx/qfximage.cpp b/src/declarative/fx/qfximage.cpp index 58d597a..539ad02 100644 --- a/src/declarative/fx/qfximage.cpp +++ b/src/declarative/fx/qfximage.cpp @@ -41,7 +41,7 @@ #include "qfximage.h" #include "qfximage_p.h" -#include <qfxperf.h> +#include <private/qfxperf_p.h> #if defined(QFX_RENDER_OPENGL) #include <glsave.h> #endif diff --git a/src/declarative/fx/qfxitem.cpp b/src/declarative/fx/qfxitem.cpp index 7ccad5f..223af60 100644 --- a/src/declarative/fx/qfxitem.cpp +++ b/src/declarative/fx/qfxitem.cpp @@ -47,7 +47,7 @@ #include <QNetworkRequest> #include <QGraphicsSceneMouseEvent> #include <QtScript/qscriptengine.h> -#include <qfxperf.h> +#include <private/qfxperf_p.h> #include "qmlengine.h" #include "qmlstate.h" diff --git a/src/declarative/fx/qfxlayouts.cpp b/src/declarative/fx/qfxlayouts.cpp index af51318..20e7c7c 100644 --- a/src/declarative/fx/qfxlayouts.cpp +++ b/src/declarative/fx/qfxlayouts.cpp @@ -45,7 +45,7 @@ #include "qmlstate.h" #include "qmlstategroup.h" #include "qmlstateoperations.h" -#include "qfxperf.h" +#include "private/qfxperf_p.h" #include "qfxlayouts.h" #include "qfxlayouts_p.h" diff --git a/src/declarative/fx/qfxpath.cpp b/src/declarative/fx/qfxpath.cpp index be731b1..4c241d3 100644 --- a/src/declarative/fx/qfxpath.cpp +++ b/src/declarative/fx/qfxpath.cpp @@ -41,7 +41,7 @@ #include "qfxpath.h" #include "qfxpath_p.h" -#include <qfxperf.h> +#include <private/qfxperf_p.h> #include <private/qbezier_p.h> diff --git a/src/declarative/fx/qfxpathview_p.h b/src/declarative/fx/qfxpathview_p.h index b5c5ba2..b77c2a0 100644 --- a/src/declarative/fx/qfxpathview_p.h +++ b/src/declarative/fx/qfxpathview_p.h @@ -58,7 +58,6 @@ #include "qfxitem_p.h" #include "qfxvisualitemmodel.h" #include "qml.h" -#include "qmltimelinevalueproxy.h" #include "private/qmlanimation_p.h" QT_BEGIN_NAMESPACE diff --git a/src/declarative/fx/qfxpixmap.cpp b/src/declarative/fx/qfxpixmap.cpp index 0ea94f5..5ee6528 100644 --- a/src/declarative/fx/qfxpixmap.cpp +++ b/src/declarative/fx/qfxpixmap.cpp @@ -43,7 +43,7 @@ #include <QHash> #include <QNetworkReply> #include <QPixmapCache> -#include <qfxperf.h> +#include <private/qfxperf_p.h> #include <QtDeclarative/qmlengine.h> #include <QFile> diff --git a/src/declarative/fx/qfxtext.cpp b/src/declarative/fx/qfxtext.cpp index 9550af9..f2519dc 100644 --- a/src/declarative/fx/qfxtext.cpp +++ b/src/declarative/fx/qfxtext.cpp @@ -48,7 +48,7 @@ #include "glbasicshaders.h" #endif -#include <qfxperf.h> +#include <private/qfxperf_p.h> #include <QTextLayout> #include <QTextLine> #include <QTextDocument> @@ -701,6 +701,21 @@ void QFxTextPrivate::checkImgCache() imgDirty = false; } +bool QFxText::smoothTransform() const +{ + Q_D(const QFxText); + return d->smooth; +} + +void QFxText::setSmoothTransform(bool s) +{ + Q_D(QFxText); + if (d->smooth == s) + return; + d->smooth = s; + update(); +} + #if defined(QFX_RENDER_QPAINTER) void QFxText::paintContents(QPainter &p) { @@ -709,6 +724,11 @@ void QFxText::paintContents(QPainter &p) if (d->imgCache.isNull()) return; + bool oldAA = p.testRenderHint(QPainter::Antialiasing); + bool oldSmooth = p.testRenderHint(QPainter::SmoothPixmapTransform); + if (d->smooth) + p.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform, d->smooth); + int w = width(); int h = height(); @@ -749,6 +769,11 @@ void QFxText::paintContents(QPainter &p) p.drawPixmap(x, y, d->imgCache); if (needClip) p.restore(); + + if (d->smooth) { + p.setRenderHint(QPainter::Antialiasing, oldAA); + p.setRenderHint(QPainter::SmoothPixmapTransform, oldSmooth); + } } #elif defined(QFX_RENDER_OPENGL2) diff --git a/src/declarative/fx/qfxtext.h b/src/declarative/fx/qfxtext.h index 1f5a7b8..104d18c 100644 --- a/src/declarative/fx/qfxtext.h +++ b/src/declarative/fx/qfxtext.h @@ -69,6 +69,7 @@ class Q_DECLARATIVE_EXPORT QFxText : public QFxItem Q_PROPERTY(bool wrap READ wrap WRITE setWrap) Q_PROPERTY(Qt::TextElideMode elide READ elideMode WRITE setElideMode) Q_PROPERTY(QString activeLink READ activeLink) + Q_PROPERTY(bool smooth READ smoothTransform WRITE setSmoothTransform) public: QFxText(QFxItem *parent=0); @@ -113,6 +114,9 @@ public: QString activeLink() const; + bool smoothTransform() const; + void setSmoothTransform(bool); + virtual void dump(int depth); virtual QString propertyInfo() const; diff --git a/src/declarative/fx/qfxtext_p.h b/src/declarative/fx/qfxtext_p.h index dfaef63..c58705c 100644 --- a/src/declarative/fx/qfxtext_p.h +++ b/src/declarative/fx/qfxtext_p.h @@ -75,7 +75,7 @@ public: QFxTextPrivate() : _font(0), color((QRgb)0), style(QFxText::Normal), imgDirty(true), hAlign(QFxText::AlignLeft), vAlign(QFxText::AlignTop), elideMode(Qt::ElideNone), - dirty(false), wrap(false), richText(false), singleline(false), control(0), doc(0) + dirty(false), wrap(false), smooth(false), richText(false), singleline(false), control(0), doc(0) { } @@ -125,6 +125,7 @@ public: Qt::TextElideMode elideMode; bool dirty; bool wrap; + bool smooth; bool richText; bool singleline; QTextControl *control; diff --git a/src/declarative/fx/qfxtextedit.cpp b/src/declarative/fx/qfxtextedit.cpp index 03dd63f..7f08fba 100644 --- a/src/declarative/fx/qfxtextedit.cpp +++ b/src/declarative/fx/qfxtextedit.cpp @@ -48,7 +48,7 @@ #include "glbasicshaders.h" #endif -#include <qfxperf.h> +#include <private/qfxperf_p.h> #include "qfxevents_p.h" #include <QTextLayout> #include <QTextLine> diff --git a/src/declarative/qml/qmlbasicscript.cpp b/src/declarative/qml/qmlbasicscript.cpp index 8b0cb42..0cfb587 100644 --- a/src/declarative/qml/qmlbasicscript.cpp +++ b/src/declarative/qml/qmlbasicscript.cpp @@ -45,7 +45,7 @@ #include <private/qmlengine_p.h> #include <private/qmlcontext_p.h> #include <QStack> -#include <qfxperf.h> +#include <private/qfxperf_p.h> #include <private/qmlrefcount_p.h> #include <private/qmljsast_p.h> #include <private/qmljsengine_p.h> diff --git a/src/declarative/qml/qmlbindablevalue.cpp b/src/declarative/qml/qmlbindablevalue.cpp index f447d4f..8e74250 100644 --- a/src/declarative/qml/qmlbindablevalue.cpp +++ b/src/declarative/qml/qmlbindablevalue.cpp @@ -45,7 +45,7 @@ #include <qmlcontext.h> #include <qmlinfo.h> #include <QVariant> -#include <qfxperf.h> +#include <private/qfxperf_p.h> #include <QtCore/qdebug.h> Q_DECLARE_METATYPE(QList<QObject *>); diff --git a/src/declarative/qml/qmlcompiler.cpp b/src/declarative/qml/qmlcompiler.cpp index 47f69a0..aa2cf84 100644 --- a/src/declarative/qml/qmlcompiler.cpp +++ b/src/declarative/qml/qmlcompiler.cpp @@ -40,7 +40,7 @@ ****************************************************************************/ #include "private/qmlcompiler_p.h" -#include <qfxperf.h> +#include <private/qfxperf_p.h> #include "qmlparser_p.h" #include "private/qmlscriptparser_p.h" #include <qmlpropertyvaluesource.h> @@ -554,17 +554,18 @@ void QmlCompiler::compileTree(Object *tree) if (!compileObject(tree, 0)) // Compile failed return; - if (tree->metatype) - static_cast<QMetaObject &>(output->root) = *tree->metaObject(); - else - static_cast<QMetaObject &>(output->root) = *output->types.at(tree->type).metaObject(); - QmlInstruction def; init.line = 0; def.type = QmlInstruction::SetDefault; output->bytecode << def; finalizeComponent(0); + + if (tree->metatype) + static_cast<QMetaObject &>(output->root) = *tree->metaObject(); + else + static_cast<QMetaObject &>(output->root) = *output->types.at(tree->type).metaObject(); + } bool QmlCompiler::compileObject(Object *obj, const BindingContext &ctxt) @@ -798,13 +799,12 @@ bool QmlCompiler::compileComponentFromRoot(Object *obj, const BindingContext &ct if (obj) COMPILE_CHECK(compileObject(obj, ctxt)); - finalizeComponent(count); + COMPILE_CHECK(finalizeComponent(count)); create.createComponent.count = output->bytecode.count() - count; compileState = oldComponentCompileState; return true; } - bool QmlCompiler::compileFetchedObject(Object *obj, const BindingContext &ctxt) { Q_ASSERT(obj->metatype); @@ -1398,7 +1398,7 @@ bool QmlCompiler::compilePropertyLiteralAssignment(QmlParser::Property *prop, return true; } -bool QmlCompiler::compileDynamicMeta(QmlParser::Object *obj) +bool QmlCompiler::compileDynamicMeta(QmlParser::Object *obj, int preAlias) { // ### FIXME - Check that there is only one default property etc. if (obj->dynamicProperties.isEmpty() && @@ -1411,14 +1411,20 @@ bool QmlCompiler::compileDynamicMeta(QmlParser::Object *obj) builder.setClassName(QByteArray(obj->metatype->className()) + "QML"); builder.setFlags(QMetaObjectBuilder::DynamicMetaObject); + bool hasAlias = false; for (int ii = 0; ii < obj->dynamicProperties.count(); ++ii) { const Object::DynamicProperty &p = obj->dynamicProperties.at(ii); - if (p.isDefaultProperty) + if (p.isDefaultProperty && + (p.type != Object::DynamicProperty::Alias || preAlias != -1)) builder.addClassInfo("DefaultProperty", p.name); QByteArray type; switch(p.type) { + case Object::DynamicProperty::Alias: + hasAlias = true; + continue; + break; case Object::DynamicProperty::Variant: type = "QVariant"; break; @@ -1466,7 +1472,29 @@ bool QmlCompiler::compileDynamicMeta(QmlParser::Object *obj) for (int ii = 0; ii < obj->dynamicSlots.count(); ++ii) { const Object::DynamicSlot &s = obj->dynamicSlots.at(ii); builder.addSlot(s.name + "()"); - output->primitives << s.body; + + if (preAlias == -1) + output->primitives << s.body; + } + + QByteArray aliasData; + if (preAlias != -1) { + int dynProperties = 0; + QByteArray data; + int propCount = builder.propertyCount(); + int signalCount = builder.methodCount(); + for (int ii = 0; ii < obj->dynamicProperties.count(); ++ii) { + const Object::DynamicProperty &p = obj->dynamicProperties.at(ii); + + if (p.type == Object::DynamicProperty::Alias) { + dynProperties++; + compileAlias(builder, data, obj, p); + } + } + aliasData.append((const char *)&dynProperties, sizeof(int)); + aliasData.append((const char *)&propCount, sizeof(int)); + aliasData.append((const char *)&signalCount, sizeof(int)); + aliasData.append(data); } if (obj->metatype) @@ -1475,17 +1503,37 @@ bool QmlCompiler::compileDynamicMeta(QmlParser::Object *obj) obj->extObjectData = builder.toMetaObject(); static_cast<QMetaObject &>(obj->extObject) = *obj->extObjectData; - output->synthesizedMetaObjects << obj->extObjectData; - QmlInstruction store; - store.type = QmlInstruction::StoreMetaObject; - store.storeMeta.data = output->synthesizedMetaObjects.count() - 1; - store.storeMeta.slotData = slotStart; - store.line = obj->location.start.line; - output->bytecode << store; + if (preAlias != -1) { + QmlInstruction &store = output->bytecode[preAlias]; + + store.storeMeta.aliasData = output->indexForByteArray(aliasData); + qFree(output->synthesizedMetaObjects.at(store.storeMeta.data)); + output->synthesizedMetaObjects[store.storeMeta.data] = obj->extObjectData; + + } else { + output->synthesizedMetaObjects << obj->extObjectData; + QmlInstruction store; + store.type = QmlInstruction::StoreMetaObject; + store.storeMeta.data = output->synthesizedMetaObjects.count() - 1; + store.storeMeta.slotData = slotStart; + store.storeMeta.aliasData = -1; + store.line = obj->location.start.line; + output->bytecode << store; + + if (hasAlias) { + AliasReference alias; + alias.object = obj; + alias.instructionIdx = output->bytecode.count() - 1; + compileState.aliases << alias; + } + } for (int ii = 0; ii < obj->dynamicProperties.count(); ++ii) { const Object::DynamicProperty &p = obj->dynamicProperties.at(ii); + if (p.type == Object::DynamicProperty::Alias) + continue; + if (p.defaultValue) { p.defaultValue->name = p.name; p.defaultValue->isDefault = false; @@ -1496,6 +1544,66 @@ bool QmlCompiler::compileDynamicMeta(QmlParser::Object *obj) return true; } +#include <private/qmljsparser_p.h> +static QStringList astNodeToStringList(QmlJS::AST::Node *node) +{ + if (node->kind == QmlJS::AST::Node::Kind_IdentifierExpression) { + QString name = + static_cast<QmlJS::AST::IdentifierExpression *>(node)->name->asString(); + return QStringList() << name; + } else if (node->kind == QmlJS::AST::Node::Kind_FieldMemberExpression) { + QmlJS::AST::FieldMemberExpression *expr = static_cast<QmlJS::AST::FieldMemberExpression *>(node); + + QStringList rv = astNodeToStringList(expr->base); + if (rv.isEmpty()) + return rv; + rv.append(expr->name->asString()); + return rv; + } + return QStringList(); +} + +bool QmlCompiler::compileAlias(QMetaObjectBuilder &builder, + QByteArray &data, + Object *obj, + const Object::DynamicProperty &prop) +{ + if (!prop.defaultValue) + COMPILE_EXCEPTION("No property alias location"); + + if (prop.defaultValue->values.count() != 1 || + prop.defaultValue->values.at(0)->object || + !prop.defaultValue->values.at(0)->value.isScript()) + COMPILE_EXCEPTION2(prop.defaultValue, "Invalid alias location"); + + QmlJS::AST::Node *node = prop.defaultValue->values.at(0)->value.asAST(); + if (!node) + COMPILE_EXCEPTION("No property alias location"); // ### Can this happen? + + QStringList alias = astNodeToStringList(node); + + if (alias.count() != 2) + COMPILE_EXCEPTION2(prop.defaultValue, "Invalid alias location"); + + if (!compileState.ids.contains(alias.at(0))) + COMPILE_EXCEPTION2(prop.defaultValue, "Invalid alias location"); + + const IdReference &id = compileState.ids[alias.at(0)]; + int propIdx = id.object->metaObject()->indexOfProperty(alias.at(1).toUtf8().constData()); + + if (-1 == propIdx) + COMPILE_EXCEPTION2(prop.defaultValue, "Invalid alias location"); + + QMetaProperty aliasProperty = id.object->metaObject()->property(propIdx); + + data.append((const char *)&id.idx, sizeof(id.idx)); + data.append((const char *)&propIdx, sizeof(propIdx)); + + builder.addSignal(prop.name + "Changed()"); + builder.addProperty(prop.name, aliasProperty.typeName(), builder.methodCount() - 1); + return true; +} + bool QmlCompiler::compileBinding(QmlParser::Value *value, QmlParser::Property *prop, const BindingContext &ctxt) @@ -1564,17 +1672,29 @@ protected: // Update the init instruction with final data, and optimize some simple // bindings -void QmlCompiler::finalizeComponent(int patch) +bool QmlCompiler::finalizeComponent(int patch) { for (int ii = 0; ii < compileState.bindings.count(); ++ii) { const BindingReference &binding = compileState.bindings.at(ii); finalizeBinding(binding); } + for (int ii = 0; ii < compileState.aliases.count(); ++ii) { + const AliasReference &alias = compileState.aliases.at(ii); + COMPILE_CHECK(finalizeAlias(alias)); + } + output->bytecode[patch].init.dataSize = compileState.savedObjects;; output->bytecode[patch].init.bindingsSize = compileState.bindings.count(); output->bytecode[patch].init.parserStatusSize = compileState.parserStatusCount; + + return true; +} + +bool QmlCompiler::finalizeAlias(const AliasReference &alias) +{ + COMPILE_CHECK(compileDynamicMeta(alias.object, alias.instructionIdx)); } void QmlCompiler::finalizeBinding(const BindingReference &binding) diff --git a/src/declarative/qml/qmlcompiler_p.h b/src/declarative/qml/qmlcompiler_p.h index 819c4ad..1c45f57 100644 --- a/src/declarative/qml/qmlcompiler_p.h +++ b/src/declarative/qml/qmlcompiler_p.h @@ -118,6 +118,7 @@ private: int indexForLocation(const QmlParser::LocationSpan &); }; +class QMetaObjectBuilder; class Q_DECLARATIVE_EXPORT QmlCompiler { public: @@ -181,13 +182,19 @@ private: const QMetaProperty &prop, QmlParser::Value *value); - bool compileDynamicMeta(QmlParser::Object *obj); + bool compileDynamicMeta(QmlParser::Object *obj, int preAlias = -1); + bool compileAlias(QMetaObjectBuilder &, + QByteArray &data, + QmlParser::Object *obj, + const QmlParser::Object::DynamicProperty &); bool compileBinding(QmlParser::Value *, QmlParser::Property *prop, const BindingContext &ctxt); - void finalizeComponent(int patch); + bool finalizeComponent(int patch); struct BindingReference; void finalizeBinding(const BindingReference &); + struct AliasReference; + bool finalizeAlias(const AliasReference &); bool canConvert(int, QmlParser::Object *); QStringList deferredProperties(QmlParser::Object *); @@ -199,6 +206,11 @@ private: int idx; }; + struct AliasReference { + QmlParser::Object *object; + int instructionIdx; + }; + struct BindingReference { QmlParser::Variant expression; QmlParser::Property *property; @@ -215,6 +227,7 @@ private: int savedObjects; int pushedProperties; QList<BindingReference> bindings; + QList<AliasReference> aliases; QmlParser::Object *root; }; ComponentCompileState compileState; diff --git a/src/declarative/qml/qmlcomponent.cpp b/src/declarative/qml/qmlcomponent.cpp index 293082f..d6b38c9 100644 --- a/src/declarative/qml/qmlcomponent.cpp +++ b/src/declarative/qml/qmlcomponent.cpp @@ -46,7 +46,7 @@ #include "qmlvme_p.h" #include "qml.h" #include <QStack> -#include <qfxperf.h> +#include <private/qfxperf_p.h> #include <QStringList> #include <qmlengine.h> #include <QFileInfo> diff --git a/src/declarative/qml/qmlengine.cpp b/src/declarative/qml/qmlengine.cpp index 2a15c27..9b74472 100644 --- a/src/declarative/qml/qmlengine.cpp +++ b/src/declarative/qml/qmlengine.cpp @@ -57,7 +57,7 @@ #include <QDebug> #include <QMetaObject> #include "qml.h" -#include <qfxperf.h> +#include <private/qfxperf_p.h> #include <QStack> #include "private/qmlbasicscript_p.h" #include "private/qmlcompiledcomponent_p.h" diff --git a/src/declarative/qml/qmlinstruction_p.h b/src/declarative/qml/qmlinstruction_p.h index f2f3ac2..40f9a32 100644 --- a/src/declarative/qml/qmlinstruction_p.h +++ b/src/declarative/qml/qmlinstruction_p.h @@ -181,6 +181,7 @@ public: struct { int data; int slotData; + int aliasData; } storeMeta; struct { int value; diff --git a/src/declarative/qml/qmlmetaproperty.cpp b/src/declarative/qml/qmlmetaproperty.cpp index 307f76f..90acd72 100644 --- a/src/declarative/qml/qmlmetaproperty.cpp +++ b/src/declarative/qml/qmlmetaproperty.cpp @@ -42,7 +42,7 @@ #include "qmlmetaproperty.h" #include "qmlmetaproperty_p.h" #include <qml.h> -#include <qfxperf.h> +#include <private/qfxperf_p.h> #include <QStringList> #include <qmlbindablevalue.h> #include <qmlcontext.h> @@ -1002,7 +1002,7 @@ QMetaMethod QmlMetaProperty::method() const */ QmlMetaProperty QmlMetaProperty::createProperty(QObject *obj, const QString &name) { - QStringList path = name.split('.'); + QStringList path = name.split(QLatin1Char('.')); QObject *object = obj; diff --git a/src/declarative/qml/qmlparser.cpp b/src/declarative/qml/qmlparser.cpp index df5e26e..2e7eb69 100644 --- a/src/declarative/qml/qmlparser.cpp +++ b/src/declarative/qml/qmlparser.cpp @@ -48,7 +48,7 @@ #include <QRectF> #include <private/qmlvme_p.h> #include <qmlbindablevalue.h> -#include <qfxperf.h> +#include <private/qfxperf_p.h> #include <qml.h> #include "private/qmlcomponent_p.h" #include <qmlcomponent.h> diff --git a/src/declarative/qml/qmlparser_p.h b/src/declarative/qml/qmlparser_p.h index 9daa336..803c73e 100644 --- a/src/declarative/qml/qmlparser_p.h +++ b/src/declarative/qml/qmlparser_p.h @@ -144,7 +144,7 @@ namespace QmlParser DynamicProperty(); DynamicProperty(const DynamicProperty &); - enum Type { Variant, Int, Bool, Real, String, Url, Color, Date }; + enum Type { Variant, Int, Bool, Real, String, Url, Color, Date, Alias }; bool isDefaultProperty; Type type; diff --git a/src/declarative/qml/qmlscriptparser.cpp b/src/declarative/qml/qmlscriptparser.cpp index 7475943..1c88018 100644 --- a/src/declarative/qml/qmlscriptparser.cpp +++ b/src/declarative/qml/qmlscriptparser.cpp @@ -55,7 +55,7 @@ #include <QCoreApplication> #include <QtDebug> -#include <qfxperf.h> +#include <private/qfxperf_p.h> QT_BEGIN_NAMESPACE @@ -534,6 +534,12 @@ bool ProcessAST::visit(AST::UiPublicMember *node) bool typeFound = false; Object::DynamicProperty::Type type; + + if (memberType == QLatin1String("alias")) { + type = Object::DynamicProperty::Alias; + typeFound = true; + } + for(int ii = 0; !typeFound && ii < propTypeNameToTypesCount; ++ii) { if(QLatin1String(propTypeNameToTypes[ii].name) == memberType) { type = propTypeNameToTypes[ii].type; diff --git a/src/declarative/qml/qmlvme.cpp b/src/declarative/qml/qmlvme.cpp index 962d917..0d88e02 100644 --- a/src/declarative/qml/qmlvme.cpp +++ b/src/declarative/qml/qmlvme.cpp @@ -40,14 +40,13 @@ ****************************************************************************/ #include "qmlvme_p.h" -#include <qfxperf.h> +#include <private/qfxperf_p.h> #include <private/qmlboundsignal_p.h> #include <private/qmlstringconverters_p.h> #include "private/qmetaobjectbuilder_p.h" #include "private/qmldeclarativedata_p.h" #include <qml.h> #include <private/qmlcustomparser_p.h> -#include <qperformancelog.h> #include <QStack> #include <QWidget> #include <private/qmlcompiledcomponent_p.h> @@ -240,7 +239,7 @@ QObject *QmlVME::run(QStack<QObject *> &stack, QmlContext *ctxt, QmlCompiledComp case QmlInstruction::StoreMetaObject: { QObject *target = stack.top(); - new QmlVMEMetaObject(target, synthesizedMetaObjects.at(instr.storeMeta.data), &comp->primitives, instr.storeMeta.slotData, comp); + new QmlVMEMetaObject(target, synthesizedMetaObjects.at(instr.storeMeta.data), &comp->primitives, instr.storeMeta.slotData, (instr.storeMeta.aliasData != -1)?datas.at(instr.storeMeta.aliasData):QByteArray(), comp); } break; diff --git a/src/declarative/qml/qmlvmemetaobject.cpp b/src/declarative/qml/qmlvmemetaobject.cpp index ec269b8..dc06bc5 100644 --- a/src/declarative/qml/qmlvmemetaobject.cpp +++ b/src/declarative/qml/qmlvmemetaobject.cpp @@ -47,6 +47,7 @@ #include <QtCore/qlist.h> #include <QtCore/qdebug.h> #include <qmlexpression.h> +#include <private/qmlcontext_p.h> QT_BEGIN_NAMESPACE @@ -54,8 +55,10 @@ QmlVMEMetaObject::QmlVMEMetaObject(QObject *obj, const QMetaObject *other, QList<QString> *strData, int slotData, + const QByteArray &alias, QmlRefCount *rc) -: object(obj), ref(rc), slotData(strData), slotDataIdx(slotData), parent(0) +: object(obj), ref(rc), slotData(strData), slotDataIdx(slotData), parent(0), + aliasData(alias), aliases(0), aliasArray(0) { if (ref) ref->addref(); @@ -68,13 +71,20 @@ QmlVMEMetaObject::QmlVMEMetaObject(QObject *obj, parent = static_cast<QAbstractDynamicMetaObject*>(op->metaObject); op->metaObject = this; + if (!aliasData.isEmpty()) { + aliases = (Aliases *)aliasData.constData(); + aliasArray = (AliasArray *)(aliasData.constData() + 3 * sizeof(int)); + aConnected.resize(aliases->aliasCount); + } + baseProp = propertyOffset(); baseSig = methodOffset(); - data = new QVariant[propertyCount() - baseProp]; - vTypes.resize(propertyCount() - baseProp); + int propCount = propertyCount() - (aliases?aliases->aliasCount:0); + data = new QVariant[propCount - baseProp]; + vTypes.resize(propCount - baseProp); // ### Optimize - for (int ii = baseProp; ii < propertyCount(); ++ii) { + for (int ii = baseProp; ii < propCount; ++ii) { QMetaProperty prop = property(ii); if ((int)prop.type() != -1) { data[ii - baseProp] = QVariant((QVariant::Type)prop.userType()); @@ -117,7 +127,34 @@ int QmlVMEMetaObject::metaCall(QMetaObject::Call c, int id, void **a) int propId = id - baseProp; bool needActivate = false; - if (vTypes.testBit(propId)) { + if (aliases && propId >= aliases->propCount) { + QmlContext *ctxt = qmlContext(object); + + if (!ctxt) return -1; + int aliasId = propId - aliases->propCount; + AliasArray *d = aliasArray + aliasId; + QmlContextPrivate *ctxtPriv = + (QmlContextPrivate *)QObjectPrivate::get(ctxt); + + QObject *target = *(QObject **)ctxtPriv->propertyValues[d->contextIdx].data(); + if (!target) return -1; + + if (c == QMetaObject::ReadProperty && + !aConnected.testBit(aliasId)) { + + int mySigIdx = baseSig + aliasId + aliases->signalOffset; + QMetaObject::connect(ctxt, d->contextIdx + ctxtPriv->notifyIndex, object, mySigIdx); + + QMetaProperty prop = target->metaObject()->property(d->propIdx); + if (prop.hasNotifySignal()) + QMetaObject::connect(target, prop.notifySignalIndex(), + object, mySigIdx); + aConnected.setBit(aliasId); + + } + return QMetaObject::metacall(target, c, d->propIdx, a); + + } else if (vTypes.testBit(propId)) { if (c == QMetaObject::ReadProperty) { *reinterpret_cast<QVariant *>(a[0]) = data[propId]; } else if (c == QMetaObject::WriteProperty) { @@ -168,7 +205,10 @@ int QmlVMEMetaObject::metaCall(QMetaObject::Call c, int id, void **a) return id; } } else if(c == QMetaObject::InvokeMetaMethod) { - if (id >= baseSig && (baseSlot == -1 || id < baseSlot)) { + if (id >= baseSig && (aliases && id >= baseSig + aliases->signalOffset)) { + QMetaObject::activate(object, id, a); + return id; + } else if (id >= baseSig && (baseSlot == -1 || id < baseSlot)) { QMetaObject::activate(object, id, a); return id; } else if (id >= baseSlot && id < (baseSlot + slotCount)) { diff --git a/src/declarative/qml/qmlvmemetaobject_p.h b/src/declarative/qml/qmlvmemetaobject_p.h index 7b6fd2d..45fb33d 100644 --- a/src/declarative/qml/qmlvmemetaobject_p.h +++ b/src/declarative/qml/qmlvmemetaobject_p.h @@ -63,7 +63,7 @@ class QmlRefCount; class QmlVMEMetaObject : public QAbstractDynamicMetaObject { public: - QmlVMEMetaObject(QObject *, const QMetaObject *, QList<QString> *, int slotData, QmlRefCount * = 0); + QmlVMEMetaObject(QObject *, const QMetaObject *, QList<QString> *, int slotData, const QByteArray &aliasData, QmlRefCount * = 0); ~QmlVMEMetaObject(); protected: @@ -78,9 +78,20 @@ private: int slotCount; QVariant *data; QBitArray vTypes; + QBitArray aConnected; QList<QString> *slotData; int slotDataIdx; QAbstractDynamicMetaObject *parent; + QByteArray aliasData; + struct Aliases { + int aliasCount; + int propCount; + int signalOffset; + } *aliases; + struct AliasArray { + int contextIdx; + int propIdx; + } *aliasArray; }; QT_END_NAMESPACE diff --git a/src/declarative/test/qfxtestengine.cpp b/src/declarative/test/qfxtestengine.cpp index 0d7e5df..cf746db 100644 --- a/src/declarative/test/qfxtestengine.cpp +++ b/src/declarative/test/qfxtestengine.cpp @@ -41,7 +41,7 @@ #include <QFile> #include <QmlComponent> -#include <qmltimeline.h> +#include <private/qmltimeline_p.h> #include "qfxtestengine.h" #include "qfxtestobjects.h" #include <QCryptographicHash> diff --git a/src/declarative/timeline/qmltimelinevalueproxy.h b/src/declarative/timeline/qmltimelinevalueproxy.h deleted file mode 100644 index 9ecdba1..0000000 --- a/src/declarative/timeline/qmltimelinevalueproxy.h +++ /dev/null @@ -1,86 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (qt-info@nokia.com) -** -** This file is part of the QtDeclarative module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the either Technology Preview License Agreement or the -** Beta Release License Agreement. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain -** additional rights. These rights are described in the Nokia Qt LGPL -** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this -** package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QMLTIMELINEVALUEPROXY_H -#define QMLTIMELINEVALUEPROXY_H - -#include <QtDeclarative/qmltimeline.h> - -QT_BEGIN_HEADER - -QT_BEGIN_NAMESPACE - -QT_MODULE(Declarative) - -template<class T> -class QmlTimeLineValueProxy : public QmlTimeLineValue -{ -public: - QmlTimeLineValueProxy(T *cls, void (T::*func)(qreal), qreal v = 0.) - : QmlTimeLineValue(v), _class(cls), _setFunctionReal(func), _setFunctionInt(0) - { - Q_ASSERT(_class); - } - - QmlTimeLineValueProxy(T *cls, void (T::*func)(int), qreal v = 0.) - : QmlTimeLineValue(v), _class(cls), _setFunctionReal(0), _setFunctionInt(func) - { - Q_ASSERT(_class); - } - - virtual void setValue(qreal v) - { - QmlTimeLineValue::setValue(v); - if (_setFunctionReal) (_class->*_setFunctionReal)(v); - else if (_setFunctionInt) (_class->*_setFunctionInt)((int)v); - } - -private: - T *_class; - void (T::*_setFunctionReal)(qreal); - void (T::*_setFunctionInt)(int); -}; - -QT_END_NAMESPACE - -QT_END_HEADER - -#endif//QMLTIMELINEVALUEPROXY_H diff --git a/src/declarative/timeline/timeline.pri b/src/declarative/timeline/timeline.pri deleted file mode 100644 index a7b3cb9..0000000 --- a/src/declarative/timeline/timeline.pri +++ /dev/null @@ -1,7 +0,0 @@ -SOURCES += \ - timeline/qmltimeline.cpp \ - -HEADERS += \ - timeline/qmltimeline.h \ - timeline/qmltimelinevalueproxy.h \ - diff --git a/src/declarative/util/qfxperf.cpp b/src/declarative/util/qfxperf.cpp index 9ac9e8d..db56b37 100644 --- a/src/declarative/util/qfxperf.cpp +++ b/src/declarative/util/qfxperf.cpp @@ -39,7 +39,7 @@ ** ****************************************************************************/ -#include "qfxperf.h" +#include "private/qfxperf_p.h" QT_BEGIN_NAMESPACE diff --git a/src/declarative/util/qfxperf.h b/src/declarative/util/qfxperf_p.h index 0bc0cc9..a1e38b7 100644 --- a/src/declarative/util/qfxperf.h +++ b/src/declarative/util/qfxperf_p.h @@ -41,7 +41,18 @@ #ifndef QFXPERF_H #define QFXPERF_H -#include "qperformancelog.h" +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include "private/qperformancelog_p.h" QT_BEGIN_HEADER diff --git a/src/declarative/util/qfxview.cpp b/src/declarative/util/qfxview.cpp index 0855224..0a3afda 100644 --- a/src/declarative/util/qfxview.cpp +++ b/src/declarative/util/qfxview.cpp @@ -54,8 +54,8 @@ #include "qmlbindablevalue.h" #include "qml.h" #include "qfxitem.h" -#include "qperformancelog.h" -#include "qfxperf.h" +#include "private/qperformancelog_p.h" +#include "private/qfxperf_p.h" #include "qfxview.h" #include <QtDeclarative/qmlengine.h> diff --git a/src/declarative/util/qmlanimation.cpp b/src/declarative/util/qmlanimation.cpp index 6ad47f5..c0d6481 100644 --- a/src/declarative/util/qmlanimation.cpp +++ b/src/declarative/util/qmlanimation.cpp @@ -58,12 +58,6 @@ #include <private/qmlstringconverters_p.h> #include <private/qvariantanimation_p.h> -/* TODO: - Check for any memory leaks - easing should be a QEasingCurve-type property - All other XXXs and ###s -*/ - QT_BEGIN_NAMESPACE QEasingCurve stringToCurve(const QString &curve) @@ -1108,7 +1102,7 @@ void QmlParentChangeActionPrivate::init() void QmlParentChangeActionPrivate::doAction() { - //XXX property.write(value); + //### property.write(value); } void QmlParentChangeAction::prepare(QmlMetaProperty &p) @@ -1120,7 +1114,7 @@ void QmlParentChangeAction::prepare(QmlMetaProperty &p) else d->property = d->userProperty; - //XXX + //### } QAbstractAnimation *QmlParentChangeAction::qtAnimation() @@ -1239,7 +1233,7 @@ QmlNumberAnimation::~QmlNumberAnimation() qreal QmlNumberAnimation::from() const { Q_D(const QmlPropertyAnimation); - return d->from.toDouble(); //### toFloat? + return d->from.toDouble(); } void QmlNumberAnimation::setFrom(qreal f) @@ -1259,7 +1253,7 @@ void QmlNumberAnimation::setFrom(qreal f) qreal QmlNumberAnimation::to() const { Q_D(const QmlPropertyAnimation); - return d->to.toDouble(); //### toFloat? + return d->to.toDouble(); } void QmlNumberAnimation::setTo(qreal t) @@ -1346,7 +1340,7 @@ void QmlSequentialAnimation::transition(QmlStateActions &actions, from = d->animations.count() - 1; } - //### needed for Behavior + //needed for Behavior if (d->userProperty.isValid() && d->propertyName.isEmpty() && !target()) { for (int i = 0; i < d->animations.count(); ++i) d->animations.at(i)->setTarget(d->userProperty); @@ -1428,7 +1422,7 @@ void QmlParallelAnimation::transition(QmlStateActions &actions, { Q_D(QmlAnimationGroup); - //### needed for Behavior + //needed for Behavior if (d->userProperty.isValid() && d->propertyName.isEmpty() && !target()) { for (int i = 0; i < d->animations.count(); ++i) d->animations.at(i)->setTarget(d->userProperty); @@ -1441,22 +1435,8 @@ void QmlParallelAnimation::transition(QmlStateActions &actions, QML_DEFINE_TYPE(QmlParallelAnimation,ParallelAnimation) -//### profile and optimize -QVariant QmlPropertyAnimationPrivate::interpolateVariant(const QVariant &from, const QVariant &to, qreal progress) -{ - if (from.userType() != to.userType()) - return QVariant(); - - QVariantAnimation::Interpolator interpolator = QVariantAnimationPrivate::getInterpolator(from.userType()); - if (interpolator) - return interpolator(from.constData(), to.constData(), progress); - else - return QVariant(); -} - //convert a variant from string type to another animatable type //### should use any registered string convertor -//### profile and optimize void QmlPropertyAnimationPrivate::convertVariant(QVariant &variant, QVariant::Type type) { if (variant.type() != QVariant::String) { @@ -1743,6 +1723,7 @@ void QmlPropertyAnimationPrivate::valueChanged(qreal r) if (!fromIsDefined) { from = property.read(); convertVariant(from, (QVariant::Type)(interpolatorType ? interpolatorType : property.propertyType())); + //### check for invalid variant if using property type } fromSourced = true; } @@ -1752,8 +1733,6 @@ void QmlPropertyAnimationPrivate::valueChanged(qreal r) } else { if (interpolator) property.write(interpolator(from.constData(), to.constData(), r)); - else - property.write(interpolateVariant(from, to, r)); //### optimize } } @@ -1771,9 +1750,15 @@ void QmlPropertyAnimation::prepare(QmlMetaProperty &p) else d->property = d->userProperty; - d->convertVariant(d->to, (QVariant::Type)(d->interpolatorType ? d->interpolatorType : d->property.propertyType())); + int propType = d->property.propertyType(); + d->convertVariant(d->to, (QVariant::Type)(d->interpolatorType ? d->interpolatorType : propType)); if (d->fromIsDefined) - d->convertVariant(d->from, (QVariant::Type)(d->interpolatorType ? d->interpolatorType : d->property.propertyType())); + d->convertVariant(d->from, (QVariant::Type)(d->interpolatorType ? d->interpolatorType : propType)); + + if (!d->interpolatorType) { + //### check for invalid variants + d->interpolator = QVariantAnimationPrivate::getInterpolator(propType); + } d->fromSourced = false; d->value.QmlTimeLineValue::setValue(0.); diff --git a/src/declarative/util/qmlanimation_p.h b/src/declarative/util/qmlanimation_p.h index fce5eca..00759e1 100644 --- a/src/declarative/util/qmlanimation_p.h +++ b/src/declarative/util/qmlanimation_p.h @@ -63,7 +63,7 @@ #include <QtDeclarative/qmlanimation.h> #include <QtDeclarative/qml.h> #include <QtDeclarative/qmlcontext.h> -#include <QtDeclarative/qmltimelinevalueproxy.h> +#include <private/qmltimeline_p.h> QT_BEGIN_NAMESPACE diff --git a/src/declarative/util/qmlscript.cpp b/src/declarative/util/qmlscript.cpp index ab095b1..07cc1d5 100644 --- a/src/declarative/util/qmlscript.cpp +++ b/src/declarative/util/qmlscript.cpp @@ -55,7 +55,7 @@ #include <QNetworkReply> #include <QNetworkRequest> #include <QtDeclarative/qmlinfo.h> -#include <qfxperf.h> +#include <private/qfxperf_p.h> QT_BEGIN_NAMESPACE diff --git a/src/declarative/timeline/qmltimeline.cpp b/src/declarative/util/qmltimeline.cpp index dcc8745..5ba310d 100644 --- a/src/declarative/timeline/qmltimeline.cpp +++ b/src/declarative/util/qmltimeline.cpp @@ -39,7 +39,7 @@ ** ****************************************************************************/ -#include "qmltimeline.h" +#include "qmltimeline_p.h" #include <QDebug> #include <QMutex> #include <QThread> diff --git a/src/declarative/timeline/qmltimeline.h b/src/declarative/util/qmltimeline_p.h index 627ec79..abed80a 100644 --- a/src/declarative/timeline/qmltimeline.h +++ b/src/declarative/util/qmltimeline_p.h @@ -42,16 +42,23 @@ #ifndef QMLTIMELINE_H #define QMLTIMELINE_H +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + #include <QtCore/QObject> #include <QtCore/QAbstractAnimation> #include <QtDeclarative/qfxglobal.h> -QT_BEGIN_HEADER - QT_BEGIN_NAMESPACE -QT_MODULE(Declarative) - class QEasingCurve; class QmlTimeLineValue; class QmlTimeLineEvent; @@ -183,8 +190,35 @@ private: QmlTimeLineObject *d2; }; -QT_END_NAMESPACE +template<class T> +class QmlTimeLineValueProxy : public QmlTimeLineValue +{ +public: + QmlTimeLineValueProxy(T *cls, void (T::*func)(qreal), qreal v = 0.) + : QmlTimeLineValue(v), _class(cls), _setFunctionReal(func), _setFunctionInt(0) + { + Q_ASSERT(_class); + } + + QmlTimeLineValueProxy(T *cls, void (T::*func)(int), qreal v = 0.) + : QmlTimeLineValue(v), _class(cls), _setFunctionReal(0), _setFunctionInt(func) + { + Q_ASSERT(_class); + } + + virtual void setValue(qreal v) + { + QmlTimeLineValue::setValue(v); + if (_setFunctionReal) (_class->*_setFunctionReal)(v); + else if (_setFunctionInt) (_class->*_setFunctionInt)((int)v); + } -QT_END_HEADER +private: + T *_class; + void (T::*_setFunctionReal)(qreal); + void (T::*_setFunctionInt)(int); +}; + +QT_END_NAMESPACE #endif diff --git a/src/declarative/util/qperformancelog.cpp b/src/declarative/util/qperformancelog.cpp index 932e4b3..8e11997 100644 --- a/src/declarative/util/qperformancelog.cpp +++ b/src/declarative/util/qperformancelog.cpp @@ -39,7 +39,7 @@ ** ****************************************************************************/ -#include "qperformancelog.h" +#include "qperformancelog_p.h" #include <QHash> #include <QDebug> diff --git a/src/declarative/util/qperformancelog.h b/src/declarative/util/qperformancelog_p.h index 6655a8d..6655a8d 100644 --- a/src/declarative/util/qperformancelog.h +++ b/src/declarative/util/qperformancelog_p.h diff --git a/src/declarative/util/util.pri b/src/declarative/util/util.pri index 0619a47..aae10af 100644 --- a/src/declarative/util/util.pri +++ b/src/declarative/util/util.pri @@ -17,13 +17,14 @@ SOURCES += \ util/qmllistmodel.cpp\ util/qmllistaccessor.cpp \ util/qmlopenmetaobject.cpp \ + util/qmltimeline.cpp \ util/qmlbind.cpp HEADERS += \ util/qfxview.h \ - util/qfxperf.h \ + util/qfxperf_p.h \ util/qfxglobal.h \ - util/qperformancelog.h \ + util/qperformancelog_p.h \ util/qmlconnection.h \ util/qmlpackage.h \ util/qmlscript.h \ @@ -42,4 +43,5 @@ HEADERS += \ util/qmllistaccessor.h \ util/qmlopenmetaobject.h \ util/qmlnullablevalue_p.h \ + util/qmltimeline_p.h \ util/qmlbind.h |