LanguageClient: Add option to hide settings

Change-Id: Iefc9398bdc4ffcf498eb66a702994e9e143beb74
Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
Marcus Tillmanns
2024-08-15 09:03:22 +02:00
parent 1547396848
commit 4ec324af0b
5 changed files with 62 additions and 8 deletions

View File

@@ -160,6 +160,7 @@ local function setupClient()
}, },
settings = Settings, settings = Settings,
startBehavior = "AlwaysOn", startBehavior = "AlwaysOn",
showInSettings = false,
onStartFailed = function() onStartFailed = function()
a.sync(function() a.sync(function()
if IsTryingToInstall == true then if IsTryingToInstall == true then

View File

@@ -100,7 +100,7 @@ public:
void reset(const QList<BaseSettings *> &settings); void reset(const QList<BaseSettings *> &settings);
QList<BaseSettings *> settings() const { return m_settings; } QList<BaseSettings *> settings() const { return m_settings; }
int insertSettings(BaseSettings *settings); QModelIndex insertSettings(BaseSettings *settings);
void enableSetting(const QString &id, bool enable = true); void enableSetting(const QString &id, bool enable = true);
QList<BaseSettings *> removed() const { return m_removed; } QList<BaseSettings *> removed() const { return m_removed; }
BaseSettings *settingForIndex(const QModelIndex &index) const; BaseSettings *settingForIndex(const QModelIndex &index) const;
@@ -112,6 +112,52 @@ private:
QList<BaseSettings *> m_removed; QList<BaseSettings *> 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<LanguageClientSettingsModel *>(sourceModel())->settingForIndex(index);
return setting && setting->m_showInSettings;
}
void reset(QList<BaseSettings *> 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<BaseSettings *> removed() const { return m_settings.removed(); }
private:
LanguageClientSettingsModel &m_settings;
};
class LanguageClientSettingsPageWidget : public Core::IOptionsPageWidget class LanguageClientSettingsPageWidget : public Core::IOptionsPageWidget
{ {
public: public:
@@ -153,7 +199,7 @@ private:
void addItem(const Utils::Id &clientTypeId); void addItem(const Utils::Id &clientTypeId);
void deleteItem(); void deleteItem();
LanguageClientSettingsModel &m_settings; FilterProxy m_settings;
QSet<QString> &m_changedSettings; QSet<QString> &m_changedSettings;
}; };
@@ -171,6 +217,7 @@ LanguageClientSettingsPageWidget::LanguageClientSettingsPageWidget(LanguageClien
{ {
auto mainLayout = new QVBoxLayout(); auto mainLayout = new QVBoxLayout();
auto layout = new QHBoxLayout(); auto layout = new QHBoxLayout();
m_view->setModel(&m_settings); m_view->setModel(&m_settings);
m_view->setHeaderHidden(true); m_view->setHeaderHidden(true);
m_view->setSelectionMode(QAbstractItemView::SingleSelection); m_view->setSelectionMode(QAbstractItemView::SingleSelection);
@@ -236,7 +283,7 @@ void LanguageClientSettingsPageWidget::resetCurrentSettings(int row)
m_currentSettings.setting = nullptr; m_currentSettings.setting = nullptr;
m_currentSettings.widget = nullptr; m_currentSettings.widget = nullptr;
m_view->setCurrentIndex(m_settings.index(row)); m_view->setCurrentIndex(m_settings.index(row, 0));
} }
void LanguageClientSettingsPageWidget::applyCurrentSettings() void LanguageClientSettingsPageWidget::applyCurrentSettings()
@@ -264,7 +311,7 @@ void LanguageClientSettingsPageWidget::addItem(const Utils::Id &clientTypeId)
{ {
auto newSettings = generateSettings(clientTypeId); auto newSettings = generateSettings(clientTypeId);
QTC_ASSERT(newSettings, return); QTC_ASSERT(newSettings, return);
m_view->setCurrentIndex(m_settings.index(m_settings.insertSettings(newSettings))); m_view->setCurrentIndex(m_settings.insertSettings(newSettings));
} }
void LanguageClientSettingsPageWidget::deleteItem() void LanguageClientSettingsPageWidget::deleteItem()
@@ -273,7 +320,7 @@ void LanguageClientSettingsPageWidget::deleteItem()
if (!index.isValid()) if (!index.isValid())
return; return;
m_settings.removeRows(index.row()); m_settings.removeRow(index.row());
} }
class LanguageClientSettingsPage : public Core::IOptionsPage class LanguageClientSettingsPage : public Core::IOptionsPage
@@ -455,13 +502,13 @@ void LanguageClientSettingsModel::reset(const QList<BaseSettings *> &settings)
endResetModel(); endResetModel();
} }
int LanguageClientSettingsModel::insertSettings(BaseSettings *settings) QModelIndex LanguageClientSettingsModel::insertSettings(BaseSettings *settings)
{ {
int row = rowCount(); int row = rowCount();
beginInsertRows(QModelIndex(), row, row); beginInsertRows(QModelIndex(), row, row);
m_settings.insert(row, settings); m_settings.insert(row, settings);
endInsertRows(); endInsertRows();
return row; return createIndex(row, 0, settings);
} }
void LanguageClientSettingsModel::enableSetting(const QString &id, bool enable) void LanguageClientSettingsModel::enableSetting(const QString &id, bool enable)

