QDeclarativeAbstractBinding * QDeclarativePropertyPrivate::setBinding(QObject *object, int coreIndex, int valueTypeIndex, QDeclarativeAbstractBinding *newBinding, WriteFlags flags) { QDeclarativeDeclarativeData *data = QDeclarativeDeclarativeData::get(object, 0 != newBinding); QDeclarativeAbstractBinding *binding = 0; if (data && data->hasBindingBit(coreIndex)) { binding = data->bindings; while (binding && binding->propertyIndex() != coreIndex) binding = binding->m_nextBinding; } if (binding && valueTypeIndex != -1 && binding->bindingType() == QDeclarativeAbstractBinding::ValueTypeProxy) { int index = coreIndex | (valueTypeIndex << 24); binding = static_cast<QDeclarativeValueTypeProxyBinding *>(binding)->binding(index); } if (binding) binding->setEnabled(false); if (newBinding) newBinding->setEnabled(true, flags); return binding; }
/*! Returns the binding associated with this property, or 0 if no binding exists. */ QDeclarativeAbstractBinding * QDeclarativePropertyPrivate::binding(const QDeclarativeProperty &that) { if (!that.isProperty() || !that.d->object) return 0; QDeclarativeDeclarativeData *data = QDeclarativeDeclarativeData::get(that.d->object); if (!data) return 0; if (!data->hasBindingBit(that.d->core.coreIndex)) return 0; QDeclarativeAbstractBinding *binding = data->bindings; while (binding && binding->propertyIndex() != that.d->core.coreIndex) binding = binding->m_nextBinding; if (binding && that.d->valueType.valueTypeCoreIdx != -1) { if (binding->bindingType() == QDeclarativeAbstractBinding::ValueTypeProxy) { QDeclarativeValueTypeProxyBinding *proxy = static_cast<QDeclarativeValueTypeProxyBinding *>(binding); binding = proxy->binding(bindingIndex(that)); } } return binding; }
QDeclarativeAbstractBinding *QDeclarativeValueTypeProxyBinding::binding(int propertyIndex) { QDeclarativeAbstractBinding *binding = m_bindings; while (binding && binding->propertyIndex() != propertyIndex) binding = binding->m_nextBinding; return binding; }
void QDeclarativeAbstractBinding::addToObject(QObject *object) { Q_ASSERT(object); if (m_object == object) return; int index = propertyIndex(); removeFromObject(); Q_ASSERT(!m_prevBinding); m_object = object; QDeclarativeData *data = QDeclarativeData::get(object, true); if (index & 0xFF000000) { // Value type int coreIndex = index & 0xFFFFFF; // Find the value type proxy (if there is one) QDeclarativeValueTypeProxyBinding *proxy = 0; if (data->hasBindingBit(coreIndex)) { QDeclarativeAbstractBinding *b = data->bindings; while (b && b->propertyIndex() != coreIndex) b = b->m_nextBinding; Q_ASSERT(b && b->bindingType() == QDeclarativeAbstractBinding::ValueTypeProxy); proxy = static_cast<QDeclarativeValueTypeProxyBinding *>(b); } if (!proxy) proxy = new QDeclarativeValueTypeProxyBinding(object, coreIndex); proxy->addToObject(object); m_nextBinding = proxy->m_bindings; if (m_nextBinding) m_nextBinding->m_prevBinding = &m_nextBinding; m_prevBinding = &proxy->m_bindings; proxy->m_bindings = this; } else { m_nextBinding = data->bindings; if (m_nextBinding) m_nextBinding->m_prevBinding = &m_nextBinding; m_prevBinding = &data->bindings; data->bindings = this; data->setBindingBit(m_object, index); } }