QmlJs: avoid overwrites by auto-completion

During auto-completion, the cursor used to randomly jump to the
beginning of line, eventually overwriting existing text.
This patch blocks the signals of the selectionModel while it refreshes
the content of the outline model.
Also cleans up a unnecessary variable and make it clear where we blocks
with using a lambda.

Task-number: QTCREATORBUG-18449
Change-Id: I94317c76b4e13d07ef7f3355b766e5473ab21011
Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
This commit is contained in:
Marco Benelli
2017-06-29 17:48:19 +02:00
parent e974f0733e
commit 8e72432654
3 changed files with 33 additions and 23 deletions

View File

@@ -220,7 +220,7 @@ void QmlJSEditorWidget::modificationChanged(bool changed)
bool QmlJSEditorWidget::isOutlineCursorChangesBlocked() bool QmlJSEditorWidget::isOutlineCursorChangesBlocked()
{ {
return hasFocus() || m_blockOutLineCursorChanges; return hasFocus();
} }
void QmlJSEditorWidget::jumpToOutlineElement(int /*index*/) void QmlJSEditorWidget::jumpToOutlineElement(int /*index*/)
@@ -813,7 +813,6 @@ void QmlJSEditorWidget::showContextPane()
void QmlJSEditorWidget::contextMenuEvent(QContextMenuEvent *e) void QmlJSEditorWidget::contextMenuEvent(QContextMenuEvent *e)
{ {
m_blockOutLineCursorChanges = true;
QPointer<QMenu> menu(new QMenu(this)); QPointer<QMenu> menu(new QMenu(this));
QMenu *refactoringMenu = new QMenu(tr("Refactoring"), menu); QMenu *refactoringMenu = new QMenu(tr("Refactoring"), menu);
@@ -858,7 +857,6 @@ void QmlJSEditorWidget::contextMenuEvent(QContextMenuEvent *e)
menu->exec(e->globalPos()); menu->exec(e->globalPos());
delete menu; delete menu;
m_blockOutLineCursorChanges = false;
} }
bool QmlJSEditorWidget::event(QEvent *e) bool QmlJSEditorWidget::event(QEvent *e)

View File

@@ -122,7 +122,6 @@ private:
QTimer m_contextPaneTimer; QTimer m_contextPaneTimer;
QComboBox *m_outlineCombo; QComboBox *m_outlineCombo;
QModelIndex m_outlineModelIndex; QModelIndex m_outlineModelIndex;
bool m_blockOutLineCursorChanges = false;
QmlJS::ModelManagerInterface *m_modelManager = nullptr; QmlJS::ModelManagerInterface *m_modelManager = nullptr;
QmlJS::IContextPane *m_contextPane = nullptr; QmlJS::IContextPane *m_contextPane = nullptr;

View File

@@ -125,6 +125,14 @@ void QmlJSOutlineWidget::setEditor(QmlJSEditorWidget *editor)
m_filterModel->setSourceModel(m_editor->qmlJsEditorDocument()->outlineModel()); m_filterModel->setSourceModel(m_editor->qmlJsEditorDocument()->outlineModel());
m_treeView->expandAll(); m_treeView->expandAll();
connect(m_editor->qmlJsEditorDocument()->outlineModel(), &QAbstractItemModel::modelAboutToBeReset, [this]() {
if (m_treeView && m_treeView->selectionModel())
m_treeView->selectionModel()->blockSignals(true);
});
connect(m_editor->qmlJsEditorDocument()->outlineModel(), &QAbstractItemModel::modelReset, [this]() {
if (m_treeView && m_treeView->selectionModel())
m_treeView->selectionModel()->blockSignals(false);
});
connect(m_treeView->selectionModel(), &QItemSelectionModel::selectionChanged, connect(m_treeView->selectionModel(), &QItemSelectionModel::selectionChanged,
this, &QmlJSOutlineWidget::updateSelectionInText); this, &QmlJSOutlineWidget::updateSelectionInText);
@@ -195,8 +203,10 @@ void QmlJSOutlineWidget::updateSelectionInText(const QItemSelection &selection)
void QmlJSOutlineWidget::updateTextCursor(const QModelIndex &index) void QmlJSOutlineWidget::updateTextCursor(const QModelIndex &index)
{ {
const auto update = [this](const QModelIndex &index) {
if (!m_editor->isOutlineCursorChangesBlocked()) { if (!m_editor->isOutlineCursorChangesBlocked()) {
QModelIndex sourceIndex = m_filterModel->mapToSource(index); QModelIndex sourceIndex = m_filterModel->mapToSource(index);
AST::SourceLocation location AST::SourceLocation location
= m_editor->qmlJsEditorDocument()->outlineModel()->sourceLocation(sourceIndex); = m_editor->qmlJsEditorDocument()->outlineModel()->sourceLocation(sourceIndex);
@@ -212,12 +222,15 @@ void QmlJSOutlineWidget::updateTextCursor(const QModelIndex &index)
Core::EditorManager::addCurrentPositionToNavigationHistory(); Core::EditorManager::addCurrentPositionToNavigationHistory();
QTextCursor textCursor = m_editor->textCursor(); QTextCursor textCursor = m_editor->textCursor();
m_blockCursorSync = true;
textCursor.setPosition(location.offset); textCursor.setPosition(location.offset);
m_editor->setTextCursor(textCursor); m_editor->setTextCursor(textCursor);
m_editor->centerCursor(); m_editor->centerCursor();
m_blockCursorSync = false;
} }
};
m_blockCursorSync = true;
update(index);
m_blockCursorSync = false;
} }
void QmlJSOutlineWidget::focusEditor() void QmlJSOutlineWidget::focusEditor()