Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qqmldebugtranslationservice.cpp
Go to the documentation of this file.
1// Copyright (C) 2020 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3// Qt-Security score:significant
4
8
9#include <QtCore/qtranslator.h>
10#include <QtCore/qdebug.h>
11#include <QtCore/qlibraryinfo.h>
12#include <QtCore/qdir.h>
13#include <QtCore/qfile.h>
14#include <QtCore/qtimer.h>
15#include <QtCore/qhash.h>
16#include <QtCore/qpointer.h>
17
18#include <private/qqmldebugtranslationprotocol_p.h>
19#include <private/qqmldebugconnector_p.h>
20#include <private/qversionedpacket_p.h>
21
22#include <private/qqmlbinding_p.h>
23#include <private/qqmlbinding_p.h>
24#include <private/qquickstategroup_p.h>
25#include <private/qquickitem_p.h>
26#include <private/qquicktext_p.h>
27#include <private/qdebug_p.h>
28
29#include <QtQuick/qquickitem.h>
30
31#include <qquickview.h>
32
34
35using namespace QQmlDebugTranslation;
36
37QDebug operator<<(QDebug debug, const TranslationBindingInformation &translationBindingInformation)
38{
39 QQmlError error;
40 error.setUrl(translationBindingInformation.compilationUnit->url());
41 error.setLine(translationBindingInformation.line);
42 error.setColumn(translationBindingInformation.column);
43 error.setDescription(
44 QString(QLatin1String(
45 "QDebug translation binding"
46 )));
47 return debug << qPrintable(error.toString());
48}
49
50static QString translationIdString(const QQmlTranslation::QsTrData &data)
51{
52 return QString::fromUtf8(data.text());
53}
54
55static QString translationIdString(const QQmlTranslation::QsTrIdData &data)
56{
57 return QString::fromUtf8(data.id());
58}
59
60static QString translationIdString(const QQmlTranslation &translation)
61{
62 return translation.visit(
63 [](auto &&arg) -> QString {
64 using T = std::decay_t<decltype(arg)>;
65 if constexpr (!std::is_same_v<T, std::nullptr_t>)
66 return translationIdString(arg);
67 else {
68 Q_ASSERT_X(false, "QQmlTranslation", "Uninitialized Translation");
69 return {};
70 }
71 });
72}
73
75{
77public:
85
100
109
131
133 {
134 // TODO: for disabling we need to keep track which one were enabled
135 if (s == false)
136 qWarning() << "disable WatchTextElides is not implemented";
141 if (elideIndex >= 0) {
144 }
145 }
146 }
147
149 {
150 if (font.styleName() != "")
151 return font.styleName();
153 if (font.bold())
154 styleName.append("Bold ");
155 if (font.italic())
156 styleName.append("Italic " );
157 if (font.strikeOut())
158 styleName.append("StrikeThrough ");
159 if (font.underline())
160 styleName.append("Underline ");
161 return styleName.trimmed();
162 }
163
165 {
166
169
171
173
177
179 if (textIndex >= 0) {
180
182
184
190
197 scopeObject->property("horizontalAlignment").toInt();
198 qmlElement.verticalAlignment = scopeObject->property("verticalAlignment").toInt();
199
204
205 } else {
206 QString warningMessage = "(QQmlDebugTranslationService can not resolve %1 - %2:"
207 " this should never happen)";
210 }
211 }
212 std::sort(qmlElements.begin(), qmlElements.end(), [](const auto &l1, const auto &l2){
213 return l1.codeMarker < l2.codeMarker;
214 });
215
218 }
219
226
260
262
263 bool watchTextElides = false;
266 ProxyTranslator *proxyTranslator;
267
271
272 QQuickItem *currentRootItem()
273 {
274 if (QQmlPreviewServiceImpl *service = QQmlDebugConnector::service<QQmlPreviewServiceImpl>())
275 return service->currentRootItem();
276 if (currentQuickView)
277 return currentQuickView->rootObject();
278 return nullptr;
279 }
281
282private:
283 CodeMarker codeMarker(const TranslationBindingInformation &information)
284 {
285 CodeMarker c;
286 c.url = information.compilationUnit->url();
287 c.line = information.line;
288 c.column = information.column;
289 return c;
290 }
291 QString currentStateName;
292};
293
294QQmlDebugTranslationServiceImpl::QQmlDebugTranslationServiceImpl(QObject *parent)
295 : QQmlDebugTranslationService(1, parent)
296{
297 d = new QQmlDebugTranslationServicePrivate(this);
298
300 d, &QQmlDebugTranslationServicePrivate::setWatchTextElides,
301 Qt::QueuedConnection);
302
303 connect(this, &QQmlDebugTranslationServiceImpl::language,
304 d->proxyTranslator, &ProxyTranslator::setLanguage,
305 Qt::QueuedConnection);
306
307 connect(this, &QQmlDebugTranslationServiceImpl::state,
308 d, &QQmlDebugTranslationServicePrivate::setState,
309 Qt::QueuedConnection);
310
312 d, &QQmlDebugTranslationServicePrivate::sendStateList,
313 Qt::QueuedConnection);
314
315 connect(d->proxyTranslator, &ProxyTranslator::languageChanged,
316 d, &QQmlDebugTranslationServicePrivate::sendLanguageChanged,
317 Qt::QueuedConnection);
318
320 d, &QQmlDebugTranslationServicePrivate::sendTranslationIssues,
321 Qt::QueuedConnection);
322
324 d, &QQmlDebugTranslationServicePrivate::sendTranslatableTextOccurrences,
325 Qt::QueuedConnection);
326}
327
334
335void QQmlDebugTranslationServiceImpl::messageReceived(const QByteArray &message)
336{
337 QVersionedPacket<QQmlDebugConnector> packet(message);
338 QQmlDebugTranslation::Request command;
339
340 packet >> command;
341 switch (command) {
342 case QQmlDebugTranslation::Request::ChangeLanguage: {
343 QUrl context;
344 QString locale;
345 packet >> context >> locale;
346 emit language(context, QLocale(locale));
347 break;
348 }
349 case QQmlDebugTranslation::Request::ChangeState: {
350 QString stateName;
351 packet >> stateName;
352 emit state(stateName);
353 break;
354 }
355 case QQmlDebugTranslation::Request::StateList: {
356 emit stateList();
357 break;
358 }
359 case QQmlDebugTranslation::Request::TranslationIssues: {
360 emit translationIssues();
361 break;
362 }
363 case QQmlDebugTranslation::Request::TranslatableTextOccurrences: {
364 emit sendTranslatableTextOccurrences();
365 break;
366 }
367 case QQmlDebugTranslation::Request::WatchTextElides: {
368 emit watchTextElides(true);
369 break;
370 }
371 case QQmlDebugTranslation::Request::DisableWatchTextElides: {
372 emit watchTextElides(false);
373 break;
374 }
375 default: {
376 qWarning() << "DebugTranslationService: received unknown command: " << static_cast<int>(command);
377 break;
378 }
379 } // switch (command)
380}
381
383{
384 if (QQmlEngine *qmlEngine = qobject_cast<QQmlEngine *>(engine))
385 d->proxyTranslator->addEngine(qmlEngine);
386
387 if (engine->parent())
388 d->currentQuickView = qobject_cast<QQuickView*>(engine->parent());
389
390 emit attachedToEngine(engine);
391}
392
394{
395 if (QQmlEngine *qmlEngine = qobject_cast<QQmlEngine *>(engine))
396 d->proxyTranslator->removeEngine(qmlEngine);
397 emit detachedFromEngine(engine);
398}
399
400void QQmlDebugTranslationServiceImpl::foundTranslationBinding(const TranslationBindingInformation &translationBindingInformation)
401{
402 QObject *scopeObject = translationBindingInformation.scopeObject;
403 connect(scopeObject, &QObject::destroyed, this, [this, scopeObject] () {
404 this->d->objectTranslationBindingMultiMap.remove(scopeObject);
405 });
406
407 d->objectTranslationBindingMultiMap.insert(scopeObject, translationBindingInformation);
408}
409
410QT_END_NAMESPACE
411
412#include "moc_qqmldebugtranslationservice.cpp"
413
414#include <qqmldebugtranslationservice.moc>
void messageReceived(const QByteArray &message) override
void foundTranslationBinding(const TranslationBindingInformation &translationBindingInformation) override
void engineAboutToBeAdded(QJSEngine *engine) override
void engineAboutToBeRemoved(QJSEngine *engine) override
QMultiMap< QObject *, TranslationBindingInformation > objectTranslationBindingMultiMap
QList< QPointer< QQuickItem > > translatableTextOccurrences
Combined button and popup list for selecting options.
QDebug operator<<(QDebug dbg, const QFileInfo &fi)
static QString translationIdString(const QQmlTranslation::QsTrData &data)