diff --git a/src/plugins/coreplugin/coreconstants.h b/src/plugins/coreplugin/coreconstants.h index 8d2e66d915b..5da7df848d7 100644 --- a/src/plugins/coreplugin/coreconstants.h +++ b/src/plugins/coreplugin/coreconstants.h @@ -131,6 +131,7 @@ const char GOTONEXTINHISTORY[] = "QtCreator.GotoNextInHistory"; const char GOTOPREVINHISTORY[] = "QtCreator.GotoPreviousInHistory"; const char GO_BACK[] = "QtCreator.GoBack"; const char GO_FORWARD[] = "QtCreator.GoForward"; +const char GOTOLASTEDIT[] = "QtCreator.GotoLastEdit"; const char ABOUT_QTCREATOR[] = "QtCreator.AboutQtCreator"; const char ABOUT_PLUGINS[] = "QtCreator.AboutPlugins"; const char S_RETURNTOEDITOR[] = "QtCreator.ReturnToEditor"; diff --git a/src/plugins/coreplugin/editormanager/editormanager.cpp b/src/plugins/coreplugin/editormanager/editormanager.cpp index 5ec572e5a06..6e30f53cebe 100644 --- a/src/plugins/coreplugin/editormanager/editormanager.cpp +++ b/src/plugins/coreplugin/editormanager/editormanager.cpp @@ -204,6 +204,7 @@ EditorManagerPrivate::EditorManagerPrivate(QObject *parent) : m_gotoPreviousDocHistoryAction(new QAction(EditorManager::tr("Previous Open Document in History"), this)), m_goBackAction(new QAction(Utils::Icons::PREV.icon(), EditorManager::tr("Go Back"), this)), m_goForwardAction(new QAction(Utils::Icons::NEXT.icon(), EditorManager::tr("Go Forward"), this)), + m_gotoLastEditAction(new QAction(EditorManager::tr("Go to Last Edit"), this)), m_copyFilePathContextAction(new QAction(EditorManager::tr("Copy Full Path"), this)), m_copyLocationContextAction(new QAction(EditorManager::tr("Copy Path and Line Number"), this)), m_copyFileNameContextAction(new QAction(EditorManager::tr("Copy File Name"), this)), @@ -383,6 +384,12 @@ void EditorManagerPrivate::init() connect(m_goForwardAction, &QAction::triggered, m_instance, &EditorManager::goForwardInNavigationHistory); + // Go to last edit + cmd = ActionManager::registerAction(m_gotoLastEditAction, Constants::GOTOLASTEDIT, editDesignContext); + mwindow->addAction(cmd, Constants::G_WINDOW_NAVIGATE); + connect(m_gotoLastEditAction, &QAction::triggered, + this, &EditorManagerPrivate::gotoLastEditLocation); + m_splitAction = new QAction(Utils::Icons::SPLIT_HORIZONTAL.icon(), tr("Split"), this); cmd = ActionManager::registerAction(m_splitAction, Constants::SPLIT, editManagerContext); cmd->setDefaultKeySequence(QKeySequence(useMacShortcuts ? tr("Meta+E,2") : tr("Ctrl+E,2"))); @@ -1915,6 +1922,11 @@ void EditorManagerPrivate::gotoPreviousDocHistory() } } +void EditorManagerPrivate::gotoLastEditLocation() +{ + currentEditorView()->goToEditLocation(d->m_globalLastEditLocation); +} + void EditorManagerPrivate::gotoNextSplit() { EditorView *view = currentEditorView(); @@ -2945,6 +2957,22 @@ void EditorManager::addCurrentPositionToNavigationHistory(const QByteArray &save EditorManagerPrivate::updateActions(); } +void EditorManager::setLastEditLocation(const IEditor* editor) +{ + IDocument *document = editor->document(); + if (!document) + return; + + const QByteArray &state = editor->saveState(); + EditLocation location; + location.document = document; + location.fileName = document->filePath().toString(); + location.id = document->id(); + location.state = QVariant(state); + + d->m_globalLastEditLocation = location; +} + void EditorManager::cutForwardNavigationHistory() { EditorManagerPrivate::currentEditorView()->cutForwardNavigationHistory(); diff --git a/src/plugins/coreplugin/editormanager/editormanager.h b/src/plugins/coreplugin/editormanager/editormanager.h index fb1da4802bc..59da62356e8 100644 --- a/src/plugins/coreplugin/editormanager/editormanager.h +++ b/src/plugins/coreplugin/editormanager/editormanager.h @@ -131,6 +131,7 @@ public: static bool closeAllDocuments(); static void addCurrentPositionToNavigationHistory(const QByteArray &saveState = QByteArray()); + static void setLastEditLocation(const IEditor *editor); static void cutForwardNavigationHistory(); static bool saveDocument(IDocument *document); diff --git a/src/plugins/coreplugin/editormanager/editormanager_p.h b/src/plugins/coreplugin/editormanager/editormanager_p.h index ac6ac6f7f8c..bc1179926d5 100644 --- a/src/plugins/coreplugin/editormanager/editormanager_p.h +++ b/src/plugins/coreplugin/editormanager/editormanager_p.h @@ -162,6 +162,8 @@ private: static void gotoNextDocHistory(); static void gotoPreviousDocHistory(); + static void gotoLastEditLocation(); + static void autoSave(); static void handleContextChange(const QList &context); @@ -213,6 +215,7 @@ private: ~EditorManagerPrivate() override; void init(); + EditLocation m_globalLastEditLocation; QList m_globalHistory; QList m_editorAreas; QPointer m_currentEditor; @@ -232,6 +235,7 @@ private: QAction *m_gotoPreviousDocHistoryAction; QAction *m_goBackAction; QAction *m_goForwardAction; + QAction *m_gotoLastEditAction; QAction *m_splitAction; QAction *m_splitSideBySideAction; QAction *m_splitNewWindowAction; diff --git a/src/plugins/coreplugin/editormanager/editorview.cpp b/src/plugins/coreplugin/editormanager/editorview.cpp index c9adba0206d..193a675833f 100644 --- a/src/plugins/coreplugin/editormanager/editorview.cpp +++ b/src/plugins/coreplugin/editormanager/editorview.cpp @@ -610,6 +610,28 @@ void EditorView::goForwardInNavigationHistory() updateNavigatorActions(); } +void EditorView::goToEditLocation(const EditLocation &location) +{ + IEditor *editor = nullptr; + + if (location.document) { + editor = EditorManagerPrivate::activateEditorForDocument(this, location.document, + EditorManager::IgnoreNavigationHistory); + } + + if (!editor) { + if (fileNameWasRemoved(location.fileName)) + return; + + editor = EditorManagerPrivate::openEditor(this, location.fileName, location.id, + EditorManager::IgnoreNavigationHistory); + } + + if (editor) { + editor->restoreState(location.state.toByteArray()); + } +} + SplitterOrView::SplitterOrView(IEditor *editor) { diff --git a/src/plugins/coreplugin/editormanager/editorview.h b/src/plugins/coreplugin/editormanager/editorview.h index a3fae51ff6e..7187989579a 100644 --- a/src/plugins/coreplugin/editormanager/editorview.h +++ b/src/plugins/coreplugin/editormanager/editorview.h @@ -154,6 +154,8 @@ public slots: void goForwardInNavigationHistory(); public: + void goToEditLocation(const EditLocation &location); + void addCurrentPositionToNavigationHistory(const QByteArray &saveState = QByteArray()); void cutForwardNavigationHistory(); diff --git a/src/plugins/texteditor/texteditor.cpp b/src/plugins/texteditor/texteditor.cpp index df51f2bfe21..b21684a9f5f 100644 --- a/src/plugins/texteditor/texteditor.cpp +++ b/src/plugins/texteditor/texteditor.cpp @@ -5270,6 +5270,8 @@ void TextEditorWidget::slotCursorPositionChanged() d->m_lastCursorChangeWasInteresting = false; } else if (d->m_contentsChanged) { d->saveCurrentCursorPositionForNavigation(); + if (EditorManager::currentEditor() && EditorManager::currentEditor()->widget() == this) + EditorManager::setLastEditLocation(EditorManager::currentEditor()); } d->updateHighlights();