diff --git a/src/plugins/languageclient/languageclientoutline.cpp b/src/plugins/languageclient/languageclientoutline.cpp index 3cafb990493..3881e5d722c 100644 --- a/src/plugins/languageclient/languageclientoutline.cpp +++ b/src/plugins/languageclient/languageclientoutline.cpp @@ -39,6 +39,7 @@ #include #include +#include #include #include @@ -302,6 +303,7 @@ TextEditor::IOutlineWidget *LanguageClientOutlineWidgetFactory::createWidget(Cor class OutlineComboBox : public Utils::TreeViewComboBox { + Q_DECLARE_TR_FUNCTIONS(LanguageClient::OutlineComboBox) public: OutlineComboBox(Client *client, TextEditor::BaseTextEditor *editor); @@ -310,8 +312,10 @@ private: void updateEntry(); void activateEntry(); void documentUpdated(TextEditor::TextDocument *document); + void setSorted(bool sorted); LanguageClientOutlineModel m_model; + QSortFilterProxyModel m_proxyModel; QPointer m_client; TextEditor::TextEditorWidget *m_editorWidget; const DocumentUri m_uri; @@ -331,19 +335,29 @@ 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); + auto sortAction = new QAction(tr("Sort Alphabetically"), 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::of(&QComboBox::activated), this, &OutlineComboBox::activateEntry); + connect(sortAction, &QAction::toggled, this, &OutlineComboBox::setSorted); documentUpdated(editor->textDocument()); } @@ -367,12 +381,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(); @@ -389,4 +403,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 4b7391a71ec..9a43eca7f96 100644 --- a/src/plugins/languageclient/languageclientsettings.cpp +++ b/src/plugins/languageclient/languageclientsettings.cpp @@ -84,6 +84,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 { @@ -702,6 +703,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 d88e00430de..ad2676454bd 100644 --- a/src/plugins/languageclient/languageclientsettings.h +++ b/src/plugins/languageclient/languageclientsettings.h @@ -172,6 +172,9 @@ public: static void addSettings(BaseSettings *settings); static void enableSettings(const QString &id); static void toSettings(QSettings *settings, const QList &languageClientSettings); + + static bool outlineComboBoxIsSorted(); + static void setOutlineComboBoxSorted(bool sorted); }; class LANGUAGECLIENT_EXPORT BaseSettingsWidget : public QWidget