QByteArray QDeclarativeGestureAreaParser::compile(const QList<QDeclarativeCustomParserProperty> &props) { QByteArray rv; QDataStream ds(&rv, QIODevice::WriteOnly); for(int ii = 0; ii < props.count(); ++ii) { QString propName = QString::fromUtf8(props.at(ii).name()); Qt::GestureType type; if (propName == QLatin1String("onTap")) { type = Qt::TapGesture; } else if (propName == QLatin1String("onTapAndHold")) { type = Qt::TapAndHoldGesture; } else if (propName == QLatin1String("onPan")) { type = Qt::PanGesture; } else if (propName == QLatin1String("onPinch")) { type = Qt::PinchGesture; } else if (propName == QLatin1String("onSwipe")) { type = Qt::SwipeGesture; } else if (propName == QLatin1String("onGesture")) { type = Qt::CustomGesture; } else { error(props.at(ii), QDeclarativeGestureArea::tr("Cannot assign to non-existent property \"%1\"").arg(propName)); return QByteArray(); } QList<QVariant> values = props.at(ii).assignedValues(); for (int i = 0; i < values.count(); ++i) { const QVariant &value = values.at(i); if (value.userType() == qMetaTypeId<QDeclarativeCustomParserNode>()) { error(props.at(ii), QDeclarativeGestureArea::tr("GestureArea: nested objects not allowed")); return QByteArray(); } else if (value.userType() == qMetaTypeId<QDeclarativeCustomParserProperty>()) { error(props.at(ii), QDeclarativeGestureArea::tr("GestureArea: syntax error")); return QByteArray(); } else { QDeclarativeParser::Variant v = qvariant_cast<QDeclarativeParser::Variant>(value); if (v.isScript()) { ds << propName; ds << int(type); ds << v.asScript(); } else { error(props.at(ii), QDeclarativeGestureArea::tr("GestureArea: script expected")); return QByteArray(); } } } } return rv; }
QByteArray QDeclarativeConnectionsParser::compile(const QList<QDeclarativeCustomParserProperty> &props) { QByteArray rv; QDataStream ds(&rv, QIODevice::WriteOnly); for(int ii = 0; ii < props.count(); ++ii) { QString propName = QString::fromUtf8(props.at(ii).name()); if (!propName.startsWith(QLatin1String("on")) || !propName.at(2).isUpper()) { error(props.at(ii), QDeclarativeConnections::tr("Cannot assign to non-existent property \"%1\"").arg(propName)); return QByteArray(); } QList<QVariant> values = props.at(ii).assignedValues(); for (int i = 0; i < values.count(); ++i) { const QVariant &value = values.at(i); if (value.userType() == qMetaTypeId<QDeclarativeCustomParserNode>()) { error(props.at(ii), QDeclarativeConnections::tr("Connections: nested objects not allowed")); return QByteArray(); } else if (value.userType() == qMetaTypeId<QDeclarativeCustomParserProperty>()) { error(props.at(ii), QDeclarativeConnections::tr("Connections: syntax error")); return QByteArray(); } else { QDeclarativeParser::Variant v = qvariant_cast<QDeclarativeParser::Variant>(value); if (v.isScript()) { ds << propName; ds << v.asScript(); } else { error(props.at(ii), QDeclarativeConnections::tr("Connections: script expected")); return QByteArray(); } } } } return rv; }
bool QDeclarativeListModelParser::compileProperty(const QDeclarativeCustomParserProperty &prop, QList<ListInstruction> &instr, QByteArray &data) { QList<QVariant> values = prop.assignedValues(); for(int ii = 0; ii < values.count(); ++ii) { const QVariant &value = values.at(ii); if(value.userType() == qMetaTypeId<QDeclarativeCustomParserNode>()) { QDeclarativeCustomParserNode node = qvariant_cast<QDeclarativeCustomParserNode>(value); if (node.name() != listElementTypeName) { const QMetaObject *mo = resolveType(node.name()); if (mo != &QDeclarativeListElement::staticMetaObject) { error(node, QDeclarativeListModel::tr("ListElement: cannot contain nested elements")); return false; } listElementTypeName = node.name(); // cache right name for next time } { ListInstruction li; li.type = ListInstruction::Push; li.dataIdx = -1; instr << li; } QList<QDeclarativeCustomParserProperty> props = node.properties(); for(int jj = 0; jj < props.count(); ++jj) { const QDeclarativeCustomParserProperty &nodeProp = props.at(jj); if (nodeProp.name().isEmpty()) { error(nodeProp, QDeclarativeListModel::tr("ListElement: cannot contain nested elements")); return false; } if (nodeProp.name() == "id") { error(nodeProp, QDeclarativeListModel::tr("ListElement: cannot use reserved \"id\" property")); return false; } ListInstruction li; int ref = data.count(); data.append(nodeProp.name()); data.append('\0'); li.type = ListInstruction::Set; li.dataIdx = ref; instr << li; if(!compileProperty(nodeProp, instr, data)) return false; li.type = ListInstruction::Pop; li.dataIdx = -1; instr << li; } { ListInstruction li; li.type = ListInstruction::Pop; li.dataIdx = -1; instr << li; } } else { QDeclarativeParser::Variant variant = qvariant_cast<QDeclarativeParser::Variant>(value); int ref = data.count(); QByteArray d; d += char(variant.type()); // type tag if (variant.isString()) { d += variant.asString().toUtf8(); } else if (variant.isNumber()) { d += QByteArray::number(variant.asNumber(),'g',20); } else if (variant.isBoolean()) { d += char(variant.asBoolean()); } else if (variant.isScript()) { if (definesEmptyList(variant.asScript())) { d[0] = char(QDeclarativeParser::Variant::Invalid); // marks empty list } else { QByteArray script = variant.asScript().toUtf8(); int v = evaluateEnum(script); if (v<0) { if (script.startsWith("QT_TR_NOOP(\"") && script.endsWith("\")")) { d[0] = char(QDeclarativeParser::Variant::String); d += script.mid(12,script.length()-14); } else { error(prop, QDeclarativeListModel::tr("ListElement: cannot use script for property value")); return false; } } else { d[0] = char(QDeclarativeParser::Variant::Number); d += QByteArray::number(v); } } } d.append('\0'); data.append(d); ListInstruction li; li.type = ListInstruction::Value; li.dataIdx = ref; instr << li; } } return true; }