diff options
author | David Schulz <david.schulz@qt.io> | 2022-02-04 12:05:31 +0100 |
---|---|---|
committer | David Schulz <david.schulz@qt.io> | 2022-05-02 04:44:35 +0000 |
commit | 176dbff127ac27f4b742bff6a37f218334f60f7f (patch) | |
tree | 1410ece8139803127b15be526b36870be370794a | |
parent | 8245ed30ae43ed6faf3d157d704ee03667b3ecb0 (diff) |
LanguageClient: support sorting outline combo box items
(cherry picked from commit 505358cb8285ccd1a2e0c634060832c0766f939c)
Change-Id: I793700e770c830b729d0e8780fc4cbac79c01c0f
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
-rw-r--r-- | src/plugins/languageclient/languageclientoutline.cpp | 29 | ||||
-rw-r--r-- | src/plugins/languageclient/languageclientsettings.cpp | 18 | ||||
-rw-r--r-- | src/plugins/languageclient/languageclientsettings.h | 3 |
3 files changed, 47 insertions, 3 deletions
diff --git a/src/plugins/languageclient/languageclientoutline.cpp b/src/plugins/languageclient/languageclientoutline.cpp index 57f4d7256e..56905738e2 100644 --- a/src/plugins/languageclient/languageclientoutline.cpp +++ b/src/plugins/languageclient/languageclientoutline.cpp @@ -31,6 +31,7 @@ #include <coreplugin/find/itemviewfind.h> #include <coreplugin/editormanager/ieditor.h> #include <languageserverprotocol/languagefeatures.h> +#include <texteditor/outlinefactory.h>> #include <texteditor/textdocument.h> #include <texteditor/texteditor.h> #include <utils/itemviews.h> @@ -39,6 +40,7 @@ #include <utils/treeviewcombobox.h> #include <utils/utilsicons.h> +#include <QAction> #include <QBoxLayout> #include <QSortFilterProxyModel> @@ -328,8 +330,10 @@ private: void updateEntry(); void activateEntry(); void documentUpdated(TextEditor::TextDocument *document); + void setSorted(bool sorted); LanguageClientOutlineModel m_model; + QSortFilterProxyModel m_proxyModel; QPointer<Client> m_client; TextEditor::TextEditorWidget *m_editorWidget; const DocumentUri m_uri; @@ -353,19 +357,32 @@ OutlineComboBox::OutlineComboBox(Client *client, TextEditor::BaseTextEditor *edi , m_uri(DocumentUri::fromFilePath(editor->document()->filePath())) { m_model.setSymbolStringifier(client->symbolStringifier()); - setModel(&m_model); + m_proxyModel.setSourceModel(&m_model); + const bool sorted = LanguageClientSettings::outlineComboBoxIsSorted(); + m_proxyModel.sort(sorted ? 0 : -1); + setModel(&m_proxyModel); setMinimumContentsLength(13); QSizePolicy policy = sizePolicy(); policy.setHorizontalPolicy(QSizePolicy::Expanding); setSizePolicy(policy); setMaxVisibleItems(40); + setContextMenuPolicy(Qt::ActionsContextMenu); + const QString sortActionText + = QCoreApplication::translate("TextEditor::Internal::OutlineWidgetStack", + "Sort Alphabetically"); + auto sortAction = new QAction(sortActionText, this); + sortAction->setCheckable(true); + sortAction->setChecked(sorted); + addAction(sortAction); + connect(client->documentSymbolCache(), &DocumentSymbolCache::gotSymbols, this, &OutlineComboBox::updateModel); connect(client, &Client::documentUpdated, this, &OutlineComboBox::documentUpdated); connect(m_editorWidget, &TextEditor::TextEditorWidget::cursorPositionChanged, this, &OutlineComboBox::updateEntry); connect(this, QOverload<int>::of(&QComboBox::activated), this, &OutlineComboBox::activateEntry); + connect(sortAction, &QAction::toggled, this, &OutlineComboBox::setSorted); documentUpdated(editor->textDocument()); } @@ -389,12 +406,12 @@ void OutlineComboBox::updateModel(const DocumentUri &resultUri, const DocumentSy void OutlineComboBox::updateEntry() { if (LanguageClientOutlineItem *item = itemForCursor(m_model, m_editorWidget->textCursor())) - setCurrentIndex(m_model.indexForItem(item)); + setCurrentIndex(m_proxyModel.mapFromSource(m_model.indexForItem(item))); } void OutlineComboBox::activateEntry() { - const QModelIndex modelIndex = view()->currentIndex(); + const QModelIndex modelIndex = m_proxyModel.mapToSource(view()->currentIndex()); if (modelIndex.isValid()) { const Position &pos = m_model.itemForIndex(modelIndex)->pos(); Core::EditorManager::cutForwardNavigationHistory(); @@ -411,4 +428,10 @@ void OutlineComboBox::documentUpdated(TextEditor::TextDocument *document) m_client->documentSymbolCache()->requestSymbols(m_uri, Schedule::Delayed); } +void OutlineComboBox::setSorted(bool sorted) +{ + LanguageClientSettings::setOutlineComboBoxSorted(sorted); + m_proxyModel.sort(sorted ? 0 : -1); +} + } // namespace LanguageClient diff --git a/src/plugins/languageclient/languageclientsettings.cpp b/src/plugins/languageclient/languageclientsettings.cpp index e994fefb49..d389f42fef 100644 --- a/src/plugins/languageclient/languageclientsettings.cpp +++ b/src/plugins/languageclient/languageclientsettings.cpp @@ -80,6 +80,7 @@ constexpr char argumentsKey[] = "arguments"; constexpr char settingsGroupKey[] = "LanguageClient"; constexpr char clientsKey[] = "clients"; constexpr char typedClientsKey[] = "typedClients"; +constexpr char outlineSortedKey[] = "outlineSorted"; constexpr char mimeType[] = "application/language.client.setting"; namespace LanguageClient { @@ -686,6 +687,23 @@ void LanguageClientSettings::toSettings(QSettings *settings, settings->endGroup(); } +bool LanguageClientSettings::outlineComboBoxIsSorted() +{ + auto settings = Core::ICore::settings(); + settings->beginGroup(settingsGroupKey); + bool sorted = settings->value(outlineSortedKey).toBool(); + settings->endGroup(); + return sorted; +} + +void LanguageClientSettings::setOutlineComboBoxSorted(bool sorted) +{ + auto settings = Core::ICore::settings(); + settings->beginGroup(settingsGroupKey); + settings->setValue(outlineSortedKey, sorted); + settings->endGroup(); +} + bool StdIOSettings::applyFromSettingsWidget(QWidget *widget) { bool changed = false; diff --git a/src/plugins/languageclient/languageclientsettings.h b/src/plugins/languageclient/languageclientsettings.h index 03a9cf9f84..95e17a9b5a 100644 --- a/src/plugins/languageclient/languageclientsettings.h +++ b/src/plugins/languageclient/languageclientsettings.h @@ -169,6 +169,9 @@ public: static void addSettings(BaseSettings *settings); static void enableSettings(const QString &id); static void toSettings(QSettings *settings, const QList<BaseSettings *> &languageClientSettings); + + static bool outlineComboBoxIsSorted(); + static void setOutlineComboBoxSorted(bool sorted); }; class LANGUAGECLIENT_EXPORT BaseSettingsWidget : public QWidget |