diff options
author | Yann Bodson <yann.bodson@nokia.com> | 2009-08-06 08:33:08 (GMT) |
---|---|---|
committer | Yann Bodson <yann.bodson@nokia.com> | 2009-08-06 08:33:08 (GMT) |
commit | e80c63a54fd7f9aa9445ef813cf52300f9204404 (patch) | |
tree | 8a96c00c19cc28bb80f17ad1b10317bcdc8d7bf7 | |
parent | a5b6b744b5a06bcd8dc101768466d202f427b2e7 (diff) | |
parent | db4b160d2defc8afbb46f75e115d74c724ca0940 (diff) | |
download | Qt-e80c63a54fd7f9aa9445ef813cf52300f9204404.zip Qt-e80c63a54fd7f9aa9445ef813cf52300f9204404.tar.gz Qt-e80c63a54fd7f9aa9445ef813cf52300f9204404.tar.bz2 |
Merge branch 'kinetic-declarativeui' of git@scm.dev.nokia.troll.no:qt/kinetic into kinetic-declarativeui
-rw-r--r-- | src/declarative/fx/fx.pri | 2 | ||||
-rw-r--r-- | src/declarative/fx/qfxitem.cpp | 23 | ||||
-rw-r--r-- | src/declarative/fx/qfxitem.h | 3 | ||||
-rw-r--r-- | src/declarative/fx/qfxlayoutitem.cpp | 105 | ||||
-rw-r--r-- | src/declarative/fx/qfxlayoutitem.h | 93 | ||||
-rw-r--r-- | src/declarative/fx/qfxmouseregion.cpp | 22 | ||||
-rw-r--r-- | src/declarative/fx/qfxmouseregion.h | 2 | ||||
-rw-r--r-- | src/declarative/qml/qmlengine_p.h | 4 | ||||
-rw-r--r-- | src/declarative/qml/qmlexpression.cpp | 2 | ||||
-rw-r--r-- | src/declarative/qml/qmlmetaproperty.cpp | 130 | ||||
-rw-r--r-- | src/declarative/qml/qmlmetaproperty_p.h | 13 | ||||
-rw-r--r-- | src/declarative/qml/qmlmetatype.cpp | 16 | ||||
-rw-r--r-- | src/declarative/qml/qmlmetatype.h | 3 | ||||
-rw-r--r-- | src/declarative/util/qmlanimation.cpp | 6 | ||||
-rw-r--r-- | src/declarative/util/qmlsetproperties.cpp | 1 | ||||
-rw-r--r-- | src/declarative/util/qmlstate.cpp | 11 | ||||
-rw-r--r-- | src/declarative/util/qmlstate.h | 1 | ||||
-rw-r--r-- | src/declarative/util/qmltransitionmanager.cpp | 14 |
18 files changed, 376 insertions, 75 deletions
diff --git a/src/declarative/fx/fx.pri b/src/declarative/fx/fx.pri index bbb09fb..a6c5281 100644 --- a/src/declarative/fx/fx.pri +++ b/src/declarative/fx/fx.pri @@ -42,6 +42,7 @@ HEADERS += \ fx/qfxvisualitemmodel.h \ fx/qfxlistview.h \ fx/qfxgraphicsobjectcontainer.h \ + fx/qfxlayoutitem.h \ SOURCES += \ fx/qfxanchors.cpp \ @@ -71,6 +72,7 @@ SOURCES += \ fx/qfxvisualitemmodel.cpp \ fx/qfxlistview.cpp \ fx/qfxgraphicsobjectcontainer.cpp \ + fx/qfxlayoutitem.cpp \ contains(QT_CONFIG, webkit) { QT+=webkit diff --git a/src/declarative/fx/qfxitem.cpp b/src/declarative/fx/qfxitem.cpp index 806d5c0..b36e994 100644 --- a/src/declarative/fx/qfxitem.cpp +++ b/src/declarative/fx/qfxitem.cpp @@ -1644,10 +1644,7 @@ QPointF QFxItemPrivate::computeTransformOrigin() const bool QFxItem::sceneEvent(QEvent *event) { - bool rv = QGraphicsItem::sceneEvent(event); - if (event->type() == QEvent::UngrabMouse) - mouseUngrabEvent(); - return rv; + return QGraphicsItem::sceneEvent(event); } QVariant QFxItem::itemChange(GraphicsItemChange change, @@ -1660,10 +1657,6 @@ QVariant QFxItem::itemChange(GraphicsItemChange change, return QGraphicsItem::itemChange(change, value); } -void QFxItem::mouseUngrabEvent() -{ -} - QRectF QFxItem::boundingRect() const { Q_D(const QFxItem); @@ -1908,6 +1901,20 @@ bool QFxItem::event(QEvent *ev) return QGraphicsObject::event(ev); } +QDebug operator<<(QDebug debug, QFxItem *item) +{ + if (!item) { + debug << "QFxItem(0)"; + return debug; + } + + debug << item->metaObject()->className() << "(this =" << ((void*)item) + << ", parent =" << ((void*)item->parentItem()) + << ", geometry =" << QRectF(item->pos(), QSizeF(item->width(), item->height())) + << ", z =" << item->zValue() << ")"; + return debug; +} + QT_END_NAMESPACE #include "moc_qfxitem.cpp" diff --git a/src/declarative/fx/qfxitem.h b/src/declarative/fx/qfxitem.h index 6563c45..3ba00cb 100644 --- a/src/declarative/fx/qfxitem.h +++ b/src/declarative/fx/qfxitem.h @@ -203,7 +203,6 @@ protected: virtual bool sceneEvent(QEvent *); virtual bool event(QEvent *); virtual QVariant itemChange(GraphicsItemChange, const QVariant &); - virtual void mouseUngrabEvent(); void setImplicitWidth(qreal); bool widthValid() const; // ### better name? @@ -252,6 +251,8 @@ T qobject_cast(QGraphicsItem *item) return qobject_cast<T>(o); } +QDebug Q_DECLARATIVE_EXPORT operator<<(QDebug debug, QFxItem *item); + QT_END_NAMESPACE QML_DECLARE_TYPE(QFxContents) diff --git a/src/declarative/fx/qfxlayoutitem.cpp b/src/declarative/fx/qfxlayoutitem.cpp new file mode 100644 index 0000000..446a8d7 --- /dev/null +++ b/src/declarative/fx/qfxlayoutitem.cpp @@ -0,0 +1,105 @@ +/**************************************************************************** +** +** 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$ +** +****************************************************************************/ + +#include "qfxlayoutitem.h" +#include <QDebug> +#include <limits.h> + +QT_BEGIN_NAMESPACE + +QML_DEFINE_TYPE(Qt,4,6,(QT_VERSION&0x00ff00)>>8,LayoutItem,QFxLayoutItem) + +/*! + \qmlclass LayoutItem QFxLayoutItem + \brief The LayoutItem element allows you to place your Fluid UI elements inside a classical Qt layout. +*/ + +/*! + \internal + \class QFxLayoutItem + \brief The QFxLayoutItem class allows you to place your Fluid UI elements inside a classical Qt layout. +*/ + + +/*! + \qmlproperty QSizeF LayoutItem::maximumSize + + The maximumSize property can be set to specify the maximum desired size of this LayoutItem +*/ + +/*! + \qmlproperty QSizeF LayoutItem::minimumSize + + The minimumSize property can be set to specify the minimum desired size of this LayoutItem +*/ + +/*! + \qmlproperty QSizeF LayoutItem::preferredSize + + The preferredSize property can be set to specify the preferred size of this LayoutItem +*/ + +QFxLayoutItem::QFxLayoutItem(QFxItem* parent) + : QFxItem(parent), m_maximumSize(INT_MAX,INT_MAX), m_preferredSize(100,100), m_minimumSize(0,0) +{ + setGraphicsItem(this); +} + +void QFxLayoutItem::setGeometry(const QRectF & rect) +{ + setX(rect.x()); + setY(rect.y()); + setWidth(rect.width()); + setHeight(rect.height()); +} + +QSizeF QFxLayoutItem::sizeHint(Qt::SizeHint w, const QSizeF &constraint) const +{ + if(w == Qt::MinimumSize){ + return m_minimumSize; + }else if(w == Qt::MaximumSize){ + return m_maximumSize; + }else{ + return m_preferredSize; + } +} + +QT_END_NAMESPACE diff --git a/src/declarative/fx/qfxlayoutitem.h b/src/declarative/fx/qfxlayoutitem.h new file mode 100644 index 0000000..7150554 --- /dev/null +++ b/src/declarative/fx/qfxlayoutitem.h @@ -0,0 +1,93 @@ +/**************************************************************************** +** +** 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 QFXGRAPHICSLAYOUTITEM_H +#define QFXGRAPHICSLAYOUTITEM_H +#include <QGraphicsLayoutItem> +#include <QFxItem> +#include <QSizeF> + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +QT_MODULE(Declarative) + +class QFxLayoutItem : public QFxItem, public QGraphicsLayoutItem +{ + Q_OBJECT + Q_INTERFACES(QGraphicsLayoutItem) + Q_PROPERTY(QSizeF maximumSize READ maximumSize WRITE setMaximumSize NOTIFY maximumSizeChanged) + Q_PROPERTY(QSizeF minimumSize READ minimumSize WRITE setMinimumSize NOTIFY minimumSizeChanged) + Q_PROPERTY(QSizeF preferredSize READ preferredSize WRITE setPreferredSize NOTIFY preferredSizeChanged) +public: + QFxLayoutItem(QFxItem* parent=0); + + QSizeF maximumSize() const { return m_maximumSize; } + void setMaximumSize(const QSizeF &s) { if(s==m_maximumSize) return; m_maximumSize = s; emit maximumSizeChanged(); } + + QSizeF minimumSize() const { return m_minimumSize; } + void setMinimumSize(const QSizeF &s) { if(s==m_minimumSize) return; m_minimumSize = s; emit minimumSizeChanged(); } + + QSizeF preferredSize() const { return m_preferredSize; } + void setPreferredSize(const QSizeF &s) { if(s==m_preferredSize) return; m_preferredSize = s; emit preferredSizeChanged(); } + + virtual void setGeometry(const QRectF & rect); +protected: + virtual QSizeF sizeHint(Qt::SizeHint which, const QSizeF &constraint = QSizeF()) const; + +Q_SIGNALS: + void maximumSizeChanged(); + void minimumSizeChanged(); + void preferredSizeChanged(); + +private: + QSizeF m_maximumSize; + QSizeF m_minimumSize; + QSizeF m_preferredSize; +}; + +QT_END_NAMESPACE + +QML_DECLARE_TYPE(QFxLayoutItem) + +QT_END_HEADER +#endif diff --git a/src/declarative/fx/qfxmouseregion.cpp b/src/declarative/fx/qfxmouseregion.cpp index e4e7442..42e024d 100644 --- a/src/declarative/fx/qfxmouseregion.cpp +++ b/src/declarative/fx/qfxmouseregion.cpp @@ -437,17 +437,21 @@ void QFxMouseRegion::hoverLeaveEvent(QGraphicsSceneHoverEvent *event) } } -void QFxMouseRegion::mouseUngrabEvent() +bool QFxMouseRegion::sceneEvent(QEvent *event) { - Q_D(QFxMouseRegion); - if (d->pressed) { - // if our mouse grab has been removed (probably by Flickable), fix our - // state - d->pressed = false; - setKeepMouseGrab(false); - emit pressedChanged(); - //emit hoveredChanged(); + bool rv = QFxItem::sceneEvent(event); + if (event->type() == QEvent::UngrabMouse) { + Q_D(QFxMouseRegion); + if (d->pressed) { + // if our mouse grab has been removed (probably by Flickable), fix our + // state + d->pressed = false; + setKeepMouseGrab(false); + emit pressedChanged(); + //emit hoveredChanged(); + } } + return rv; } void QFxMouseRegion::timerEvent(QTimerEvent *event) diff --git a/src/declarative/fx/qfxmouseregion.h b/src/declarative/fx/qfxmouseregion.h index 6d85cea..418434a 100644 --- a/src/declarative/fx/qfxmouseregion.h +++ b/src/declarative/fx/qfxmouseregion.h @@ -137,7 +137,7 @@ protected: void mouseMoveEvent(QGraphicsSceneMouseEvent *event); void hoverEnterEvent(QGraphicsSceneHoverEvent *event); void hoverLeaveEvent(QGraphicsSceneHoverEvent *event); - void mouseUngrabEvent(); + bool sceneEvent(QEvent *); void timerEvent(QTimerEvent *event); private: diff --git a/src/declarative/qml/qmlengine_p.h b/src/declarative/qml/qmlengine_p.h index dffae6c..602321d 100644 --- a/src/declarative/qml/qmlengine_p.h +++ b/src/declarative/qml/qmlengine_p.h @@ -179,6 +179,10 @@ public: QmlValueTypeFactory valueTypes; QHash<const QMetaObject *, QmlMetaObjectCache> propertyCache; + static QmlMetaObjectCache *cache(QmlEnginePrivate *priv, QObject *obj) { + if (!priv || !obj || QObjectPrivate::get(obj)->metaObject) return 0; + return &priv->propertyCache[obj->metaObject()]; + } struct Imports { Imports(); diff --git a/src/declarative/qml/qmlexpression.cpp b/src/declarative/qml/qmlexpression.cpp index 3206734..a9175ea 100644 --- a/src/declarative/qml/qmlexpression.cpp +++ b/src/declarative/qml/qmlexpression.cpp @@ -66,6 +66,7 @@ void QmlExpressionPrivate::init(QmlContext *ctxt, const QString &expr, if (ctxt) { QmlContextPrivate *cp = ctxt->d_func(); nextExpression = cp->expressions; + if (nextExpression) nextExpression->prevExpression = &nextExpression; prevExpression = &cp->expressions; cp->expressions = this; } @@ -91,6 +92,7 @@ void QmlExpressionPrivate::init(QmlContext *ctxt, void *expr, QmlRefCount *rc, if (ctxt) { QmlContextPrivate *cp = ctxt->d_func(); nextExpression = cp->expressions; + if (nextExpression) nextExpression->prevExpression = &nextExpression; prevExpression = &cp->expressions; cp->expressions = this; } diff --git a/src/declarative/qml/qmlmetaproperty.cpp b/src/declarative/qml/qmlmetaproperty.cpp index 5181f12..09ca872 100644 --- a/src/declarative/qml/qmlmetaproperty.cpp +++ b/src/declarative/qml/qmlmetaproperty.cpp @@ -56,25 +56,53 @@ Q_DECLARE_METATYPE(QList<QObject *>); QT_BEGIN_NAMESPACE -QmlMetaObjectCache::Data -QmlMetaObjectCache::property(const QString &name, const QMetaObject *metaObject) +QmlMetaObjectCache::QmlMetaObjectCache() +: propertyCache(0) { - QHash<QString, Data>::ConstIterator iter = properties.find(name); - if (iter != properties.end()) { - return *iter; - } else { - Data cacheData = { -1, -1 }; +} - int idx = metaObject->indexOfProperty(name.toUtf8().constData()); - if (idx == -1) - return cacheData; +void QmlMetaObjectCache::init(const QMetaObject *metaObject) +{ + if (propertyCache || !metaObject) + return; - QMetaProperty property = metaObject->property(idx); - cacheData.propType = property.userType(); - cacheData.coreIndex = idx; - properties.insert(name, cacheData); + int propCount = metaObject->propertyCount(); - return cacheData; + propertyCache = new Data[propCount]; + for (int ii = 0; ii < propCount; ++ii) { + QMetaProperty p = metaObject->property(ii); + propertyCache[ii].propType = p.userType(); + propertyCache[ii].coreIndex = ii; + propertyCache[ii].name = QLatin1String(p.name()); + + propertyNameCache.insert(propertyCache[ii].name, ii); + } +} + +QmlMetaObjectCache::~QmlMetaObjectCache() +{ + delete [] propertyCache; +} + +QmlMetaObjectCache::Data * +QmlMetaObjectCache::property(int index, const QMetaObject *metaObject) +{ + init(metaObject); + + return propertyCache + index; +} + +QmlMetaObjectCache::Data * +QmlMetaObjectCache::property(const QString &name, const QMetaObject *metaObject) +{ + init(metaObject); + + QHash<QString, int>::ConstIterator iter = propertyNameCache.find(name); + + if (iter != propertyNameCache.end()) { + return propertyCache + *iter; + } else { + return 0; } } @@ -99,14 +127,6 @@ QmlMetaProperty::~QmlMetaProperty() delete d; d = 0; } -struct CachedPropertyData { - CachedPropertyData(const QString &n, int pt, int ci) - : name(n), propType(pt), coreIdx(ci) {} - QString name; - int propType; - int coreIdx; -}; - /*! Creates a QmlMetaProperty for the default property of \a obj. If there is no default property, an invalid QmlMetaProperty will be created. @@ -218,15 +238,14 @@ void QmlMetaPropertyPrivate::initProperty(QObject *obj, const QString &name) } // Property - if (!QObjectPrivate::get(obj)->metaObject && enginePrivate) { - // Can cache - QmlMetaObjectCache &cache = - enginePrivate->propertyCache[obj->metaObject()]; - QmlMetaObjectCache::Data data = cache.property(name, obj->metaObject()); - if (data.coreIndex != -1) { + QmlMetaObjectCache *cache = QmlEnginePrivate::cache(enginePrivate, obj); + if (cache) { + QmlMetaObjectCache::Data *data = + cache->property(name, obj->metaObject()); + if (data) { type = QmlMetaProperty::Property; - propType = data.propType; - coreIdx = data.coreIndex; + propType = data->propType; + coreIdx = data->coreIndex; } } else { // Can't cache @@ -291,14 +310,23 @@ QmlMetaPropertyPrivate::propertyCategory() const category = QmlMetaProperty::Normal; else if (type == qMetaTypeId<QmlBinding *>()) category = QmlMetaProperty::Bindable; - else if (QmlMetaType::isList(type)) - category = QmlMetaProperty::List; - else if (QmlMetaType::isQmlList(type)) - category = QmlMetaProperty::QmlList; - else if (QmlMetaType::isObject(type)) - category = QmlMetaProperty::Object; - else - category = QmlMetaProperty::Normal; + else { + QmlMetaType::TypeCategory tc = QmlMetaType::typeCategory(type); + switch(tc) { + case QmlMetaType::Object: + category = QmlMetaProperty::Object; + break; + case QmlMetaType::QmlList: + category = QmlMetaProperty::QmlList; + break; + case QmlMetaType::List: + category = QmlMetaProperty::List; + break; + case QmlMetaType::Unknown: + category = QmlMetaProperty::Normal; + break; + } + } } return category; } @@ -492,7 +520,7 @@ QmlBinding *QmlMetaProperty::binding() const QObject *child = *iter; if (child->metaObject() == &QmlBinding::staticMetaObject) { QmlBinding *v = static_cast<QmlBinding *>(child); - if (v->property() == *this) + if (v->property() == *this && v->enabled()) return v; } } @@ -1015,6 +1043,10 @@ quint32 QmlMetaPropertyPrivate::saveProperty(int core) */ void QmlMetaProperty::restore(quint32 id, QObject *obj, QmlContext *ctxt) { + QmlEnginePrivate *enginePrivate = 0; + if (ctxt && ctxt->engine()) + enginePrivate = QmlEnginePrivate::get(ctxt->engine()); + d->object = obj; d->context = ctxt; @@ -1042,10 +1074,22 @@ void QmlMetaProperty::restore(quint32 id, QObject *obj, QmlContext *ctxt) d->valueTypeId = p.type(); } else if (d->type & Property) { - QMetaProperty p(obj->metaObject()->property(id)); - d->name = QLatin1String(p.name()); - d->propType = p.userType(); + + QmlMetaObjectCache *cache = QmlEnginePrivate::cache(enginePrivate, obj); + d->coreIdx = id; + + if (cache) { + QmlMetaObjectCache::Data *data = + cache->property(id, obj->metaObject()); + d->propType = data->propType; + d->name = data->name; + } else { + QMetaProperty p(obj->metaObject()->property(id)); + d->name = QLatin1String(p.name()); + d->propType = p.userType(); + } + } else if (d->type & SignalProperty) { d->signal = obj->metaObject()->method(id); d->coreIdx = id; diff --git a/src/declarative/qml/qmlmetaproperty_p.h b/src/declarative/qml/qmlmetaproperty_p.h index 0410dd6..8e8966e 100644 --- a/src/declarative/qml/qmlmetaproperty_p.h +++ b/src/declarative/qml/qmlmetaproperty_p.h @@ -61,14 +61,23 @@ QT_BEGIN_NAMESPACE class QmlMetaObjectCache { public: + QmlMetaObjectCache(); + ~QmlMetaObjectCache(); + struct Data { int propType; int coreIndex; + QString name; }; - QHash<QString, Data> properties; + Data *property(const QString &, const QMetaObject *); + Data *property(int, const QMetaObject *); + +private: + void init(const QMetaObject *); - Data property(const QString &, const QMetaObject *); + Data *propertyCache; + QHash<QString, int> propertyNameCache; }; class QmlContext; diff --git a/src/declarative/qml/qmlmetatype.cpp b/src/declarative/qml/qmlmetatype.cpp index 29fe026..50bc676 100644 --- a/src/declarative/qml/qmlmetatype.cpp +++ b/src/declarative/qml/qmlmetatype.cpp @@ -794,6 +794,22 @@ QMetaProperty QmlMetaType::property(QObject *obj, const char *name) return metaObject->property(idx); } +QmlMetaType::TypeCategory QmlMetaType::typeCategory(int userType) +{ + if (userType < 0) + return Unknown; + QReadLocker lock(metaTypeDataLock()); + QmlMetaTypeData *data = metaTypeData(); + if (userType < data->objects.size() && data->objects.testBit(userType)) + return Object; + else if (userType < data->qmllists.size() && data->qmllists.testBit(userType)) + return QmlList; + else if (userType < data->lists.size() && data->lists.testBit(userType)) + return List; + else + return Unknown; +} + bool QmlMetaType::isObject(int userType) { QReadLocker lock(metaTypeDataLock()); diff --git a/src/declarative/qml/qmlmetatype.h b/src/declarative/qml/qmlmetatype.h index e023e83..9cbf7f3 100644 --- a/src/declarative/qml/qmlmetatype.h +++ b/src/declarative/qml/qmlmetatype.h @@ -94,6 +94,9 @@ public: static QmlAttachedPropertiesFunc attachedPropertiesFuncById(int); static QmlAttachedPropertiesFunc attachedPropertiesFunc(const QByteArray &); + enum TypeCategory { Unknown, Object, List, QmlList }; + static TypeCategory typeCategory(int); + static bool isInterface(int); static const char *interfaceIId(int); static bool isObject(int); diff --git a/src/declarative/util/qmlanimation.cpp b/src/declarative/util/qmlanimation.cpp index 27caf20..f3691ea 100644 --- a/src/declarative/util/qmlanimation.cpp +++ b/src/declarative/util/qmlanimation.cpp @@ -723,7 +723,6 @@ QmlColorAnimation::QmlColorAnimation(QObject *parent) : QmlPropertyAnimation(parent) { Q_D(QmlPropertyAnimation); - d->init(); d->interpolatorType = QMetaType::QColor; d->interpolator = QVariantAnimationPrivate::getInterpolator(d->interpolatorType); d->defaultToInterpolatorType = true; @@ -1199,7 +1198,6 @@ QmlNumberAnimation::QmlNumberAnimation(QObject *parent) : QmlPropertyAnimation(parent) { Q_D(QmlPropertyAnimation); - d->init(); d->interpolatorType = QMetaType::QReal; d->interpolator = QVariantAnimationPrivate::getInterpolator(d->interpolatorType); } @@ -1496,7 +1494,9 @@ QmlPropertyAnimation::~QmlPropertyAnimation() void QmlPropertyAnimationPrivate::init() { Q_Q(QmlPropertyAnimation); - va = new QmlTimeLineValueAnimator(q); + va = new QmlTimeLineValueAnimator; + QFx_setParent_noEvent(va, q); + va->setStartValue(QVariant(0.0f)); va->setEndValue(QVariant(1.0f)); } diff --git a/src/declarative/util/qmlsetproperties.cpp b/src/declarative/util/qmlsetproperties.cpp index bbbc6a9..1cd4a79 100644 --- a/src/declarative/util/qmlsetproperties.cpp +++ b/src/declarative/util/qmlsetproperties.cpp @@ -335,6 +335,7 @@ QmlSetProperties::ActionList QmlSetProperties::actions() a.toValue = d->expressions.at(ii).second->value(); } else { a.toBinding = new QmlBinding(d->expressions.at(ii).second->expression(), object(), qmlContext(this)); + a.deletableToBinding = true; a.toBinding->setTarget(prop); } diff --git a/src/declarative/util/qmlstate.cpp b/src/declarative/util/qmlstate.cpp index b5ba909..9967486 100644 --- a/src/declarative/util/qmlstate.cpp +++ b/src/declarative/util/qmlstate.cpp @@ -54,14 +54,14 @@ QT_BEGIN_NAMESPACE DEFINE_BOOL_CONFIG_OPTION(stateChangeDebug, STATECHANGE_DEBUG); Action::Action() -: restore(true), actionDone(false), reverseEvent(false), fromBinding(0), toBinding(0), event(0), +: restore(true), actionDone(false), reverseEvent(false), deletableToBinding(false), fromBinding(0), toBinding(0), event(0), specifiedObject(0) { } Action::Action(QObject *target, const QString &propertyName, const QVariant &value) -: restore(true), actionDone(false), reverseEvent(false), toValue(value), fromBinding(0), +: restore(true), actionDone(false), reverseEvent(false), deletableToBinding(false), toValue(value), fromBinding(0), toBinding(0), event(0), specifiedObject(target), specifiedProperty(propertyName) { @@ -413,11 +413,8 @@ void QmlState::apply(QmlStateGroup *group, QmlTransition *trans, QmlState *rever SimpleAction r(action); additionalReverts << r; } - } else { - - if (!found || d->revertList.at(jj).binding != action.fromBinding) { - action.deleteFromBinding(); - } + } else if (d->revertList.at(jj).binding != action.fromBinding) { + action.deleteFromBinding(); } } diff --git a/src/declarative/util/qmlstate.h b/src/declarative/util/qmlstate.h index 7c62768..9eb7aee 100644 --- a/src/declarative/util/qmlstate.h +++ b/src/declarative/util/qmlstate.h @@ -64,6 +64,7 @@ public: bool restore:1; bool actionDone:1; bool reverseEvent:1; + bool deletableToBinding:1; QmlMetaProperty property; QVariant fromValue; diff --git a/src/declarative/util/qmltransitionmanager.cpp b/src/declarative/util/qmltransitionmanager.cpp index b2d9414..f04a821 100644 --- a/src/declarative/util/qmltransitionmanager.cpp +++ b/src/declarative/util/qmltransitionmanager.cpp @@ -239,7 +239,7 @@ void QmlTransitionManager::transition(const QList<Action> &list, } } if (!transition) - d->applyBindings(); //### merge into above foreach? + d->applyBindings(); } @@ -251,6 +251,18 @@ void QmlTransitionManager::cancel() d->transition = 0; } + for(int i = 0; i < d->bindingsList.count(); ++i) { + Action action = d->bindingsList[i]; + if (action.toBinding && action.deletableToBinding) { + action.property.setBinding(0); + delete action.toBinding; + action.toBinding = 0; + action.deletableToBinding = false; + } else if (action.event) { + //### what do we do here? + } + + } d->bindingsList.clear(); d->completeList.clear(); |