aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick/util/qquickpropertychanges.cpp
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@digia.com>2014-04-26 14:42:39 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-04-28 12:50:17 +0200
commit68a662a2e15b790080ea12c2434f6e1fe60bda1b (patch)
tree2ac79cccf047e4ed5f61f06f9a3823715975daa1 /src/quick/util/qquickpropertychanges.cpp
parentda4f5504822189a7efd279d2380e0737f9de3968 (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.cpp37
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);
}
}