static void addProperty(QMetaObjectBuilder *builder, int propertyId, const QByteArray &propertyName, const QByteArray &propertyType) { builder->addSignal("__" + QByteArray::number(propertyId) + "()"); QMetaPropertyBuilder property = builder->addProperty( propertyName, propertyType, propertyId); property.setWritable(true); }
QMetaObject *GoValue::metaObjectFor(GoTypeInfo *typeInfo) { if (typeInfo->metaObject) { return reinterpret_cast<QMetaObject *>(typeInfo->metaObject); } QMetaObjectBuilder mob; mob.setSuperClass(&QObject::staticMetaObject); mob.setClassName(typeInfo->typeName); mob.setFlags(QMetaObjectBuilder::DynamicMetaObject); GoMemberInfo *memberInfo; memberInfo = typeInfo->fields; int relativePropIndex = mob.propertyCount(); for (int i = 0; i < typeInfo->fieldsLen; i++) { mob.addSignal("__" + QByteArray::number(relativePropIndex) + "()"); QMetaPropertyBuilder propb = mob.addProperty(memberInfo->memberName, "QVariant", relativePropIndex); propb.setWritable(true); memberInfo->metaIndex = relativePropIndex; memberInfo++; relativePropIndex++; } memberInfo = typeInfo->methods; int relativeMethodIndex = mob.methodCount(); for (int i = 0; i < typeInfo->methodsLen; i++) { if (*memberInfo->resultSignature) { mob.addMethod(memberInfo->methodSignature, memberInfo->resultSignature); } else { mob.addMethod(memberInfo->methodSignature); } memberInfo->metaIndex = relativeMethodIndex; memberInfo++; relativeMethodIndex++; } QMetaObject *mo = mob.toMetaObject(); // Turn the relative indexes into absolute indexes. memberInfo = typeInfo->fields; int propOffset = mo->propertyOffset(); for (int i = 0; i < typeInfo->fieldsLen; i++) { memberInfo->metaIndex += propOffset; memberInfo++; } memberInfo = typeInfo->methods; int methodOffset = mo->methodOffset(); for (int i = 0; i < typeInfo->methodsLen; i++) { memberInfo->metaIndex += methodOffset; memberInfo++; } typeInfo->metaObject = mo; return mo; }
QMetaObject *DosQMetaObject::createMetaObject(const QString &className, const SignalDefinitions &signalDefinitions, const SlotDefinitions &slotDefinitions, const PropertyDefinitions &propertyDefinitions) { QMetaObjectBuilder builder; builder.setClassName(className.toUtf8()); builder.setSuperClass(m_superClassDosMetaObject->metaObject()); for (const SignalDefinition &signal : signalDefinitions) { QMetaMethodBuilder signalBuilder = builder.addSignal(::createSignature(signal)); signalBuilder.setReturnType(QMetaType::typeName(QMetaType::Void)); signalBuilder.setAccess(QMetaMethod::Public); signalBuilder.setParameterNames(createParameterNames(signal)); m_signalIndexByName[signal.name] = signalBuilder.index(); } QHash<QString, int> methodIndexByName; for (const SlotDefinition &slot : slotDefinitions) { QMetaMethodBuilder methodBuilder = builder.addSlot(::createSignature(slot)); methodBuilder.setReturnType(QMetaType::typeName(slot.returnType)); methodBuilder.setAttributes(QMetaMethod::Scriptable); methodIndexByName[slot.name] = methodBuilder.index(); } for (const PropertyDefinition &property : propertyDefinitions) { const int writer = methodIndexByName.value(property.writeSlot, -1); const int notifier = m_signalIndexByName.value(property.notifySignal, -1); const QByteArray name = property.name.toUtf8(); const QByteArray typeName = QMetaObject::normalizedType(QMetaType::typeName(property.type)); QMetaPropertyBuilder propertyBuilder = builder.addProperty(name, typeName, notifier); if (writer == -1) propertyBuilder.setWritable(false); if (notifier == -1) propertyBuilder.setConstant(true); m_propertySlots[property.name] = qMakePair(methodIndexByName.value(property.readSlot, -1), methodIndexByName.value(property.writeSlot, -1)); } return builder.toMetaObject(); }
int QDeclarativeOpenMetaObjectType::createProperty(const QByteArray &name) { int id = d->mob.propertyCount(); d->mob.addSignal("__" + QByteArray::number(id) + "()"); QMetaPropertyBuilder build = d->mob.addProperty(name, "QVariant", id); build.setDynamic(true); propertyCreated(id, build); qFree(d->mem); d->mem = d->mob.toMetaObject(); d->names.insert(name, id); QSet<QDeclarativeOpenMetaObject*>::iterator it = d->referers.begin(); while (it != d->referers.end()) { QDeclarativeOpenMetaObject *omo = *it; *static_cast<QMetaObject *>(omo) = *d->mem; if (d->cache) d->cache->update(d->engine, omo); ++it; } return d->propertyOffset + id; }
QMetaObject *metaObjectFor(GoTypeInfo *typeInfo) { if (typeInfo->metaObject) { return reinterpret_cast<QMetaObject *>(typeInfo->metaObject); } QMetaObjectBuilder mob; if (typeInfo->paint) { mob.setSuperClass(&QQuickPaintedItem::staticMetaObject); } else { mob.setSuperClass(&QObject::staticMetaObject); } mob.setClassName(typeInfo->typeName); mob.setFlags(QMetaObjectBuilder::DynamicMetaObject); GoMemberInfo *memberInfo; memberInfo = typeInfo->fields; int relativePropIndex = mob.propertyCount(); for (int i = 0; i < typeInfo->fieldsLen; i++) { mob.addSignal("__" + QByteArray::number(relativePropIndex) + "()"); const char *typeName = "QVariant"; if (memberInfo->memberType == DTListProperty) { typeName = "QQmlListProperty<QObject>"; } QMetaPropertyBuilder propb = mob.addProperty(memberInfo->memberName, typeName, relativePropIndex); propb.setWritable(true); memberInfo->metaIndex = relativePropIndex; memberInfo++; relativePropIndex++; } memberInfo = typeInfo->methods; int relativeMethodIndex = mob.methodCount(); for (int i = 0; i < typeInfo->methodsLen; i++) { if (*memberInfo->resultSignature) { mob.addMethod(memberInfo->methodSignature, memberInfo->resultSignature); } else { mob.addMethod(memberInfo->methodSignature); } memberInfo->metaIndex = relativeMethodIndex; memberInfo++; relativeMethodIndex++; } // TODO Support default properties. //mob.addClassInfo("DefaultProperty", "objects"); QMetaObject *mo = mob.toMetaObject(); // Turn the relative indexes into absolute indexes. memberInfo = typeInfo->fields; int propOffset = mo->propertyOffset(); for (int i = 0; i < typeInfo->fieldsLen; i++) { memberInfo->metaIndex += propOffset; memberInfo++; } memberInfo = typeInfo->methods; int methodOffset = mo->methodOffset(); for (int i = 0; i < typeInfo->methodsLen; i++) { memberInfo->metaIndex += methodOffset; memberInfo++; } typeInfo->metaObject = mo; return mo; }
void QQmlPropertyMapMetaObject::propertyCreated(int, QMetaPropertyBuilder &b) { priv->keys.append(QString::fromUtf8(b.name())); }