Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 49 additions & 9 deletions src/integrations/editor/DiffViewProvider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ export class DiffViewProvider {
originalContent: string | undefined
private createdDirs: string[] = []
private documentWasOpen = false
private originalViewColumn?: vscode.ViewColumn // Store the original view column
private relPath?: string
private newContent?: string
private activeDiffEditor?: vscode.TextEditor
Expand Down Expand Up @@ -65,11 +66,22 @@ export class DiffViewProvider {
.filter(
(tab) => tab.input instanceof vscode.TabInputText && arePathsEqual(tab.input.uri.fsPath, absolutePath),
)
// Check if the document is already open and store its state
// DO NOT close the original tab to preserve pin status
for (const tab of tabs) {
if (!tab.isDirty) {
await vscode.window.tabGroups.close(tab)
if (tab.input instanceof vscode.TabInputText && arePathsEqual(tab.input.uri.fsPath, absolutePath)) {
this.originalViewColumn = tab.group.viewColumn
this.documentWasOpen = true
// Ensure the tab is not dirty before proceeding, but don't close it
if (tab.isDirty) {
// Find the document associated with the tab and save it
const doc = vscode.workspace.textDocuments.find((d) => arePathsEqual(d.uri.fsPath, absolutePath))
if (doc) {
await doc.save()
}
}
break // Found the relevant tab, no need to check others
}
this.documentWasOpen = true
}
this.activeDiffEditor = await this.openDiffEditor()
this.fadedOverlayController = new DecorationController("fadedOverlay", this.activeDiffEditor)
Expand Down Expand Up @@ -159,6 +171,10 @@ export class DiffViewProvider {
await vscode.window.showTextDocument(vscode.Uri.file(absolutePath), { preview: false })
await this.closeAllDiffViews()

// If the original document was open, try to focus it.
// VS Code should handle showing the updated content automatically since the file was saved.
await this._focusOriginalDocument(absolutePath, this.originalViewColumn)

/*
Getting diagnostics before and after the file edit is a better approach than
automatically tracking problems in real-time. This method ensures we only
Expand Down Expand Up @@ -237,14 +253,14 @@ export class DiffViewProvider {
await vscode.workspace.applyEdit(edit)
await updatedDocument.save()
console.log(`File ${absolutePath} has been reverted to its original content.`)
if (this.documentWasOpen) {
await vscode.window.showTextDocument(vscode.Uri.file(absolutePath), {
preview: false,
})
}

// Close the diff view first
await this.closeAllDiffViews()
}

// If the document was originally open, ensure it's focused.
// The revert logic already applied the original content and saved.
await this._focusOriginalDocument(absolutePath, this.originalViewColumn)
}
// edit is done
await this.reset()
}
Expand Down Expand Up @@ -351,13 +367,37 @@ export class DiffViewProvider {
return result
}

private async _focusOriginalDocument(
absolutePath: string,
viewColumn: vscode.ViewColumn | undefined,
): Promise<void> {
if (this.documentWasOpen && viewColumn) {
// Find the editor for the original document and reveal it
const originalEditor = vscode.window.visibleTextEditors.find(
(editor) => arePathsEqual(editor.document.uri.fsPath, absolutePath) && editor.viewColumn === viewColumn,
)
if (originalEditor) {
// Reveal a range (e.g., the start) to ensure focus
const position = new vscode.Position(0, 0)
originalEditor.revealRange(new vscode.Range(position, position), vscode.TextEditorRevealType.AtTop)
} else {
// Fallback if editor not found
await vscode.window.showTextDocument(vscode.Uri.file(absolutePath), {
preview: false,
viewColumn: viewColumn,
})
}
}
}

// close editor if open?
async reset() {
this.editType = undefined
this.isEditing = false
this.originalContent = undefined
this.createdDirs = []
this.documentWasOpen = false
this.originalViewColumn = undefined // Reset stored view column
this.activeDiffEditor = undefined
this.fadedOverlayController = undefined
this.activeLineController = undefined
Expand Down