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);
}
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)
{
QItemSelection selection;
const Position pos(currentCursor);
m_model.forAllItems([&](const LanguageClientOutlineItem *item) {
if (item->contains(pos))
selection.select(m_model.indexForItem(item), m_model.indexForItem(item));
});
m_view.selectionModel()->select(selection, QItemSelectionModel::ClearAndSelect);
if (!selection.isEmpty())
m_view.scrollTo(selection.indexes().first());
if (LanguageClientOutlineItem *item = itemForCursor(m_model, currentCursor)) {
const QModelIndex index = m_model.indexForItem(item);
m_view.selectionModel()->select(index, QItemSelectionModel::ClearAndSelect);
m_view.scrollTo(index);
} else {
m_view.clearSelection();
}
}
void LanguageClientOutlineWidget::onItemActivated(const QModelIndex &index)
@@ -324,17 +337,8 @@ void OutlineComboBox::updateModel(const DocumentUri &resultUri, const DocumentSy
void OutlineComboBox::updateEntry()
{
const Position pos(m_editorWidget->textCursor());
LanguageClientOutlineItem *itemForCursor = nullptr;
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));
if (LanguageClientOutlineItem *item = itemForCursor(m_model, m_editorWidget->textCursor()))
setCurrentIndex(m_model.indexForItem(item));
}
void OutlineComboBox::activateEntry()