diff options
author | Tim Jenssen <tim.jenssen@qt.io> | 2020-01-24 11:26:06 +0100 |
---|---|---|
committer | Tim Jenssen <tim.jenssen@qt.io> | 2020-02-05 14:58:52 +0000 |
commit | 4975a33ba9aa357ba2bca93e292b1fbcfb34c24e (patch) | |
tree | ee096871e60633c203232048131d51759da2cd19 /src | |
parent | 75ce6f3cd03362e6d763ae3bc21ab793a3675fce (diff) |
QmlDebug: add new debugtranslationservice
Users were asking for having the possibility to see where the translated
text will not fit in the reserved/available space.
This is more a preparation patch to get the right connectors to change the
visualization of findings or maybe log this to a file.
Task-number: QDS-1463
Change-Id: Ic0a7a930141d6eeb79964e51c0a165c69888cf5d
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
Diffstat (limited to 'src')
-rw-r--r-- | src/plugins/qmltooling/qmldbg_preview/qmldbg_preview.pro | 2 | ||||
-rw-r--r-- | src/plugins/qmltooling/qmldbg_preview/qqmldebugtranslationservice.cpp | 68 | ||||
-rw-r--r-- | src/plugins/qmltooling/qmldbg_preview/qqmldebugtranslationservice.h | 87 | ||||
-rw-r--r-- | src/plugins/qmltooling/qmldbg_preview/qqmlpreviewservice.json | 2 | ||||
-rw-r--r-- | src/plugins/qmltooling/qmldbg_preview/qqmlpreviewservicefactory.cpp | 8 | ||||
-rw-r--r-- | src/plugins/qmltooling/qmldbg_server/qqmldebugserver.cpp | 5 | ||||
-rw-r--r-- | src/qml/debugger/qqmldebugserviceinterfaces.cpp | 1 | ||||
-rw-r--r-- | src/qml/debugger/qqmldebugserviceinterfaces_p.h | 21 | ||||
-rw-r--r-- | src/qml/qml/qqmlbinding.cpp | 9 | ||||
-rw-r--r-- | src/qmldebug/qmldebug.pro | 4 | ||||
-rw-r--r-- | src/qmldebug/qqmldebugtranslationclient.cpp | 76 | ||||
-rw-r--r-- | src/qmldebug/qqmldebugtranslationclient_p.h | 81 | ||||
-rw-r--r-- | src/quick/items/qquicktext.cpp | 7 |
13 files changed, 368 insertions, 3 deletions
diff --git a/src/plugins/qmltooling/qmldbg_preview/qmldbg_preview.pro b/src/plugins/qmltooling/qmldbg_preview/qmldbg_preview.pro index 08686a43e3..e1cbc393f7 100644 --- a/src/plugins/qmltooling/qmldbg_preview/qmldbg_preview.pro +++ b/src/plugins/qmltooling/qmldbg_preview/qmldbg_preview.pro @@ -3,6 +3,7 @@ QT += core-private qml-private packetprotocol-private network quick-private gui- TARGET = qmldbg_preview SOURCES += \ + $$PWD/qqmldebugtranslationservice.cpp \ $$PWD/qqmlpreviewblacklist.cpp \ $$PWD/qqmlpreviewfileengine.cpp \ $$PWD/qqmlpreviewfileloader.cpp \ @@ -12,6 +13,7 @@ SOURCES += \ $$PWD/qqmlpreviewservicefactory.cpp HEADERS += \ + $$PWD/qqmldebugtranslationservice.h \ $$PWD/qqmlpreviewblacklist.h \ $$PWD/qqmlpreviewfileengine.h \ $$PWD/qqmlpreviewfileloader.h \ diff --git a/src/plugins/qmltooling/qmldbg_preview/qqmldebugtranslationservice.cpp b/src/plugins/qmltooling/qmldbg_preview/qqmldebugtranslationservice.cpp new file mode 100644 index 0000000000..1561777202 --- /dev/null +++ b/src/plugins/qmltooling/qmldbg_preview/qqmldebugtranslationservice.cpp @@ -0,0 +1,68 @@ +/**************************************************************************** +** +** Copyright (C) 2020 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtQml module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qqmldebugtranslationservice.h" + +QT_BEGIN_NAMESPACE + +QQmlDebugTranslationServiceImpl::QQmlDebugTranslationServiceImpl(QObject *parent) : + QQmlDebugTranslationService(1, parent) +{ +} + +void QQmlDebugTranslationServiceImpl::messageReceived(const QByteArray &message) +{ + Q_UNUSED(message) +} + +QString QQmlDebugTranslationServiceImpl::foundElidedText(QObject *textObject, const QString &layoutText, const QString &elideText) +{ + Q_UNUSED(textObject) + Q_UNUSED(layoutText) + return elideText; +} + +void QQmlDebugTranslationServiceImpl::foundTranslationBinding(QQmlTranslationBinding *binding, QObject *scopeObject, QQmlContextData *contextData) +{ + Q_UNUSED(binding) + Q_UNUSED(scopeObject) + Q_UNUSED(contextData) +} + +QT_END_NAMESPACE diff --git a/src/plugins/qmltooling/qmldbg_preview/qqmldebugtranslationservice.h b/src/plugins/qmltooling/qmldbg_preview/qqmldebugtranslationservice.h new file mode 100644 index 0000000000..a337a937a5 --- /dev/null +++ b/src/plugins/qmltooling/qmldbg_preview/qqmldebugtranslationservice.h @@ -0,0 +1,87 @@ +/**************************************************************************** +** +** Copyright (C) 2020 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtQml module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QDEBUGMESSAGESERVICE_H +#define QDEBUGMESSAGESERVICE_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include <private/qqmldebugserviceinterfaces_p.h> + +#include <QtCore/qlogging.h> +#include <QtCore/qmutex.h> +#include <QtCore/qelapsedtimer.h> + +QT_BEGIN_NAMESPACE + +class QQmlDebugTranslationServicePrivate; + +class QQmlDebugTranslationServiceImpl : public QQmlDebugTranslationService +{ + Q_OBJECT +public: + //needs to be in sync with QQmlDebugTranslationClient in qqmldebugtranslationclient_p.h + enum Command { + ChangeLanguage, + ChangeWarningColor, + ChangeElidedTextWarningString, + SetDebugTranslationServiceLogFile, + EnableElidedTextWarning, + DisableElidedTextWarning, + TestAllLanguages + }; + QQmlDebugTranslationServiceImpl(QObject *parent = 0); + + QString foundElidedText(QObject *textObject, const QString &layoutText, const QString &elideText) override; + void foundTranslationBinding(QQmlTranslationBinding *binding, QObject *scopeObject, QQmlContextData *contextData) override; + void messageReceived(const QByteArray &message) override; +}; + +QT_END_NAMESPACE + +#endif // QDEBUGMESSAGESERVICE_H diff --git a/src/plugins/qmltooling/qmldbg_preview/qqmlpreviewservice.json b/src/plugins/qmltooling/qmldbg_preview/qqmlpreviewservice.json index d7e1ef1f10..5e148f8101 100644 --- a/src/plugins/qmltooling/qmldbg_preview/qqmlpreviewservice.json +++ b/src/plugins/qmltooling/qmldbg_preview/qqmlpreviewservice.json @@ -1,3 +1,3 @@ { - "Keys" : [ "QmlPreview" ] + "Keys" : [ "QmlPreview", "DebugTranslation" ] } diff --git a/src/plugins/qmltooling/qmldbg_preview/qqmlpreviewservicefactory.cpp b/src/plugins/qmltooling/qmldbg_preview/qqmlpreviewservicefactory.cpp index f0aa3226c8..6ff9805bbe 100644 --- a/src/plugins/qmltooling/qmldbg_preview/qqmlpreviewservicefactory.cpp +++ b/src/plugins/qmltooling/qmldbg_preview/qqmlpreviewservicefactory.cpp @@ -39,12 +39,18 @@ #include "qqmlpreviewservicefactory.h" #include "qqmlpreviewservice.h" +#include "qqmldebugtranslationservice.h" QT_BEGIN_NAMESPACE QQmlDebugService *QQmlPreviewServiceFactory::create(const QString &key) { - return key == QQmlPreviewServiceImpl::s_key ? new QQmlPreviewServiceImpl(this) : nullptr; + if (key == QQmlPreviewServiceImpl::s_key) + return new QQmlPreviewServiceImpl(this); + if (key == QQmlDebugTranslationServiceImpl::s_key) + return new QQmlDebugTranslationServiceImpl(this); + + return nullptr; } QT_END_NAMESPACE diff --git a/src/plugins/qmltooling/qmldbg_server/qqmldebugserver.cpp b/src/plugins/qmltooling/qmldbg_server/qqmldebugserver.cpp index cc663cd6b3..33b6606b44 100644 --- a/src/plugins/qmltooling/qmldbg_server/qqmldebugserver.cpp +++ b/src/plugins/qmltooling/qmldbg_server/qqmldebugserver.cpp @@ -422,6 +422,11 @@ void QQmlDebugServerImpl::parseArguments() << tr("Sends qDebug() and similar messages over the QML debug\n" "\t\t connection. QtCreator uses this for showing debug\n" "\t\t messages in the debugger console.") << '\n' + << '\n' << QQmlDebugTranslationService::s_key << "\t- " + //: Please preserve the line breaks and formatting + << tr("helps to see if a translated text\n" + "\t\t will result in an elided text\n" + "\t\t in QML elements.") << '\n' << tr("Other services offered by qmltooling plugins that implement " "QQmlDebugServiceFactory and which can be found in the standard plugin " "paths will also be available and can be specified. If no \"services\" " diff --git a/src/qml/debugger/qqmldebugserviceinterfaces.cpp b/src/qml/debugger/qqmldebugserviceinterfaces.cpp index 76205c7760..3df1a21bda 100644 --- a/src/qml/debugger/qqmldebugserviceinterfaces.cpp +++ b/src/qml/debugger/qqmldebugserviceinterfaces.cpp @@ -48,6 +48,7 @@ const QString QQmlProfilerService::s_key = QStringLiteral("CanvasFrameRate"); const QString QDebugMessageService::s_key = QStringLiteral("DebugMessages"); const QString QQmlEngineControlService::s_key = QStringLiteral("EngineControl"); const QString QQmlNativeDebugService::s_key = QStringLiteral("NativeQmlDebugger"); +const QString QQmlDebugTranslationService::s_key = QStringLiteral("DebugTranslation"); QT_END_NAMESPACE diff --git a/src/qml/debugger/qqmldebugserviceinterfaces_p.h b/src/qml/debugger/qqmldebugserviceinterfaces_p.h index 01693aee24..644d9d6ba9 100644 --- a/src/qml/debugger/qqmldebugserviceinterfaces_p.h +++ b/src/qml/debugger/qqmldebugserviceinterfaces_p.h @@ -65,6 +65,7 @@ QT_BEGIN_NAMESPACE class QWindow; class QQuickWindow; +class QQmlTranslationBinding; #if !QT_CONFIG(qml_debug) @@ -103,6 +104,10 @@ public: class QDebugMessageService {}; class QQmlEngineControlService {}; class QQmlNativeDebugService {}; +class QQmlDebugTranslationService { + virtual QString foundElidedText(QObject *, const QString &, const QString &) {return {};} + virtual void foundTranslationBinding(QQmlTranslationBinding *, QObject *, QQmlContextData *) {} +}; #else @@ -162,6 +167,22 @@ protected: QQmlBoundSignal *nextSignal(QQmlBoundSignal *prev) { return prev->m_nextSignal; } }; +class Q_QML_PRIVATE_EXPORT QQmlDebugTranslationService : public QQmlDebugService +{ + Q_OBJECT +public: + static const QString s_key; + + virtual QString foundElidedText(QObject *qQuickTextObject, const QString &layoutText, const QString &elideText) = 0; + virtual void foundTranslationBinding(QQmlTranslationBinding *binding, QObject *scopeObject, QQmlContextData *contextData) = 0; +protected: + friend class QQmlDebugConnector; + + QQmlDebugTranslationService(float version, QObject *parent = nullptr) : + QQmlDebugService(s_key, version, parent) {} + +}; + class Q_QML_PRIVATE_EXPORT QQmlInspectorService : public QQmlDebugService { Q_OBJECT diff --git a/src/qml/qml/qqmlbinding.cpp b/src/qml/qml/qqmlbinding.cpp index e14b00af22..b9566d5862 100644 --- a/src/qml/qml/qqmlbinding.cpp +++ b/src/qml/qml/qqmlbinding.cpp @@ -43,6 +43,10 @@ #include "qqmlcontext.h" #include "qqmlinfo.h" #include "qqmldata_p.h" + +#include <private/qqmldebugserviceinterfaces_p.h> +#include <private/qqmldebugconnector_p.h> + #include <private/qqmlprofiler_p.h> #include <private/qqmlexpression_p.h> #include <private/qqmlscriptstring_p.h> @@ -392,6 +396,11 @@ QQmlBinding *QQmlBinding::createTranslationBinding(const QQmlRefPointer<QV4::Exe b->QQmlJavaScriptExpression::setContext(ctxt); b->setScopeObject(obj); + if (QQmlDebugTranslationService *service + = QQmlDebugConnector::service<QQmlDebugTranslationService>()) { + service->foundTranslationBinding(b, obj, ctxt); + } + return b; } diff --git a/src/qmldebug/qmldebug.pro b/src/qmldebug/qmldebug.pro index 94d300b765..ac3f3bf3bf 100644 --- a/src/qmldebug/qmldebug.pro +++ b/src/qmldebug/qmldebug.pro @@ -1,5 +1,5 @@ TARGET = QtQmlDebug -QT = core-private network packetprotocol-private +QT = core-private qml-private network packetprotocol-private CONFIG += static internal_module load(qt_module) @@ -8,6 +8,7 @@ SOURCES += \ qqmldebugclient.cpp \ qqmldebugconnection.cpp \ qqmldebugmessageclient.cpp \ + qqmldebugtranslationclient.cpp \ qqmlenginecontrolclient.cpp \ qqmlenginedebugclient.cpp \ qqmlinspectorclient.cpp \ @@ -24,6 +25,7 @@ HEADERS += \ qqmldebugclient_p_p.h \ qqmldebugconnection_p.h \ qqmldebugmessageclient_p.h \ + qqmldebugtranslationclient_p.h \ qqmlenginedebugclient_p.h \ qqmlenginedebugclient_p_p.h \ qqmlenginecontrolclient_p.h \ diff --git a/src/qmldebug/qqmldebugtranslationclient.cpp b/src/qmldebug/qqmldebugtranslationclient.cpp new file mode 100644 index 0000000000..1fd0748fa0 --- /dev/null +++ b/src/qmldebug/qqmldebugtranslationclient.cpp @@ -0,0 +1,76 @@ +/**************************************************************************** +** +** Copyright (C) 2020 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtQml module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qqmldebugtranslationclient_p.h" +#include "qqmldebugconnection_p.h" + +#include <QUrl> +#include <QDataStream> + +#include <QDebug> +#include <QtPacketProtocol/private/qpacket_p.h> + +QT_BEGIN_NAMESPACE + +/*! + \class QQmlDebugTranslationClient + \internal + + \brief Client for the debug translation service + + The QQmlDebugTranslationClient can test if translated texts will fit. + */ + +QQmlDebugTranslationClient::QQmlDebugTranslationClient(QQmlDebugConnection *client) + : QQmlDebugClient(QLatin1String("DebugTranslation"), client) +{ +} + +void QQmlDebugTranslationClient::messageReceived(const QByteArray &data) +{ + Q_UNUSED(data); +} + +void QQmlDebugTranslationClient::triggerLanguage(const QUrl &url, const QString &locale) +{ + Q_UNUSED(url) + Q_UNUSED(locale) +} + +QT_END_NAMESPACE diff --git a/src/qmldebug/qqmldebugtranslationclient_p.h b/src/qmldebug/qqmldebugtranslationclient_p.h new file mode 100644 index 0000000000..3163759d9e --- /dev/null +++ b/src/qmldebug/qqmldebugtranslationclient_p.h @@ -0,0 +1,81 @@ +/**************************************************************************** +** +** Copyright (C) 2020 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtQml module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef QQMLDEBUGTRANSLATIONCLIENT_P_H +#define QQMLDEBUGTRANSLATIONCLIENT_P_H + +#include "qqmldebugclient_p.h" + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +QT_BEGIN_NAMESPACE + +class QQmlDebugTranslationClient : public QQmlDebugClient +{ + Q_OBJECT + +public: + //needs to be in sync with QQmlDebugTranslationServiceImpl in qqmldebugtranslationservice.h + enum Command { + ChangeLanguage, + ChangeWarningColor, + ChangeElidedTextWarningString, + SetDebugTranslationServiceLogFile, + EnableElidedTextWarning, + DisableElidedTextWarning, + TestAllLanguages + }; + + explicit QQmlDebugTranslationClient(QQmlDebugConnection *client); + + virtual void messageReceived(const QByteArray &) override; + void triggerLanguage(const QUrl &url, const QString &locale); +}; + +QT_END_NAMESPACE + +#endif // QQMLDEBUGTRANSLATIONCLIENT_P_H diff --git a/src/quick/items/qquicktext.cpp b/src/quick/items/qquicktext.cpp index c2980b792d..1c7f1ca6aa 100644 --- a/src/quick/items/qquicktext.cpp +++ b/src/quick/items/qquicktext.cpp @@ -40,6 +40,9 @@ #include "qquicktext_p.h" #include "qquicktext_p_p.h" +#include <private/qqmldebugserviceinterfaces_p.h> +#include <private/qqmldebugconnector_p.h> + #include <QtQuick/private/qsgcontext_p.h> #include <private/qqmlglobal_p.h> #include <private/qsgadaptationlayer_p.h> @@ -1146,6 +1149,10 @@ QRectF QQuickTextPrivate::setupTextLayout(qreal *const baseline) elideLayout->setFont(layout.font()); elideLayout->setTextOption(layout.textOption()); + if (QQmlDebugTranslationService *service + = QQmlDebugConnector::service<QQmlDebugTranslationService>()) { + elideText = service->foundElidedText(q, layoutText, elideText); + } elideLayout->setText(elideText); elideLayout->beginLayout(); |