void NodeAbstractProperty::reparentHere(const ModelNode &modelNode, bool isNodeList) { if (modelNode.parentProperty() == *this) return; Internal::WriteLocker locker(model()); if (!isValid()) throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__); if (isNodeProperty()) { NodeProperty nodeProperty(toNodeProperty()); if (nodeProperty.modelNode().isValid()) throw InvalidReparentingException(__LINE__, __FUNCTION__, __FILE__); } if (modelNode.isAncestorOf(parentModelNode())) throw InvalidReparentingException(__LINE__, __FUNCTION__, __FILE__); if (internalNode()->hasProperty(name()) && !internalNode()->property(name())->isNodeAbstractProperty()) model()->d->removeProperty(internalNode()->property(name())); if (modelNode.hasParentProperty()) { Internal::InternalNodeAbstractProperty::Pointer oldParentProperty = modelNode.internalNode()->parentProperty(); model()->d->reparentNode(internalNode(), name(), modelNode.internalNode(), isNodeList); Q_ASSERT(!oldParentProperty.isNull()); } else { model()->d->reparentNode(internalNode(), name(), modelNode.internalNode(), isNodeList); } }
ModelNode BindingProperty::resolveToModelNode() const { if (!isValid()) throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__); return resolveBinding(expression(), parentModelNode(), view()); }
void NodeAbstractProperty::reparentHere(const ModelNode &modelNode) { if (internalNode()->hasProperty(name()) && !internalNode()->property(name())->isNodeAbstractProperty()) reparentHere(modelNode, isNodeListProperty()); else reparentHere(modelNode, parentModelNode().metaInfo().propertyIsListProperty(name()) || isDefaultProperty()); //we could use the metasystem instead? }
AbstractProperty BindingProperty::resolveToProperty() const { if (!isValid()) throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__); QString binding = expression(); ModelNode node = parentModelNode(); QString element; if (binding.contains(QLatin1Char('.'))) { element = binding.split(QLatin1Char('.')).last(); QString nodeBinding = binding; nodeBinding.chop(element.length()); node = resolveBinding(nodeBinding, parentModelNode(), view()); } else { element = binding; } if (node.isValid()) return node.property(element); else return AbstractProperty(); }
/*! \brief returns the QmlObjectNode to which the property belongs \return node to which the property belongs */ QmlObjectNode AbstractProperty::parentQmlObjectNode() const { return QmlObjectNode(parentModelNode()); }