QStringList DynamicPropertiesModel::possibleTargetProperties(const BindingProperty &bindingProperty) const { const ModelNode modelNode = bindingProperty.parentModelNode(); if (!modelNode.isValid()) { qWarning() << " BindingModel::possibleTargetPropertiesForRow invalid model node"; return QStringList(); } NodeMetaInfo metaInfo = modelNode.metaInfo(); if (metaInfo.isValid()) { QStringList possibleProperties; foreach (const PropertyName &propertyName, metaInfo.propertyNames()) { if (metaInfo.propertyIsWritable(propertyName)) possibleProperties << QString::fromLatin1(propertyName); } return possibleProperties; }
void PropertyEditorContextObject::changeTypeName(const QString &typeName) { if (!m_model || !m_model->rewriterView()) return; /* Ideally we should not missuse the rewriterView * If we add more code here we have to forward the property editor view */ RewriterView *rewriterView = m_model->rewriterView(); if (rewriterView->selectedModelNodes().isEmpty()) return; ModelNode selectedNode = rewriterView->selectedModelNodes().constFirst(); try { RewriterTransaction transaction = rewriterView->beginRewriterTransaction(QByteArrayLiteral("PropertyEditorContextObject:changeTypeName")); NodeMetaInfo metaInfo = m_model->metaInfo(typeName.toLatin1()); if (!metaInfo.isValid()) { Core::AsynchronousMessageBox::warning(tr("Invalid Type"), tr("%1 is an invalid type.").arg(typeName)); return; } if (selectedNode.isRootNode()) rewriterView->changeRootNodeType(metaInfo.typeName(), metaInfo.majorVersion(), metaInfo.minorVersion()); else selectedNode.changeType(metaInfo.typeName(), metaInfo.majorVersion(), metaInfo.minorVersion()); transaction.commit(); } catch (RewritingException &exception) { //better safe than sorry! There always might be cases where we fail exception.showException(); } }
QmlItemNode QmlItemNode::createQmlItemNode(AbstractView *view, const ItemLibraryEntry &itemLibraryEntry, const QPointF &position, QmlItemNode parentQmlItemNode) { if (!parentQmlItemNode.isValid()) parentQmlItemNode = QmlItemNode(view->rootModelNode()); Q_ASSERT(parentQmlItemNode.isValid()); QmlItemNode newQmlItemNode; try { RewriterTransaction transaction = view->beginRewriterTransaction(); NodeMetaInfo metaInfo = view->model()->metaInfo(itemLibraryEntry.typeName()); int minorVersion = metaInfo.minorVersion(); int majorVersion = metaInfo.majorVersion(); if (itemLibraryEntry.typeName().contains('.')) { const QString newImportUrl = itemLibraryEntry.requiredImport(); if (!itemLibraryEntry.requiredImport().isEmpty()) { const QString newImportVersion = QString("%1.%2").arg(QString::number(itemLibraryEntry.majorVersion()), QString::number(itemLibraryEntry.minorVersion())); Import newImport = Import::createLibraryImport(newImportUrl, newImportVersion); if (itemLibraryEntry.majorVersion() == -1 && itemLibraryEntry.minorVersion() == -1) newImport = Import::createFileImport(newImportUrl, QString()); else newImport = Import::createLibraryImport(newImportUrl, newImportVersion); foreach (const Import &import, view->model()->imports()) { if (import.isLibraryImport() && import.url() == newImport.url() && import.version() == newImport.version()) { // reuse this import newImport = import; break; } } if (!view->model()->hasImport(newImport, true, true)) view->model()->changeImports(QList<Import>() << newImport, QList<Import>()); } } if (itemLibraryEntry.qmlSource().isEmpty()) { QList<QPair<PropertyName, QVariant> > propertyPairList; propertyPairList.append(qMakePair(PropertyName("x"), QVariant(qRound(position.x())))); propertyPairList.append(qMakePair(PropertyName("y"), QVariant(qRound(position.y())))); foreach (const PropertyContainer &property, itemLibraryEntry.properties()) propertyPairList.append(qMakePair(property.name(), property.value())); newQmlItemNode = QmlItemNode(view->createModelNode(itemLibraryEntry.typeName(), majorVersion, minorVersion, propertyPairList)); } else { newQmlItemNode = createQmlItemNodeFromSource(view, itemLibraryEntry.qmlSource(), position); } if (parentQmlItemNode.hasDefaultPropertyName()) parentQmlItemNode.nodeAbstractProperty(parentQmlItemNode.defaultPropertyName()).reparentHere(newQmlItemNode); if (!newQmlItemNode.isValid()) return newQmlItemNode; newQmlItemNode.setId(view->generateNewId(itemLibraryEntry.name())); if (!view->currentState().isBaseState()) { newQmlItemNode.modelNode().variantProperty("opacity").setValue(0); newQmlItemNode.setVariantProperty("opacity", 1); } Q_ASSERT(newQmlItemNode.isValid()); }