summaryrefslogtreecommitdiffstats
path: root/src/declarative/qml/qmlbinding.cpp
diff options
context:
space:
mode:
authorAaron Kennedy <aaron.kennedy@nokia.com>2009-08-10 05:37:19 (GMT)
committerAaron Kennedy <aaron.kennedy@nokia.com>2009-08-10 08:01:37 (GMT)
commit8c3405bbf65826f0ab0be0bd090d723f8efaa3af (patch)
treef6886a2b8a86f567b98728bba9cdc3d1be780dcf /src/declarative/qml/qmlbinding.cpp
parent12ffa33ddc725cd94662a383af6e1793049c807c (diff)
downloadQt-8c3405bbf65826f0ab0be0bd090d723f8efaa3af.zip
Qt-8c3405bbf65826f0ab0be0bd090d723f8efaa3af.tar.gz
Qt-8c3405bbf65826f0ab0be0bd090d723f8efaa3af.tar.bz2
Abstract expression and binding APIs
By splitting the interface through which the system interacts with bindings away from a specific implementation, we can introduce highly specialized implementations for specific optimizations. This commit also includes a sample optimization for object properties being assigned directly from a local id.
Diffstat (limited to 'src/declarative/qml/qmlbinding.cpp')
-rw-r--r--src/declarative/qml/qmlbinding.cpp82
1 files changed, 61 insertions, 21 deletions
diff --git a/src/declarative/qml/qmlbinding.cpp b/src/declarative/qml/qmlbinding.cpp
index 41cef49..7c5b366 100644
--- a/src/declarative/qml/qmlbinding.cpp
+++ b/src/declarative/qml/qmlbinding.cpp
@@ -47,6 +47,8 @@
#include <QVariant>
#include <private/qfxperf_p.h>
#include <QtCore/qdebug.h>
+#include <private/qmlcontext_p.h>
+#include <private/qmldeclarativedata_p.h>
Q_DECLARE_METATYPE(QList<QObject *>);
@@ -55,7 +57,7 @@ QT_BEGIN_NAMESPACE
QML_DEFINE_NOCREATE_TYPE(QmlBinding);
QmlBindingPrivate::QmlBindingPrivate()
-: inited(false), updating(false), enabled(true), mePtr(0)
+: updating(false), enabled(false), mePtr(0)
{
}
@@ -92,25 +94,6 @@ QmlMetaProperty QmlBinding::property() const
return d->property;
}
-void QmlBinding::init()
-{
- Q_D(QmlBinding);
-
- if (d->inited)
- return;
- d->inited = true;
- update();
-}
-
-void QmlBinding::forceUpdate()
-{
- Q_D(QmlBinding);
- if (!d->inited)
- init();
- else
- update();
-}
-
void QmlBinding::update()
{
Q_D(QmlBinding);
@@ -118,7 +101,7 @@ void QmlBinding::update()
#ifdef Q_ENABLE_PERFORMANCE_LOG
QFxPerfTimer<QFxPerf::BindableValueUpdate> bu;
#endif
- if (!d->inited || !d->enabled)
+ if (!d->enabled)
return;
if (!d->updating) {
@@ -168,6 +151,20 @@ void QmlBinding::setEnabled(bool e)
Q_D(QmlBinding);
d->enabled = e;
setTrackChange(e);
+
+ if (e) {
+ d->mePtr = 0;
+ addToObject(d->property.object());
+ update();
+ } else {
+ removeFromObject();
+ }
+}
+
+int QmlBinding::propertyIndex()
+{
+ Q_D(QmlBinding);
+ return d->property.coreIndex();
}
bool QmlBinding::enabled() const
@@ -177,4 +174,47 @@ bool QmlBinding::enabled() const
return d->enabled;
}
+QString QmlBinding::expression() const
+{
+ return QmlExpression::expression();
+}
+
+QmlAbstractBinding::QmlAbstractBinding()
+: m_prevBinding(0), m_nextBinding(0)
+{
+}
+
+QmlAbstractBinding::~QmlAbstractBinding()
+{
+ removeFromObject();
+}
+
+void QmlAbstractBinding::addToObject(QObject *object)
+{
+ removeFromObject();
+
+ if (object) {
+ QmlDeclarativeData *data = QmlDeclarativeData::get(object, true);
+ m_nextBinding = data->bindings;
+ if (m_nextBinding) m_nextBinding->m_prevBinding = &m_nextBinding;
+ m_prevBinding = &data->bindings;
+ data->bindings = this;
+ }
+}
+
+void QmlAbstractBinding::removeFromObject()
+{
+ if (m_prevBinding) {
+ *m_prevBinding = m_nextBinding;
+ if (m_nextBinding) m_nextBinding->m_prevBinding = m_prevBinding;
+ m_prevBinding = 0;
+ m_nextBinding = 0;
+ }
+}
+
+QString QmlAbstractBinding::expression() const
+{
+ return QLatin1String("<Unknown>");
+}
+
QT_END_NAMESPACE