提交 1dd559cd 编写于 作者: J Joao Moreno

tree.expandOnlyOnTwistieClick

fixes #67909
上级 e50ef11f
...@@ -7,7 +7,7 @@ import 'vs/css!./media/tree'; ...@@ -7,7 +7,7 @@ import 'vs/css!./media/tree';
import { IDisposable, dispose, Disposable, toDisposable } from 'vs/base/common/lifecycle'; import { IDisposable, dispose, Disposable, toDisposable } from 'vs/base/common/lifecycle';
import { IListOptions, List, IListStyles, mightProducePrintableCharacter, MouseController } from 'vs/base/browser/ui/list/listWidget'; import { IListOptions, List, IListStyles, mightProducePrintableCharacter, MouseController } from 'vs/base/browser/ui/list/listWidget';
import { IListVirtualDelegate, IListRenderer, IListMouseEvent, IListEvent, IListContextMenuEvent, IListDragAndDrop, IListDragOverReaction, IKeyboardNavigationLabelProvider } from 'vs/base/browser/ui/list/list'; import { IListVirtualDelegate, IListRenderer, IListMouseEvent, IListEvent, IListContextMenuEvent, IListDragAndDrop, IListDragOverReaction, IKeyboardNavigationLabelProvider } from 'vs/base/browser/ui/list/list';
import { append, $, toggleClass, getDomNodePagePosition, removeClass, addClass } from 'vs/base/browser/dom'; import { append, $, toggleClass, getDomNodePagePosition, removeClass, addClass, hasClass, createStyleSheet } from 'vs/base/browser/dom';
import { Event, Relay, Emitter, EventBufferer } from 'vs/base/common/event'; import { Event, Relay, Emitter, EventBufferer } from 'vs/base/common/event';
import { StandardKeyboardEvent, IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { StandardKeyboardEvent, IKeyboardEvent } from 'vs/base/browser/keyboardEvent';
import { KeyCode } from 'vs/base/common/keyCodes'; import { KeyCode } from 'vs/base/common/keyCodes';
...@@ -697,6 +697,7 @@ export interface IAbstractTreeOptions<T, TFilterData = void> extends IAbstractTr ...@@ -697,6 +697,7 @@ export interface IAbstractTreeOptions<T, TFilterData = void> extends IAbstractTr
readonly dnd?: ITreeDragAndDrop<T>; readonly dnd?: ITreeDragAndDrop<T>;
readonly autoExpandSingleChildren?: boolean; readonly autoExpandSingleChildren?: boolean;
readonly keyboardNavigationEventFilter?: IKeyboardNavigationEventFilter; readonly keyboardNavigationEventFilter?: IKeyboardNavigationEventFilter;
readonly expandOnlyOnTwistieClick?: boolean;
} }
/** /**
...@@ -761,7 +762,7 @@ class Trait<T> { ...@@ -761,7 +762,7 @@ class Trait<T> {
} }
} }
export class TreeNodeListMouseController<T, TFilterData, TRef> extends MouseController<ITreeNode<T, TFilterData>> { class TreeNodeListMouseController<T, TFilterData, TRef> extends MouseController<ITreeNode<T, TFilterData>> {
constructor(list: TreeNodeList<T, TFilterData, TRef>, private tree: AbstractTree<T, TFilterData, TRef>) { constructor(list: TreeNodeList<T, TFilterData, TRef>, private tree: AbstractTree<T, TFilterData, TRef>) {
super(list); super(list);
...@@ -771,24 +772,32 @@ export class TreeNodeListMouseController<T, TFilterData, TRef> extends MouseCont ...@@ -771,24 +772,32 @@ export class TreeNodeListMouseController<T, TFilterData, TRef> extends MouseCont
const node = e.element; const node = e.element;
if (!node) { if (!node) {
super.onPointer(e); return super.onPointer(e);
return;
} }
if (this.multipleSelectionController.isSelectionRangeChangeEvent(e) || this.multipleSelectionController.isSelectionSingleChangeEvent(e)) { if (this.multipleSelectionController.isSelectionRangeChangeEvent(e) || this.multipleSelectionController.isSelectionSingleChangeEvent(e)) {
super.onPointer(e); return super.onPointer(e);
return;
} }
if (!this.tree.options.openOnSingleClick && e.browserEvent.detail !== 2) { if (!this.tree.openOnSingleClick && e.browserEvent.detail !== 2) {
super.onPointer(e); return super.onPointer(e);
return; }
const onTwistie = hasClass(e.browserEvent.target as HTMLElement, 'monaco-tl-twistie');
if (this.tree.expandOnlyOnTwistieClick && !onTwistie) {
return super.onPointer(e);
} }
const model = ((this.tree as any).model as ITreeModel<T, TFilterData, TRef>); // internal const model = ((this.tree as any).model as ITreeModel<T, TFilterData, TRef>); // internal
const location = model.getNodeLocation(node); const location = model.getNodeLocation(node);
const recursive = e.browserEvent.altKey; const recursive = e.browserEvent.altKey;
model.setCollapsed(location, undefined, recursive); model.setCollapsed(location, undefined, recursive);
if (this.tree.expandOnlyOnTwistieClick && onTwistie) {
return;
}
super.onPointer(e); super.onPointer(e);
} }
} }
...@@ -900,7 +909,10 @@ export abstract class AbstractTree<T, TFilterData, TRef> implements IDisposable ...@@ -900,7 +909,10 @@ export abstract class AbstractTree<T, TFilterData, TRef> implements IDisposable
readonly onWillRefilter: Event<void> = this._onWillRefilter.event; readonly onWillRefilter: Event<void> = this._onWillRefilter.event;
get filterOnType(): boolean { return !!this._options.filterOnType; } get filterOnType(): boolean { return !!this._options.filterOnType; }
// Options TODO@joao expose options only, not Optional<>
get openOnSingleClick(): boolean { return typeof this._options.openOnSingleClick === 'undefined' ? true : this._options.openOnSingleClick; } get openOnSingleClick(): boolean { return typeof this._options.openOnSingleClick === 'undefined' ? true : this._options.openOnSingleClick; }
get expandOnlyOnTwistieClick(): boolean { return typeof this._options.expandOnlyOnTwistieClick === 'undefined' ? false : this._options.expandOnlyOnTwistieClick; }
get onDidDispose(): Event<void> { return this.view.onDidDispose; } get onDidDispose(): Event<void> { return this.view.onDidDispose; }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册