diff --git a/src/plugins/qmljseditor/CMakeLists.txt b/src/plugins/qmljseditor/CMakeLists.txt index d2155c9ae4c..fcba4765f3b 100644 --- a/src/plugins/qmljseditor/CMakeLists.txt +++ b/src/plugins/qmljseditor/CMakeLists.txt @@ -4,7 +4,6 @@ add_qtc_plugin(QmlJSEditor SOURCES qmlexpressionundercursor.cpp qmlexpressionundercursor.h qmllsclient.h qmllsclient.cpp - qmllssettings.h qmllssettings.cpp qmljsautocompleter.cpp qmljsautocompleter.h qmljscompletionassist.cpp qmljscompletionassist.h qmljscomponentfromobjectdef.cpp qmljscomponentfromobjectdef.h diff --git a/src/plugins/qmljseditor/qmljseditor.qbs b/src/plugins/qmljseditor/qmljseditor.qbs index 544c2fd67f0..1ed1d976ac7 100644 --- a/src/plugins/qmljseditor/qmljseditor.qbs +++ b/src/plugins/qmljseditor/qmljseditor.qbs @@ -21,8 +21,6 @@ QtcPlugin { "qmlexpressionundercursor.h", "qmllsclient.cpp", "qmllsclient.h", - "qmllssettings.cpp", - "qmllssettings.h", "qmljsautocompleter.cpp", "qmljsautocompleter.h", "qmljscompletionassist.cpp", diff --git a/src/plugins/qmljseditor/qmljseditordocument.cpp b/src/plugins/qmljseditor/qmljseditordocument.cpp index 30fe36b6010..a7ed5199c1e 100644 --- a/src/plugins/qmljseditor/qmljseditordocument.cpp +++ b/src/plugins/qmljseditor/qmljseditordocument.cpp @@ -6,13 +6,13 @@ #include "qmljseditordocument_p.h" #include "qmljseditorplugin.h" #include "qmljseditortr.h" +#include "qmljseditorsettings.h" #include "qmljshighlighter.h" #include "qmljsquickfixassist.h" #include "qmljssemantichighlighter.h" #include "qmljssemanticinfoupdater.h" #include "qmljstextmark.h" #include "qmllsclient.h" -#include "qmllssettings.h" #include "qmloutlinemodel.h" #include @@ -477,10 +477,8 @@ QmlJSEditorDocumentPrivate::QmlJSEditorDocumentPrivate(QmlJSEditorDocument *pare this, &QmlJSEditorDocumentPrivate::reparseDocument); connect(modelManager, &ModelManagerInterface::documentUpdated, this, &QmlJSEditorDocumentPrivate::onDocumentUpdated); - connect(QmllsSettingsManager::instance(), - &QmllsSettingsManager::settingsChanged, - this, - &Internal::QmlJSEditorDocumentPrivate::settingsChanged); + connect(QmllsSettingsManager::instance(), &QmllsSettingsManager::settingsChanged, + this, &QmlJSEditorDocumentPrivate::settingsChanged); // semantic info m_semanticInfoUpdater = new SemanticInfoUpdater(); @@ -746,9 +744,9 @@ static Utils::FilePath qmllsForFile(const Utils::FilePath &file, return settingsManager->latestQmlls(); QmlJS::ModelManagerInterface::ProjectInfo pInfo = modelManager->projectInfoForPath(file); - if (!settingsManager->ignoreMinimumQmllsVersion() + if (!settings().ignoreMinimumQmllsVersion() && QVersionNumber::fromString(pInfo.qtVersionString) - < QmllsSettingsManager::mininumQmllsVersion) { + < QmlJsEditingSettings::mininumQmllsVersion) { return {}; } return pInfo.qmllsPath; diff --git a/src/plugins/qmljseditor/qmljseditorsettings.cpp b/src/plugins/qmljseditor/qmljseditorsettings.cpp index aadcf7c6c01..3fc07d76841 100644 --- a/src/plugins/qmljseditor/qmljseditorsettings.cpp +++ b/src/plugins/qmljseditor/qmljseditorsettings.cpp @@ -9,10 +9,15 @@ #include #include +#include #include + #include +#include + #include +#include #include #include #include @@ -24,10 +29,23 @@ #include #include #include +#include #include #include #include +#include + +#include + +using namespace QmlJSEditor::Internal; +using namespace QtSupport; +using namespace Utils; + +namespace QmlJSEditor::Internal { + +static Q_LOGGING_CATEGORY(qmllsLog, "qtc.qmlls.settings", QtWarningMsg) + const char AUTO_FORMAT_ON_SAVE[] = "QmlJSEditor.AutoFormatOnSave"; const char AUTO_FORMAT_ONLY_CURRENT_PROJECT[] = "QmlJSEditor.AutoFormatOnlyCurrentProject"; const char QML_CONTEXTPANE_KEY[] = "QmlJSEditor.ContextPaneEnabled"; @@ -47,17 +65,107 @@ const char DISABLED_MESSAGES[] = "QmlJSEditor.disabledMessages"; const char DISABLED_MESSAGES_NONQUICKUI[] = "QmlJSEditor.disabledMessagesNonQuickUI"; const char DEFAULT_CUSTOM_FORMAT_COMMAND[] = "%{CurrentDocument:Project:QT_HOST_BINS}/qmlformat"; -using namespace QmlJSEditor::Internal; -using namespace Utils; - -namespace QmlJSEditor::Internal { - QmlJsEditingSettings &settings() { static QmlJsEditingSettings settings; return settings; } +static FilePath evaluateLatestQmlls() +{ + // find latest qmlls, i.e. vals + if (!QtVersionManager::isLoaded()) + return {}; + const QtVersions versions = QtVersionManager::versions(); + FilePath latestQmlls; + QVersionNumber latestVersion; + FilePath latestQmakeFilePath; + int latestUniqueId = std::numeric_limits::min(); + for (QtVersion *v : versions) { + // check if we find qmlls + QVersionNumber vNow = v->qtVersion(); + FilePath qmllsNow = QmlJS::ModelManagerInterface::qmllsForBinPath(v->hostBinPath(), vNow); + if (!qmllsNow.isExecutableFile()) + continue; + if (latestVersion > vNow) + continue; + FilePath qmakeNow = v->qmakeFilePath(); + int uniqueIdNow = v->uniqueId(); + if (latestVersion == vNow) { + if (latestQmakeFilePath > qmakeNow) + continue; + if (latestQmakeFilePath == qmakeNow && latestUniqueId >= v->uniqueId()) + continue; + } + latestVersion = vNow; + latestQmlls = qmllsNow; + latestQmakeFilePath = qmakeNow; + latestUniqueId = uniqueIdNow; + } + return latestQmlls; +} + +QmllsSettingsManager *QmllsSettingsManager::instance() +{ + static QmllsSettingsManager *manager = new QmllsSettingsManager; + return manager; +} + +FilePath QmllsSettingsManager::latestQmlls() +{ + QMutexLocker l(&m_mutex); + return m_latestQmlls; +} + +void QmllsSettingsManager::setupAutoupdate() +{ + QObject::connect(QtVersionManager::instance(), + &QtVersionManager::qtVersionsChanged, + this, + &QmllsSettingsManager::checkForChanges); + if (QtVersionManager::isLoaded()) + checkForChanges(); + else + QObject::connect(QtVersionManager::instance(), + &QtVersionManager::qtVersionsLoaded, + this, + &QmllsSettingsManager::checkForChanges); +} + +void QmllsSettingsManager::checkForChanges() +{ + const QmlJsEditingSettings &newSettings = settings(); + FilePath newLatest = newSettings.useLatestQmlls() && newSettings.useQmlls() + ? evaluateLatestQmlls() : m_latestQmlls; + if (m_useQmlls == newSettings.useQmlls() + && m_useLatestQmlls == newSettings.useLatestQmlls() + && m_disableBuiltinCodemodel == newSettings.disableBuiltinCodemodel() + && m_generateQmllsIniFiles == newSettings.generateQmllsIniFiles() + && newLatest == m_latestQmlls) + return; + qCDebug(qmllsLog) << "qmlls settings changed:" << newSettings.useQmlls() + << newSettings.useLatestQmlls() << newLatest; + { + QMutexLocker l(&m_mutex); + m_latestQmlls = newLatest; + m_useQmlls = newSettings.useQmlls(); + m_useLatestQmlls = newSettings.useLatestQmlls(); + m_disableBuiltinCodemodel = newSettings.disableBuiltinCodemodel(); + m_generateQmllsIniFiles = newSettings.generateQmllsIniFiles(); + } + emit settingsChanged(); +} + +bool QmllsSettingsManager::useLatestQmlls() const +{ + return m_useLatestQmlls; +} + +bool QmllsSettingsManager::useQmlls() const +{ + return m_useQmlls; +} + static QList defaultDisabledMessages() { static const QList disabledByDefault = Utils::transform( @@ -452,7 +560,7 @@ public: ignoreMinimumQmllsVersion = new QCheckBox( Tr::tr("Allow versions below Qt %1") - .arg(QmllsSettingsManager::mininumQmllsVersion.toString())); + .arg(QmlJsEditingSettings::mininumQmllsVersion.toString())); ignoreMinimumQmllsVersion->setChecked(s.ignoreMinimumQmllsVersion()); ignoreMinimumQmllsVersion->setEnabled(s.useQmlls()); diff --git a/src/plugins/qmljseditor/qmljseditorsettings.h b/src/plugins/qmljseditor/qmljseditorsettings.h index f4290fba299..2922d2c10ca 100644 --- a/src/plugins/qmljseditor/qmljseditorsettings.h +++ b/src/plugins/qmljseditor/qmljseditorsettings.h @@ -3,18 +3,21 @@ #pragma once -#include "qmllssettings.h" - #include -#include -#include +#include + +#include +#include +#include namespace QmlJSEditor::Internal { class QmlJsEditingSettings { public: + static const inline QVersionNumber mininumQmllsVersion = QVersionNumber(6, 8); + QmlJsEditingSettings(); void toSettings(Utils::QtcSettings *) const; @@ -98,6 +101,33 @@ private: QSet m_disabledMessagesForNonQuickUi; }; +class QmllsSettingsManager : public QObject +{ + Q_OBJECT + +public: + static QmllsSettingsManager *instance(); + + Utils::FilePath latestQmlls(); + void setupAutoupdate(); + + bool useQmlls() const; + bool useLatestQmlls() const; + +public slots: + void checkForChanges(); +signals: + void settingsChanged(); + +private: + QMutex m_mutex; + bool m_useQmlls = true; + bool m_useLatestQmlls = false; + bool m_disableBuiltinCodemodel = false; + bool m_generateQmllsIniFiles = false; + Utils::FilePath m_latestQmlls; +}; + QmlJsEditingSettings &settings(); class QmlJsEditingSettingsPage : public Core::IOptionsPage diff --git a/src/plugins/qmljseditor/qmllssettings.cpp b/src/plugins/qmljseditor/qmllssettings.cpp deleted file mode 100644 index 268439e055c..00000000000 --- a/src/plugins/qmljseditor/qmllssettings.cpp +++ /dev/null @@ -1,130 +0,0 @@ -// Copyright (C) 2022 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 - -#include "qmllssettings.h" -#include "qmljseditorsettings.h" - -#include -#include - -#include -#include - -#include - -#include - -using namespace QtSupport; -using namespace Utils; - -namespace QmlJSEditor::Internal { - -namespace { -Q_LOGGING_CATEGORY(qmllsLog, "qtc.qmlls.settings", QtWarningMsg); -} - -static FilePath evaluateLatestQmlls() -{ - // find latest qmlls, i.e. vals - if (!QtVersionManager::isLoaded()) - return {}; - const QtVersions versions = QtVersionManager::versions(); - FilePath latestQmlls; - QVersionNumber latestVersion; - FilePath latestQmakeFilePath; - int latestUniqueId = std::numeric_limits::min(); - const bool ignoreMinimumQmllsVersion - = QmllsSettingsManager::instance()->ignoreMinimumQmllsVersion(); - for (QtVersion *v : versions) { - // check if we find qmlls - QVersionNumber vNow = v->qtVersion(); - if (!ignoreMinimumQmllsVersion && vNow < QmllsSettingsManager::mininumQmllsVersion) - continue; - FilePath qmllsNow = QmlJS::ModelManagerInterface::qmllsForBinPath(v->hostBinPath(), vNow); - if (!qmllsNow.isExecutableFile()) - continue; - if (latestVersion > vNow) - continue; - FilePath qmakeNow = v->qmakeFilePath(); - int uniqueIdNow = v->uniqueId(); - if (latestVersion == vNow) { - if (latestQmakeFilePath > qmakeNow) - continue; - if (latestQmakeFilePath == qmakeNow && latestUniqueId >= v->uniqueId()) - continue; - } - latestVersion = vNow; - latestQmlls = qmllsNow; - latestQmakeFilePath = qmakeNow; - latestUniqueId = uniqueIdNow; - } - return latestQmlls; -} - -QmllsSettingsManager *QmllsSettingsManager::instance() -{ - static QmllsSettingsManager *manager = new QmllsSettingsManager; - return manager; -} - -FilePath QmllsSettingsManager::latestQmlls() -{ - QMutexLocker l(&m_mutex); - return m_latestQmlls; -} - -void QmllsSettingsManager::setupAutoupdate() -{ - QObject::connect(QtVersionManager::instance(), - &QtVersionManager::qtVersionsChanged, - this, - &QmllsSettingsManager::checkForChanges); - if (QtVersionManager::isLoaded()) - checkForChanges(); - else - QObject::connect(QtVersionManager::instance(), - &QtVersionManager::qtVersionsLoaded, - this, - &QmllsSettingsManager::checkForChanges); -} - -void QmllsSettingsManager::checkForChanges() -{ - const QmlJsEditingSettings &newSettings = settings(); - FilePath newLatest = newSettings.useLatestQmlls() && newSettings.useQmlls() - ? evaluateLatestQmlls() : m_latestQmlls; - if (m_useQmlls == newSettings.useQmlls() - && m_useLatestQmlls == newSettings.useLatestQmlls() - && m_disableBuiltinCodemodel == newSettings.disableBuiltinCodemodel() - && m_generateQmllsIniFiles == newSettings.generateQmllsIniFiles() - && newLatest == m_latestQmlls) - return; - qCDebug(qmllsLog) << "qmlls settings changed:" << newSettings.useQmlls() - << newSettings.useLatestQmlls() << newLatest; - { - QMutexLocker l(&m_mutex); - m_latestQmlls = newLatest; - m_useQmlls = newSettings.useQmlls(); - m_useLatestQmlls = newSettings.useLatestQmlls(); - m_disableBuiltinCodemodel = newSettings.disableBuiltinCodemodel(); - m_generateQmllsIniFiles = newSettings.generateQmllsIniFiles(); - } - emit settingsChanged(); -} - -bool QmllsSettingsManager::useLatestQmlls() const -{ - return m_useLatestQmlls; -} - -bool QmllsSettingsManager::ignoreMinimumQmllsVersion() const -{ - return m_ignoreMinimumQmllsVersion; -} - -bool QmllsSettingsManager::useQmlls() const -{ - return m_useQmlls; -} - -} // QmlJSEditor::Internal diff --git a/src/plugins/qmljseditor/qmllssettings.h b/src/plugins/qmljseditor/qmllssettings.h deleted file mode 100644 index 05e335ba81e..00000000000 --- a/src/plugins/qmljseditor/qmllssettings.h +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright (C) 2022 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 - -#pragma once - -#include - -#include -#include -#include - -namespace QmlJSEditor::Internal { - -class QmllsSettingsManager : public QObject -{ - Q_OBJECT - -public: - static const inline QVersionNumber mininumQmllsVersion = QVersionNumber(6, 8); - - static QmllsSettingsManager *instance(); - - Utils::FilePath latestQmlls(); - void setupAutoupdate(); - - bool useQmlls() const; - bool useLatestQmlls() const; - bool ignoreMinimumQmllsVersion() const; - -public slots: - void checkForChanges(); -signals: - void settingsChanged(); - -private: - QMutex m_mutex; - bool m_useQmlls = true; - bool m_useLatestQmlls = false; - bool m_ignoreMinimumQmllsVersion = false; - bool m_disableBuiltinCodemodel = false; - bool m_generateQmllsIniFiles = false; - Utils::FilePath m_latestQmlls; -}; - -} // QmlJSEditor::Internal