QPair<QString, NodeInstance> QmlGraphicsItemNodeInstance::anchor(const QString &name) const { if (!isValidAnchorName(name) || !hasAnchor(name)) return GraphicsObjectNodeInstance::anchor(name); QObject *targetObject = 0; QString targetName; if (name == "anchors.fill") { targetObject = anchors()->fill(); } else if (name == "anchors.centerIn") { targetObject = anchors()->centerIn(); } else { QDeclarativeProperty metaProperty(object(), name, context()); if (!metaProperty.isValid()) return GraphicsObjectNodeInstance::anchor(name); QDeclarativeAnchorLine anchorLine = metaProperty.read().value<QDeclarativeAnchorLine>(); if (anchorLine.anchorLine != QDeclarativeAnchorLine::Invalid) { targetObject = anchorLine.item; targetName = propertyNameForAnchorLine(anchorLine.anchorLine); } } if (targetObject && nodeInstanceView()->hasInstanceForObject(targetObject)) { return qMakePair(targetName, nodeInstanceView()->instanceForObject(targetObject)); } else { return GraphicsObjectNodeInstance::anchor(name); } }
void ObjectNodeInstance::setPropertyVariant(const QString &name, const QVariant &value) { QDeclarativeProperty property(object(), name, context()); if (!property.isValid()) return; QVariant oldValue = property.read(); if (oldValue.type() == QVariant::Url) { QUrl url = oldValue.toUrl(); QString path = url.toLocalFile(); if (QFileInfo(path).exists() && nodeInstanceView() && !path.isEmpty()) nodeInstanceView()->removeFilePropertyFromFileSystemWatcher(object(), name, path); } property.write(value); QVariant newValue = property.read(); if (newValue.type() == QVariant::Url) { QUrl url = newValue.toUrl(); QString path = url.toLocalFile(); if (QFileInfo(path).exists() && nodeInstanceView() && !path.isEmpty()) nodeInstanceView()->addFilePropertyToFileSystemWatcher(object(), name, path); } }
void NodeInstanceView::currentStateChanged(const ModelNode &node) { NodeInstance newStateInstance = instanceForModelNode(node); if (newStateInstance.isValid() && node.metaInfo().isSubclassOf("QtQuick.State", 1, 0)) nodeInstanceView()->activateState(newStateInstance); else nodeInstanceView()->activateBaseState(); }
NodeInstance ObjectNodeInstance::instanceForNode(const ModelNode &node, const QString &fullname) { if (nodeInstanceView()->hasInstanceForNode(node)) { return nodeInstanceView()->instanceForNode(node); } else { NodeInstance instance(nodeInstanceView()->loadNode(node)); m_modelAbstractPropertyHash.insert(fullname, instance); return instance; } }
QDeclarativeContext *ObjectNodeInstance::context() const { QDeclarativeContext *context = QDeclarativeEngine::contextForObject(object()); if (context) return context; else if (nodeInstanceView()) return nodeInstanceView()->engine()->rootContext(); return 0; }
QVariant ObjectNodeInstance::property(const QString &name) const { if (m_modelAbstractPropertyHash.contains(name)) return QVariant::fromValue(m_modelAbstractPropertyHash.value(name)); // TODO: handle model nodes QDeclarativeProperty property(object(), name, context()); if (property.property().isEnumType()) { QVariant value = object()->property(name.toLatin1()); return property.property().enumerator().valueToKey(value.toInt()); } if (property.propertyType() == QVariant::Url) { QUrl url = property.read().toUrl(); if (url.isEmpty()) return QVariant(); if (url.scheme() == "file") { int basePathLength = nodeInstanceView()->model()->fileUrl().toLocalFile().lastIndexOf('/'); return QUrl(url.toLocalFile().mid(basePathLength + 1)); } } return property.read(); }
void ObjectNodeInstance::removeFromOldProperty(QObject *object, QObject *oldParent, const QString &oldParentProperty) { QDeclarativeProperty property(oldParent, oldParentProperty, context()); if (!property.isValid()) return; if (isList(property)) { removeObjectFromList(property, object, nodeInstanceView()->engine()); } else if (isObject(property)) { if (nodeInstanceView()->hasInstanceForObject(oldParent)) { nodeInstanceView()->instanceForObject(oldParent).resetProperty(oldParentProperty); } } object->setParent(0); }
void ObjectNodeInstance::doResetProperty(const QString &propertyName) { m_modelAbstractPropertyHash.remove(propertyName); QDeclarativeProperty property(object(), propertyName, context()); if (!property.isValid()) return; QVariant oldValue = property.read(); if (oldValue.type() == QVariant::Url) { QUrl url = oldValue.toUrl(); QString path = url.toLocalFile(); if (QFileInfo(path).exists() && nodeInstanceView()) nodeInstanceView()->removeFilePropertyFromFileSystemWatcher(object(), propertyName, path); } QDeclarativeAbstractBinding *binding = QDeclarativePropertyPrivate::binding(property); if (binding) { binding->setEnabled(false, 0); binding->destroy(); } if (property.isResettable()) { property.reset(); } else if (property.propertyTypeCategory() == QDeclarativeProperty::List) { QDeclarativeListReference list = qvariant_cast<QDeclarativeListReference>(property.read()); if (!hasFullImplementedListInterface(list)) { qWarning() << "Property list interface not fully implemented for Class " << property.property().typeName() << " in property " << property.name() << "!"; return; } list.clear(); } else if (property.isWritable()) { if (property.read() == resetValue(propertyName)) return; property.write(resetValue(propertyName)); } }
void QmlModelView::activateState(const QmlModelState &state) { if (debug) qDebug() << this << __FUNCTION__ << state; if (!state.isValid()) return; if (m_state == state) return; QmlModelState oldState = m_state; NodeInstance newStateInstance = instanceForModelNode(state.modelNode()); if (state.isBaseState()) { nodeInstanceView()->activateBaseState(); } else { nodeInstanceView()->activateState(newStateInstance); } }
void StatesEditorView::modelAttached(Model *model) { if (model == QmlModelView::model()) return; Q_ASSERT(model); QmlModelView::modelAttached(model); if (m_statesEditorWidget) m_statesEditorWidget->setNodeInstanceView(nodeInstanceView()); resetModel(); }
void StatesEditorView::modelAttached(Model *model) { if (model == AbstractView::model()) return; Q_ASSERT(model); AbstractView::modelAttached(model); if (m_statesEditorWidget) m_statesEditorWidget->setNodeInstanceView(nodeInstanceView()); checkForApplicationWindow(); resetModel(); }
void ObjectNodeInstance::initializePropertyWatcher(const ObjectNodeInstance::Pointer &objectNodeInstance) { if (!objectNodeInstance->modelNode().metaInfo().isComponent()) { // TODO: this is a nasty workaround which needs to be removed const QMetaObject *metaObject = objectNodeInstance->object()->metaObject(); m_metaObject = new NodeInstanceMetaObject(objectNodeInstance, nodeInstanceView()->engine()); for(int propertyIndex = QObject::staticMetaObject.propertyCount(); propertyIndex < metaObject->propertyCount(); propertyIndex++) { if (QDeclarativeMetaType::isQObject(metaObject->property(propertyIndex).userType())) { QObject *propertyObject = QDeclarativeMetaType::toQObject(metaObject->property(propertyIndex).read(objectNodeInstance->object())); if (propertyObject && hasPropertiesWitoutNotifications(propertyObject->metaObject())) { new NodeInstanceMetaObject(objectNodeInstance, propertyObject, metaObject->property(propertyIndex).name(), nodeInstanceView()->engine()); } } } } else { qWarning() << "dynamic properties are not supported for components"; } m_signalSpy.setObjectNodeInstance(objectNodeInstance); }
bool QmlModelView::hasInstanceForModelNode(const ModelNode &modelNode) { return nodeInstanceView()->hasInstanceForNode(modelNode); }
NodeInstance QmlModelView::instanceForModelNode(const ModelNode &modelNode) { return nodeInstanceView()->instanceForNode(modelNode); }
void AbstractView::emitInstancePropertyChange(const QList<QPair<ModelNode, PropertyName> > &propertyList) { if (model() && nodeInstanceView() == this) model()->d->notifyInstancePropertyChange(propertyList); }
void AbstractView::emitInstanceInformationsChange(const QMultiHash<ModelNode, InformationName> &informationChangeHash) { if (model() && nodeInstanceView() == this) model()->d->notifyInstancesInformationsChange(informationChangeHash); }
void AbstractView::emitInstancesChildrenChanged(const QVector<ModelNode> &nodeVector) { if (model() && nodeInstanceView() == this) model()->d->notifyInstancesChildrenChanged(nodeVector); }
void AbstractView::sendTokenToInstances(const QString &token, int number, const QVector<ModelNode> &nodeVector) { if (nodeInstanceView()) nodeInstanceView()->sendToken(token, number, nodeVector); }
void AbstractView::emitInstanceToken(const QString &token, int number, const QVector<ModelNode> &nodeVector) { if (nodeInstanceView()) model()->d->notifyInstanceToken(token, number, nodeVector); }