From 40b32cd4bb2149e23bd396e8c2dc1a413cf7971e Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 15 May 2018 12:42:48 +0200 Subject: [PATCH] better left click logic --- .../outline/electron-browser/outlineTree.ts | 36 +++++++++++++++---- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/src/vs/workbench/parts/outline/electron-browser/outlineTree.ts b/src/vs/workbench/parts/outline/electron-browser/outlineTree.ts index b3f2102f9b7..bbc1568963a 100644 --- a/src/vs/workbench/parts/outline/electron-browser/outlineTree.ts +++ b/src/vs/workbench/parts/outline/electron-browser/outlineTree.ts @@ -12,7 +12,7 @@ import { onUnexpectedError } from 'vs/base/common/errors'; import { createMatches } from 'vs/base/common/filters'; import { TPromise } from 'vs/base/common/winjs.base'; import { IDataSource, IFilter, IRenderer, ISorter, ITree } from 'vs/base/parts/tree/browser/tree'; -import { DefaultController, ICancelableEvent } from 'vs/base/parts/tree/browser/treeDefaults'; +import { DefaultController } from 'vs/base/parts/tree/browser/treeDefaults'; import 'vs/css!./media/symbol-icons'; import { Range } from 'vs/editor/common/core/range'; import { symbolKindToCssClass } from 'vs/editor/common/modes'; @@ -236,12 +236,34 @@ export class OutlineTreeState { export class OutlineController extends DefaultController { - protected onLeftClick(tree: ITree, element: any, eventish: ICancelableEvent, origin: string = 'mouse'): boolean { - let undoExpansion = element instanceof OutlineElement && !this.isClickOnTwistie(eventish); - let result = super.onLeftClick(tree, element, eventish, origin); - if (undoExpansion) { - tree.toggleExpansion(element, false).then(undefined, onUnexpectedError); + protected onLeftClick(tree: ITree, element: any, event: IMouseEvent, origin: string = 'mouse'): boolean { + + const payload = { origin: origin, originalEvent: event }; + + if (tree.getInput() === element) { + tree.clearFocus(payload); + tree.clearSelection(payload); + } else { + const isMouseDown = event && event.browserEvent && event.browserEvent.type === 'mousedown'; + if (!isMouseDown) { + event.preventDefault(); // we cannot preventDefault onMouseDown because this would break DND otherwise + } + event.stopPropagation(); + + tree.domFocus(); + tree.setSelection([element], payload); + tree.setFocus(element, payload); + + const didClickElement = element instanceof OutlineElement && !this.isClickOnTwistie(event); + + if (!didClickElement) { + if (tree.isExpanded(element)) { + tree.collapse(element).then(null, onUnexpectedError); + } else { + tree.expand(element).then(null, onUnexpectedError); + } + } } - return result; + return true; } }