From da5ded8393c60ef8bb6985327b8b714cd145ddde Mon Sep 17 00:00:00 2001 From: Rajaniraiyn Rajagiri Date: Tue, 28 Oct 2025 01:04:13 +0530 Subject: [PATCH] add DnD for SCM history items into terminal, editor and external --- .../contrib/scm/browser/scmHistoryViewPane.ts | 4 +++- .../contrib/terminal/browser/terminalInstance.ts | 15 ++++++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/scm/browser/scmHistoryViewPane.ts b/src/vs/workbench/contrib/scm/browser/scmHistoryViewPane.ts index 21a3f1e9ae034..183d7861d5f94 100644 --- a/src/vs/workbench/contrib/scm/browser/scmHistoryViewPane.ts +++ b/src/vs/workbench/contrib/scm/browser/scmHistoryViewPane.ts @@ -71,7 +71,7 @@ import { ITreeCompressionDelegate } from '../../../../base/browser/ui/tree/async import { ICompressibleKeyboardNavigationLabelProvider, ICompressibleTreeRenderer } from '../../../../base/browser/ui/tree/objectTree.js'; import { ICompressedTreeNode } from '../../../../base/browser/ui/tree/compressedObjectTreeModel.js'; import { ILabelService } from '../../../../platform/label/common/label.js'; -import { IDragAndDropData } from '../../../../base/browser/dnd.js'; +import { DataTransfers, IDragAndDropData } from '../../../../base/browser/dnd.js'; import { ElementsDragAndDropData, ListViewTargetSector } from '../../../../base/browser/ui/list/listView.js'; import { CodeDataTransfers } from '../../../../platform/dnd/browser/dnd.js'; import { SCMHistoryItemTransferData } from './scmHistoryChatContext.js'; @@ -953,6 +953,8 @@ class SCMHistoryTreeDragAndDrop implements ITreeDragAndDrop { return; } + originalEvent.dataTransfer.setData(DataTransfers.TEXT, historyItems.map(hi => hi.historyItem.id).join(' ')); + originalEvent.dataTransfer.setData(CodeDataTransfers.SCM_HISTORY_ITEM, JSON.stringify(historyItems)); } diff --git a/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts b/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts index 254432f6794a9..a779d12e623be 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts @@ -93,6 +93,7 @@ import type { IProgressState } from '@xterm/addon-progress'; import { refreshShellIntegrationInfoStatus } from './terminalTooltip.js'; import { generateUuid } from '../../../../base/common/uuid.js'; import { PromptInputState } from '../../../../platform/terminal/common/capabilities/commandDetection/promptInputModel.js'; +import { extractSCMHistoryItemDropData, SCMHistoryItemTransferData } from '../../scm/browser/scmHistoryChatContext.js'; const enum Constants { /** @@ -1204,6 +1205,10 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { this.focus(); await this.sendPath(path, false); })); + store.add(dndController.onDropSCMHistoryItem(commitHash => { + this.focus(); + this.sendText(commitHash.historyItem.id, false); + })); store.add(new dom.DragAndDropObserver(container, dndController)); this._dndObserver.value = store; } @@ -2428,6 +2433,8 @@ class TerminalInstanceDragAndDropController extends Disposable implements dom.ID get onDropFile(): Event { return this._onDropFile.event; } private readonly _onDropTerminal = this._register(new Emitter()); get onDropTerminal(): Event { return this._onDropTerminal.event; } + private readonly _onDropSCMHistoryItem = this._register(new Emitter()); + get onDropSCMHistoryItem(): Event { return this._onDropSCMHistoryItem.event; } constructor( private readonly _container: HTMLElement, @@ -2444,7 +2451,7 @@ class TerminalInstanceDragAndDropController extends Disposable implements dom.ID } onDragEnter(e: DragEvent) { - if (!containsDragType(e, DataTransfers.FILES, DataTransfers.RESOURCES, TerminalDataTransfers.Terminals, CodeDataTransfers.FILES)) { + if (!containsDragType(e, DataTransfers.FILES, DataTransfers.RESOURCES, TerminalDataTransfers.Terminals, CodeDataTransfers.FILES, CodeDataTransfers.SCM_HISTORY_ITEM)) { return; } @@ -2520,6 +2527,12 @@ class TerminalInstanceDragAndDropController extends Disposable implements dom.ID path = URI.file(getPathForFile(e.dataTransfer.files[0])!); } + const commitHashes = extractSCMHistoryItemDropData(e); + if (!path && commitHashes?.length) { + this._onDropSCMHistoryItem.fire(commitHashes[0]); + return; + } + if (!path) { return; }