2022-08-19 15:59:36 +02:00
|
|
|
// Copyright (C) 2016 The Qt Company Ltd.
|
2022-12-21 10:12:09 +01:00
|
|
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
2016-06-18 14:15:02 +02:00
|
|
|
|
2024-06-20 08:44:26 +02:00
|
|
|
#include "qmljseditorsettings.h"
|
2016-06-18 14:15:02 +02:00
|
|
|
#include "qmljseditorconstants.h"
|
2022-08-25 12:46:47 +02:00
|
|
|
#include "qmljseditortr.h"
|
2016-06-18 14:15:02 +02:00
|
|
|
|
2022-05-05 18:18:44 +03:00
|
|
|
#include <coreplugin/coreconstants.h>
|
2016-06-18 14:15:02 +02:00
|
|
|
#include <coreplugin/icore.h>
|
2023-09-22 16:15:27 +02:00
|
|
|
|
2023-04-28 14:15:27 +02:00
|
|
|
#include <qmljs/qmljscheck.h>
|
2024-06-20 11:32:39 +02:00
|
|
|
#include <qmljs/qmljsmodelmanagerinterface.h>
|
2023-04-28 14:15:27 +02:00
|
|
|
#include <qmljs/qmljsstaticanalysismessage.h>
|
2024-06-20 11:32:39 +02:00
|
|
|
|
2023-04-28 14:15:27 +02:00
|
|
|
#include <qmljstools/qmljstoolsconstants.h>
|
2023-09-22 16:15:27 +02:00
|
|
|
|
2024-06-20 11:32:39 +02:00
|
|
|
#include <qtsupport/qtversionmanager.h>
|
|
|
|
|
|
2023-04-28 14:15:27 +02:00
|
|
|
#include <utils/algorithm.h>
|
2024-06-20 11:32:39 +02:00
|
|
|
#include <utils/hostosinfo.h>
|
2022-08-17 17:13:21 +02:00
|
|
|
#include <utils/layoutbuilder.h>
|
2022-11-03 15:20:13 +03:00
|
|
|
#include <utils/macroexpander.h>
|
|
|
|
|
#include <utils/qtcsettings.h>
|
2023-04-28 14:15:27 +02:00
|
|
|
#include <utils/treemodel.h>
|
2022-11-03 15:20:13 +03:00
|
|
|
#include <utils/variablechooser.h>
|
2016-06-18 14:15:02 +02:00
|
|
|
|
2022-08-17 17:13:21 +02:00
|
|
|
#include <QCheckBox>
|
|
|
|
|
#include <QComboBox>
|
2024-05-14 10:33:01 +02:00
|
|
|
#include <QGroupBox>
|
2022-11-03 15:20:13 +03:00
|
|
|
#include <QLabel>
|
|
|
|
|
#include <QLineEdit>
|
2024-06-20 11:32:39 +02:00
|
|
|
#include <QLoggingCategory>
|
2023-05-04 09:05:27 +02:00
|
|
|
#include <QMenu>
|
2016-06-18 14:15:02 +02:00
|
|
|
#include <QTextStream>
|
2023-04-28 14:15:27 +02:00
|
|
|
#include <QTreeView>
|
2016-06-18 14:15:02 +02:00
|
|
|
|
2024-06-20 11:32:39 +02:00
|
|
|
#include <nanotrace/nanotrace.h>
|
|
|
|
|
|
|
|
|
|
#include <limits>
|
|
|
|
|
|
|
|
|
|
using namespace QmlJSEditor::Internal;
|
|
|
|
|
using namespace QtSupport;
|
|
|
|
|
using namespace Utils;
|
|
|
|
|
|
|
|
|
|
namespace QmlJSEditor::Internal {
|
|
|
|
|
|
|
|
|
|
static Q_LOGGING_CATEGORY(qmllsLog, "qtc.qmlls.settings", QtWarningMsg)
|
|
|
|
|
|
2019-07-18 14:17:25 +02:00
|
|
|
const char AUTO_FORMAT_ON_SAVE[] = "QmlJSEditor.AutoFormatOnSave";
|
|
|
|
|
const char AUTO_FORMAT_ONLY_CURRENT_PROJECT[] = "QmlJSEditor.AutoFormatOnlyCurrentProject";
|
|
|
|
|
const char QML_CONTEXTPANE_KEY[] = "QmlJSEditor.ContextPaneEnabled";
|
|
|
|
|
const char QML_CONTEXTPANEPIN_KEY[] = "QmlJSEditor.ContextPanePinned";
|
2020-02-20 15:19:12 +01:00
|
|
|
const char FOLD_AUX_DATA[] = "QmlJSEditor.FoldAuxData";
|
2022-09-28 11:16:49 +02:00
|
|
|
const char USE_QMLLS[] = "QmlJSEditor.UseQmlls";
|
|
|
|
|
const char USE_LATEST_QMLLS[] = "QmlJSEditor.UseLatestQmlls";
|
2024-06-17 14:21:07 +02:00
|
|
|
const char IGNORE_MINIMUM_QMLLS_VERSION[] = "QmlJSEditor.IgnoreMinimumQmllsVersion";
|
2023-09-01 11:40:37 +02:00
|
|
|
const char DISABLE_BUILTIN_CODEMODEL[] = "QmlJSEditor.DisableBuiltinCodemodel";
|
2024-03-14 16:36:38 +01:00
|
|
|
const char GENERATE_QMLLS_INI_FILES[] = "QmlJSEditor.GenerateQmllsIniFiles";
|
2022-05-05 18:18:44 +03:00
|
|
|
const char UIQML_OPEN_MODE[] = "QmlJSEditor.openUiQmlMode";
|
2022-11-03 15:20:13 +03:00
|
|
|
const char FORMAT_COMMAND[] = "QmlJSEditor.formatCommand";
|
|
|
|
|
const char FORMAT_COMMAND_OPTIONS[] = "QmlJSEditor.formatCommandOptions";
|
|
|
|
|
const char CUSTOM_COMMAND[] = "QmlJSEditor.useCustomFormatCommand";
|
2023-04-28 14:15:27 +02:00
|
|
|
const char CUSTOM_ANALYZER[] = "QmlJSEditor.useCustomAnalyzer";
|
|
|
|
|
const char DISABLED_MESSAGES[] = "QmlJSEditor.disabledMessages";
|
|
|
|
|
const char DISABLED_MESSAGES_NONQUICKUI[] = "QmlJSEditor.disabledMessagesNonQuickUI";
|
2022-11-03 15:20:13 +03:00
|
|
|
const char DEFAULT_CUSTOM_FORMAT_COMMAND[] = "%{CurrentDocument:Project:QT_HOST_BINS}/qmlformat";
|
2016-06-18 14:15:02 +02:00
|
|
|
|
2024-06-20 08:44:26 +02:00
|
|
|
QmlJsEditingSettings &settings()
|
|
|
|
|
{
|
|
|
|
|
static QmlJsEditingSettings settings;
|
|
|
|
|
return settings;
|
|
|
|
|
}
|
2016-06-18 14:15:02 +02:00
|
|
|
|
2024-06-20 11:32:39 +02:00
|
|
|
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<int>::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;
|
|
|
|
|
}
|
|
|
|
|
|
2023-05-04 09:05:27 +02:00
|
|
|
static QList<int> defaultDisabledMessages()
|
|
|
|
|
{
|
|
|
|
|
static const QList<int> disabledByDefault = Utils::transform(
|
|
|
|
|
QmlJS::Check::defaultDisabledMessages(),
|
|
|
|
|
[](QmlJS::StaticAnalysis::Type t) { return int(t); });
|
|
|
|
|
return disabledByDefault;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static QList<int> defaultDisabledMessagesNonQuickUi()
|
|
|
|
|
{
|
|
|
|
|
static const QList<int> disabledForNonQuickUi = Utils::transform(
|
|
|
|
|
QmlJS::Check::defaultDisabledMessagesForNonQuickUi(),
|
|
|
|
|
[](QmlJS::StaticAnalysis::Type t){ return int(t); });
|
|
|
|
|
return disabledForNonQuickUi;
|
|
|
|
|
}
|
|
|
|
|
|
2023-06-09 13:57:54 +02:00
|
|
|
static QStringList intListToStringList(const QList<int> &list)
|
|
|
|
|
{
|
|
|
|
|
return Utils::transform(list, [](int v) { return QString::number(v); });
|
|
|
|
|
}
|
|
|
|
|
|
2024-06-20 08:44:26 +02:00
|
|
|
static QList<int> intListFromStringList(const QStringList &list)
|
2023-06-09 13:57:54 +02:00
|
|
|
{
|
|
|
|
|
return Utils::transform<QList<int> >(list, [](const QString &v) { return v.toInt(); });
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static QStringList defaultDisabledMessagesAsString()
|
|
|
|
|
{
|
|
|
|
|
static const QStringList result = intListToStringList(defaultDisabledMessages());
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static QStringList defaultDisabledNonQuickUiAsString()
|
|
|
|
|
{
|
|
|
|
|
static const QStringList result = intListToStringList(defaultDisabledMessagesNonQuickUi());
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
2024-06-20 08:44:26 +02:00
|
|
|
QmlJsEditingSettings::QmlJsEditingSettings()
|
2016-06-18 14:15:02 +02:00
|
|
|
{
|
2024-06-20 08:44:26 +02:00
|
|
|
QtcSettings *settings = Core::ICore::settings();
|
|
|
|
|
|
2019-07-18 14:17:25 +02:00
|
|
|
settings->beginGroup(QmlJSEditor::Constants::SETTINGS_CATEGORY_QML);
|
|
|
|
|
m_enableContextPane = settings->value(QML_CONTEXTPANE_KEY, QVariant(false)).toBool();
|
|
|
|
|
m_pinContextPane = settings->value(QML_CONTEXTPANEPIN_KEY, QVariant(false)).toBool();
|
|
|
|
|
m_autoFormatOnSave = settings->value(AUTO_FORMAT_ON_SAVE, QVariant(false)).toBool();
|
|
|
|
|
m_autoFormatOnlyCurrentProject
|
|
|
|
|
= settings->value(AUTO_FORMAT_ONLY_CURRENT_PROJECT, QVariant(false)).toBool();
|
2020-02-20 15:19:12 +01:00
|
|
|
m_foldAuxData = settings->value(FOLD_AUX_DATA, QVariant(true)).toBool();
|
2022-05-05 18:18:44 +03:00
|
|
|
m_uiQmlOpenMode = settings->value(UIQML_OPEN_MODE, "").toString();
|
2024-06-19 17:55:01 +02:00
|
|
|
m_useQmlls = settings->value(USE_QMLLS, QVariant(true)).toBool();
|
|
|
|
|
m_useLatestQmlls = settings->value(USE_LATEST_QMLLS, QVariant(false)).toBool();
|
2024-06-21 13:54:42 +02:00
|
|
|
m_ignoreMinimumQmllsVersion
|
2024-06-17 14:21:07 +02:00
|
|
|
= settings->value(IGNORE_MINIMUM_QMLLS_VERSION, QVariant(false)).toBool();
|
2024-06-21 13:54:42 +02:00
|
|
|
m_disableBuiltinCodemodel = settings->value(DISABLE_BUILTIN_CODEMODEL, QVariant(false)).toBool();
|
2024-06-19 17:55:01 +02:00
|
|
|
m_generateQmllsIniFiles
|
2024-03-14 16:36:38 +01:00
|
|
|
= settings->value(GENERATE_QMLLS_INI_FILES, QVariant(false)).toBool();
|
2022-11-03 15:20:13 +03:00
|
|
|
m_formatCommand = settings->value(FORMAT_COMMAND, {}).toString();
|
|
|
|
|
m_formatCommandOptions = settings->value(FORMAT_COMMAND_OPTIONS, {}).toString();
|
|
|
|
|
m_useCustomFormatCommand = settings->value(CUSTOM_COMMAND, QVariant(false)).toBool();
|
2023-04-28 14:15:27 +02:00
|
|
|
m_useCustomAnalyzer = settings->value(CUSTOM_ANALYZER, QVariant(false)).toBool();
|
|
|
|
|
|
2023-06-09 13:57:54 +02:00
|
|
|
m_disabledMessages = Utils::toSet(
|
|
|
|
|
intListFromStringList(settings->value(DISABLED_MESSAGES,
|
|
|
|
|
defaultDisabledMessagesAsString()).toStringList()));
|
|
|
|
|
|
|
|
|
|
m_disabledMessagesForNonQuickUi = Utils::toSet(
|
|
|
|
|
intListFromStringList(settings->value(DISABLED_MESSAGES_NONQUICKUI,
|
|
|
|
|
defaultDisabledNonQuickUiAsString()).toStringList()));
|
2023-04-28 14:15:27 +02:00
|
|
|
|
2016-06-18 14:15:02 +02:00
|
|
|
settings->endGroup();
|
|
|
|
|
}
|
|
|
|
|
|
2023-09-22 16:15:27 +02:00
|
|
|
void QmlJsEditingSettings::toSettings(QtcSettings *settings) const
|
2016-06-18 14:15:02 +02:00
|
|
|
{
|
2019-07-18 14:17:25 +02:00
|
|
|
settings->beginGroup(QmlJSEditor::Constants::SETTINGS_CATEGORY_QML);
|
|
|
|
|
settings->setValue(QML_CONTEXTPANE_KEY, m_enableContextPane);
|
|
|
|
|
settings->setValue(QML_CONTEXTPANEPIN_KEY, m_pinContextPane);
|
|
|
|
|
settings->setValue(AUTO_FORMAT_ON_SAVE, m_autoFormatOnSave);
|
|
|
|
|
settings->setValue(AUTO_FORMAT_ONLY_CURRENT_PROJECT, m_autoFormatOnlyCurrentProject);
|
2020-02-20 15:19:12 +01:00
|
|
|
settings->setValue(FOLD_AUX_DATA, m_foldAuxData);
|
2022-05-05 18:18:44 +03:00
|
|
|
settings->setValue(UIQML_OPEN_MODE, m_uiQmlOpenMode);
|
2024-06-19 17:55:01 +02:00
|
|
|
settings->setValue(USE_QMLLS, m_useQmlls);
|
|
|
|
|
settings->setValue(USE_LATEST_QMLLS, m_useLatestQmlls);
|
2024-06-21 13:54:42 +02:00
|
|
|
settings->setValue(IGNORE_MINIMUM_QMLLS_VERSION, m_ignoreMinimumQmllsVersion);
|
2024-06-19 17:55:01 +02:00
|
|
|
settings->setValue(DISABLE_BUILTIN_CODEMODEL, m_disableBuiltinCodemodel);
|
|
|
|
|
settings->setValue(GENERATE_QMLLS_INI_FILES, m_generateQmllsIniFiles);
|
2023-09-27 16:53:35 +02:00
|
|
|
settings->setValueWithDefault(FORMAT_COMMAND, m_formatCommand, {});
|
|
|
|
|
settings->setValueWithDefault(FORMAT_COMMAND_OPTIONS, m_formatCommandOptions, {});
|
|
|
|
|
settings->setValueWithDefault(CUSTOM_COMMAND, m_useCustomFormatCommand, false);
|
|
|
|
|
settings->setValueWithDefault(CUSTOM_ANALYZER, m_useCustomAnalyzer, false);
|
|
|
|
|
settings->setValueWithDefault(DISABLED_MESSAGES,
|
|
|
|
|
intListToStringList(Utils::sorted(Utils::toList(m_disabledMessages))),
|
|
|
|
|
defaultDisabledMessagesAsString());
|
|
|
|
|
settings->setValueWithDefault(DISABLED_MESSAGES_NONQUICKUI,
|
|
|
|
|
intListToStringList(Utils::sorted(Utils::toList(m_disabledMessagesForNonQuickUi))),
|
|
|
|
|
defaultDisabledNonQuickUiAsString());
|
2016-06-18 14:15:02 +02:00
|
|
|
settings->endGroup();
|
2022-09-28 11:16:49 +02:00
|
|
|
QmllsSettingsManager::instance()->checkForChanges();
|
2016-06-18 14:15:02 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool QmlJsEditingSettings::equals(const QmlJsEditingSettings &other) const
|
|
|
|
|
{
|
2022-01-21 20:08:28 +01:00
|
|
|
return m_enableContextPane == other.m_enableContextPane
|
|
|
|
|
&& m_pinContextPane == other.m_pinContextPane
|
|
|
|
|
&& m_autoFormatOnSave == other.m_autoFormatOnSave
|
|
|
|
|
&& m_autoFormatOnlyCurrentProject == other.m_autoFormatOnlyCurrentProject
|
2024-06-19 17:55:01 +02:00
|
|
|
&& m_foldAuxData == other.m_foldAuxData
|
|
|
|
|
&& m_useQmlls == other.m_useQmlls
|
|
|
|
|
&& m_useLatestQmlls == other.m_useLatestQmlls
|
|
|
|
|
&& m_disableBuiltinCodemodel == other.m_disableBuiltinCodemodel
|
|
|
|
|
&& m_generateQmllsIniFiles == other.m_generateQmllsIniFiles
|
|
|
|
|
&& m_uiQmlOpenMode == other.m_uiQmlOpenMode
|
|
|
|
|
&& m_formatCommand == other.m_formatCommand
|
2022-11-03 15:20:13 +03:00
|
|
|
&& m_formatCommandOptions == other.m_formatCommandOptions
|
2023-04-28 14:15:27 +02:00
|
|
|
&& m_useCustomFormatCommand == other.m_useCustomFormatCommand
|
|
|
|
|
&& m_useCustomAnalyzer == other.m_useCustomAnalyzer
|
|
|
|
|
&& m_disabledMessages == other.m_disabledMessages
|
|
|
|
|
&& m_disabledMessagesForNonQuickUi == other.m_disabledMessagesForNonQuickUi;
|
2016-06-18 14:15:02 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool QmlJsEditingSettings::enableContextPane() const
|
|
|
|
|
{
|
|
|
|
|
return m_enableContextPane;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void QmlJsEditingSettings::setEnableContextPane(const bool enableContextPane)
|
|
|
|
|
{
|
|
|
|
|
m_enableContextPane = enableContextPane;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool QmlJsEditingSettings::pinContextPane() const
|
|
|
|
|
{
|
|
|
|
|
return m_pinContextPane;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void QmlJsEditingSettings::setPinContextPane(const bool pinContextPane)
|
|
|
|
|
{
|
|
|
|
|
m_pinContextPane = pinContextPane;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool QmlJsEditingSettings::autoFormatOnSave() const
|
|
|
|
|
{
|
|
|
|
|
return m_autoFormatOnSave;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void QmlJsEditingSettings::setAutoFormatOnSave(const bool autoFormatOnSave)
|
|
|
|
|
{
|
|
|
|
|
m_autoFormatOnSave = autoFormatOnSave;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool QmlJsEditingSettings::autoFormatOnlyCurrentProject() const
|
|
|
|
|
{
|
|
|
|
|
return m_autoFormatOnlyCurrentProject;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void QmlJsEditingSettings::setAutoFormatOnlyCurrentProject(const bool autoFormatOnlyCurrentProject)
|
|
|
|
|
{
|
|
|
|
|
m_autoFormatOnlyCurrentProject = autoFormatOnlyCurrentProject;
|
|
|
|
|
}
|
|
|
|
|
|
2020-02-20 15:19:12 +01:00
|
|
|
bool QmlJsEditingSettings::foldAuxData() const
|
|
|
|
|
{
|
|
|
|
|
return m_foldAuxData;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void QmlJsEditingSettings::setFoldAuxData(const bool foldAuxData)
|
|
|
|
|
{
|
|
|
|
|
m_foldAuxData = foldAuxData;
|
|
|
|
|
}
|
|
|
|
|
|
2022-11-03 15:20:13 +03:00
|
|
|
QString QmlJsEditingSettings::defaultFormatCommand() const
|
|
|
|
|
{
|
|
|
|
|
return DEFAULT_CUSTOM_FORMAT_COMMAND;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QString QmlJsEditingSettings::formatCommand() const
|
|
|
|
|
{
|
|
|
|
|
return m_formatCommand;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void QmlJsEditingSettings::setFormatCommand(const QString &formatCommand)
|
|
|
|
|
{
|
|
|
|
|
m_formatCommand = formatCommand;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QString QmlJsEditingSettings::formatCommandOptions() const
|
|
|
|
|
{
|
|
|
|
|
return m_formatCommandOptions;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void QmlJsEditingSettings::setFormatCommandOptions(const QString &formatCommandOptions)
|
|
|
|
|
{
|
|
|
|
|
m_formatCommandOptions = formatCommandOptions;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool QmlJsEditingSettings::useCustomFormatCommand() const
|
|
|
|
|
{
|
|
|
|
|
return m_useCustomFormatCommand;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void QmlJsEditingSettings::setUseCustomFormatCommand(bool customCommand)
|
|
|
|
|
{
|
|
|
|
|
m_useCustomFormatCommand = customCommand;
|
|
|
|
|
}
|
|
|
|
|
|
2022-05-05 18:18:44 +03:00
|
|
|
const QString QmlJsEditingSettings::uiQmlOpenMode() const
|
2022-01-21 20:08:28 +01:00
|
|
|
{
|
2022-05-05 18:18:44 +03:00
|
|
|
return m_uiQmlOpenMode;
|
2022-01-21 20:08:28 +01:00
|
|
|
}
|
|
|
|
|
|
2022-05-05 18:18:44 +03:00
|
|
|
void QmlJsEditingSettings::setUiQmlOpenMode(const QString &mode)
|
2022-01-21 20:08:28 +01:00
|
|
|
{
|
2022-05-05 18:18:44 +03:00
|
|
|
m_uiQmlOpenMode = mode;
|
2022-01-21 20:08:28 +01:00
|
|
|
}
|
|
|
|
|
|
2023-04-28 14:15:27 +02:00
|
|
|
bool QmlJsEditingSettings::useCustomAnalyzer() const
|
|
|
|
|
{
|
|
|
|
|
return m_useCustomAnalyzer;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void QmlJsEditingSettings::setUseCustomAnalyzer(bool customAnalyzer)
|
|
|
|
|
{
|
|
|
|
|
m_useCustomAnalyzer = customAnalyzer;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QSet<int> QmlJsEditingSettings::disabledMessages() const
|
|
|
|
|
{
|
|
|
|
|
return m_disabledMessages;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void QmlJsEditingSettings::setDisabledMessages(const QSet<int> &disabled)
|
|
|
|
|
{
|
|
|
|
|
m_disabledMessages = disabled;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QSet<int> QmlJsEditingSettings::disabledMessagesForNonQuickUi() const
|
|
|
|
|
{
|
|
|
|
|
return m_disabledMessagesForNonQuickUi;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void QmlJsEditingSettings::setDisabledMessagesForNonQuickUi(const QSet<int> &disabled)
|
|
|
|
|
{
|
|
|
|
|
m_disabledMessagesForNonQuickUi = disabled;
|
|
|
|
|
}
|
|
|
|
|
|
2024-06-19 17:55:01 +02:00
|
|
|
bool QmlJsEditingSettings::generateQmllsIniFiles() const
|
|
|
|
|
{
|
|
|
|
|
return m_generateQmllsIniFiles;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void QmlJsEditingSettings::setGenerateQmllsIniFiles(bool newGenerateQmllsIniFiles)
|
|
|
|
|
{
|
|
|
|
|
m_generateQmllsIniFiles = newGenerateQmllsIniFiles;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool QmlJsEditingSettings::disableBuiltinCodemodel() const
|
|
|
|
|
{
|
|
|
|
|
return m_disableBuiltinCodemodel;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void QmlJsEditingSettings::setDisableBuiltinCodemodel(bool newDisableBuiltinCodemodel)
|
|
|
|
|
{
|
|
|
|
|
m_disableBuiltinCodemodel = newDisableBuiltinCodemodel;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool QmlJsEditingSettings::useLatestQmlls() const
|
|
|
|
|
{
|
|
|
|
|
return m_useLatestQmlls;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void QmlJsEditingSettings::setUseLatestQmlls(bool newUseLatestQmlls)
|
|
|
|
|
{
|
|
|
|
|
m_useLatestQmlls = newUseLatestQmlls;
|
|
|
|
|
}
|
|
|
|
|
|
2024-06-21 13:54:42 +02:00
|
|
|
bool QmlJsEditingSettings::ignoreMinimumQmllsVersion() const
|
|
|
|
|
{
|
|
|
|
|
return m_ignoreMinimumQmllsVersion;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void QmlJsEditingSettings::setIgnoreMinimumQmllsVersion(bool newIgnoreMinimumQmllsVersion)
|
|
|
|
|
{
|
|
|
|
|
m_ignoreMinimumQmllsVersion = newIgnoreMinimumQmllsVersion;
|
|
|
|
|
}
|
|
|
|
|
|
2024-06-19 17:55:01 +02:00
|
|
|
bool QmlJsEditingSettings::useQmlls() const
|
|
|
|
|
{
|
|
|
|
|
return m_useQmlls;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void QmlJsEditingSettings::setUseQmlls(bool newUseQmlls)
|
|
|
|
|
{
|
|
|
|
|
m_useQmlls = newUseQmlls;
|
|
|
|
|
}
|
|
|
|
|
|
2023-04-28 14:15:27 +02:00
|
|
|
class AnalyzerMessageItem final : public Utils::TreeItem
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
AnalyzerMessageItem() = default;
|
|
|
|
|
AnalyzerMessageItem(int number, const QString &message)
|
|
|
|
|
: m_messageNumber(number)
|
|
|
|
|
, m_message(message)
|
|
|
|
|
{}
|
|
|
|
|
|
|
|
|
|
QVariant data(int column, int role) const final
|
|
|
|
|
{
|
|
|
|
|
if (role == Qt::DisplayRole) {
|
|
|
|
|
if (column == 0)
|
|
|
|
|
return QString("M%1").arg(m_messageNumber);
|
|
|
|
|
if (column == 2)
|
|
|
|
|
return m_message.split('\n').first();
|
|
|
|
|
} else if (role == Qt::CheckStateRole) {
|
|
|
|
|
if (column == 0)
|
|
|
|
|
return m_checked ? Qt::Checked : Qt::Unchecked;
|
|
|
|
|
if (column == 1)
|
|
|
|
|
return m_disabledInNonQuickUi ? Qt::Checked : Qt::Unchecked;
|
|
|
|
|
}
|
|
|
|
|
return TreeItem::data(column, role);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool setData(int column, const QVariant &value, int role) final
|
|
|
|
|
{
|
|
|
|
|
if (role == Qt::CheckStateRole) {
|
|
|
|
|
if (column == 0) {
|
|
|
|
|
m_checked = value.toBool();
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
if (column == 1) {
|
|
|
|
|
m_disabledInNonQuickUi = value.toBool();
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Qt::ItemFlags flags(int column) const final
|
|
|
|
|
{
|
|
|
|
|
if (column == 0 || column == 1)
|
|
|
|
|
return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable;
|
|
|
|
|
else
|
|
|
|
|
return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int messageNumber() const { return m_messageNumber; }
|
|
|
|
|
private:
|
|
|
|
|
int m_messageNumber = -1;
|
|
|
|
|
QString m_message;
|
|
|
|
|
bool m_checked = true;
|
|
|
|
|
bool m_disabledInNonQuickUi = false;
|
|
|
|
|
};
|
|
|
|
|
|
2020-01-28 16:11:51 +01:00
|
|
|
class QmlJsEditingSettingsPageWidget final : public Core::IOptionsPageWidget
|
2016-06-18 14:15:02 +02:00
|
|
|
{
|
2020-01-28 16:11:51 +01:00
|
|
|
public:
|
|
|
|
|
QmlJsEditingSettingsPageWidget()
|
|
|
|
|
{
|
2024-06-20 08:44:26 +02:00
|
|
|
const QmlJsEditingSettings &s = settings();
|
2022-08-25 12:46:47 +02:00
|
|
|
autoFormatOnSave = new QCheckBox(Tr::tr("Enable auto format on file save"));
|
2022-08-17 17:13:21 +02:00
|
|
|
autoFormatOnSave->setChecked(s.autoFormatOnSave());
|
|
|
|
|
autoFormatOnlyCurrentProject =
|
2022-08-25 12:46:47 +02:00
|
|
|
new QCheckBox(Tr::tr("Restrict to files contained in the current project"));
|
2022-08-17 17:13:21 +02:00
|
|
|
autoFormatOnlyCurrentProject->setChecked(s.autoFormatOnlyCurrentProject());
|
|
|
|
|
autoFormatOnlyCurrentProject->setEnabled(autoFormatOnSave->isChecked());
|
2022-11-03 15:20:13 +03:00
|
|
|
useCustomFormatCommand = new QCheckBox(
|
|
|
|
|
Tr::tr("Use custom command instead of built-in formatter"));
|
|
|
|
|
useCustomFormatCommand->setChecked(s.useCustomFormatCommand());
|
|
|
|
|
auto formatCommandLabel = new QLabel(Tr::tr("Command:"));
|
|
|
|
|
formatCommand = new QLineEdit();
|
|
|
|
|
formatCommand->setText(s.formatCommand());
|
|
|
|
|
formatCommand->setPlaceholderText(s.defaultFormatCommand());
|
|
|
|
|
auto formatCommandOptionsLabel = new QLabel(Tr::tr("Arguments:"));
|
|
|
|
|
formatCommandOptions = new QLineEdit();
|
|
|
|
|
formatCommandOptions->setText(s.formatCommandOptions());
|
2022-08-25 12:46:47 +02:00
|
|
|
pinContextPane = new QCheckBox(Tr::tr("Pin Qt Quick Toolbar"));
|
2022-08-17 17:13:21 +02:00
|
|
|
pinContextPane->setChecked(s.pinContextPane());
|
2022-08-25 12:46:47 +02:00
|
|
|
enableContextPane = new QCheckBox(Tr::tr("Always show Qt Quick Toolbar"));
|
2022-08-17 17:13:21 +02:00
|
|
|
enableContextPane->setChecked(s.enableContextPane());
|
2022-08-25 12:46:47 +02:00
|
|
|
foldAuxData = new QCheckBox(Tr::tr("Auto-fold auxiliary data"));
|
2022-08-17 17:13:21 +02:00
|
|
|
foldAuxData->setChecked(s.foldAuxData());
|
|
|
|
|
uiQmlOpenComboBox = new QComboBox;
|
2022-08-25 12:46:47 +02:00
|
|
|
uiQmlOpenComboBox->addItem(Tr::tr("Always Ask"), "");
|
|
|
|
|
uiQmlOpenComboBox->addItem(Tr::tr("Qt Design Studio"), Core::Constants::MODE_DESIGN);
|
|
|
|
|
uiQmlOpenComboBox->addItem(Tr::tr("Qt Creator"), Core::Constants::MODE_EDIT);
|
2022-08-17 17:13:21 +02:00
|
|
|
const int comboIndex = qMax(0, uiQmlOpenComboBox->findData(s.uiQmlOpenMode()));
|
|
|
|
|
uiQmlOpenComboBox->setCurrentIndex(comboIndex);
|
|
|
|
|
uiQmlOpenComboBox->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred);
|
|
|
|
|
uiQmlOpenComboBox->setSizeAdjustPolicy(QComboBox::QComboBox::AdjustToContents);
|
|
|
|
|
|
2024-06-25 09:40:42 +02:00
|
|
|
useQmlls = new QCheckBox(Tr::tr("Turn on"));
|
2024-06-19 17:55:01 +02:00
|
|
|
useQmlls->setChecked(s.useQmlls());
|
2024-06-17 14:21:07 +02:00
|
|
|
|
|
|
|
|
ignoreMinimumQmllsVersion = new QCheckBox(
|
|
|
|
|
Tr::tr("Allow versions below Qt %1")
|
2024-06-20 11:32:39 +02:00
|
|
|
.arg(QmlJsEditingSettings::mininumQmllsVersion.toString()));
|
2024-06-21 13:54:42 +02:00
|
|
|
ignoreMinimumQmllsVersion->setChecked(s.ignoreMinimumQmllsVersion());
|
|
|
|
|
ignoreMinimumQmllsVersion->setEnabled(s.useQmlls());
|
2024-06-17 14:21:07 +02:00
|
|
|
|
2023-09-01 11:40:37 +02:00
|
|
|
disableBuiltInCodemodel = new QCheckBox(
|
2024-06-25 09:40:42 +02:00
|
|
|
Tr::tr("Use advanced features (renaming, find usages, and so on) "
|
|
|
|
|
"(experimental)"));
|
2024-06-19 17:55:01 +02:00
|
|
|
disableBuiltInCodemodel->setChecked(s.disableBuiltinCodemodel());
|
|
|
|
|
disableBuiltInCodemodel->setEnabled(s.useQmlls());
|
2024-06-25 09:40:42 +02:00
|
|
|
useLatestQmlls = new QCheckBox(Tr::tr("Use from latest Qt version"));
|
2024-06-19 17:55:01 +02:00
|
|
|
useLatestQmlls->setChecked(s.useLatestQmlls());
|
|
|
|
|
useLatestQmlls->setEnabled(s.useQmlls());
|
2024-06-17 14:21:07 +02:00
|
|
|
|
2024-06-27 11:41:54 +02:00
|
|
|
generateQmllsIniFiles = new QCheckBox(Tr::tr("Create .qmlls.ini files for new projects"));
|
2024-06-19 17:55:01 +02:00
|
|
|
generateQmllsIniFiles->setChecked(s.generateQmllsIniFiles());
|
|
|
|
|
generateQmllsIniFiles->setEnabled(s.useQmlls());
|
2022-09-28 11:16:49 +02:00
|
|
|
QObject::connect(useQmlls, &QCheckBox::stateChanged, this, [this](int checked) {
|
|
|
|
|
useLatestQmlls->setEnabled(checked != Qt::Unchecked);
|
2023-09-01 11:40:37 +02:00
|
|
|
disableBuiltInCodemodel->setEnabled(checked != Qt::Unchecked);
|
2024-03-14 16:36:38 +01:00
|
|
|
generateQmllsIniFiles->setEnabled(checked != Qt::Unchecked);
|
2024-06-17 14:21:07 +02:00
|
|
|
ignoreMinimumQmllsVersion->setEnabled(checked != Qt::Unchecked);
|
2022-09-28 11:16:49 +02:00
|
|
|
});
|
2023-04-27 08:24:43 +02:00
|
|
|
|
2023-04-28 14:15:27 +02:00
|
|
|
useCustomAnalyzer = new QCheckBox(Tr::tr("Use customized static analyzer"));
|
|
|
|
|
useCustomAnalyzer->setChecked(s.useCustomAnalyzer());
|
|
|
|
|
analyzerMessageModel = new Utils::TreeModel<AnalyzerMessageItem>(this);
|
|
|
|
|
analyzerMessageModel->setHeader({Tr::tr("Enabled"),
|
|
|
|
|
Tr::tr("Disabled for non Qt Quick UI"),
|
|
|
|
|
Tr::tr("Message")});
|
|
|
|
|
analyzerMessagesView = new QTreeView;
|
|
|
|
|
analyzerMessagesView->setModel(analyzerMessageModel);
|
|
|
|
|
analyzerMessagesView->setEnabled(s.useCustomAnalyzer());
|
|
|
|
|
QObject::connect(useCustomAnalyzer, &QCheckBox::stateChanged, this, [this](int checked){
|
|
|
|
|
analyzerMessagesView->setEnabled(checked != Qt::Unchecked);
|
|
|
|
|
});
|
2023-06-13 15:39:19 +02:00
|
|
|
analyzerMessagesView->setToolTip(
|
|
|
|
|
"<html>"
|
|
|
|
|
+ Tr::tr("Enabled checks can be disabled for non Qt Quick UI"
|
|
|
|
|
" files, but disabled checks cannot get explicitly"
|
|
|
|
|
" enabled for non Qt Quick UI files."));
|
2023-05-04 09:05:27 +02:00
|
|
|
analyzerMessagesView->setContextMenuPolicy(Qt::CustomContextMenu);
|
|
|
|
|
connect(analyzerMessagesView, &QTreeView::customContextMenuRequested,
|
|
|
|
|
this, &QmlJsEditingSettingsPageWidget::showContextMenu);
|
2023-04-25 10:15:07 +02:00
|
|
|
using namespace Layouting;
|
2022-11-03 15:20:13 +03:00
|
|
|
// clang-format off
|
2023-04-27 08:24:43 +02:00
|
|
|
QWidget *formattingGroup = nullptr;
|
|
|
|
|
Column {
|
2022-08-17 17:13:21 +02:00
|
|
|
Group {
|
2023-04-27 08:24:43 +02:00
|
|
|
bindTo(&formattingGroup),
|
2022-08-25 12:46:47 +02:00
|
|
|
title(Tr::tr("Automatic Formatting on File Save")),
|
2022-11-03 15:20:13 +03:00
|
|
|
Column {
|
|
|
|
|
autoFormatOnSave,
|
|
|
|
|
autoFormatOnlyCurrentProject,
|
|
|
|
|
useCustomFormatCommand,
|
|
|
|
|
Form {
|
|
|
|
|
formatCommandLabel, formatCommand, br,
|
|
|
|
|
formatCommandOptionsLabel, formatCommandOptions
|
|
|
|
|
}
|
|
|
|
|
},
|
2023-04-27 08:24:43 +02:00
|
|
|
},
|
2022-08-17 17:13:21 +02:00
|
|
|
Group {
|
2022-08-25 12:46:47 +02:00
|
|
|
title(Tr::tr("Qt Quick Toolbars")),
|
2022-08-17 17:13:21 +02:00
|
|
|
Column { pinContextPane, enableContextPane },
|
|
|
|
|
},
|
|
|
|
|
Group {
|
2022-08-25 12:46:47 +02:00
|
|
|
title(Tr::tr("Features")),
|
2022-08-17 17:13:21 +02:00
|
|
|
Column {
|
|
|
|
|
foldAuxData,
|
2022-08-25 12:46:47 +02:00
|
|
|
Form { Tr::tr("Open .ui.qml files with:"), uiQmlOpenComboBox },
|
2022-08-17 17:13:21 +02:00
|
|
|
},
|
|
|
|
|
},
|
2022-09-28 11:16:49 +02:00
|
|
|
Group{
|
2023-09-01 11:40:37 +02:00
|
|
|
title(Tr::tr("QML Language Server")),
|
2024-06-17 14:21:07 +02:00
|
|
|
Column{useQmlls, ignoreMinimumQmllsVersion, disableBuiltInCodemodel, useLatestQmlls, generateQmllsIniFiles},
|
2022-09-28 11:16:49 +02:00
|
|
|
},
|
2023-04-28 14:15:27 +02:00
|
|
|
Group {
|
|
|
|
|
title(Tr::tr("Static Analyzer")),
|
|
|
|
|
Column{ useCustomAnalyzer, analyzerMessagesView },
|
|
|
|
|
},
|
2022-08-17 17:13:21 +02:00
|
|
|
st,
|
2022-11-03 15:20:13 +03:00
|
|
|
}.attachTo(this);
|
|
|
|
|
// clang-format on
|
|
|
|
|
|
2023-04-27 08:24:43 +02:00
|
|
|
Utils::VariableChooser::addSupportForChildWidgets(formattingGroup,
|
2022-11-03 15:20:13 +03:00
|
|
|
Utils::globalMacroExpander());
|
2022-08-17 17:13:21 +02:00
|
|
|
|
2022-11-03 15:20:13 +03:00
|
|
|
const auto updateFormatCommandState = [&, formatCommandLabel, formatCommandOptionsLabel] {
|
2023-03-19 21:48:27 +01:00
|
|
|
const bool enabled = useCustomFormatCommand->isChecked();
|
2022-11-03 15:20:13 +03:00
|
|
|
formatCommandLabel->setEnabled(enabled);
|
|
|
|
|
formatCommand->setEnabled(enabled);
|
|
|
|
|
formatCommandOptionsLabel->setEnabled(enabled);
|
|
|
|
|
formatCommandOptions->setEnabled(enabled);
|
|
|
|
|
};
|
|
|
|
|
updateFormatCommandState();
|
|
|
|
|
|
|
|
|
|
connect(autoFormatOnSave, &QCheckBox::toggled, this, [&, updateFormatCommandState]() {
|
|
|
|
|
autoFormatOnlyCurrentProject->setEnabled(autoFormatOnSave->isChecked());
|
|
|
|
|
updateFormatCommandState();
|
|
|
|
|
});
|
|
|
|
|
connect(useCustomFormatCommand, &QCheckBox::toggled, this, updateFormatCommandState);
|
2023-04-28 14:15:27 +02:00
|
|
|
|
|
|
|
|
populateAnalyzerMessages(s.disabledMessages(), s.disabledMessagesForNonQuickUi());
|
2020-01-28 16:11:51 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void apply() final
|
|
|
|
|
{
|
2024-06-20 08:44:26 +02:00
|
|
|
QmlJsEditingSettings &s = settings();
|
2022-08-17 17:13:21 +02:00
|
|
|
s.setEnableContextPane(enableContextPane->isChecked());
|
|
|
|
|
s.setPinContextPane(pinContextPane->isChecked());
|
|
|
|
|
s.setAutoFormatOnSave(autoFormatOnSave->isChecked());
|
|
|
|
|
s.setAutoFormatOnlyCurrentProject(autoFormatOnlyCurrentProject->isChecked());
|
2022-11-03 15:20:13 +03:00
|
|
|
s.setUseCustomFormatCommand(useCustomFormatCommand->isChecked());
|
|
|
|
|
s.setFormatCommand(formatCommand->text());
|
|
|
|
|
s.setFormatCommandOptions(formatCommandOptions->text());
|
2022-08-17 17:13:21 +02:00
|
|
|
s.setFoldAuxData(foldAuxData->isChecked());
|
|
|
|
|
s.setUiQmlOpenMode(uiQmlOpenComboBox->currentData().toString());
|
2024-06-19 17:55:01 +02:00
|
|
|
s.setUseQmlls(useQmlls->isChecked());
|
|
|
|
|
s.setDisableBuiltinCodemodel(disableBuiltInCodemodel->isChecked());
|
|
|
|
|
s.setUseLatestQmlls(useLatestQmlls->isChecked());
|
2024-06-21 13:54:42 +02:00
|
|
|
s.setIgnoreMinimumQmllsVersion(ignoreMinimumQmllsVersion->isChecked());
|
2024-06-19 17:55:01 +02:00
|
|
|
s.setGenerateQmllsIniFiles(generateQmllsIniFiles->isChecked());
|
2023-04-28 14:15:27 +02:00
|
|
|
s.setUseCustomAnalyzer(useCustomAnalyzer->isChecked());
|
|
|
|
|
QSet<int> disabled;
|
|
|
|
|
QSet<int> disabledForNonQuickUi;
|
|
|
|
|
analyzerMessageModel->forAllItems(
|
|
|
|
|
[&disabled, &disabledForNonQuickUi](AnalyzerMessageItem *item){
|
|
|
|
|
if (item->data(0, Qt::CheckStateRole) == Qt::Unchecked)
|
|
|
|
|
disabled.insert(item->messageNumber());
|
|
|
|
|
if (item->data(1, Qt::CheckStateRole) == Qt::Checked)
|
|
|
|
|
disabledForNonQuickUi.insert(item->messageNumber());
|
|
|
|
|
});
|
|
|
|
|
s.setDisabledMessages(disabled);
|
|
|
|
|
s.setDisabledMessagesForNonQuickUi(disabledForNonQuickUi);
|
2024-06-20 08:44:26 +02:00
|
|
|
s.toSettings(Core::ICore::settings());
|
2020-01-28 16:11:51 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private:
|
2023-04-28 14:15:27 +02:00
|
|
|
void populateAnalyzerMessages(const QSet<int> &disabled, const QSet<int> &disabledForNonQuickUi)
|
|
|
|
|
{
|
|
|
|
|
using namespace QmlJS::StaticAnalysis;
|
|
|
|
|
auto knownMessages = Utils::sorted(Message::allMessageTypes());
|
|
|
|
|
auto root = analyzerMessageModel->rootItem();
|
|
|
|
|
for (auto msgType : knownMessages) {
|
|
|
|
|
const QString msg = Message::prototypeForMessageType(msgType).message;
|
|
|
|
|
auto item = new AnalyzerMessageItem(msgType, msg);
|
|
|
|
|
item->setData(0, !disabled.contains(msgType), Qt::CheckStateRole);
|
|
|
|
|
item->setData(1, disabledForNonQuickUi.contains(msgType), Qt::CheckStateRole);
|
|
|
|
|
root->appendChild(item);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (int column = 0; column < 3; ++column)
|
|
|
|
|
analyzerMessagesView->resizeColumnToContents(column);
|
|
|
|
|
}
|
|
|
|
|
|
2023-05-04 09:05:27 +02:00
|
|
|
void showContextMenu(const QPoint &position)
|
|
|
|
|
{
|
|
|
|
|
QMenu menu;
|
|
|
|
|
QAction *reset = new QAction(Tr::tr("Reset to Default"), &menu);
|
|
|
|
|
menu.addAction(reset);
|
|
|
|
|
connect(reset, &QAction::triggered, this, [this](){
|
|
|
|
|
analyzerMessageModel->clear();
|
|
|
|
|
populateAnalyzerMessages(Utils::toSet(defaultDisabledMessages()),
|
|
|
|
|
Utils::toSet(defaultDisabledMessagesNonQuickUi()));
|
|
|
|
|
|
|
|
|
|
});
|
|
|
|
|
menu.exec(analyzerMessagesView->mapToGlobal(position));
|
|
|
|
|
}
|
|
|
|
|
|
2022-08-17 17:13:21 +02:00
|
|
|
QCheckBox *autoFormatOnSave;
|
|
|
|
|
QCheckBox *autoFormatOnlyCurrentProject;
|
2022-11-03 15:20:13 +03:00
|
|
|
QCheckBox *useCustomFormatCommand;
|
|
|
|
|
QLineEdit *formatCommand;
|
|
|
|
|
QLineEdit *formatCommandOptions;
|
2022-08-17 17:13:21 +02:00
|
|
|
QCheckBox *pinContextPane;
|
|
|
|
|
QCheckBox *enableContextPane;
|
|
|
|
|
QCheckBox *foldAuxData;
|
2022-09-28 11:16:49 +02:00
|
|
|
QCheckBox *useQmlls;
|
|
|
|
|
QCheckBox *useLatestQmlls;
|
2024-06-17 14:21:07 +02:00
|
|
|
QCheckBox *ignoreMinimumQmllsVersion;
|
2023-09-01 11:40:37 +02:00
|
|
|
QCheckBox *disableBuiltInCodemodel;
|
2024-03-14 16:36:38 +01:00
|
|
|
QCheckBox *generateQmllsIniFiles;
|
2022-08-17 17:13:21 +02:00
|
|
|
QComboBox *uiQmlOpenComboBox;
|
2023-04-28 14:15:27 +02:00
|
|
|
QCheckBox *useCustomAnalyzer;
|
|
|
|
|
QTreeView *analyzerMessagesView;
|
|
|
|
|
Utils::TreeModel<AnalyzerMessageItem> *analyzerMessageModel;
|
2020-01-28 16:11:51 +01:00
|
|
|
};
|
2016-06-18 14:15:02 +02:00
|
|
|
|
2018-11-24 02:45:30 +01:00
|
|
|
QmlJsEditingSettingsPage::QmlJsEditingSettingsPage()
|
2016-06-18 14:15:02 +02:00
|
|
|
{
|
|
|
|
|
setId("C.QmlJsEditing");
|
2023-10-16 15:14:01 +02:00
|
|
|
setDisplayName(::QmlJSEditor::Tr::tr("QML/JS Editing"));
|
2016-06-18 14:15:02 +02:00
|
|
|
setCategory(Constants::SETTINGS_CATEGORY_QML);
|
2020-01-28 16:11:51 +01:00
|
|
|
setWidgetCreator([] { return new QmlJsEditingSettingsPageWidget; });
|
2016-06-18 14:15:02 +02:00
|
|
|
}
|
2023-09-22 16:15:27 +02:00
|
|
|
|
2024-06-20 08:44:26 +02:00
|
|
|
} // QmlJsEditor::Internal
|