LanguageClient: support sorting outline combo box items

Fixes: QTCREATORBUG-26976
Change-Id: I6ec31072629c62a007bc27381f4adba597307057
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
David Schulz
2022-02-04 12:05:31 +01:00
parent 46a012bc11
commit 505358cb82
3 changed files with 44 additions and 3 deletions

View File

@@ -39,6 +39,7 @@
#include <utils/treeviewcombobox.h> #include <utils/treeviewcombobox.h>
#include <utils/utilsicons.h> #include <utils/utilsicons.h>
#include <QAction>
#include <QBoxLayout> #include <QBoxLayout>
#include <QSortFilterProxyModel> #include <QSortFilterProxyModel>
@@ -302,6 +303,7 @@ TextEditor::IOutlineWidget *LanguageClientOutlineWidgetFactory::createWidget(Cor
class OutlineComboBox : public Utils::TreeViewComboBox class OutlineComboBox : public Utils::TreeViewComboBox
{ {
Q_DECLARE_TR_FUNCTIONS(LanguageClient::OutlineComboBox)
public: public:
OutlineComboBox(Client *client, TextEditor::BaseTextEditor *editor); OutlineComboBox(Client *client, TextEditor::BaseTextEditor *editor);
@@ -310,8 +312,10 @@ private:
void updateEntry(); void updateEntry();
void activateEntry(); void activateEntry();
void documentUpdated(TextEditor::TextDocument *document); void documentUpdated(TextEditor::TextDocument *document);
void setSorted(bool sorted);
LanguageClientOutlineModel m_model; LanguageClientOutlineModel m_model;
QSortFilterProxyModel m_proxyModel;
QPointer<Client> m_client; QPointer<Client> m_client;
TextEditor::TextEditorWidget *m_editorWidget; TextEditor::TextEditorWidget *m_editorWidget;
const DocumentUri m_uri; const DocumentUri m_uri;
@@ -331,19 +335,29 @@ OutlineComboBox::OutlineComboBox(Client *client, TextEditor::BaseTextEditor *edi
, m_uri(DocumentUri::fromFilePath(editor->document()->filePath())) , m_uri(DocumentUri::fromFilePath(editor->document()->filePath()))
{ {
m_model.setSymbolStringifier(client->symbolStringifier()); 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); setMinimumContentsLength(13);
QSizePolicy policy = sizePolicy(); QSizePolicy policy = sizePolicy();
policy.setHorizontalPolicy(QSizePolicy::Expanding); policy.setHorizontalPolicy(QSizePolicy::Expanding);
setSizePolicy(policy); setSizePolicy(policy);
setMaxVisibleItems(40); 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, connect(client->documentSymbolCache(), &DocumentSymbolCache::gotSymbols,
this, &OutlineComboBox::updateModel); this, &OutlineComboBox::updateModel);
connect(client, &Client::documentUpdated, this, &OutlineComboBox::documentUpdated); connect(client, &Client::documentUpdated, this, &OutlineComboBox::documentUpdated);
connect(m_editorWidget, &TextEditor::TextEditorWidget::cursorPositionChanged, connect(m_editorWidget, &TextEditor::TextEditorWidget::cursorPositionChanged,
this, &OutlineComboBox::updateEntry); this, &OutlineComboBox::updateEntry);
connect(this, QOverload<int>::of(&QComboBox::activated), this, &OutlineComboBox::activateEntry); connect(this, QOverload<int>::of(&QComboBox::activated), this, &OutlineComboBox::activateEntry);
connect(sortAction, &QAction::toggled, this, &OutlineComboBox::setSorted);
documentUpdated(editor->textDocument()); documentUpdated(editor->textDocument());
} }
@@ -367,12 +381,12 @@ void OutlineComboBox::updateModel(const DocumentUri &resultUri, const DocumentSy
void OutlineComboBox::updateEntry() void OutlineComboBox::updateEntry()
{ {
if (LanguageClientOutlineItem *item = itemForCursor(m_model, m_editorWidget->textCursor())) 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() void OutlineComboBox::activateEntry()
{ {
const QModelIndex modelIndex = view()->currentIndex(); const QModelIndex modelIndex = m_proxyModel.mapToSource(view()->currentIndex());
if (modelIndex.isValid()) { if (modelIndex.isValid()) {
const Position &pos = m_model.itemForIndex(modelIndex)->pos(); const Position &pos = m_model.itemForIndex(modelIndex)->pos();
Core::EditorManager::cutForwardNavigationHistory(); Core::EditorManager::cutForwardNavigationHistory();
@@ -389,4 +403,10 @@ void OutlineComboBox::documentUpdated(TextEditor::TextDocument *document)
m_client->documentSymbolCache()->requestSymbols(m_uri, Schedule::Delayed); m_client->documentSymbolCache()->requestSymbols(m_uri, Schedule::Delayed);
} }
void OutlineComboBox::setSorted(bool sorted)
{
LanguageClientSettings::setOutlineComboBoxSorted(sorted);
m_proxyModel.sort(sorted ? 0 : -1);
}
} // namespace LanguageClient } // namespace LanguageClient

View File

@@ -84,6 +84,7 @@ constexpr char argumentsKey[] = "arguments";
constexpr char settingsGroupKey[] = "LanguageClient"; constexpr char settingsGroupKey[] = "LanguageClient";
constexpr char clientsKey[] = "clients"; constexpr char clientsKey[] = "clients";
constexpr char typedClientsKey[] = "typedClients"; constexpr char typedClientsKey[] = "typedClients";
constexpr char outlineSortedKey[] = "outlineSorted";
constexpr char mimeType[] = "application/language.client.setting"; constexpr char mimeType[] = "application/language.client.setting";
namespace LanguageClient { namespace LanguageClient {
@@ -702,6 +703,23 @@ void LanguageClientSettings::toSettings(QSettings *settings,
settings->endGroup(); 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 StdIOSettings::applyFromSettingsWidget(QWidget *widget)
{ {
bool changed = false; bool changed = false;

View File

@@ -172,6 +172,9 @@ public:
static void addSettings(BaseSettings *settings); static void addSettings(BaseSettings *settings);
static void enableSettings(const QString &id); static void enableSettings(const QString &id);
static void toSettings(QSettings *settings, const QList<BaseSettings *> &languageClientSettings); static void toSettings(QSettings *settings, const QList<BaseSettings *> &languageClientSettings);
static bool outlineComboBoxIsSorted();
static void setOutlineComboBoxSorted(bool sorted);
}; };
class LANGUAGECLIENT_EXPORT BaseSettingsWidget : public QWidget class LANGUAGECLIENT_EXPORT BaseSettingsWidget : public QWidget