From 01e0e434435e6e2cbd5bf1a20e56e04694c14bfd Mon Sep 17 00:00:00 2001 From: Artem Sokolovskii Date: Wed, 8 May 2024 12:17:31 +0200 Subject: [PATCH] Core: Reopen last closed editor The short-cut to reopen the last closed editor is not set by default to allow users to set by themselves. Change-Id: I1f57e34c3b1a30873fd550f5cb008e5640e6a1c5 Reviewed-by: Eike Ziller --- src/plugins/coreplugin/coreconstants.h | 1 + .../editormanager/editormanager.cpp | 28 +++++++++++++++++++ .../editormanager/editormanager_p.h | 5 ++++ .../coreplugin/editormanager/editorview.cpp | 27 ++++++++++++++++++ .../coreplugin/editormanager/editorview.h | 5 ++++ 5 files changed, 66 insertions(+) diff --git a/src/plugins/coreplugin/coreconstants.h b/src/plugins/coreplugin/coreconstants.h index a259717ba89..d8d2388fb18 100644 --- a/src/plugins/coreplugin/coreconstants.h +++ b/src/plugins/coreplugin/coreconstants.h @@ -119,6 +119,7 @@ const char GOTOPREVINHISTORY[] = "QtCreator.GotoPreviousInHistory"; const char GO_BACK[] = "QtCreator.GoBack"; const char GO_FORWARD[] = "QtCreator.GoForward"; const char GOTOLASTEDIT[] = "QtCreator.GotoLastEdit"; +const char REOPEN_CLOSED_EDITOR[] = "QtCreator.ReopenClosedEditor"; const char ABOUT_QTCREATOR[] = "QtCreator.AboutQtCreator"; const char ABOUT_PLUGINS[] = "QtCreator.AboutPlugins"; const char CHANGE_LOG[] = "QtCreator.ChangeLog"; diff --git a/src/plugins/coreplugin/editormanager/editormanager.cpp b/src/plugins/coreplugin/editormanager/editormanager.cpp index 3d79cf3bc77..c8ef2a4f1ab 100644 --- a/src/plugins/coreplugin/editormanager/editormanager.cpp +++ b/src/plugins/coreplugin/editormanager/editormanager.cpp @@ -596,6 +596,14 @@ void EditorManagerPrivate::init() goForward.addToContainer(Constants::M_WINDOW, Constants::G_WINDOW_NAVIGATE); goForward.addOnTriggered(this, &EditorManager::goForwardInNavigationHistory); + // Reopen last closed document + ActionBuilder reopenLastClosedDocument(this, Constants::REOPEN_CLOSED_EDITOR); + reopenLastClosedDocument.setText(::Core::Tr::tr("Reopen Last Closed Document")); + reopenLastClosedDocument.bindContextAction(&m_reopenLastClosedDocumenAction); + reopenLastClosedDocument.setContext(editDesignContext); + reopenLastClosedDocument.addToContainer(Constants::M_WINDOW, Constants::G_WINDOW_NAVIGATE); + reopenLastClosedDocument.addOnTriggered(this, &EditorManagerPrivate::reopenLastClosedDocument); + // Go to last edit ActionBuilder gotoLastEdit(this, Constants::GOTOLASTEDIT); gotoLastEdit.setText(::Core::Tr::tr("Go to Last Edit")); @@ -2075,6 +2083,7 @@ void EditorManagerPrivate::updateActions() EditorView *view = currentEditorView(); d->m_goBackAction->setEnabled(view ? view->canGoBack() : false); d->m_goForwardAction->setEnabled(view ? view->canGoForward() : false); + d->m_reopenLastClosedDocumenAction->setEnabled(view ? view->canReopen() : false); SplitterOrView *viewParent = (view ? view->parentSplitterOrView() : nullptr); SplitterOrView *parentSplitter = (viewParent ? viewParent->findParentSplitter() : nullptr); @@ -2227,6 +2236,22 @@ void EditorManagerPrivate::gotoPreviousSplit() activateView(prevView); } +void EditorManagerPrivate::addClosedDocumentToCloseHistory(IEditor *editor) +{ + EditorView *view = EditorManagerPrivate::viewForEditor(editor); + QTC_ASSERT(view, return); + view->addClosedEditorToCloseHistory(editor); + EditorManagerPrivate::updateActions(); +} + +void EditorManagerPrivate::reopenLastClosedDocument() +{ + EditorView *view = EditorManagerPrivate::currentEditorView(); + QTC_ASSERT(view, return); + view->reopenLastClosedDocument(); + EditorManagerPrivate::updateActions(); +} + void EditorManagerPrivate::makeCurrentEditorWritable() { if (IDocument* doc = EditorManager::currentDocument()) @@ -3031,6 +3056,9 @@ bool EditorManager::closeDocuments(const QList &entries) */ bool EditorManager::closeEditors(const QList &editorsToClose, bool askAboutModifiedEditors) { + for (IEditor *editor : editorsToClose) + EditorManagerPrivate::addClosedDocumentToCloseHistory(editor); + return EditorManagerPrivate::closeEditors(editorsToClose, askAboutModifiedEditors ? EditorManagerPrivate::CloseFlag::CloseWithAsking : EditorManagerPrivate::CloseFlag::CloseWithoutAsking); diff --git a/src/plugins/coreplugin/editormanager/editormanager_p.h b/src/plugins/coreplugin/editormanager/editormanager_p.h index db5bf759aec..34a67457219 100644 --- a/src/plugins/coreplugin/editormanager/editormanager_p.h +++ b/src/plugins/coreplugin/editormanager/editormanager_p.h @@ -124,6 +124,8 @@ public: const Utils::FilePath &newFilePath, Utils::Id originalType = {}); + static void addClosedDocumentToCloseHistory(IEditor *editor); + public slots: static bool saveDocument(Core::IDocument *document); static bool saveDocumentAs(Core::IDocument *document); @@ -133,6 +135,8 @@ public slots: static void gotoPreviousSplit(); static void gotoNextSplit(); + static void reopenLastClosedDocument(); + void handleDocumentStateChange(Core::IDocument *document); void editorAreaDestroyed(QObject *area); @@ -216,6 +220,7 @@ private: QAction *m_gotoPreviousDocHistoryAction = nullptr; QAction *m_goBackAction = nullptr; QAction *m_goForwardAction = nullptr; + QAction *m_reopenLastClosedDocumenAction = nullptr; QAction *m_gotoLastEditAction = nullptr; QAction *m_splitAction = nullptr; QAction *m_splitSideBySideAction = nullptr; diff --git a/src/plugins/coreplugin/editormanager/editorview.cpp b/src/plugins/coreplugin/editormanager/editorview.cpp index 15a6e810576..fd9d375d81d 100644 --- a/src/plugins/coreplugin/editormanager/editorview.cpp +++ b/src/plugins/coreplugin/editormanager/editorview.cpp @@ -264,6 +264,11 @@ bool EditorView::canGoBack() const return m_currentNavigationHistoryPosition > 0; } +bool EditorView::canReopen() const +{ + return !m_closedEditorHistory.isEmpty(); +} + void EditorView::updateEditorHistory(IEditor *editor, QList &history) { IDocument *document = editor ? editor->document() : nullptr; @@ -505,6 +510,21 @@ void EditorView::addCurrentPositionToNavigationHistory(const QByteArray &saveSta updateNavigatorActions(); } +void EditorView::addClosedEditorToCloseHistory(IEditor *editor) +{ + static const int MAX_ITEMS = 20; + + if (!editor || !editor->document()) + return; + + EditLocation location = EditLocation::forEditor(editor); + + m_closedEditorHistory.push_back(location); + + if (m_closedEditorHistory.size() > MAX_ITEMS) + m_closedEditorHistory.removeFirst(); +} + void EditorView::cutForwardNavigationHistory() { while (m_currentNavigationHistoryPosition < m_navigationHistory.size() - 1) @@ -636,6 +656,13 @@ void EditorView::goForwardInNavigationHistory() updateNavigatorActions(); } +void EditorView::reopenLastClosedDocument() +{ + if (m_closedEditorHistory.isEmpty()) + return; + goToEditLocation(m_closedEditorHistory.takeLast()); +} + void EditorView::goToEditLocation(const EditLocation &location) { IEditor *editor = nullptr; diff --git a/src/plugins/coreplugin/editormanager/editorview.h b/src/plugins/coreplugin/editormanager/editorview.h index 28db4f533c5..374c6df21fa 100644 --- a/src/plugins/coreplugin/editormanager/editorview.h +++ b/src/plugins/coreplugin/editormanager/editorview.h @@ -85,13 +85,17 @@ public: bool canGoForward() const; bool canGoBack() const; + bool canReopen() const; void goBackInNavigationHistory(); void goForwardInNavigationHistory(); + void reopenLastClosedDocument(); + void goToEditLocation(const EditLocation &location); void addCurrentPositionToNavigationHistory(const QByteArray &saveState = QByteArray()); + void addClosedEditorToCloseHistory(IEditor *editor); void cutForwardNavigationHistory(); QList editorHistory() const { return m_editorHistory; } @@ -148,6 +152,7 @@ private: QMenu *m_backMenu; QMenu *m_forwardMenu; QList m_editorHistory; + QList m_closedEditorHistory; int m_currentNavigationHistoryPosition = 0; };