diff --git a/src/plugins/qmljseditor/qmljseditor.cpp b/src/plugins/qmljseditor/qmljseditor.cpp index aea16f3d8b4..cf84adfae4d 100644 --- a/src/plugins/qmljseditor/qmljseditor.cpp +++ b/src/plugins/qmljseditor/qmljseditor.cpp @@ -218,6 +218,11 @@ void QmlJSEditorWidget::modificationChanged(bool changed) m_modelManager->fileChangedOnDisk(textDocument()->filePath().toString()); } +bool QmlJSEditorWidget::isOutlineCursorChangesBlocked() +{ + return hasFocus() || m_blockOutLineCursorChanges; +} + void QmlJSEditorWidget::jumpToOutlineElement(int /*index*/) { QModelIndex index = m_outlineCombo->view()->currentIndex(); @@ -808,6 +813,7 @@ void QmlJSEditorWidget::showContextPane() void QmlJSEditorWidget::contextMenuEvent(QContextMenuEvent *e) { + m_blockOutLineCursorChanges = true; QPointer menu(new QMenu(this)); QMenu *refactoringMenu = new QMenu(tr("Refactoring"), menu); @@ -852,6 +858,7 @@ void QmlJSEditorWidget::contextMenuEvent(QContextMenuEvent *e) menu->exec(e->globalPos()); delete menu; + m_blockOutLineCursorChanges = false; } bool QmlJSEditorWidget::event(QEvent *e) diff --git a/src/plugins/qmljseditor/qmljseditor.h b/src/plugins/qmljseditor/qmljseditor.h index 5dde3a8660a..2710e29fa0c 100644 --- a/src/plugins/qmljseditor/qmljseditor.h +++ b/src/plugins/qmljseditor/qmljseditor.h @@ -67,6 +67,7 @@ public: QModelIndex outlineModelIndex(); void updateOutlineIndexNow(); + bool isOutlineCursorChangesBlocked(); TextEditor::AssistInterface *createAssistInterface(TextEditor::AssistKind assistKind, TextEditor::AssistReason reason) const override; @@ -121,6 +122,7 @@ private: QTimer m_contextPaneTimer; QComboBox *m_outlineCombo; QModelIndex m_outlineModelIndex; + bool m_blockOutLineCursorChanges = false; QmlJS::ModelManagerInterface *m_modelManager = nullptr; QmlJS::IContextPane *m_contextPane = nullptr; diff --git a/src/plugins/qmljseditor/qmljsoutline.cpp b/src/plugins/qmljseditor/qmljsoutline.cpp index 26ae8b5fc6d..ea90a99c669 100644 --- a/src/plugins/qmljseditor/qmljsoutline.cpp +++ b/src/plugins/qmljseditor/qmljsoutline.cpp @@ -195,27 +195,29 @@ void QmlJSOutlineWidget::updateSelectionInText(const QItemSelection &selection) void QmlJSOutlineWidget::updateTextCursor(const QModelIndex &index) { - QModelIndex sourceIndex = m_filterModel->mapToSource(index); - AST::SourceLocation location - = m_editor->qmlJsEditorDocument()->outlineModel()->sourceLocation(sourceIndex); + if (!m_editor->isOutlineCursorChangesBlocked()) { + QModelIndex sourceIndex = m_filterModel->mapToSource(index); + AST::SourceLocation location + = m_editor->qmlJsEditorDocument()->outlineModel()->sourceLocation(sourceIndex); - if (!location.isValid()) - return; + if (!location.isValid()) + return; - const QTextBlock lastBlock = m_editor->document()->lastBlock(); - const uint textLength = lastBlock.position() + lastBlock.length(); - if (location.offset >= textLength) - return; + const QTextBlock lastBlock = m_editor->document()->lastBlock(); + const uint textLength = lastBlock.position() + lastBlock.length(); + if (location.offset >= textLength) + return; - Core::EditorManager::cutForwardNavigationHistory(); - Core::EditorManager::addCurrentPositionToNavigationHistory(); + Core::EditorManager::cutForwardNavigationHistory(); + Core::EditorManager::addCurrentPositionToNavigationHistory(); - QTextCursor textCursor = m_editor->textCursor(); - m_blockCursorSync = true; - textCursor.setPosition(location.offset); - m_editor->setTextCursor(textCursor); - m_editor->centerCursor(); - m_blockCursorSync = false; + QTextCursor textCursor = m_editor->textCursor(); + m_blockCursorSync = true; + textCursor.setPosition(location.offset); + m_editor->setTextCursor(textCursor); + m_editor->centerCursor(); + m_blockCursorSync = false; + } } void QmlJSOutlineWidget::focusEditor()