diff options
| author | Sami Shalayel <[email protected]> | 2022-07-15 11:15:52 +0200 |
|---|---|---|
| committer | Sami Shalayel <[email protected]> | 2022-08-15 11:20:32 +0200 |
| commit | e9dc0ac68134bc6a9cc6522eaca6d893ee10b86d (patch) | |
| tree | f584dbb5ff239bbe7f931f35d2b8e46465f3ff60 /src/qml/qmltc | |
| parent | 70074e1acaca16afd6306a9c967ce4d15966c333 (diff) | |
Create Translation Bindings without CompiledData::Binding
To add translation bindings to qmltc, the methods used to create
translation bindings need to be adapted to work without
QV4::CompiledData::Binding as it is not available from qmltc. Instead,
information already available from the QQmlJSScope should be used, along
with a newly introduced helper class QQmlTranslation.
Details:
Add a QQmlTranslation class that represents a call to qsTr, qsTrId etc
that knows how to translate itself (without needing any
ExecutableCompilationUnit or Binding). It encapsulates the
information needed to create a translation binding.
ExecutableCompilationUnit::bindingValueAsString refactored
so its functionality can be used without Binding.
Instead, it uses only the translationId, see
ExecutableCompilationUnit::translateFromId
and
ExecutableCompilationUnit::translateFrom.
Refactored QQmlTranslationBinding to work with QQmlTranslation instead
of CompiledData::Binding.
Same for QQmlCppBinding::createTranslationBindingForBindable,
QQmlTranslationPropertyBinding::create and
QQmlCppBinding::createTranslationBindingForNonBindable.
Changed TranslationBindingInformation to work without
CompiledData::Binding, and also removed static unused
QString ProxyTranslator::originStringFromInformation(
const TranslationBindingInformation &translationBindingInformation)
as I could not find out what this origin string is.
Same for the translation debugging in qmldb_preview.
Added QmltcCodeGenerator::generate_createTranslationBindingOnProperty.
Added #if to avoid compilation error for standalone DOM compilation due
to the new QQmlTranslation class.
Task-number: QTBUG-105345
Change-Id: Iccd94d5cba4eaf63901233451fec48051c855c2a
Reviewed-by: Qt CI Bot <[email protected]>
Reviewed-by: Fabian Kosmale <[email protected]>
Diffstat (limited to 'src/qml/qmltc')
| -rw-r--r-- | src/qml/qmltc/supportlibrary/qqmlcppbinding.cpp | 52 | ||||
| -rw-r--r-- | src/qml/qmltc/supportlibrary/qqmlcppbinding_p.h | 12 |
2 files changed, 64 insertions, 0 deletions
diff --git a/src/qml/qmltc/supportlibrary/qqmlcppbinding.cpp b/src/qml/qmltc/supportlibrary/qqmlcppbinding.cpp index a9d4207c1b..fdea993124 100644 --- a/src/qml/qmltc/supportlibrary/qqmlcppbinding.cpp +++ b/src/qml/qmltc/supportlibrary/qqmlcppbinding.cpp @@ -108,4 +108,56 @@ void QQmlCppBinding::createBindingForNonBindable(const QV4::ExecutableCompilatio }); } +QUntypedPropertyBinding QQmlCppBinding::createTranslationBindingForBindable( + const QQmlRefPointer<QV4::ExecutableCompilationUnit> &unit, QObject *bindingTarget, + int metaPropertyIndex, const QQmlTranslation &translationData, const QString &propertyName) +{ + Q_UNUSED(propertyName); + + if (metaPropertyIndex < 0) { + // TODO: align with existing logging of such + qCritical() << "invalid meta property index (internal error)"; + return QUntypedPropertyBinding(); + } + + const QMetaObject *mo = bindingTarget->metaObject(); + Q_ASSERT(mo); + QMetaProperty property = mo->property(metaPropertyIndex); + Q_ASSERT(QString::fromUtf8(property.name()) == propertyName); + + return QQmlTranslationPropertyBinding::create(property.metaType(), unit, translationData); +} + +void QQmlCppBinding::createTranslationBindingForNonBindable( + const QQmlRefPointer<QV4::ExecutableCompilationUnit> &unit, + const QQmlSourceLocation &location, const QQmlTranslation &translationData, + QObject *thisObject, QObject *bindingTarget, int metaPropertyIndex, + const QString &propertyName, int valueTypePropertyIndex) +{ + Q_UNUSED(propertyName); + + if (metaPropertyIndex < 0) { + // TODO: align with existing logging of such + qCritical() << "invalid meta property index (internal error)"; + return; + } + + const QMetaObject *mo = bindingTarget->metaObject(); + Q_ASSERT(mo); + QMetaProperty property = mo->property(metaPropertyIndex); + Q_ASSERT(QString::fromUtf8(property.name()) == propertyName); + + createBindingInScope( + thisObject, + [&](const QQmlRefPointer<QQmlContextData> &ctxt, QV4::ExecutionContext *) -> void { + QQmlBinding *binding = QQmlBinding::createTranslationBinding( + unit, ctxt, propertyName, translationData, location, thisObject); + // almost as in qv4objectwrapper.cpp:535 + Q_ASSERT(!property.isAlias()); // we convert aliases to (almost) real properties + binding->setTarget(bindingTarget, property.propertyIndex(), false, + valueTypePropertyIndex); + QQmlPropertyPrivate::setBinding(binding); + }); +} + QT_END_NAMESPACE diff --git a/src/qml/qmltc/supportlibrary/qqmlcppbinding_p.h b/src/qml/qmltc/supportlibrary/qqmlcppbinding_p.h index e692ab4007..0f2e6a4998 100644 --- a/src/qml/qmltc/supportlibrary/qqmlcppbinding_p.h +++ b/src/qml/qmltc/supportlibrary/qqmlcppbinding_p.h @@ -45,6 +45,18 @@ struct Q_QML_PRIVATE_EXPORT QQmlCppBinding QObject *bindingTarget, int metaPropertyIndex, int valueTypePropertyIndex, const QString &propertyName); + + static QUntypedPropertyBinding + createTranslationBindingForBindable(const QQmlRefPointer<QV4::ExecutableCompilationUnit> &unit, + QObject *bindingTarget, int metaPropertyIndex, + const QQmlTranslation &translationData, + const QString &propertyName); + + static void createTranslationBindingForNonBindable( + const QQmlRefPointer<QV4::ExecutableCompilationUnit> &unit, + const QQmlSourceLocation &location, const QQmlTranslation &translationData, + QObject *thisObject, QObject *bindingTarget, int metaPropertyIndex, + const QString &propertyName, int valueTypePropertyIndex); }; QT_END_NAMESPACE |
