@@ -10,7 +10,7 @@ import { IHoverDelegate } from '../../../../base/browser/ui/hover/hoverDelegate.
10
10
import { IconLabel } from '../../../../base/browser/ui/iconLabel/iconLabel.js' ;
11
11
import { IIdentityProvider , IListVirtualDelegate } from '../../../../base/browser/ui/list/list.js' ;
12
12
import { LabelFuzzyScore } from '../../../../base/browser/ui/tree/abstractTree.js' ;
13
- import { IAsyncDataSource , ITreeContextMenuEvent , ITreeElementRenderDetails , ITreeNode } from '../../../../base/browser/ui/tree/tree.js' ;
13
+ import { IAsyncDataSource , ITreeContextMenuEvent , ITreeDragAndDrop , ITreeElementRenderDetails , ITreeNode } from '../../../../base/browser/ui/tree/tree.js' ;
14
14
import { createMatches , FuzzyScore , IMatch } from '../../../../base/common/filters.js' ;
15
15
import { combinedDisposable , Disposable , DisposableStore , IDisposable , MutableDisposable } from '../../../../base/common/lifecycle.js' ;
16
16
import { autorun , autorunWithStore , derived , IObservable , observableValue , waitForState , constObservable , latestChangedValue , observableFromEvent , runOnChange , observableSignal , ISettableObservable } from '../../../../base/common/observable.js' ;
@@ -72,6 +72,10 @@ import { ITreeCompressionDelegate } from '../../../../base/browser/ui/tree/async
72
72
import { ICompressibleKeyboardNavigationLabelProvider , ICompressibleTreeRenderer } from '../../../../base/browser/ui/tree/objectTree.js' ;
73
73
import { ICompressedTreeNode } from '../../../../base/browser/ui/tree/compressedObjectTreeModel.js' ;
74
74
import { ILabelService } from '../../../../platform/label/common/label.js' ;
75
+ import { IDragAndDropData } from '../../../../base/browser/dnd.js' ;
76
+ import { ElementsDragAndDropData , ListViewTargetSector } from '../../../../base/browser/ui/list/listView.js' ;
77
+ import { CodeDataTransfers } from '../../../../platform/dnd/browser/dnd.js' ;
78
+ import { SCMHistoryItemTransferData } from './scmHistoryChatContext.js' ;
75
79
76
80
const PICK_REPOSITORY_ACTION_ID = 'workbench.scm.action.graph.pickRepository' ;
77
81
const PICK_HISTORY_ITEM_REFS_ACTION_ID = 'workbench.scm.action.graph.pickHistoryItemRefs' ;
@@ -946,6 +950,84 @@ class SCMHistoryTreeDataSource extends Disposable implements IAsyncDataSource<SC
946
950
}
947
951
}
948
952
953
+ class SCMHistoryTreeDragAndDrop implements ITreeDragAndDrop < TreeElement > {
954
+ getDragURI ( element : TreeElement ) : string | null {
955
+ const uri = this . _getTreeElementUri ( element ) ;
956
+ return uri ? uri . toString ( ) : null ;
957
+ }
958
+
959
+ onDragStart ( data : IDragAndDropData , originalEvent : DragEvent ) : void {
960
+ if ( ! originalEvent . dataTransfer ) {
961
+ return ;
962
+ }
963
+
964
+ const historyItems = this . _getDragAndDropData ( data as ElementsDragAndDropData < TreeElement , TreeElement [ ] > ) ;
965
+ if ( historyItems . length === 0 ) {
966
+ return ;
967
+ }
968
+
969
+ originalEvent . dataTransfer . setData ( CodeDataTransfers . SCM_HISTORY_ITEM , JSON . stringify ( historyItems ) ) ;
970
+ }
971
+
972
+ getDragLabel ( elements : TreeElement [ ] , originalEvent : DragEvent ) : string | undefined {
973
+ if ( elements . length === 1 ) {
974
+ const element = elements [ 0 ] ;
975
+ return this . _getTreeElementLabel ( element ) ;
976
+ }
977
+
978
+ return String ( elements . length ) ;
979
+ }
980
+
981
+ onDragOver ( data : IDragAndDropData , targetElement : TreeElement | undefined , targetIndex : number | undefined , targetSector : ListViewTargetSector | undefined , originalEvent : DragEvent ) : boolean {
982
+ return false ;
983
+ }
984
+
985
+ drop ( data : IDragAndDropData , targetElement : TreeElement | undefined , targetIndex : number | undefined , targetSector : ListViewTargetSector | undefined , originalEvent : DragEvent ) : void { }
986
+
987
+ private _getDragAndDropData ( data : ElementsDragAndDropData < TreeElement , TreeElement [ ] > ) : SCMHistoryItemTransferData [ ] {
988
+ const historyItems : SCMHistoryItemTransferData [ ] = [ ] ;
989
+ for ( const element of [ ...data . context ?? [ ] , ...data . elements ] ) {
990
+ if ( ! isSCMHistoryItemViewModelTreeElement ( element ) ) {
991
+ continue ;
992
+ }
993
+
994
+ const provider = element . repository . provider ;
995
+ const historyItem = element . historyItemViewModel . historyItem ;
996
+ const attachmentName = `$(${ Codicon . repo . id } )\u00A0${ provider . name } \u00A0$(${ Codicon . gitCommit . id } )\u00A0${ historyItem . displayId ?? historyItem . id } ` ;
997
+
998
+ historyItems . push ( {
999
+ name : attachmentName ,
1000
+ resource : ScmHistoryItemResolver . getMultiDiffSourceUri ( provider , historyItem ) ,
1001
+ historyItem : historyItem
1002
+ } ) ;
1003
+ }
1004
+
1005
+ return historyItems ;
1006
+ }
1007
+
1008
+ private _getTreeElementLabel ( element : TreeElement ) : string | undefined {
1009
+ if ( isSCMHistoryItemViewModelTreeElement ( element ) ) {
1010
+ const historyItem = element . historyItemViewModel . historyItem ;
1011
+ return getHistoryItemEditorTitle ( historyItem ) ;
1012
+ }
1013
+
1014
+ return undefined ;
1015
+ }
1016
+
1017
+ private _getTreeElementUri ( element : TreeElement ) : URI | undefined {
1018
+ if ( isSCMHistoryItemViewModelTreeElement ( element ) ) {
1019
+ const provider = element . repository . provider ;
1020
+ const historyItem = element . historyItemViewModel . historyItem ;
1021
+
1022
+ return ScmHistoryItemResolver . getMultiDiffSourceUri ( provider , historyItem ) ;
1023
+ }
1024
+
1025
+ return undefined ;
1026
+ }
1027
+
1028
+ dispose ( ) : void { }
1029
+ }
1030
+
949
1031
type HistoryItemRefsFilter = 'all' | 'auto' | string [ ] ;
950
1032
951
1033
type RepositoryState = {
@@ -1793,6 +1875,7 @@ export class SCMHistoryViewPane extends ViewPane {
1793
1875
identityProvider : this . _treeIdentityProvider ,
1794
1876
collapseByDefault : ( e : unknown ) => ! isSCMHistoryItemChangeNode ( e ) ,
1795
1877
compressionEnabled : compressionEnabled . get ( ) ,
1878
+ dnd : new SCMHistoryTreeDragAndDrop ( ) ,
1796
1879
keyboardNavigationLabelProvider : new SCMHistoryTreeKeyboardNavigationLabelProvider ( ) ,
1797
1880
horizontalScrolling : false ,
1798
1881
multipleSelectionSupport : false
0 commit comments