Change:
<!-- Do Not Delete This! featurerequesttemplate --<!-- Please read our Rules of Conduct: --<!-- Please search existing issues to avoid creating duplicates. --I frequently use the drag-and-drop feature from the Explorer view to open files into specific panes. It would be really nice if this functionality was supported in the Source Control panel as well. I imagine it working like: Drag from filename into pane opens diff in that pane Drag from file icon into pane opens original file in that pane with reversed behavior if .
Not sure if this belongs here, or would be better a new feature request: If I have already two panels open next to each other, opening the git diff in one panel is pretty small and no fun to read, e.g.: ! For me it would be nice, if the first two panels would be used for the diff In IntelliJ the diffs opens in a detached popup, which I can move around and resize individually. I also like this feature a lot
please open a new issue -- although note, that the behavior you describe is unlikely to change, as that is how tab management works in VS Code.
One additional use case: I just enabled drag and drop into the SCM input box. It would be nice if we could drag and drop files from the SCM panel into the box to insert this file path (this already works with files from the explorer)

Discussion:
import { WorkbenchCompressibleObjectTree, IOpenEvent } from 'vs/platform/list/browser/listService'; import { IConfigurationService, ConfigurationTarget, IConfigurationChangeEvent } from 'vs/platform/configuration/common/configuration'; import { disposableTimeout, ThrottledDelayer } from 'vs/base/common/async'; <del> import { ITreeNode, ITreeFilter, ITreeSorter, ITreeContextMenuEvent } from 'vs/base/browser/ui/tree/tree'; </del> <ins> import { ITreeNode, ITreeFilter, ITreeSorter, ITreeContextMenuEvent, ITreeDragAndDrop, ITreeDragOverReaction } from 'vs/base/browser/ui/tree/tree'; </ins> import { ResourceTree, IResourceNode } from 'vs/base/common/resourceTree'; import { ISplice } from 'vs/base/common/sequence'; import { ICompressibleTreeRenderer, ICompressibleKeyboardNavigationLabelProvider } from 'vs/base/browser/ui/tree/objectTree';

import { CodeActionController } from 'vs/editor/contrib/codeAction/browser/codeActionController'; import { IResolvedTextEditorModel, ITextModelContentProvider, ITextModelService } from 'vs/editor/common/services/resolverService'; import { Schemas } from 'vs/base/common/network'; <ins> import { IDragAndDropData } from 'vs/base/browser/dnd'; import { fillEditorsDragData } from 'vs/workbench/browser/dnd'; import { ElementsDragAndDropData } from 'vs/base/browser/ui/list/listView'; import { CodeDataTransfers } from 'vs/platform/dnd/browser/dnd'; </ins> type TreeElement = ISCMRepository | ISCMInput | ISCMActionButton | ISCMResourceGroup | IResourceNode<ISCMResource, ISCMResourceGroup> | ISCMResource;

} } <ins> class SCMTreeDragAndDrop implements ITreeDragAndDrop<TreeElement> { constructor(private readonly instantiationService: IInstantiationService) { } getDragURI(element: TreeElement): string | null { if (isSCMResource(element)) { return element.sourceUri.toString(); } return null; } onDragStart(data: IDragAndDropData, originalEvent: DragEvent): void { const items = SCMTreeDragAndDrop.getResourcesFromDragAndDropData(data as ElementsDragAndDropData<TreeElement, TreeElement[]>); if (originalEvent.dataTransfer && items?.length) { this.instantiationService.invokeFunction(accessor => fillEditorsDragData(accessor, items, originalEvent)); const fileResources = items.filter(s => s.scheme === Schemas.file).map(r => r.fsPath); if (fileResources.length) { originalEvent.dataTransfer.setData(CodeDataTransfers.FILES, JSON.stringify(fileResources)); } } } getDragLabel(elements: TreeElement[], originalEvent: DragEvent): string | undefined { if (elements.length === 1) { const element = elements[0]; if (isSCMResource(element)) { return basename(element.sourceUri); } } return String(elements.length); } onDragOver(data: IDragAndDropData, targetElement: TreeElement | undefined, targetIndex: number | undefined, originalEvent: DragEvent): boolean | ITreeDragOverReaction { return true; } drop(data: IDragAndDropData, targetElement: TreeElement | undefined, targetIndex: number | undefined, originalEvent: DragEvent): void { } private static getResourcesFromDragAndDropData(data: ElementsDragAndDropData<TreeElement, TreeElement[]>): URI[] { const uris: URI[] = []; for (const element of [...data.context ?? [], ...data.elements]) { if (isSCMResource(element)) { uris.push(element.sourceUri); } } return uris; } } </ins> interface InputTemplate { readonly inputWidget: SCMInputWidget; readonly elementDisposables: DisposableStore;

const sorter = new SCMTreeSorter(() => this._viewModel); const keyboardNavigationLabelProvider = this.instantiationService.createInstance(SCMTreeKeyboardNavigationLabelProvider, () => this._viewModel); const identityProvider = new SCMResourceIdentityProvider(); <ins> const dnd = new SCMTreeDragAndDrop(this.instantiationService); </ins> this.tree = this.instantiationService.createInstance( WorkbenchCompressibleObjectTree,

{ transformOptimization: false, identityProvider, <ins> dnd, </ins> horizontalScrolling: false, setRowLineHeight: false, filter,