From 0108a85c821ac8765e84f07910163b40778e3abd Mon Sep 17 00:00:00 2001 From: Tim Jenssen Date: Thu, 25 Mar 2021 02:45:40 +0100 Subject: [PATCH] qmlpreview: prepare plugin to have an external client - export the plugin andd add client creator API to be able to implement external debugtranslationclients - use the private/qqmldebugtranslationprotocol_p.h from Qt5::QmlDebugPrivate - have a basic client implementation which cares about changing language - remove out of date elide warning implementation - remove old ui - remove the menu entry The old client implementation is incompatible with the will be introduced service and there was never an officially released compatible service. Therefore we can remove the old client implementation without causing any harm. Change-Id: I26b5e8a99ba30ae6377443b3fffb05901b1cac28 Reviewed-by: Tim Jenssen --- src/plugins/qmlpreview/CMakeLists.txt | 22 +- .../projectfileselectionswidget.cpp | 162 ------ .../qmlpreview/projectfileselectionswidget.h | 50 -- .../qmlpreview/qmldebugtranslationclient.cpp | 54 +- .../qmlpreview/qmldebugtranslationclient.h | 20 - .../qmlpreview/qmldebugtranslationwidget.cpp | 523 ------------------ .../qmlpreview/qmldebugtranslationwidget.h | 110 ---- src/plugins/qmlpreview/qmlpreview.pro | 8 +- .../qmlpreviewconnectionmanager.cpp | 19 +- .../qmlpreview/qmlpreviewconnectionmanager.h | 7 +- src/plugins/qmlpreview/qmlpreviewplugin.cpp | 66 +-- src/plugins/qmlpreview/qmlpreviewplugin.h | 16 +- .../qmlpreview/qmlpreviewruncontrol.cpp | 6 +- src/plugins/qmlpreview/qmlpreviewruncontrol.h | 3 +- .../tests/qmlpreviewclient_test.cpp | 2 - .../qmlpreview/tests/qmlpreviewclient_test.h | 2 - .../tests/qmlpreviewplugin_test.cpp | 6 +- .../qmlpreview/tests/qmlpreviewplugin_test.h | 2 - 18 files changed, 64 insertions(+), 1014 deletions(-) delete mode 100644 src/plugins/qmlpreview/projectfileselectionswidget.cpp delete mode 100644 src/plugins/qmlpreview/projectfileselectionswidget.h delete mode 100644 src/plugins/qmlpreview/qmldebugtranslationwidget.cpp delete mode 100644 src/plugins/qmlpreview/qmldebugtranslationwidget.h diff --git a/src/plugins/qmlpreview/CMakeLists.txt b/src/plugins/qmlpreview/CMakeLists.txt index 00bda33ab0b..6e2dbc4238f 100644 --- a/src/plugins/qmlpreview/CMakeLists.txt +++ b/src/plugins/qmlpreview/CMakeLists.txt @@ -1,3 +1,5 @@ +find_package(Qt5 COMPONENTS QmlDebug REQUIRED) + add_qtc_plugin(QmlPreview DEPENDS QmlDebug QmlJS PLUGIN_DEPENDS Core ProjectExplorer QmlJSTools QtSupport ResourceEditor QmlProjectManager @@ -9,8 +11,6 @@ add_qtc_plugin(QmlPreview qmlpreviewruncontrol.cpp qmlpreviewruncontrol.h qmldebugtranslationclient.cpp qmldebugtranslationclient.h qmlpreview_global.h - projectfileselectionswidget.cpp projectfileselectionswidget.h - qmldebugtranslationwidget.cpp qmldebugtranslationwidget.h ) extend_qtc_plugin(QmlPreview @@ -19,3 +19,21 @@ extend_qtc_plugin(QmlPreview tests/qmlpreviewclient_test.cpp tests/qmlpreviewclient_test.h tests/qmlpreviewplugin_test.cpp tests/qmlpreviewplugin_test.h ) + +# check if Qt version have_qml_debug_translation_protocol +# will be introduced in Qt 6.2, but there are users +# who needs it in older but special built Qt versions aswell +string(REGEX MATCH "^[0-9]*" QT_VERSION_MAJOR ${Qt5_VERSION}) +get_target_property(qmldebugprivate_include_directories + Qt${QT_VERSION_MAJOR}::QmlDebugPrivate + INTERFACE_INCLUDE_DIRECTORIES +) +find_file(have_qml_debug_translation_protocol + NAMES private/qqmldebugtranslationprotocol_p.h + PATHS ${qmldebugprivate_include_directories} +) +extend_qtc_plugin(QmlPreview + CONDITION have_qml_debug_translation_protocol + PUBLIC_DEPENDS Qt5::QmlDebugPrivate + PUBLIC_DEFINES "FOUND_QML_DEBUG_TRANSLATION_PROTOCOL" +) diff --git a/src/plugins/qmlpreview/projectfileselectionswidget.cpp b/src/plugins/qmlpreview/projectfileselectionswidget.cpp deleted file mode 100644 index 44b8451dfcb..00000000000 --- a/src/plugins/qmlpreview/projectfileselectionswidget.cpp +++ /dev/null @@ -1,162 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2020 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt Creator. -** -** 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 General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** 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-3.0.html. -** -****************************************************************************/ - -#include "projectfileselectionswidget.h" - -#include -#include -#include - -#include - -#include -#include -#include -#include - -namespace QmlPreview { - -class ProjectFileItem : public Utils::TreeItem -{ -public: - ProjectFileItem() = default; - ProjectFileItem(const Utils::FilePath &f, bool d) - : filePath(f) - , disabled(d) - {} - - Qt::ItemFlags flags(int) const override - { - return Qt::ItemIsUserCheckable | Qt::ItemIsEnabled; - } - - QVariant data(int , int role) const override - { - if (role == Qt::DisplayRole) - return filePath.toUserOutput(); - if (role == Qt::CheckStateRole) { - if (disabled) - return Qt::Unchecked; - else - return Qt::Checked; - } - return QVariant(); - } - - bool setData(int , const QVariant &data, int role) override - { - if (role != Qt::CheckStateRole) - return false; - disabled = (data == Qt::Unchecked); - return true; - } - - Utils::FilePath filePath; - bool disabled = false; -}; - - -ProjectFileSelectionsWidget::ProjectFileSelectionsWidget(const QString &projectSettingsKey, ProjectExplorer::FileType fileType, QWidget *parent) - : QWidget(parent) - , m_projectSettingsKey(projectSettingsKey) - , m_fileType(fileType) -{ - auto model = new Utils::TreeModel(this); - model->setHeader({tr("Files to test:")}); - auto updateCheckedFiles = [this, model] () { - m_checkedFiles.clear(); - QStringList uncheckedFiles; - model->forAllItems([&, this](ProjectFileItem *item) { - if (item->disabled) - uncheckedFiles.append(item->filePath.toString()); - else - m_checkedFiles.append(item->filePath); - }); - if (auto project = ProjectExplorer::SessionManager::startupProject()) - project->setNamedSettings(m_projectSettingsKey, uncheckedFiles); - emit selectionChanged(m_checkedFiles); - }; - - connect(model, &QAbstractItemModel::dataChanged, updateCheckedFiles); - - auto view = new QTreeView(this); - view->setMinimumSize(QSize(100, 100)); - view->setTextElideMode(Qt::ElideMiddle); - view->setWordWrap(false); - view->setUniformRowHeights(true); - view->setModel(model); - - const auto viewLayout = new QHBoxLayout; - viewLayout->addWidget(view); - - auto layout = new QVBoxLayout(this); - layout->setContentsMargins(0, 0, 0, 0); - layout->addLayout(viewLayout); - - auto initModel = [this, model, updateCheckedFiles](ProjectExplorer::Project *project) { - if (!project) - return; - - auto refreshModel = [this, model, updateCheckedFiles] () { - model->clear(); - if (auto project = ProjectExplorer::SessionManager::startupProject()) { - const auto settingsDisabledFiles = project->namedSettings(m_projectSettingsKey).toStringList(); - - if (auto rootProjectNode = project->rootProjectNode()) { - auto rootPath = rootProjectNode->filePath(); - - rootProjectNode->forEachNode([this, settingsDisabledFiles, model, rootPath](ProjectExplorer::FileNode *fileNode) { - if (fileNode->fileType() == m_fileType - && !fileNode->filePath().relativeChildPath(rootPath).startsWith("imports/")) { - bool isDisabled = settingsDisabledFiles.contains(fileNode->filePath().toString()); - model->rootItem()->appendChild(new ProjectFileItem(fileNode->filePath(), isDisabled)); - } - }); - } - updateCheckedFiles(); - } - }; - // deploymentDataChanged is only triggered if the active project changed, so it is not a - // problem that maybe many different targets are connected to refreshModel - this->connect(project->activeTarget(), &ProjectExplorer::Target::deploymentDataChanged, - model, refreshModel, Qt::UniqueConnection); - refreshModel(); - }; - - if (auto project = ProjectExplorer::SessionManager::startupProject()) { - initModel(project); - } - - connect(ProjectExplorer::SessionManager::instance(), - &ProjectExplorer::SessionManager::startupProjectChanged, - initModel); -} - -Utils::FilePaths ProjectFileSelectionsWidget::checkedFiles() -{ - return m_checkedFiles; -} - -} // QmlPreview diff --git a/src/plugins/qmlpreview/projectfileselectionswidget.h b/src/plugins/qmlpreview/projectfileselectionswidget.h deleted file mode 100644 index 4bacb41d49b..00000000000 --- a/src/plugins/qmlpreview/projectfileselectionswidget.h +++ /dev/null @@ -1,50 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2020 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt Creator. -** -** 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 General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** 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-3.0.html. -** -****************************************************************************/ - -#pragma once -#include -#include - -#include - -namespace QmlPreview { - -class ProjectFileSelectionsWidget : public QWidget -{ - Q_OBJECT - -public: - explicit ProjectFileSelectionsWidget(const QString &projectSettingsKey, ProjectExplorer::FileType fileType, QWidget *parent = nullptr); - Utils::FilePaths checkedFiles(); -signals: - void selectionChanged(const Utils::FilePaths &selectedFiles); -private: - const QString m_projectSettingsKey; - ProjectExplorer::FileType m_fileType; - - Utils::FilePaths m_checkedFiles; -}; - -} // QmlPreview diff --git a/src/plugins/qmlpreview/qmldebugtranslationclient.cpp b/src/plugins/qmlpreview/qmldebugtranslationclient.cpp index 6ebc13d8f8a..3ef4351d498 100644 --- a/src/plugins/qmlpreview/qmldebugtranslationclient.cpp +++ b/src/plugins/qmlpreview/qmldebugtranslationclient.cpp @@ -26,8 +26,9 @@ #include "qmldebugtranslationclient.h" #include -#include -#include +#ifdef FOUND_QML_DEBUG_TRANSLATION_PROTOCOL +#include +#endif namespace QmlPreview { @@ -39,51 +40,14 @@ QmlDebugTranslationClient::QmlDebugTranslationClient(QmlDebug::QmlDebugConnectio void QmlDebugTranslationClient::changeLanguage(const QUrl &url, const QString &localeIsoCode) { QmlDebug::QPacket packet(dataStreamVersion()); - packet << static_cast(Command::ChangeLanguage) << url << localeIsoCode; +#ifdef FOUND_QML_DEBUG_TRANSLATION_PROTOCOL + sendMessage(QQmlDebugTranslation::createChangeLanguageRequest(packet, url, localeIsoCode)); +#else + const int request_change_language = 1; + packet << request_change_language << url << localeIsoCode; sendMessage(packet.data()); -} +#endif -void QmlDebugTranslationClient::changeWarningColor(const QColor &warningColor) -{ - QmlDebug::QPacket packet(dataStreamVersion()); - packet << static_cast(Command::ChangeWarningColor) << warningColor; - sendMessage(packet.data()); -} - -void QmlDebugTranslationClient::changeElidedTextWarningString(const QString &warningString) -{ - QmlDebug::QPacket packet(dataStreamVersion()); - packet << static_cast(Command::ChangeElidedTextWarningString) << warningString; - sendMessage(packet.data()); -} - -void QmlDebugTranslationClient::changeElideWarning(bool elideWarning) -{ - if (elideWarning) - enableElidedTextWarning(); - else - disableElidedTextWarning(); -} - -void QmlDebugTranslationClient::setDebugTranslationServiceLogFile(const QString &logFilePath) -{ - QmlDebug::QPacket packet(dataStreamVersion()); - packet << static_cast(Command::SetDebugTranslationServiceLogFile) << logFilePath; - sendMessage(packet.data()); -} - -void QmlDebugTranslationClient::enableElidedTextWarning() -{ - QmlDebug::QPacket packet(dataStreamVersion()); - packet << static_cast(Command::EnableElidedTextWarning); - sendMessage(packet.data()); -} - -void QmlDebugTranslationClient::disableElidedTextWarning() -{ - QmlDebug::QPacket packet(dataStreamVersion()); - packet << static_cast(Command::DisableElidedTextWarning); - sendMessage(packet.data()); } void QmlDebugTranslationClient::messageReceived(const QByteArray &data) diff --git a/src/plugins/qmlpreview/qmldebugtranslationclient.h b/src/plugins/qmlpreview/qmldebugtranslationclient.h index db00b6f0056..0b9e3594b2b 100644 --- a/src/plugins/qmlpreview/qmldebugtranslationclient.h +++ b/src/plugins/qmlpreview/qmldebugtranslationclient.h @@ -34,34 +34,14 @@ class QMLPREVIEW_EXPORT QmlDebugTranslationClient : public QmlDebug::QmlDebugCli { Q_OBJECT public: - //needs to be in sync with QQmlDebugTranslationClient in qtdeclarative/src/plugins/qmltooling/qmldbg_preview/qqmldebugtranslationservice.h - enum class Command { - ChangeLanguage, - MissingTranslationsChecked, - EnableElidedTextWarning, - DisableElidedTextWarning, - ChangeWarningColor, - ChangeElidedTextWarningString, - SetDebugTranslationServiceLogFile, - TestAllLanguages - }; - explicit QmlDebugTranslationClient(QmlDebug::QmlDebugConnection *connection); void changeLanguage(const QUrl &url, const QString &localeIsoCode); - void changeWarningColor(const QColor &warningColor); - void changeElidedTextWarningString(const QString &warningString); //is QByteArray better here? - void changeElideWarning(bool elideWarning); - void setDebugTranslationServiceLogFile(const QString &logFilePath); - void enableElidedTextWarning(); - void disableElidedTextWarning(); void messageReceived(const QByteArray &message) override; void stateChanged(State state) override; signals: -// void pathRequested(const QString &path); -// void errorReported(const QString &error); void debugServiceUnavailable(); }; diff --git a/src/plugins/qmlpreview/qmldebugtranslationwidget.cpp b/src/plugins/qmlpreview/qmldebugtranslationwidget.cpp deleted file mode 100644 index f835fa79459..00000000000 --- a/src/plugins/qmlpreview/qmldebugtranslationwidget.cpp +++ /dev/null @@ -1,523 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2020 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt Creator. -** -** 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 General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** 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-3.0.html. -** -****************************************************************************/ - -#include "qmldebugtranslationwidget.h" -#include "qmlpreviewruncontrol.h" -#include "qmlpreviewplugin.h" -#include "projectfileselectionswidget.h" - -#include -#include -#include - -#include -#include - -#include -#include -#include -#include - -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#include - -#include - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace { -QObject *getPreviewPlugin() -{ - const QVector &specs = ExtensionSystem::PluginManager::plugins(); - const auto pluginIt = std::find_if(specs.cbegin(), specs.cend(), - [](const ExtensionSystem::PluginSpec *p) { - return p->name() == "QmlPreview"; - }); - - if (pluginIt != specs.cend()) - return (*pluginIt)->plugin(); - - return nullptr; -} - -} - -namespace QmlPreview { - -QmlDebugTranslationWidget::QmlDebugTranslationWidget(QWidget *parent, TestLanguageGetter languagesGetterMethod) - : QWidget(parent) - , m_testLanguagesGetter(languagesGetterMethod) - , m_warningColor(Qt::red) - //, m_foundTrColor(Qt::green) // invalid color -> init without the frame - , m_lastWarningColor(m_warningColor) - , m_lastfoundTrColor(Qt::green) - -{ - auto mainLayout = new QVBoxLayout(this); - - auto buttonGroup = new QButtonGroup(this); - // it gets the text from updateCurrentEditor method - m_singleFileButton = new QRadioButton(); - m_singleFileButton->setChecked(true); - buttonGroup->addButton(m_singleFileButton); - - const QString projectSettingsKey = "QmlPreview.DisabledDebugTranslationFiles"; - const ProjectExplorer::FileType filterFileType = ProjectExplorer::FileType::QML; - m_checkableProjectFileView = new ProjectFileSelectionsWidget(projectSettingsKey, filterFileType); - m_checkableProjectFileView->setVisible(false); - connect(m_checkableProjectFileView, &ProjectFileSelectionsWidget::selectionChanged, this, &QmlDebugTranslationWidget::setFiles); - m_multipleFileButton = new QRadioButton(tr("Multiple files")); - buttonGroup->addButton(m_multipleFileButton); - connect(m_multipleFileButton, &QAbstractButton::toggled, m_checkableProjectFileView, &QWidget::setVisible); - connect(m_multipleFileButton, &QAbstractButton::toggled, this, &QmlDebugTranslationWidget::updateFiles); - - mainLayout->addWidget(m_singleFileButton); - mainLayout->addWidget(m_multipleFileButton); - mainLayout->addWidget(m_checkableProjectFileView); - - // language checkboxes are add in updateAvailableTranslations method - m_selectLanguageLayout = new QHBoxLayout; - mainLayout->addLayout(m_selectLanguageLayout); - - auto settingsLayout = new QHBoxLayout(); - mainLayout->addLayout(settingsLayout); - - auto elideWarningCheckBox = new QCheckBox(tr("Elide warning")); - connect(elideWarningCheckBox, &QCheckBox::stateChanged, [this] (int state) { - m_elideWarning = (state == Qt::Checked); - }); - settingsLayout->addWidget(elideWarningCheckBox); - - auto warningColorCheckbox = new QCheckBox(tr("Warning color: ")); - settingsLayout->addWidget(warningColorCheckbox); - auto warningColorButton = new Utils::QtColorButton(); - connect(warningColorCheckbox, &QCheckBox::stateChanged, [warningColorButton, this] (int state) { - if (state == Qt::Checked) { - warningColorButton->setColor(m_lastWarningColor); - warningColorButton->setEnabled(true); - } else { - m_lastWarningColor = warningColorButton->color(); - warningColorButton->setColor({}); - warningColorButton->setEnabled(false); - } - }); - connect(warningColorButton, &Utils::QtColorButton::colorChanged, [this](const QColor &color) { - m_warningColor = color; - }); - warningColorCheckbox->setCheckState(Qt::Checked); - settingsLayout->addWidget(warningColorButton); - - auto foundTrColorCheckbox = new QCheckBox(tr("Found \"tr\" color: ")); - settingsLayout->addWidget(foundTrColorCheckbox); - auto foundTrColorButton = new Utils::QtColorButton(); - foundTrColorButton->setDisabled(true); - connect(foundTrColorCheckbox, &QCheckBox::stateChanged, [foundTrColorButton, this] (int state) { - if (state == Qt::Checked) { - foundTrColorButton->setColor(m_lastfoundTrColor); - foundTrColorButton->setEnabled(true); - } else { - m_lastfoundTrColor = foundTrColorButton->color(); - foundTrColorButton->setColor({}); - foundTrColorButton->setEnabled(false); - } - }); - connect(foundTrColorButton, &Utils::QtColorButton::colorChanged, [this](const QColor &color) { - m_foundTrColor = color; - }); - settingsLayout->addWidget(foundTrColorButton); - - settingsLayout->addItem(new QSpacerItem(0, 0, QSizePolicy::Expanding)); - - auto controlLayout = new QHBoxLayout; - mainLayout->addLayout(controlLayout); - - auto showLogButton = new QToolButton; - showLogButton->setText(tr("Show Log")); - showLogButton->setCheckable(true); - controlLayout->addWidget(showLogButton); - - // TODO: do we still need this buttons? -// auto pauseButton = new QToolButton; -// pauseButton->setText(tr("Pause")); -// pauseButton->setCheckable(true); -// controlLayout->addWidget(pauseButton); - -// auto onTheFlyButton = new QToolButton; -// onTheFlyButton->setText(tr("On the Fly")); -// controlLayout->addWidget(onTheFlyButton); - - m_runTestButton = new QPushButton(); - m_runTestButton->setCheckable(true); - m_runTestButton->setText(runButtonText()); - connect(m_runTestButton, &QPushButton::toggled, [this](bool checked) { - m_runTestButton->setText(runButtonText(checked)); - }); - - connect(m_runTestButton, &QPushButton::clicked, [this](bool checked) { - if (checked) - runTest(); - else { - if (m_currentRunControl) - m_currentRunControl->initiateStop(); - // TODO: what happens if we already have a preview running? -// QmlPreviewPlugin::stopAllRunControls(); -// qWarning() << "not implemented"; // TODO: stop still running tests - } - }); - controlLayout->addWidget(m_runTestButton); - - m_runOutputWindow = new Core::OutputWindow(Core::Context("QmlPreview.DebugTranslation"), - "QmlPreview/OutputWindow/Zoom"); - - m_runOutputWindow->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - m_runOutputWindow->setReadOnly(true); - m_runOutputWindow->setVisible(false); - mainLayout->addWidget(m_runOutputWindow); - - QSpacerItem *endSpacerItem = new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Expanding); - mainLayout->addItem(endSpacerItem); - - connect(showLogButton, &QToolButton::toggled, m_runOutputWindow, [this, mainLayout, endSpacerItem](bool checked) { - m_runOutputWindow->setVisible(checked); - if (m_runOutputWindow->isVisible()) - mainLayout->takeAt(mainLayout->count() - 1); - else - mainLayout->addItem(endSpacerItem); - }); - - auto loadLogButton = new QToolButton; - loadLogButton->setText(tr("Load")); - controlLayout->addWidget(loadLogButton); - connect(loadLogButton, &QToolButton::clicked, this, &QmlDebugTranslationWidget::loadLogFile); - - auto saveLogButton = new QToolButton; - saveLogButton->setText(tr("Save")); - controlLayout->addWidget(saveLogButton); - connect(saveLogButton, &QToolButton::clicked, this, &QmlDebugTranslationWidget::saveLogToFile); - - auto clearButton = new QToolButton; - clearButton->setText(tr("Clear")); - controlLayout->addWidget(clearButton); - connect(clearButton, &QToolButton::clicked, this, &QmlDebugTranslationWidget::clear); - - Core::EditorManager *editorManager = Core::EditorManager::instance(); - connect(editorManager, &Core::EditorManager::currentEditorChanged, this, &QmlDebugTranslationWidget::updateCurrentEditor); - updateCurrentEditor(Core::EditorManager::currentEditor()); - - connect(ProjectExplorer::SessionManager::instance(), &ProjectExplorer::SessionManager::startupProjectChanged, - this, &QmlDebugTranslationWidget::updateCurrentTranslations); - - updateStartupProjectTranslations(); - - ProjectExplorer::TaskHub::addCategory("QmlPreview.Translation", tr("Translation issues")); -} - -QmlDebugTranslationWidget::~QmlDebugTranslationWidget() -{ - -} - -void QmlDebugTranslationWidget::updateCurrentEditor(const Core::IEditor *editor) -{ - if (editor && editor->document()) - m_currentFilePath = editor->document()->filePath(); - else - m_currentFilePath.clear(); - m_singleFileButton->setText(singleFileButtonText(m_currentFilePath.toString())); - updateFiles(); -} - -void QmlDebugTranslationWidget::updateStartupProjectTranslations() -{ - updateCurrentTranslations(ProjectExplorer::SessionManager::startupProject()); -} - -QColor QmlDebugTranslationWidget::warningColor() -{ - return m_warningColor; -} - -QColor QmlDebugTranslationWidget::foundTrColor() -{ - return m_foundTrColor; -} - -void QmlDebugTranslationWidget::updateCurrentTranslations(ProjectExplorer::Project *project) -{ - m_testLanguages.clear(); - for (int i = m_selectLanguageLayout->count()-1; i >= 0; --i) { - auto layoutItem = m_selectLanguageLayout->takeAt(i); - delete layoutItem->widget(); - delete layoutItem; - } - if (!project) - return; - - if (auto multiLanguageAspect = QmlProjectManager::QmlMultiLanguageAspect::current(project)) { - connect(multiLanguageAspect, &QmlProjectManager::QmlMultiLanguageAspect::changed, - this, &QmlDebugTranslationWidget::updateStartupProjectTranslations, - Qt::UniqueConnection); - auto languageLabel = new QLabel(); - languageLabel->setText(tr("Language to test:")); - m_selectLanguageLayout->addWidget(languageLabel); - if (multiLanguageAspect->value()) { - addLanguageCheckBoxes({multiLanguageAspect->currentLocale()}); - if (m_testLanguagesGetter) { - auto addTestLanguages = new QPushButton(tr("Add Test Languages")); - m_selectLanguageLayout->addWidget(addTestLanguages); - connect(addTestLanguages, &QPushButton::clicked, [this]() { - addLanguageCheckBoxes(m_testLanguagesGetter()); - }); - } - } else { - QString errorMessage; - addLanguageCheckBoxes(project->availableQmlPreviewTranslations(&errorMessage)); - } - m_selectLanguageLayout->addItem(new QSpacerItem(20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum)); - } -} - -void QmlDebugTranslationWidget::updateFiles() -{ - if (m_multipleFileButton->isChecked()) - setFiles(m_checkableProjectFileView->checkedFiles()); - else - setFiles({m_currentFilePath}); -} - -void QmlDebugTranslationWidget::setFiles(const Utils::FilePaths &filePathes) -{ - m_selectedFilePaths = filePathes; -} - -void QmlDebugTranslationWidget::runTest() -{ - m_runOutputWindow->grayOutOldContent(); - - auto runControl = new ProjectExplorer::RunControl(ProjectExplorer::Constants::QML_PREVIEW_RUN_MODE); - QTC_ASSERT(runControl, qWarning("Can not create a QmlPreviewRunner"); return;); - auto previewPlugin = qobject_cast(getPreviewPlugin()); - - connect(runControl, &ProjectExplorer::RunControl::started, [this, runControl, previewPlugin]() { - //Q_ASSERT(m_currentRunControl == nullptr); //TODO: who deletes the runcontrol - m_currentRunControl = runControl; - m_runOutputWindow->setLineParsers( - ProjectExplorer::OutputFormatterFactory::createFormatters(runControl->target())); - int timerCounter = 1; - const auto testLanguageList = m_testLanguages; - - if (m_elideWarning) - previewPlugin->changeElideWarning(true); - - auto testLanguages = [previewPlugin, runControl, testLanguageList](int timerCounter, const QString &previewedFile) { - for (auto language : testLanguageList) { - QTimer::singleShot(timerCounter * 1000, previewPlugin, [previewPlugin, runControl, language, previewedFile]() { - if (runControl && runControl->isRunning()) { - if (!previewedFile.isEmpty()) - previewPlugin->setPreviewedFile(previewedFile); - previewPlugin->setLocaleIsoCode(language); - } - }); - } - }; - for (auto filePath : qAsConst(m_selectedFilePaths)) { - testLanguages(timerCounter++, filePath.toString()); - } - }); - connect(runControl, &ProjectExplorer::RunControl::stopped, [this]() { - m_runTestButton->setChecked(false); - //delete m_currentRunControl; // who deletes the runcontrol? - m_currentRunControl = nullptr; - if (auto previewPlugin = qobject_cast(getPreviewPlugin())) - previewPlugin->setLocaleIsoCode(m_lastUsedLanguageBeforeTest); - }); - - connect(runControl, &ProjectExplorer::RunControl::appendMessage, - this, &QmlDebugTranslationWidget::appendMessage); - - if (auto project = ProjectExplorer::SessionManager::startupProject()) { - if (auto target = project->activeTarget()) { - if (auto multiLanguageAspect = QmlProjectManager::QmlMultiLanguageAspect::current(target)) - m_lastUsedLanguageBeforeTest = multiLanguageAspect->currentLocale(); - if (auto runConfiguration = target->activeRunConfiguration()) { - runControl->setRunConfiguration(runConfiguration); - if (runControl->createMainWorker()) { - previewPlugin->setLocaleIsoCode(QString()); - runControl->initiateStart(); - } - } - } - } -} - -void QmlDebugTranslationWidget::clear() -{ - m_runOutputWindow->clear(); - ProjectExplorer::TaskHub::clearTasks("QmlPreview.Translation"); -} - -QString QmlDebugTranslationWidget::currentDir() const -{ - return m_lastDir.isEmpty() ? - ProjectExplorer::ProjectTree::currentFilePath().parentDir().toString() : m_lastDir; -} - -void QmlDebugTranslationWidget::setCurrentDir(const QString &path) -{ - m_lastDir = path; -} - -void QmlDebugTranslationWidget::loadLogFile() -{ - const auto fileName = QFileDialog::getOpenFileName(this, QStringLiteral("Open File"), currentDir()); - if (!fileName.isEmpty()) { - setCurrentDir(QFileInfo(fileName).absolutePath()); - QFile f(fileName); - if (f.open(QFile::ReadOnly)) { - clear(); - while (!f.atEnd()) - appendMessage(QString::fromUtf8(f.readLine()), Utils::GeneralMessageFormat); - } else { - // TODO: maybe add this message to log and tasks - qWarning() << "Failed to open" << fileName << ":" << f.errorString(); - } - } -} - -void QmlDebugTranslationWidget::saveLogToFile() -{ - const QString fileName = QFileDialog::getSaveFileName( - this, tr("Choose file to save logged issues."), currentDir()); - if (!fileName.isEmpty()) { - setCurrentDir(QFileInfo(fileName).absolutePath()); - QFile f(fileName); - if (f.open(QFile::WriteOnly | QFile::Text)) - f.write(m_runOutputWindow->toPlainText().toUtf8()); - } -} - -void QmlDebugTranslationWidget::appendMessage(const QString &message, Utils::OutputFormat format) -{ - const auto newLine = QRegularExpression("[\r\n]"); - const auto messages = message.split(newLine, Qt::SkipEmptyParts); - - if (messages.count() > 1) { - for (auto m : messages) - appendMessage(m + "\n", format); - return; - } - const QString serviceSeperator = ": QQmlDebugTranslationService: "; - if (!message.contains(serviceSeperator)) - return; - QString locationString = message; - locationString = locationString.split(serviceSeperator).first(); - static const QRegularExpression qmlLineColumnLink("^(" QT_QML_URL_REGEXP ")" // url - ":(\\d+)" // line - ":(\\d+)$"); // column - const QRegularExpressionMatch qmlLineColumnMatch = qmlLineColumnLink.match(locationString); - - auto fileLine = -1; - QUrl fileUrl; - if (qmlLineColumnMatch.hasMatch()) { - fileUrl = QUrl(qmlLineColumnMatch.captured(1)); - fileLine = qmlLineColumnMatch.captured(2).toInt(); - } - - m_runOutputWindow->appendMessage(message, format); - - - auto type = ProjectExplorer::Task::TaskType::Warning; - auto description = message.split(serviceSeperator).at(1); - auto filePath = Utils::FilePath::fromString(fileUrl.toLocalFile()); - auto category = "QmlPreview.Translation"; - auto icon = Utils::Icons::WARNING.icon(); - - ProjectExplorer::TaskHub::addTask(ProjectExplorer::Task(type, - description, - filePath, - fileLine, - category, - icon, - ProjectExplorer::Task::NoOptions)); -} - -QString QmlDebugTranslationWidget::singleFileButtonText(const QString &filePath) -{ - auto buttonText = tr("Current file: %1"); - if (filePath.isEmpty()) - return buttonText.arg(tr("Empty")); - return buttonText.arg(filePath); -} - -QString QmlDebugTranslationWidget::runButtonText(bool isRunning) -{ - if (isRunning) { - return tr("Stop"); - } - return tr("Run Language Tests"); -} - -void QmlDebugTranslationWidget::addLanguageCheckBoxes(const QStringList &languages) -{ - for (auto language : languages) { - auto languageCheckBox = new QCheckBox(language); - m_selectLanguageLayout->addWidget(languageCheckBox); - connect(languageCheckBox, &QCheckBox::stateChanged, [this, language] (int state) { - if (state == Qt::Checked) - m_testLanguages.append(language); - else - m_testLanguages.removeAll(language); - }); - languageCheckBox->setChecked(true); - } -} - -} // namespace QmlPreview diff --git a/src/plugins/qmlpreview/qmldebugtranslationwidget.h b/src/plugins/qmlpreview/qmldebugtranslationwidget.h deleted file mode 100644 index de0c7ba3624..00000000000 --- a/src/plugins/qmlpreview/qmldebugtranslationwidget.h +++ /dev/null @@ -1,110 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2020 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt Creator. -** -** 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 General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** 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-3.0.html. -** -****************************************************************************/ - -#pragma once - -#include "qmlpreview_global.h" - -#include -#include - -#include - -QT_BEGIN_NAMESPACE -class QRadioButton; -class QPushButton; -class QHBoxLayout; -QT_END_NAMESPACE - -namespace Core { -class IEditor; -class OutputWindow; -} -namespace ProjectExplorer { -class Project; -class RunControl; -} - -namespace QmlPreview { - -class ProjectFileSelectionsWidget; - - -class QMLPREVIEW_EXPORT QmlDebugTranslationWidget : public QWidget -{ - using TestLanguageGetter = std::function; - Q_OBJECT -public: - explicit QmlDebugTranslationWidget(QWidget *parent = nullptr, TestLanguageGetter languagesGetterMethod = {}); - ~QmlDebugTranslationWidget() override; - - void setCurrentFile(const Utils::FilePath &filepath); - void setFiles(const Utils::FilePaths &filePathes); - void updateStartupProjectTranslations(); - - QColor warningColor(); - QColor foundTrColor(); -private: - void updateCurrentEditor(const Core::IEditor *editor); - void updateCurrentTranslations(ProjectExplorer::Project *project); - void updateFiles(); - void runTest(); - void appendMessage(const QString &message, Utils::OutputFormat format); - void clear(); - void loadLogFile(); - void saveLogToFile(); - QString currentDir() const; - void setCurrentDir(const QString &path); - - QString singleFileButtonText(const QString &filePath); - QString runButtonText(bool isRunning = false); - void addLanguageCheckBoxes(const QStringList &languages); - - QStringList m_testLanguages; - QString m_lastUsedLanguageBeforeTest; - bool m_elideWarning = false; - - Core::OutputWindow *m_runOutputWindow = nullptr; - - QRadioButton *m_singleFileButton = nullptr; - QRadioButton *m_multipleFileButton = nullptr; - ProjectFileSelectionsWidget *m_checkableProjectFileView = nullptr; - QPushButton *m_runTestButton = nullptr; - - Utils::FilePath m_currentFilePath; - Utils::FilePaths m_selectedFilePaths; - ProjectExplorer::RunControl *m_currentRunControl = nullptr; - - QString m_lastDir; - - QHBoxLayout *m_selectLanguageLayout; - TestLanguageGetter m_testLanguagesGetter; - QColor m_warningColor; - QColor m_foundTrColor; - QColor m_lastWarningColor; - QColor m_lastfoundTrColor; -}; - -} // namespace QmlPreview diff --git a/src/plugins/qmlpreview/qmlpreview.pro b/src/plugins/qmlpreview/qmlpreview.pro index ea53ac2f4ea..cfc571521f5 100644 --- a/src/plugins/qmlpreview/qmlpreview.pro +++ b/src/plugins/qmlpreview/qmlpreview.pro @@ -10,23 +10,19 @@ include(tests/tests.pri) HEADERS += \ qmlpreview_global.h \ qmldebugtranslationclient.h \ - qmldebugtranslationwidget.h \ qmlpreviewclient.h \ qmlpreviewplugin.h \ qmlpreviewruncontrol.h \ qmlpreviewconnectionmanager.h \ - qmlpreviewfileontargetfinder.h \ - projectfileselectionswidget.h + qmlpreviewfileontargetfinder.h SOURCES += \ qmlpreviewplugin.cpp \ qmldebugtranslationclient.cpp \ - qmldebugtranslationwidget.cpp \ qmlpreviewclient.cpp \ qmlpreviewruncontrol.cpp \ qmlpreviewconnectionmanager.cpp \ - qmlpreviewfileontargetfinder.cpp \ - projectfileselectionswidget.cpp + qmlpreviewfileontargetfinder.cpp OTHER_FILES += \ QmlPreview.json.in diff --git a/src/plugins/qmlpreview/qmlpreviewconnectionmanager.cpp b/src/plugins/qmlpreview/qmlpreviewconnectionmanager.cpp index 6767544c1d7..0087d97f21d 100644 --- a/src/plugins/qmlpreview/qmlpreviewconnectionmanager.cpp +++ b/src/plugins/qmlpreview/qmlpreviewconnectionmanager.cpp @@ -40,6 +40,9 @@ QmlPreviewConnectionManager::QmlPreviewConnectionManager(QObject *parent) : QmlDebug::QmlDebugConnectionManager(parent) { setTarget(nullptr); + m_createDebugTranslationClientMethod = [](QmlDebug::QmlDebugConnection *connection) { + return std::make_unique(connection); + }; } QmlPreviewConnectionManager::~QmlPreviewConnectionManager() = default; @@ -66,6 +69,11 @@ void QmlPreviewConnectionManager::setFpsHandler(QmlPreviewFpsHandler fpsHandler) m_fpsHandler = fpsHandler; } +void QmlPreviewConnectionManager::setQmlDebugTranslationClientCreator(QmlDebugTranslationClientCreator creator) +{ + m_createDebugTranslationClientMethod = creator; +} + void QmlPreviewConnectionManager::createClients() { createPreviewClient(); @@ -113,9 +121,9 @@ QUrl QmlPreviewConnectionManager::findValidI18nDirectoryAsUrl(const QString &loc void QmlPreviewConnectionManager::createDebugTranslationClient() { - m_qmlDebugTranslationClient = new QmlDebugTranslationClient(connection()); + m_qmlDebugTranslationClient = m_createDebugTranslationClientMethod(connection()); connect(this, &QmlPreviewConnectionManager::language, - m_qmlDebugTranslationClient, [this](const QString &locale) { + m_qmlDebugTranslationClient.get(), [this](const QString &locale) { m_lastUsedLanguage = locale; // findValidI18nDirectoryAsUrl does not work if we didn't load any file // service expects a context URL. @@ -124,10 +132,7 @@ void QmlPreviewConnectionManager::createDebugTranslationClient() m_qmlDebugTranslationClient->changeLanguage(findValidI18nDirectoryAsUrl(locale), locale); } }); - connect(this, &QmlPreviewConnectionManager::changeElideWarning, - m_qmlDebugTranslationClient, &QmlDebugTranslationClient::changeElideWarning); - - connect(m_qmlDebugTranslationClient.data(), &QmlDebugTranslationClient::debugServiceUnavailable, + connect(m_qmlDebugTranslationClient.get(), &QmlDebugTranslationClient::debugServiceUnavailable, this, []() { QMessageBox::warning(Core::ICore::dialogParent(), "Error connect to QML DebugTranslation service", "QML DebugTranslation feature is not available for this version of Qt."); @@ -260,7 +265,7 @@ void QmlPreviewConnectionManager::clearClient(QObject *client) void QmlPreviewConnectionManager::destroyClients() { clearClient(m_qmlPreviewClient); - clearClient(m_qmlDebugTranslationClient); + clearClient(m_qmlDebugTranslationClient.release()); m_fileSystemWatcher.removeFiles(m_fileSystemWatcher.files()); QTC_ASSERT(m_fileSystemWatcher.directories().isEmpty(), m_fileSystemWatcher.removeDirectories(m_fileSystemWatcher.directories())); diff --git a/src/plugins/qmlpreview/qmlpreviewconnectionmanager.h b/src/plugins/qmlpreview/qmlpreviewconnectionmanager.h index c63db57343c..a23c68c31a9 100644 --- a/src/plugins/qmlpreview/qmlpreviewconnectionmanager.h +++ b/src/plugins/qmlpreview/qmlpreviewconnectionmanager.h @@ -52,12 +52,12 @@ public: void setFileLoader(QmlPreviewFileLoader fileLoader); void setFileClassifier(QmlPreviewFileClassifier fileClassifier); void setFpsHandler(QmlPreviewFpsHandler fpsHandler); + void setQmlDebugTranslationClientCreator(QmlDebugTranslationClientCreator creator); signals: void loadFile(const QString &filename, const QString &changedFile, const QByteArray &contents); void zoom(float zoomFactor); void language(const QString &locale); - void changeElideWarning(bool elideWarning); void rerun(); void restart(); @@ -68,18 +68,19 @@ protected: private: void createPreviewClient(); void createDebugTranslationClient(); - QUrl findValidI18nDirectoryAsUrl(const QString &locale); void clearClient(QObject *client); + QUrl findValidI18nDirectoryAsUrl(const QString &locale); Utils::FileInProjectFinder m_projectFileFinder; QmlPreviewFileOnTargetFinder m_targetFileFinder; QPointer m_qmlPreviewClient; - QPointer m_qmlDebugTranslationClient; + std::unique_ptr m_qmlDebugTranslationClient; Utils::FileSystemWatcher m_fileSystemWatcher; QUrl m_lastLoadedUrl; QString m_lastUsedLanguage; QmlPreviewFileLoader m_fileLoader = nullptr; QmlPreviewFileClassifier m_fileClassifier = nullptr; QmlPreviewFpsHandler m_fpsHandler = nullptr; + QmlDebugTranslationClientCreator m_createDebugTranslationClientMethod; }; } // namespace Internal diff --git a/src/plugins/qmlpreview/qmlpreviewplugin.cpp b/src/plugins/qmlpreview/qmlpreviewplugin.cpp index 137c51b4b3d..06c3887dbdf 100644 --- a/src/plugins/qmlpreview/qmlpreviewplugin.cpp +++ b/src/plugins/qmlpreview/qmlpreviewplugin.cpp @@ -26,8 +26,6 @@ #include "qmlpreviewplugin.h" #include "qmlpreviewruncontrol.h" -#include "qmldebugtranslationwidget.h" - #ifdef WITH_TESTS #include "tests/qmlpreviewclient_test.h" #include "tests/qmlpreviewplugin_test.h" @@ -67,7 +65,6 @@ using namespace ProjectExplorer; namespace QmlPreview { -namespace Internal { class QmlPreviewParser : public QObject { @@ -151,8 +148,7 @@ public: float m_zoomFactor = -1.0; QmlPreview::QmlPreviewFpsHandler m_fpsHandler = nullptr; QString m_localeIsoCode; - bool m_translationElideWarning = false; - QPointer m_qmlDebugTranslationWidget; + QmlDebugTranslationClientCreator m_createDebugTranslationClientMethod; RunWorkerFactory localRunWorkerFactory{ RunWorkerFactory::make(), @@ -170,7 +166,7 @@ public: m_fpsHandler, m_zoomFactor, m_localeIsoCode, - m_translationElideWarning + m_createDebugTranslationClientMethod }); connect(q, &QmlPreviewPlugin::updatePreviews, runner, &QmlPreviewRunner::loadFile); @@ -182,8 +178,6 @@ public: runner, &QmlPreviewRunner::zoom); connect(q, &QmlPreviewPlugin::localeIsoCodeChanged, runner, &QmlPreviewRunner::language); - connect(q, &QmlPreviewPlugin::elideWarningChanged, - runner, &QmlPreviewRunner::changeElideWarning); connect(runner, &RunWorker::started, this, [this, runControl] { addPreview(runControl); @@ -222,50 +216,6 @@ QmlPreviewPluginPrivate::QmlPreviewPluginPrivate(QmlPreviewPlugin *parent) Core::ActionManager::registerAction(action, "QmlPreview.RunPreview"), Constants::G_BUILD_RUN); - action = new QAction(QmlPreviewPlugin::tr("Test Translations"), this); - action->setToolTip(QLatin1String("Runs the preview with all available translations and collects all issues.")); - action->setEnabled(SessionManager::startupProject() != nullptr); - connect(SessionManager::instance(), &SessionManager::startupProjectChanged, action, - &QAction::setEnabled); - connect(action, &QAction::triggered, this, [this]() { - if (SessionManager::startupProject()) { - // Deletion for this widget is taken care of in aboutToShutdown() and registerWindow() - m_qmlDebugTranslationWidget = new QmlDebugTranslationWidget(); - Core::ICore::registerWindow(m_qmlDebugTranslationWidget, Core::Context("Core.DebugTranslation")); - m_qmlDebugTranslationWidget->show(); - } - }); - menu->addAction( - Core::ActionManager::registerAction(action, "QmlPreview.TestTranslations"), - Constants::G_BUILD_RUN); - auto updateTestTranslationAction = [action]() { - bool showTestTranslationAction = false; - bool enableTestTranslationAction = false; - QtSupport::BaseQtVersion *activeQt{}; - if (auto project = SessionManager::startupProject()) { - if (auto target = project->activeTarget()) { - if (auto activeKit = target->kit()) - activeQt = QtSupport::QtKitAspect::qtVersion(activeKit); - } - } - for (auto qtVersion : QtSupport::QtVersionManager::versions()) { - if (qtVersion->features().contains("QtStudio")) { - showTestTranslationAction = true; - if (qtVersion == activeQt) - enableTestTranslationAction = true; - } - } - action->setVisible(showTestTranslationAction); - action->setEnabled(enableTestTranslationAction); - }; - connect(ProjectExplorer::SessionManager::instance(), - &ProjectExplorer::SessionManager::startupProjectChanged, - updateTestTranslationAction); - - connect(QtSupport::QtVersionManager::instance(), - &QtSupport::QtVersionManager::qtVersionsChanged, - updateTestTranslationAction); - menu = Core::ActionManager::actionContainer(Constants::M_FILECONTEXT); action = new QAction(QmlPreviewPlugin::tr("Preview File"), this); action->setEnabled(false); @@ -314,7 +264,6 @@ ExtensionSystem::IPlugin::ShutdownFlag QmlPreviewPlugin::aboutToShutdown() { d->m_parseThread.quit(); d->m_parseThread.wait(); - delete d->m_qmlDebugTranslationWidget; return SynchronousShutdown; } @@ -410,15 +359,9 @@ void QmlPreviewPlugin::setLocaleIsoCode(const QString &localeIsoCode) emit localeIsoCodeChanged(d->m_localeIsoCode); } -bool QmlPreviewPlugin::elideWarning() const +void QmlPreviewPlugin::setQmlDebugTranslationClientCreator(QmlDebugTranslationClientCreator creator) { - return d->m_translationElideWarning; -} - -void QmlPreviewPlugin::changeElideWarning(bool elideWarning) -{ - d->m_translationElideWarning = elideWarning; - emit elideWarningChanged(elideWarning); + d->m_createDebugTranslationClientMethod = creator; } void QmlPreviewPlugin::setFileLoader(QmlPreviewFileLoader fileLoader) @@ -588,7 +531,6 @@ void QmlPreviewParser::parse(const QString &name, const QByteArray &contents, emit failure(); } -} // namespace Internal } // namespace QmlPreview #include diff --git a/src/plugins/qmlpreview/qmlpreviewplugin.h b/src/plugins/qmlpreview/qmlpreviewplugin.h index b2455b10773..873564b5ac6 100644 --- a/src/plugins/qmlpreview/qmlpreviewplugin.h +++ b/src/plugins/qmlpreview/qmlpreviewplugin.h @@ -25,6 +25,9 @@ #pragma once +#include "qmlpreview_global.h" +#include "qmldebugtranslationclient.h" + #include #include #include @@ -34,16 +37,17 @@ namespace Core { class IEditor; } +namespace QmlDebug { class QmlDebugConnection; } + namespace QmlPreview { typedef bool (*QmlPreviewFileClassifier) (const QString &); typedef QByteArray (*QmlPreviewFileLoader)(const QString &, bool *); typedef void (*QmlPreviewFpsHandler)(quint16[8]); typedef QList QmlPreviewRunControlList; +typedef std::function(QmlDebug::QmlDebugConnection *)> QmlDebugTranslationClientCreator; -namespace Internal { - -class QmlPreviewPlugin : public ExtensionSystem::IPlugin +class QMLPREVIEW_EXPORT QmlPreviewPlugin : public ExtensionSystem::IPlugin { Q_OBJECT Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "QmlPreview.json") @@ -59,7 +63,6 @@ class QmlPreviewPlugin : public ExtensionSystem::IPlugin WRITE setFpsHandler NOTIFY fpsHandlerChanged) Q_PROPERTY(float zoomFactor READ zoomFactor WRITE setZoomFactor NOTIFY zoomFactorChanged) Q_PROPERTY(QString localeIsoCode READ localeIsoCode WRITE setLocaleIsoCode NOTIFY localeIsoCodeChanged) - Q_PROPERTY(bool elideWarning READ elideWarning WRITE changeElideWarning NOTIFY elideWarningChanged) public: ~QmlPreviewPlugin() override; @@ -87,8 +90,7 @@ public: QString localeIsoCode() const; void setLocaleIsoCode(const QString &localeIsoCode); - bool elideWarning() const; - void changeElideWarning(bool elideWarning); + void setQmlDebugTranslationClientCreator(QmlDebugTranslationClientCreator creator); signals: void checkDocument(const QString &name, const QByteArray &contents, @@ -104,13 +106,11 @@ signals: void zoomFactorChanged(float zoomFactor); void localeIsoCodeChanged(const QString &localeIsoCode); - void elideWarningChanged(bool elideWarning); private: class QmlPreviewPluginPrivate *d = nullptr; }; -} // namespace Internal } // namespace QmlPreview Q_DECLARE_METATYPE(QmlPreview::QmlPreviewFileLoader) diff --git a/src/plugins/qmlpreview/qmlpreviewruncontrol.cpp b/src/plugins/qmlpreview/qmlpreviewruncontrol.cpp index f04f7525277..fd1d3bde3d9 100644 --- a/src/plugins/qmlpreview/qmlpreviewruncontrol.cpp +++ b/src/plugins/qmlpreview/qmlpreviewruncontrol.cpp @@ -52,6 +52,8 @@ QmlPreviewRunner::QmlPreviewRunner(const QmlPreviewRunnerSetting &settings) m_connectionManager.setFileLoader(settings.fileLoader); m_connectionManager.setFileClassifier(settings.fileClassifier); m_connectionManager.setFpsHandler(settings.fpsHandler); + m_connectionManager.setQmlDebugTranslationClientCreator( + settings.createDebugTranslationClientMethod); connect(this, &QmlPreviewRunner::loadFile, &m_connectionManager, &Internal::QmlPreviewConnectionManager::loadFile); @@ -62,8 +64,6 @@ QmlPreviewRunner::QmlPreviewRunner(const QmlPreviewRunnerSetting &settings) &m_connectionManager, &Internal::QmlPreviewConnectionManager::zoom); connect(this, &QmlPreviewRunner::language, &m_connectionManager, &Internal::QmlPreviewConnectionManager::language); - connect(this, &QmlPreviewRunner::changeElideWarning, - &m_connectionManager, &Internal::QmlPreviewConnectionManager::changeElideWarning); connect(&m_connectionManager, &Internal::QmlPreviewConnectionManager::connectionOpened, this, [this, settings]() { @@ -71,8 +71,6 @@ QmlPreviewRunner::QmlPreviewRunner(const QmlPreviewRunnerSetting &settings) emit zoom(settings.zoom); if (!settings.language.isEmpty()) emit language(settings.language); - if (settings.translationElideWarning) - emit changeElideWarning(true); emit ready(); }); diff --git a/src/plugins/qmlpreview/qmlpreviewruncontrol.h b/src/plugins/qmlpreview/qmlpreviewruncontrol.h index c5171e22488..2b425ee8bd7 100644 --- a/src/plugins/qmlpreview/qmlpreviewruncontrol.h +++ b/src/plugins/qmlpreview/qmlpreviewruncontrol.h @@ -39,7 +39,7 @@ struct QmlPreviewRunnerSetting { QmlPreviewFpsHandler fpsHandler; float zoom = 1.0; QString language; - bool translationElideWarning = false; + QmlDebugTranslationClientCreator createDebugTranslationClientMethod; }; class QmlPreviewRunner : public ProjectExplorer::RunWorker @@ -59,7 +59,6 @@ signals: void zoom(float zoomFactor); void rerun(); void ready(); - void changeElideWarning(bool elideWarning); private: void start() override; void stop() override; diff --git a/src/plugins/qmlpreview/tests/qmlpreviewclient_test.cpp b/src/plugins/qmlpreview/tests/qmlpreviewclient_test.cpp index 9aec2d6cc66..8b99a8f1d7d 100644 --- a/src/plugins/qmlpreview/tests/qmlpreviewclient_test.cpp +++ b/src/plugins/qmlpreview/tests/qmlpreviewclient_test.cpp @@ -29,7 +29,6 @@ #include namespace QmlPreview { -namespace Internal { class TestableQmlPreviewClient : public QmlPreviewClient { @@ -139,7 +138,6 @@ void QmlPreviewClientTest::testMessageReceived() } } -} // namespace Internal } // namespace QmlPreview #include "qmlpreviewclient_test.moc" diff --git a/src/plugins/qmlpreview/tests/qmlpreviewclient_test.h b/src/plugins/qmlpreview/tests/qmlpreviewclient_test.h index 43ae0030036..dcb8d380c74 100644 --- a/src/plugins/qmlpreview/tests/qmlpreviewclient_test.h +++ b/src/plugins/qmlpreview/tests/qmlpreviewclient_test.h @@ -26,7 +26,6 @@ #include namespace QmlPreview { -namespace Internal { class QmlPreviewClientTest : public QObject { @@ -39,5 +38,4 @@ private slots: void testMessageReceived(); }; -} // namespace Internal } // namespace QmlPreview diff --git a/src/plugins/qmlpreview/tests/qmlpreviewplugin_test.cpp b/src/plugins/qmlpreview/tests/qmlpreviewplugin_test.cpp index 0e3306f15df..08ede8b185e 100644 --- a/src/plugins/qmlpreview/tests/qmlpreviewplugin_test.cpp +++ b/src/plugins/qmlpreview/tests/qmlpreviewplugin_test.cpp @@ -31,11 +31,10 @@ #include #include -Q_DECLARE_METATYPE(QmlPreview::Internal::TestFileLoader) -Q_DECLARE_METATYPE(QmlPreview::Internal::TestFpsHandler) +Q_DECLARE_METATYPE(QmlPreview::TestFileLoader) +Q_DECLARE_METATYPE(QmlPreview::TestFpsHandler) namespace QmlPreview { -namespace Internal { QmlPreviewPluginTest::QmlPreviewPluginTest(QObject *parent) : QObject(parent) { @@ -90,5 +89,4 @@ void QmlPreviewPluginTest::testFpsHandlerProperty() handler(stats); } -} // namespace Internal } // namespace QmlPreview diff --git a/src/plugins/qmlpreview/tests/qmlpreviewplugin_test.h b/src/plugins/qmlpreview/tests/qmlpreviewplugin_test.h index 8ceeb6669ca..5c28e9cc341 100644 --- a/src/plugins/qmlpreview/tests/qmlpreviewplugin_test.h +++ b/src/plugins/qmlpreview/tests/qmlpreviewplugin_test.h @@ -28,7 +28,6 @@ #include namespace QmlPreview { -namespace Internal { typedef QByteArray (*TestFileLoader)(const QString &, bool *); typedef void (*TestFpsHandler)(quint16[8]); @@ -45,5 +44,4 @@ private slots: void testFpsHandlerProperty(); }; -} // namespace Internal } // namespace QmlPreview