Skip to content

Commit 742e27c

Browse files
committed
tree: dnd auto expand
1 parent 7b50be2 commit 742e27c

1 file changed

Lines changed: 26 additions & 5 deletions

File tree

src/vs/base/browser/ui/tree/abstractTree.ts

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@
44
*--------------------------------------------------------------------------------------------*/
55

66
import 'vs/css!./media/tree';
7-
import { IDisposable, dispose } from 'vs/base/common/lifecycle';
7+
import { IDisposable, dispose, Disposable } from 'vs/base/common/lifecycle';
88
import { IListOptions, List, IListStyles } from 'vs/base/browser/ui/list/listWidget';
99
import { IListVirtualDelegate, IListRenderer, IListMouseEvent, IListEvent, IListContextMenuEvent, IListDragAndDrop, IListDragOverReaction } from 'vs/base/browser/ui/list/list';
10-
import { append, $, toggleClass } from 'vs/base/browser/dom';
10+
import { append, $, toggleClass, timeout } from 'vs/base/browser/dom';
1111
import { Event, Relay } from 'vs/base/common/event';
1212
import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent';
1313
import { KeyCode } from 'vs/base/common/keyCodes';
@@ -18,6 +18,9 @@ import { range } from 'vs/base/common/arrays';
1818

1919
class TreeNodeListDragAndDrop<T, TFilterData, TRef> implements IListDragAndDrop<ITreeNode<T, TFilterData>> {
2020

21+
private autoExpandNode: ITreeNode<T, TFilterData> | undefined;
22+
private autoExpandDisposable: IDisposable = Disposable.None;
23+
2124
constructor(private modelProvider: () => ITreeModel<T, TFilterData, TRef>, private dnd: ITreeDragAndDrop<T>) { }
2225

2326
getDragURI(node: ITreeNode<T, TFilterData>): string | null {
@@ -32,15 +35,33 @@ class TreeNodeListDragAndDrop<T, TFilterData, TRef> implements IListDragAndDrop<
3235
this.dnd.onDragStart(data, originalEvent);
3336
}
3437

35-
onDragOver(data: IDragAndDropData, targetNode: ITreeNode<T, TFilterData> | undefined, targetIndex: number | undefined, originalEvent: DragEvent, force = false): boolean | IListDragOverReaction {
38+
onDragOver(data: IDragAndDropData, targetNode: ITreeNode<T, TFilterData> | undefined, targetIndex: number | undefined, originalEvent: DragEvent, raw = true): boolean | IListDragOverReaction {
3639
const result = this.dnd.onDragOver(data, targetNode && targetNode.element, targetIndex, originalEvent);
3740

3841
if (typeof targetNode === 'undefined') {
3942
return result;
4043
}
4144

45+
if (this.autoExpandNode !== targetNode) {
46+
this.autoExpandDisposable.dispose();
47+
this.autoExpandNode = targetNode;
48+
}
49+
50+
if (typeof result !== 'boolean' && result.autoExpand) {
51+
this.autoExpandDisposable = timeout(() => {
52+
const model = this.modelProvider();
53+
const ref = model.getNodeLocation(targetNode);
54+
55+
if (model.isCollapsed(ref)) {
56+
model.setCollapsed(ref, false);
57+
}
58+
59+
this.autoExpandNode = undefined;
60+
}, 500);
61+
}
62+
4263
if (typeof result === 'boolean' || !result.accept || typeof result.bubble === 'undefined') {
43-
if (force) {
64+
if (!raw) {
4465
const accept = typeof result === 'boolean' ? result : result.accept;
4566
const effect = typeof result === 'boolean' ? undefined : result.effect;
4667
return { accept, effect, feedback: [targetIndex!] };
@@ -54,7 +75,7 @@ class TreeNodeListDragAndDrop<T, TFilterData, TRef> implements IListDragAndDrop<
5475
const model = this.modelProvider();
5576
const parentIndex = parentNode && model.getListIndex(model.getNodeLocation(parentNode));
5677

57-
return this.onDragOver(data, parentNode, parentIndex, originalEvent, true);
78+
return this.onDragOver(data, parentNode, parentIndex, originalEvent, false);
5879
}
5980

6081
const model = this.modelProvider();

0 commit comments

Comments
 (0)