View File

@@ -71,6 +71,7 @@ public:
LanguageFilter m_languageFilter; LanguageFilter m_languageFilter;
QString m_initializationOptions; QString m_initializationOptions;
QString m_configuration; QString m_configuration;
bool m_showInSettings = true;
QJsonObject initializationOptions() const; QJsonObject initializationOptions() const;
QJsonValue configuration() const; QJsonValue configuration() const;

View File

@@ -215,6 +215,7 @@ public:
CommandLine m_cmdLine; CommandLine m_cmdLine;
QString m_serverName; QString m_serverName;
LanguageFilter m_languageFilter; LanguageFilter m_languageFilter;
bool m_showInSettings;
BaseSettings::StartBehavior m_startBehavior = BaseSettings::RequiresFile; BaseSettings::StartBehavior m_startBehavior = BaseSettings::RequiresFile;
std::optional<sol::protected_function> m_onInstanceStart; std::optional<sol::protected_function> m_onInstanceStart;
@@ -294,6 +295,8 @@ public:
m_languageFilter.mimeTypes.push_back(v.as<QString>()); m_languageFilter.mimeTypes.push_back(v.as<QString>());
} }
m_showInSettings = options.get<std::optional<bool>>("showInSettings").value_or(true);
// get<sol::optional<>> because on MSVC, get_or(..., nullptr) fails to compile // get<sol::optional<>> because on MSVC, get_or(..., nullptr) fails to compile
m_aspects = options.get<sol::optional<AspectContainer *>>("settings").value_or(nullptr); m_aspects = options.get<sol::optional<AspectContainer *>>("settings").value_or(nullptr);
@@ -569,6 +572,7 @@ LuaClientSettings::LuaClientSettings(const std::weak_ptr<LuaClientWrapper> &wrap
m_languageFilter = w->m_languageFilter; m_languageFilter = w->m_languageFilter;
m_initializationOptions = w->m_initializationOptions; m_initializationOptions = w->m_initializationOptions;
m_startBehavior = w->m_startBehavior; m_startBehavior = w->m_startBehavior;
m_showInSettings = w->m_showInSettings;
QObject::connect(w.get(), &LuaClientWrapper::optionsChanged, &guard, [this] { QObject::connect(w.get(), &LuaClientWrapper::optionsChanged, &guard, [this] {
if (auto w = m_wrapper.lock()) if (auto w = m_wrapper.lock())
m_initializationOptions = w->m_initializationOptions; m_initializationOptions = w->m_initializationOptions;

View File

@@ -11,8 +11,9 @@ local lsp = {}
---@field languageFilter LanguageFilter The language filter deciding which files to open with the language server. ---@field languageFilter LanguageFilter The language filter deciding which files to open with the language server.
---@field startBehavior? "AlwaysOn"|"RequiresFile"|"RequiresProject" ---@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 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 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 = {} local ClientOptions = {}
---@class LanguageFilter ---@class LanguageFilter