diff options
author | Simon Hausmann <simon.hausmann@digia.com> | 2014-04-26 14:42:39 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2014-04-28 12:50:17 +0200 |
commit | 68a662a2e15b790080ea12c2434f6e1fe60bda1b (patch) | |
tree | 2ac79cccf047e4ed5f61f06f9a3823715975daa1 /src/quick/util/qquickpropertychanges.cpp | |
parent | da4f5504822189a7efd279d2380e0737f9de3968 (diff) |
Fix translations in states causing failing assertions
This is a smaller fix suitable for the release branch, merely adding support
for translations to the bytearray compilation step for states and ensuring a
consistent error message when qsTr is used in list models.
The proper fix will be done in dev that eliminates the entire intermediate
QByteArray storage for custom compilers.
Task-number: QTBUG-38492
Change-Id: If5171f16eb742c718e48b8bbcb265b0c241cd5e7
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
Diffstat (limited to 'src/quick/util/qquickpropertychanges.cpp')
-rw-r--r-- | src/quick/util/qquickpropertychanges.cpp | 37 |
1 files changed, 25 insertions, 12 deletions
diff --git a/src/quick/util/qquickpropertychanges.cpp b/src/quick/util/qquickpropertychanges.cpp index 188b91b15e..1786317356 100644 --- a/src/quick/util/qquickpropertychanges.cpp +++ b/src/quick/util/qquickpropertychanges.cpp @@ -272,12 +272,11 @@ QByteArray QQuickPropertyChangesParser::compile(const QV4::CompiledData::QmlUnit ds << data.count(); for (int ii = 0; ii < data.count(); ++ii) { const QV4::CompiledData::Binding *binding = data.at(ii).second; + ds << data.at(ii).first << int(binding->type); QVariant var; - bool isScript = binding->type == QV4::CompiledData::Binding::Type_Script; - QQmlBinding::Identifier id = QQmlBinding::Invalid; switch (binding->type) { case QV4::CompiledData::Binding::Type_Script: - id = bindingIdentifier(binding); + ds << bindingIdentifier(binding); // Fall through as we also need the expression string. // Signal handlers still need to be constructed by string ;( case QV4::CompiledData::Binding::Type_String: @@ -291,13 +290,12 @@ QByteArray QQuickPropertyChangesParser::compile(const QV4::CompiledData::QmlUnit break; case QV4::CompiledData::Binding::Type_Translation: case QV4::CompiledData::Binding::Type_TranslationById: - Q_UNREACHABLE(); + ds << binding->value.translationData.commentIndex << binding->value.translationData.number; + var = binding->stringIndex; default: break; } - ds << data.at(ii).first << isScript << var; - if (isScript) - ds << id; + ds << var; } return rv; @@ -315,14 +313,21 @@ void QQuickPropertyChangesPrivate::decode() ds >> count; for (int ii = 0; ii < count; ++ii) { QString name; - bool isScript; + int type; QVariant data; QQmlBinding::Identifier id = QQmlBinding::Invalid; + QV4::CompiledData::TranslationData tsd; ds >> name; - ds >> isScript; - ds >> data; - if (isScript) + ds >> type; + + if (type == QV4::CompiledData::Binding::Type_Script) { ds >> id; + } else if (type == QV4::CompiledData::Binding::Type_Translation + || type == QV4::CompiledData::Binding::Type_TranslationById) { + ds >> tsd.commentIndex >> tsd.number; + } + + ds >> data; QQmlProperty prop = property(name); //### better way to check for signal property? if (prop.type() & QQmlProperty::SignalProperty) { @@ -331,7 +336,7 @@ void QQuickPropertyChangesPrivate::decode() handler->expression.take(new QQmlBoundSignalExpression(object, QQmlPropertyPrivate::get(prop)->signalIndex(), QQmlContextData::get(qmlContext(q)), object, cdata->functionForBindingId(id))); signalReplacements << handler; - } else if (isScript) { // binding + } else if (type == QV4::CompiledData::Binding::Type_Script) { // binding QString expression = data.toString(); QUrl url = QUrl(); int line = -1; @@ -346,6 +351,14 @@ void QQuickPropertyChangesPrivate::decode() expressions << ExpressionChange(name, id, expression, url, line, column); } else { + if (type == QV4::CompiledData::Binding::Type_Translation + || type == QV4::CompiledData::Binding::Type_TranslationById) { + QV4::CompiledData::Binding tmpBinding; + tmpBinding.type = type; + tmpBinding.stringIndex = data.toInt(); + tmpBinding.value.translationData = tsd; + data = tmpBinding.valueAsString(&cdata->qmlUnit->header); + } properties << qMakePair(name, data); } } |