From 1dd559cddcfca9b81b3046981dd3743a78353e59 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 5 Feb 2019 17:13:23 +0100 Subject: [PATCH] tree.expandOnlyOnTwistieClick fixes #67909 --- src/vs/base/browser/ui/tree/abstractTree.ts | 30 ++++++++++++++------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/src/vs/base/browser/ui/tree/abstractTree.ts b/src/vs/base/browser/ui/tree/abstractTree.ts index 3262608778c..64e526e262b 100644 --- a/src/vs/base/browser/ui/tree/abstractTree.ts +++ b/src/vs/base/browser/ui/tree/abstractTree.ts @@ -7,7 +7,7 @@ import 'vs/css!./media/tree'; import { IDisposable, dispose, Disposable, toDisposable } from 'vs/base/common/lifecycle'; 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 { 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 { StandardKeyboardEvent, IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { KeyCode } from 'vs/base/common/keyCodes'; @@ -697,6 +697,7 @@ export interface IAbstractTreeOptions extends IAbstractTr readonly dnd?: ITreeDragAndDrop; readonly autoExpandSingleChildren?: boolean; readonly keyboardNavigationEventFilter?: IKeyboardNavigationEventFilter; + readonly expandOnlyOnTwistieClick?: boolean; } /** @@ -761,7 +762,7 @@ class Trait { } } -export class TreeNodeListMouseController extends MouseController> { +class TreeNodeListMouseController extends MouseController> { constructor(list: TreeNodeList, private tree: AbstractTree) { super(list); @@ -771,24 +772,32 @@ export class TreeNodeListMouseController extends MouseCont const node = e.element; if (!node) { - super.onPointer(e); - return; + return super.onPointer(e); } if (this.multipleSelectionController.isSelectionRangeChangeEvent(e) || this.multipleSelectionController.isSelectionSingleChangeEvent(e)) { - super.onPointer(e); - return; + return super.onPointer(e); } - if (!this.tree.options.openOnSingleClick && e.browserEvent.detail !== 2) { - super.onPointer(e); - return; + if (!this.tree.openOnSingleClick && e.browserEvent.detail !== 2) { + return super.onPointer(e); + } + + 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); // internal const location = model.getNodeLocation(node); const recursive = e.browserEvent.altKey; model.setCollapsed(location, undefined, recursive); + + if (this.tree.expandOnlyOnTwistieClick && onTwistie) { + return; + } + super.onPointer(e); } } @@ -900,7 +909,10 @@ export abstract class AbstractTree implements IDisposable readonly onWillRefilter: Event = this._onWillRefilter.event; 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 expandOnlyOnTwistieClick(): boolean { return typeof this._options.expandOnlyOnTwistieClick === 'undefined' ? false : this._options.expandOnlyOnTwistieClick; } get onDidDispose(): Event { return this.view.onDidDispose; } -- GitLab