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
299 connect(this, &QQmlDebugTranslationServiceImpl::watchTextElides,
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
311 connect(this, &QQmlDebugTranslationServiceImpl::stateList,
312 d, &QQmlDebugTranslationServicePrivate::sendStateList,
313 Qt::QueuedConnection);
314
315 connect(d->proxyTranslator, &ProxyTranslator::languageChanged,
316 d, &QQmlDebugTranslationServicePrivate::sendLanguageChanged,
317 Qt::QueuedConnection);
318
319 connect(this, &QQmlDebugTranslationServiceImpl::translationIssues,
320 d, &QQmlDebugTranslationServicePrivate::sendTranslationIssues,
321 Qt::QueuedConnection);
322
323 connect(this, &QQmlDebugTranslationServiceImpl::sendTranslatableTextOccurrences,
324 d, &QQmlDebugTranslationServicePrivate::sendTranslatableTextOccurrences,
325 Qt::QueuedConnection);
326}
327
333
334void QQmlDebugTranslationServiceImpl::messageReceived(const QByteArray &message)
335{
336 QVersionedPacket<QQmlDebugConnector> packet(message);
337 QQmlDebugTranslation::Request command;
338
339 packet >> command;
340 switch (command) {
341 case QQmlDebugTranslation::Request::ChangeLanguage: {
342 QUrl context;
343 QString locale;
344 packet >> context >> locale;
345 emit language(context, QLocale(locale));
346 break;
347 }
348 case QQmlDebugTranslation::Request::ChangeState: {
349 QString stateName;
350 packet >> stateName;
351 emit state(stateName);
352 break;
353 }
354 case QQmlDebugTranslation::Request::StateList: {
355 emit stateList();
356 break;
357 }
358 case QQmlDebugTranslation::Request::TranslationIssues: {
359 emit translationIssues();
360 break;
361 }
362 case QQmlDebugTranslation::Request::TranslatableTextOccurrences: {
363 emit sendTranslatableTextOccurrences();
364 break;
365 }
366 case QQmlDebugTranslation::Request::WatchTextElides: {
367 emit watchTextElides(true);
368 break;
369 }
370 case QQmlDebugTranslation::Request::DisableWatchTextElides: {
371 emit watchTextElides(false);
372 break;
373 }
374 default: {
375 qWarning() << "DebugTranslationService: received unknown command: " << static_cast<int>(command);
376 break;
377 }
378 } // switch (command)
379}
380
382{
383 if (QQmlEngine *qmlEngine = qobject_cast<QQmlEngine *>(engine))
384 d->proxyTranslator->addEngine(qmlEngine);
385
386 if (engine->parent())
387 d->currentQuickView = qobject_cast<QQuickView*>(engine->parent());
388
389 emit attachedToEngine(engine);
390}
391
393{
394 if (QQmlEngine *qmlEngine = qobject_cast<QQmlEngine *>(engine))
395 d->proxyTranslator->removeEngine(qmlEngine);
396 emit detachedFromEngine(engine);
397}
398
399void QQmlDebugTranslationServiceImpl::foundTranslationBinding(const TranslationBindingInformation &translationBindingInformation)
400{
401 QObject *scopeObject = translationBindingInformation.scopeObject;
402 connect(scopeObject, &QObject::destroyed, this, [this, scopeObject] () {
403 this->d->objectTranslationBindingMultiMap.remove(scopeObject);
404 });
405
406 d->objectTranslationBindingMultiMap.insert(scopeObject, translationBindingInformation);
407}
408
409QT_END_NAMESPACE
410
411#include "moc_qqmldebugtranslationservice.cpp"
412
413#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)