diff --git a/share/qtcreator/lua-plugins/ai_asistant/init.lua b/share/qtcreator/lua-plugins/ai_asistant/init.lua index eefe935dc4c..e6ab2f4a611 100644 --- a/share/qtcreator/lua-plugins/ai_asistant/init.lua +++ b/share/qtcreator/lua-plugins/ai_asistant/init.lua @@ -160,6 +160,7 @@ local function setupClient() }, settings = Settings, startBehavior = "AlwaysOn", + showInSettings = false, onStartFailed = function() a.sync(function() if IsTryingToInstall == true then diff --git a/src/plugins/languageclient/languageclientsettings.cpp b/src/plugins/languageclient/languageclientsettings.cpp index 58b36f40ad8..1f8d1b835c1 100644 --- a/src/plugins/languageclient/languageclientsettings.cpp +++ b/src/plugins/languageclient/languageclientsettings.cpp @@ -100,7 +100,7 @@ public: void reset(const QList &settings); QList settings() const { return m_settings; } - int insertSettings(BaseSettings *settings); + QModelIndex insertSettings(BaseSettings *settings); void enableSetting(const QString &id, bool enable = true); QList removed() const { return m_removed; } BaseSettings *settingForIndex(const QModelIndex &index) const; @@ -112,6 +112,52 @@ private: QList m_removed; }; +class FilterProxy final : public QSortFilterProxyModel +{ +public: + FilterProxy(LanguageClientSettingsModel &sourceModel) + : m_settings(sourceModel) + { + setSourceModel(&sourceModel); + } + + bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const final + { + const QModelIndex index = sourceModel()->index(sourceRow, 0, sourceParent); + const BaseSettings *setting + = static_cast(sourceModel())->settingForIndex(index); + return setting && setting->m_showInSettings; + } + + void reset(QList settings) + { + m_settings.reset(settings); + invalidateFilter(); + } + + QModelIndex insertSettings(BaseSettings *settings) + { + const auto idx = m_settings.insertSettings(settings); + invalidateFilter(); + return mapFromSource(idx); + } + + BaseSettings *settingForIndex(const QModelIndex &index) const + { + return m_settings.settingForIndex(mapToSource(index)); + } + + QModelIndex indexForSetting(BaseSettings *setting) const + { + return mapFromSource(m_settings.indexForSetting(setting)); + } + + QList removed() const { return m_settings.removed(); } + +private: + LanguageClientSettingsModel &m_settings; +}; + class LanguageClientSettingsPageWidget : public Core::IOptionsPageWidget { public: @@ -153,7 +199,7 @@ private: void addItem(const Utils::Id &clientTypeId); void deleteItem(); - LanguageClientSettingsModel &m_settings; + FilterProxy m_settings; QSet &m_changedSettings; }; @@ -171,6 +217,7 @@ LanguageClientSettingsPageWidget::LanguageClientSettingsPageWidget(LanguageClien { auto mainLayout = new QVBoxLayout(); auto layout = new QHBoxLayout(); + m_view->setModel(&m_settings); m_view->setHeaderHidden(true); m_view->setSelectionMode(QAbstractItemView::SingleSelection); @@ -236,7 +283,7 @@ void LanguageClientSettingsPageWidget::resetCurrentSettings(int row) m_currentSettings.setting = nullptr; m_currentSettings.widget = nullptr; - m_view->setCurrentIndex(m_settings.index(row)); + m_view->setCurrentIndex(m_settings.index(row, 0)); } void LanguageClientSettingsPageWidget::applyCurrentSettings() @@ -264,7 +311,7 @@ void LanguageClientSettingsPageWidget::addItem(const Utils::Id &clientTypeId) { auto newSettings = generateSettings(clientTypeId); QTC_ASSERT(newSettings, return); - m_view->setCurrentIndex(m_settings.index(m_settings.insertSettings(newSettings))); + m_view->setCurrentIndex(m_settings.insertSettings(newSettings)); } void LanguageClientSettingsPageWidget::deleteItem() @@ -273,7 +320,7 @@ void LanguageClientSettingsPageWidget::deleteItem() if (!index.isValid()) return; - m_settings.removeRows(index.row()); + m_settings.removeRow(index.row()); } class LanguageClientSettingsPage : public Core::IOptionsPage @@ -455,13 +502,13 @@ void LanguageClientSettingsModel::reset(const QList &settings) endResetModel(); } -int LanguageClientSettingsModel::insertSettings(BaseSettings *settings) +QModelIndex LanguageClientSettingsModel::insertSettings(BaseSettings *settings) { int row = rowCount(); beginInsertRows(QModelIndex(), row, row); m_settings.insert(row, settings); endInsertRows(); - return row; + return createIndex(row, 0, settings); } void LanguageClientSettingsModel::enableSetting(const QString &id, bool enable) diff --git a/src/plugins/languageclient/languageclientsettings.h b/src/plugins/languageclient/languageclientsettings.h index 48e26cc2bab..f1d14b4bcd8 100644 --- a/src/plugins/languageclient/languageclientsettings.h +++ b/src/plugins/languageclient/languageclientsettings.h @@ -71,6 +71,7 @@ public: LanguageFilter m_languageFilter; QString m_initializationOptions; QString m_configuration; + bool m_showInSettings = true; QJsonObject initializationOptions() const; QJsonValue configuration() const; diff --git a/src/plugins/languageclient/lualanguageclient/lualanguageclient.cpp b/src/plugins/languageclient/lualanguageclient/lualanguageclient.cpp index 2e9b31693f7..c78be12ac4b 100644 --- a/src/plugins/languageclient/lualanguageclient/lualanguageclient.cpp +++ b/src/plugins/languageclient/lualanguageclient/lualanguageclient.cpp @@ -215,6 +215,7 @@ public: CommandLine m_cmdLine; QString m_serverName; LanguageFilter m_languageFilter; + bool m_showInSettings; BaseSettings::StartBehavior m_startBehavior = BaseSettings::RequiresFile; std::optional m_onInstanceStart; @@ -294,6 +295,8 @@ public: m_languageFilter.mimeTypes.push_back(v.as()); } + m_showInSettings = options.get>("showInSettings").value_or(true); + // get> because on MSVC, get_or(..., nullptr) fails to compile m_aspects = options.get>("settings").value_or(nullptr); @@ -569,6 +572,7 @@ LuaClientSettings::LuaClientSettings(const std::weak_ptr &wrap m_languageFilter = w->m_languageFilter; m_initializationOptions = w->m_initializationOptions; m_startBehavior = w->m_startBehavior; + m_showInSettings = w->m_showInSettings; QObject::connect(w.get(), &LuaClientWrapper::optionsChanged, &guard, [this] { if (auto w = m_wrapper.lock()) m_initializationOptions = w->m_initializationOptions; diff --git a/src/plugins/lua/meta/lsp.lua b/src/plugins/lua/meta/lsp.lua index 73b664cf761..5186afe2349 100644 --- a/src/plugins/lua/meta/lsp.lua +++ b/src/plugins/lua/meta/lsp.lua @@ -11,8 +11,9 @@ local lsp = {} ---@field languageFilter LanguageFilter The language filter deciding which files to open with the language server. ---@field startBehavior? "AlwaysOn"|"RequiresFile"|"RequiresProject" ---@field initializationOptions? function|table|string The initialization options to pass to the language server, either a JSON string, a table, or a function that returns either. ----@field settings? AspectContainer +---@field settings? AspectContainer The settings object to associate with the language server. ---@field onStartFailed? function This callback is called when client failed to start. +---@field showInSettings? boolean Whether the client should show up in the general Language Server list. local ClientOptions = {} ---@class LanguageFilter