LanguageClient: select innermost outline widget item

Reuse the code that selects the innermost item in the outline combobox
also in the widget so the behavior is consistent.

Change-Id: I8a4758296d2d44294e2b1e11b6bb18acca2c7e32
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
David Schulz
2022-02-04 07:30:06 +01:00
parent fd7bf831ba
commit b97204ebb6

View File

@@ -216,17 +216,30 @@ void LanguageClientOutlineWidget::updateTextCursor(const QModelIndex &proxyIndex
m_editor->editorWidget()->gotoLine(pos.line() + 1, pos.character(), true, true); m_editor->editorWidget()->gotoLine(pos.line() + 1, pos.character(), true, true);
} }
static LanguageClientOutlineItem *itemForCursor(const LanguageClientOutlineModel &m_model,
const QTextCursor &cursor)
{
const Position pos(cursor);
LanguageClientOutlineItem *result = nullptr;
m_model.forAllItems([&](LanguageClientOutlineItem *candidate){
if (!candidate->contains(pos))
return;
if (result && candidate->range().contains(result->range()))
return; // skip item if the range is equal or bigger than the previous found range
result = candidate;
});
return result;
}
void LanguageClientOutlineWidget::updateSelectionInTree(const QTextCursor &currentCursor) void LanguageClientOutlineWidget::updateSelectionInTree(const QTextCursor &currentCursor)
{ {
QItemSelection selection; if (LanguageClientOutlineItem *item = itemForCursor(m_model, currentCursor)) {
const Position pos(currentCursor); const QModelIndex index = m_model.indexForItem(item);
m_model.forAllItems([&](const LanguageClientOutlineItem *item) { m_view.selectionModel()->select(index, QItemSelectionModel::ClearAndSelect);
if (item->contains(pos)) m_view.scrollTo(index);
selection.select(m_model.indexForItem(item), m_model.indexForItem(item)); } else {
}); m_view.clearSelection();
m_view.selectionModel()->select(selection, QItemSelectionModel::ClearAndSelect); }
if (!selection.isEmpty())
m_view.scrollTo(selection.indexes().first());
} }
void LanguageClientOutlineWidget::onItemActivated(const QModelIndex &index) void LanguageClientOutlineWidget::onItemActivated(const QModelIndex &index)
@@ -324,17 +337,8 @@ void OutlineComboBox::updateModel(const DocumentUri &resultUri, const DocumentSy
void OutlineComboBox::updateEntry() void OutlineComboBox::updateEntry()
{ {
const Position pos(m_editorWidget->textCursor()); if (LanguageClientOutlineItem *item = itemForCursor(m_model, m_editorWidget->textCursor()))
LanguageClientOutlineItem *itemForCursor = nullptr; setCurrentIndex(m_model.indexForItem(item));
m_model.forAllItems([&](LanguageClientOutlineItem *candidate){
if (!candidate->contains(pos))
return;
if (itemForCursor && candidate->range().contains(itemForCursor->range()))
return; // skip item if the range is equal or bigger than the previous found range
itemForCursor = candidate;
});
if (itemForCursor)
setCurrentIndex(m_model.indexForItem(itemForCursor));
} }
void OutlineComboBox::activateEntry() void OutlineComboBox::activateEntry()