forked from qt-creator/qt-creator
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:
@@ -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
|
||||||
|
@@ -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;
|
||||||
|
@@ -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
|
||||||
|
Reference in New Issue
Block a user