Skip to content

Commit 13ddd79

Browse files
authored
Add keybinding for Reveal in Explorer (#8363)
1 parent c971092 commit 13ddd79

File tree

3 files changed

+37
-5
lines changed

3 files changed

+37
-5
lines changed

package.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2083,6 +2083,12 @@
20832083
"mac": "cmd+r",
20842084
"command": "pr.refreshDescription",
20852085
"when": "activeWebviewPanelId == 'PullRequestOverview'"
2086+
},
2087+
{
2088+
"key": "shift+alt+r",
2089+
"mac": "shift+alt+cmd+r",
2090+
"command": "pr.revealFileInOS",
2091+
"when": "focusedView =~ /(pr|prStatus):github/ && listFocus"
20862092
}
20872093
],
20882094
"menus": {

src/commands.ts

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import { codespacesPrLink, getIssuesUrl, getPullsUrl, isInCodespaces, ISSUE_OR_U
3535
import { OverviewContext } from './github/views';
3636
import { isNotificationTreeItem, NotificationTreeItem } from './notifications/notificationItem';
3737
import { NotificationsManager } from './notifications/notificationsManager';
38+
import { PullRequestsTreeDataProvider } from './view/prsTreeDataProvider';
3839
import { PrsTreeModel } from './view/prsTreeModel';
3940
import { ReviewCommentController } from './view/reviewCommentController';
4041
import { ReviewManager } from './view/reviewManager';
@@ -135,7 +136,8 @@ export function registerCommands(
135136
telemetry: ITelemetry,
136137
copilotRemoteAgentManager: CopilotRemoteAgentManager,
137138
notificationManager: NotificationsManager,
138-
prsTreeModel: PrsTreeModel
139+
prsTreeModel: PrsTreeModel,
140+
tree: PullRequestsTreeDataProvider
139141
) {
140142
const logId = 'RegisterCommands';
141143
context.subscriptions.push(
@@ -233,10 +235,34 @@ export function registerCommands(
233235
);
234236

235237
context.subscriptions.push(
236-
vscode.commands.registerCommand('pr.revealFileInOS', (e: GitFileChangeNode) => {
237-
const folderManager = reposManager.getManagerForIssueModel(e.pullRequest);
238+
vscode.commands.registerCommand('pr.revealFileInOS', (e: GitFileChangeNode | InMemFileChangeNode | undefined) => {
239+
let fileChangeNode: FileChangeNode | undefined = e;
240+
// When invoked from a keybinding, get the selected item from the tree view
241+
if (!fileChangeNode) {
242+
// First check the prStatus:github tree (checked out PRs)
243+
for (const reviewManager of reviewsManager.reviewManagers) {
244+
const selection = reviewManager.changesInPrDataProvider.view.selection;
245+
const selectedFileChange = selection.find((node): node is GitFileChangeNode => node instanceof GitFileChangeNode);
246+
if (selectedFileChange) {
247+
fileChangeNode = selectedFileChange;
248+
break;
249+
}
250+
}
251+
// Then check the pr:github tree (non-checked out PRs)
252+
if (!fileChangeNode) {
253+
const prTreeSelection = tree.view.selection;
254+
const selectedInMemFileChange = prTreeSelection.find((node): node is InMemFileChangeNode => node instanceof InMemFileChangeNode);
255+
if (selectedInMemFileChange) {
256+
fileChangeNode = selectedInMemFileChange;
257+
}
258+
}
259+
}
260+
if (!fileChangeNode) {
261+
return;
262+
}
263+
const folderManager = reposManager.getManagerForIssueModel(fileChangeNode.pullRequest);
238264
if (folderManager) {
239-
const filePath = vscode.Uri.joinPath(folderManager.repository.rootUri, e.changeModel.fileName);
265+
const filePath = vscode.Uri.joinPath(folderManager.repository.rootUri, fileChangeNode.changeModel.fileName);
240266
vscode.commands.executeCommand('revealFileInOS', filePath);
241267
}
242268
}),

src/extension.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,7 @@ async function init(
260260

261261
tree.initialize(reviewsManager.reviewManagers.map(manager => manager.reviewModel), notificationsManager);
262262

263-
registerCommands(context, reposManager, reviewsManager, telemetry, copilotRemoteAgentManager, notificationsManager, prsTreeModel);
263+
registerCommands(context, reposManager, reviewsManager, telemetry, copilotRemoteAgentManager, notificationsManager, prsTreeModel, tree);
264264

265265
const layout = vscode.workspace.getConfiguration(PR_SETTINGS_NAMESPACE).get<string>(FILE_LIST_LAYOUT);
266266
await vscode.commands.executeCommand('setContext', 'fileListLayout:flat', layout === 'flat');

0 commit comments

Comments
 (0)