Skip to content

Commit 02091fa

Browse files
committed
Merge branch 'joao/list-open'
2 parents fd2658d + 9914ad7 commit 02091fa

26 files changed

Lines changed: 228 additions & 395 deletions

File tree

src/vs/base/browser/ui/list/listPaging.ts

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import 'vs/css!./list';
77
import { IDisposable, Disposable } from 'vs/base/common/lifecycle';
88
import { range } from 'vs/base/common/arrays';
9-
import { IListVirtualDelegate, IListRenderer, IListEvent, IListContextMenuEvent } from './list';
9+
import { IListVirtualDelegate, IListRenderer, IListEvent, IListContextMenuEvent, IListMouseEvent } from './list';
1010
import { List, IListStyles, IListOptions, IListAccessibilityProvider, IListOptionsUpdate } from './listWidget';
1111
import { IPagedModel } from 'vs/base/common/paging';
1212
import { Event } from 'vs/base/common/event';
@@ -168,22 +168,18 @@ export class PagedList<T> implements IDisposable {
168168
return this.list.onDidDispose;
169169
}
170170

171-
get onDidChangeFocus(): Event<IListEvent<T>> {
172-
return Event.map(this.list.onDidChangeFocus, ({ elements, indexes, browserEvent }) => ({ elements: elements.map(e => this._model.get(e)), indexes, browserEvent }));
171+
get onMouseDblClick(): Event<IListMouseEvent<T>> {
172+
return Event.map(this.list.onMouseDblClick, ({ element, index, browserEvent }) => ({ element: element === undefined ? undefined : this._model.get(element), index, browserEvent }));
173173
}
174174

175-
get onDidOpen(): Event<IListEvent<T>> {
176-
return Event.map(this.list.onDidOpen, ({ elements, indexes, browserEvent }) => ({ elements: elements.map(e => this._model.get(e)), indexes, browserEvent }));
175+
get onDidChangeFocus(): Event<IListEvent<T>> {
176+
return Event.map(this.list.onDidChangeFocus, ({ elements, indexes, browserEvent }) => ({ elements: elements.map(e => this._model.get(e)), indexes, browserEvent }));
177177
}
178178

179179
get onDidChangeSelection(): Event<IListEvent<T>> {
180180
return Event.map(this.list.onDidChangeSelection, ({ elements, indexes, browserEvent }) => ({ elements: elements.map(e => this._model.get(e)), indexes, browserEvent }));
181181
}
182182

183-
get onPin(): Event<IListEvent<T>> {
184-
return Event.map(this.list.onDidPin, ({ elements, indexes, browserEvent }) => ({ elements: elements.map(e => this._model.get(e)), indexes, browserEvent }));
185-
}
186-
187183
get onContextMenu(): Event<IListContextMenuEvent<T>> {
188184
return Event.map(this.list.onContextMenu, ({ element, index, anchor, browserEvent }) => (typeof element === 'undefined' ? { element, index, anchor, browserEvent } : { element: this._model.get(element), index, anchor, browserEvent }));
189185
}
@@ -217,10 +213,6 @@ export class PagedList<T> implements IDisposable {
217213
this.list.scrollLeft = scrollLeft;
218214
}
219215

220-
open(indexes: number[], browserEvent?: UIEvent): void {
221-
this.list.open(indexes, browserEvent);
222-
}
223-
224216
setFocus(indexes: number[]): void {
225217
this.list.setFocus(indexes);
226218
}

src/vs/base/browser/ui/list/listWidget.ts

Lines changed: 0 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,6 @@ function isInputElement(e: HTMLElement): boolean {
231231
class KeyboardController<T> implements IDisposable {
232232

233233
private readonly disposables = new DisposableStore();
234-
private openController: IOpenController;
235234

236235
constructor(
237236
private list: List<T>,
@@ -240,8 +239,6 @@ class KeyboardController<T> implements IDisposable {
240239
) {
241240
const multipleSelectionSupport = options.multipleSelectionSupport !== false;
242241

243-
this.openController = options.openController || DefaultOpenController;
244-
245242
const onKeyDown = Event.chain(domEvent(view.domNode, 'keydown'))
246243
.filter(e => !isInputElement(e.target as HTMLElement))
247244
.map(e => new StandardKeyboardEvent(e));
@@ -262,10 +259,6 @@ class KeyboardController<T> implements IDisposable {
262259
e.preventDefault();
263260
e.stopPropagation();
264261
this.list.setSelection(this.list.getFocus(), e.browserEvent);
265-
266-
if (this.openController.shouldOpen(e.browserEvent)) {
267-
this.list.open(this.list.getFocus(), e.browserEvent);
268-
}
269262
}
270263

271264
private onUpArrow(e: StandardKeyboardEvent): void {
@@ -527,21 +520,10 @@ const DefaultMultipleSelectionController = {
527520
isSelectionRangeChangeEvent
528521
};
529522

530-
const DefaultOpenController: IOpenController = {
531-
shouldOpen: (event: UIEvent) => {
532-
if (event instanceof MouseEvent) {
533-
return !isMouseRightClick(event);
534-
}
535-
536-
return true;
537-
}
538-
};
539-
540523
export class MouseController<T> implements IDisposable {
541524

542525
private multipleSelectionSupport: boolean;
543526
readonly multipleSelectionController: IMultipleSelectionController<T> | undefined;
544-
private openController: IOpenController;
545527
private mouseSupport: boolean;
546528
private readonly disposables = new DisposableStore();
547529

@@ -552,7 +534,6 @@ export class MouseController<T> implements IDisposable {
552534
this.multipleSelectionController = list.options.multipleSelectionController || DefaultMultipleSelectionController;
553535
}
554536

555-
this.openController = list.options.openController || DefaultOpenController;
556537
this.mouseSupport = typeof list.options.mouseSupport === 'undefined' || !!list.options.mouseSupport;
557538

558539
if (this.mouseSupport) {
@@ -632,10 +613,6 @@ export class MouseController<T> implements IDisposable {
632613

633614
if (!isMouseRightClick(e.browserEvent)) {
634615
this.list.setSelection([focus], e.browserEvent);
635-
636-
if (this.openController.shouldOpen(e.browserEvent)) {
637-
this.list.open([focus], e.browserEvent);
638-
}
639616
}
640617
}
641618

@@ -650,7 +627,6 @@ export class MouseController<T> implements IDisposable {
650627

651628
const focus = this.list.getFocus();
652629
this.list.setSelection(focus, e.browserEvent);
653-
this.list.pin(focus);
654630
}
655631

656632
private changeSelection(e: IListMouseEvent<T> | IListTouchEvent<T>, reference: number | undefined): void {
@@ -694,10 +670,6 @@ export interface IMultipleSelectionController<T> {
694670
isSelectionRangeChangeEvent(event: IListMouseEvent<T> | IListTouchEvent<T>): boolean;
695671
}
696672

697-
export interface IOpenController {
698-
shouldOpen(event: UIEvent): boolean;
699-
}
700-
701673
export interface IStyleController {
702674
style(styles: IListStyles): void;
703675
}
@@ -841,7 +813,6 @@ export interface IListOptions<T> {
841813
readonly keyboardSupport?: boolean;
842814
readonly multipleSelectionSupport?: boolean;
843815
readonly multipleSelectionController?: IMultipleSelectionController<T>;
844-
readonly openController?: IOpenController;
845816
readonly styleController?: (suffix: string) => IStyleController;
846817
readonly accessibilityProvider?: IListAccessibilityProvider<T>;
847818

@@ -1134,12 +1105,6 @@ export class List<T> implements ISpliceable<T>, IDisposable {
11341105
return Event.map(this.eventBufferer.wrapEvent(this.selection.onChange), e => this.toListEvent(e));
11351106
}
11361107

1137-
private readonly _onDidOpen = new Emitter<IListEvent<T>>();
1138-
readonly onDidOpen: Event<IListEvent<T>> = this._onDidOpen.event;
1139-
1140-
private readonly _onDidPin = new Emitter<IListEvent<T>>();
1141-
readonly onDidPin: Event<IListEvent<T>> = this._onDidPin.event;
1142-
11431108
get domId(): string { return this.view.domId; }
11441109
get onDidScroll(): Event<ScrollEvent> { return this.view.onDidScroll; }
11451110
get onMouseClick(): Event<IListMouseEvent<T>> { return this.view.onMouseClick; }
@@ -1625,26 +1590,6 @@ export class List<T> implements ISpliceable<T>, IDisposable {
16251590
return this.view.domNode;
16261591
}
16271592

1628-
open(indexes: number[], browserEvent?: UIEvent): void {
1629-
for (const index of indexes) {
1630-
if (index < 0 || index >= this.length) {
1631-
throw new ListError(this.user, `Invalid index ${index}`);
1632-
}
1633-
}
1634-
1635-
this._onDidOpen.fire({ indexes, elements: indexes.map(i => this.view.element(i)), browserEvent });
1636-
}
1637-
1638-
pin(indexes: number[], browserEvent?: UIEvent): void {
1639-
for (const index of indexes) {
1640-
if (index < 0 || index >= this.length) {
1641-
throw new ListError(this.user, `Invalid index ${index}`);
1642-
}
1643-
}
1644-
1645-
this._onDidPin.fire({ indexes, elements: indexes.map(i => this.view.element(i)), browserEvent });
1646-
}
1647-
16481593
style(styles: IListStyles): void {
16491594
this.styleController.style(styles);
16501595
}
@@ -1687,8 +1632,6 @@ export class List<T> implements ISpliceable<T>, IDisposable {
16871632
this._onDidDispose.fire();
16881633
this.disposables.dispose();
16891634

1690-
this._onDidOpen.dispose();
1691-
this._onDidPin.dispose();
16921635
this._onDidDispose.dispose();
16931636
}
16941637
}

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

Lines changed: 1 addition & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import 'vs/css!./media/tree';
77
import { IDisposable, dispose, Disposable, toDisposable, DisposableStore } from 'vs/base/common/lifecycle';
88
import { IListOptions, List, IListStyles, MouseController, DefaultKeyboardNavigationDelegate } from 'vs/base/browser/ui/list/listWidget';
9-
import { IListVirtualDelegate, IListRenderer, IListMouseEvent, IListEvent, IListContextMenuEvent, IListDragAndDrop, IListDragOverReaction, IKeyboardNavigationLabelProvider, IIdentityProvider, IKeyboardNavigationDelegate } from 'vs/base/browser/ui/list/list';
9+
import { IListVirtualDelegate, IListRenderer, IListMouseEvent, IListContextMenuEvent, IListDragAndDrop, IListDragOverReaction, IKeyboardNavigationLabelProvider, IIdentityProvider, IKeyboardNavigationDelegate } from 'vs/base/browser/ui/list/list';
1010
import { append, $, toggleClass, getDomNodePagePosition, removeClass, addClass, hasClass, hasParentWithClass, createStyleSheet, clearNode, addClasses, removeClasses } from 'vs/base/browser/dom';
1111
import { Event, Relay, Emitter, EventBufferer } from 'vs/base/common/event';
1212
import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent';
@@ -921,13 +921,6 @@ function isInputElement(e: HTMLElement): boolean {
921921
return e.tagName === 'INPUT' || e.tagName === 'TEXTAREA';
922922
}
923923

924-
function asTreeEvent<T>(event: IListEvent<ITreeNode<T, any>>): ITreeEvent<T> {
925-
return {
926-
elements: event.elements.map(node => node.element),
927-
browserEvent: event.browserEvent
928-
};
929-
}
930-
931924
function asTreeMouseEvent<T>(event: IListMouseEvent<ITreeNode<T, any>>): ITreeMouseEvent<T> {
932925
let target: TreeMouseEventTarget = TreeMouseEventTarget.Unknown;
933926

@@ -960,7 +953,6 @@ export interface IAbstractTreeOptionsUpdate extends ITreeRendererOptions {
960953
readonly automaticKeyboardNavigation?: boolean;
961954
readonly simpleKeyboardNavigation?: boolean;
962955
readonly filterOnType?: boolean;
963-
readonly openOnSingleClick?: boolean;
964956
readonly smoothScrolling?: boolean;
965957
readonly horizontalScrolling?: boolean;
966958
}
@@ -1107,11 +1099,6 @@ class TreeNodeListMouseController<T, TFilterData, TRef> extends MouseController<
11071099
}
11081100

11091101
const onTwistie = hasClass(e.browserEvent.target as HTMLElement, 'monaco-tl-twistie');
1110-
1111-
if (!this.tree.openOnSingleClick && e.browserEvent.detail !== 2 && !onTwistie) {
1112-
return super.onPointer(e);
1113-
}
1114-
11151102
let expandOnlyOnTwistieClick = false;
11161103

11171104
if (typeof this.tree.expandOnlyOnTwistieClick === 'function') {
@@ -1238,8 +1225,6 @@ export abstract class AbstractTree<T, TFilterData, TRef> implements IDisposable
12381225

12391226
get onDidChangeFocus(): Event<ITreeEvent<T>> { return this.eventBufferer.wrapEvent(this.focus.onDidChange); }
12401227
get onDidChangeSelection(): Event<ITreeEvent<T>> { return this.eventBufferer.wrapEvent(this.selection.onDidChange); }
1241-
get onDidOpen(): Event<ITreeEvent<T>> { return Event.map(this.view.onDidOpen, asTreeEvent); }
1242-
get onDidPin(): Event<ITreeEvent<T>> { return Event.map(this.view.onDidPin, asTreeEvent); }
12431228

12441229
get onMouseClick(): Event<ITreeMouseEvent<T>> { return Event.map(this.view.onMouseClick, asTreeMouseEvent); }
12451230
get onMouseDblClick(): Event<ITreeMouseEvent<T>> { return Event.map(this.view.onMouseDblClick, asTreeMouseEvent); }
@@ -1261,7 +1246,6 @@ export abstract class AbstractTree<T, TFilterData, TRef> implements IDisposable
12611246
get filterOnType(): boolean { return !!this._options.filterOnType; }
12621247
get onDidChangeTypeFilterPattern(): Event<string> { return this.typeFilterController ? this.typeFilterController.onDidChangePattern : Event.None; }
12631248

1264-
get openOnSingleClick(): boolean { return typeof this._options.openOnSingleClick === 'undefined' ? true : this._options.openOnSingleClick; }
12651249
get expandOnlyOnTwistieClick(): boolean | ((e: T) => boolean) { return typeof this._options.expandOnlyOnTwistieClick === 'undefined' ? false : this._options.expandOnlyOnTwistieClick; }
12661250

12671251
private readonly _onDidUpdateOptions = new Emitter<IAbstractTreeOptions<T, TFilterData>>();
@@ -1602,11 +1586,6 @@ export abstract class AbstractTree<T, TFilterData, TRef> implements IDisposable
16021586
return this.focus.get();
16031587
}
16041588

1605-
open(elements: TRef[], browserEvent?: UIEvent): void {
1606-
const indexes = elements.map(e => this.model.getListIndex(e)).filter(i => i >= 0);
1607-
this.view.open(indexes, browserEvent);
1608-
}
1609-
16101589
reveal(location: TRef, relativeTop?: number): void {
16111590
this.model.expandTo(location);
16121591

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

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -330,7 +330,6 @@ export class AsyncDataTree<TInput, T, TFilterData = void> implements IDisposable
330330

331331
get onDidChangeFocus(): Event<ITreeEvent<T>> { return Event.map(this.tree.onDidChangeFocus, asTreeEvent); }
332332
get onDidChangeSelection(): Event<ITreeEvent<T>> { return Event.map(this.tree.onDidChangeSelection, asTreeEvent); }
333-
get onDidOpen(): Event<ITreeEvent<T>> { return Event.map(this.tree.onDidOpen, asTreeEvent); }
334333

335334
get onKeyDown(): Event<KeyboardEvent> { return this.tree.onKeyDown; }
336335
get onMouseClick(): Event<ITreeMouseEvent<T>> { return Event.map(this.tree.onMouseClick, asTreeMouseEvent); }
@@ -344,7 +343,6 @@ export class AsyncDataTree<TInput, T, TFilterData = void> implements IDisposable
344343
get onDidUpdateOptions(): Event<IAsyncDataTreeOptionsUpdate> { return this.tree.onDidUpdateOptions; }
345344

346345
get filterOnType(): boolean { return this.tree.filterOnType; }
347-
get openOnSingleClick(): boolean { return this.tree.openOnSingleClick; }
348346
get expandOnlyOnTwistieClick(): boolean | ((e: T) => boolean) {
349347
if (typeof this.tree.expandOnlyOnTwistieClick === 'boolean') {
350348
return this.tree.expandOnlyOnTwistieClick;
@@ -671,11 +669,6 @@ export class AsyncDataTree<TInput, T, TFilterData = void> implements IDisposable
671669
return nodes.map(n => n!.element as T);
672670
}
673671

674-
open(elements: T[], browserEvent?: UIEvent): void {
675-
const nodes = elements.map(e => this.getDataNode(e));
676-
this.tree.open(nodes, browserEvent);
677-
}
678-
679672
reveal(element: T, relativeTop?: number): void {
680673
this.tree.reveal(this.getDataNode(element), relativeTop);
681674
}

src/vs/base/parts/quickinput/browser/quickInputList.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,6 @@ export class QuickInputList {
283283
const accessibilityProvider = new QuickInputAccessibilityProvider();
284284
this.list = options.createList('QuickInput', this.container, delegate, [new ListElementRenderer()], {
285285
identityProvider: { getId: element => element.saneLabel },
286-
openController: { shouldOpen: () => false }, // Workaround #58124
287286
setRowLineHeight: false,
288287
multipleSelectionSupport: false,
289288
horizontalScrolling: false,

src/vs/editor/contrib/gotoSymbol/peek/referencesWidget.ts

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import 'vs/css!./referencesWidget';
77
import * as dom from 'vs/base/browser/dom';
88
import { IMouseEvent } from 'vs/base/browser/mouseEvent';
9-
import { GestureEvent } from 'vs/base/browser/touch';
109
import { Orientation } from 'vs/base/browser/ui/sash/sash';
1110
import { Color } from 'vs/base/common/color';
1211
import { Emitter, Event } from 'vs/base/common/event';
@@ -317,6 +316,8 @@ export class ReferenceWidget extends peekView.PeekViewWidget {
317316
accessibilityProvider: new AccessibilityProvider(),
318317
keyboardNavigationLabelProvider: this._instantiationService.createInstance(StringRepresentationProvider),
319318
identityProvider: new IdentityProvider(),
319+
openOnSingleClick: true,
320+
openOnFocus: true,
320321
overrideStyles: {
321322
listBackground: peekView.peekViewResultsBackground
322323
}
@@ -372,22 +373,13 @@ export class ReferenceWidget extends peekView.PeekViewWidget {
372373
this._onDidSelectReference.fire({ element, kind, source: 'tree' });
373374
}
374375
};
375-
this._tree.onDidChangeFocus(e => {
376-
onEvent(e.elements[0], 'show');
377-
});
378376
this._tree.onDidOpen(e => {
379-
if (e.browserEvent instanceof MouseEvent && (e.browserEvent.ctrlKey || e.browserEvent.metaKey || e.browserEvent.altKey)) {
380-
// modifier-click -> open to the side
381-
onEvent(e.elements[0], 'side');
382-
} else if (e.browserEvent instanceof KeyboardEvent || (e.browserEvent instanceof MouseEvent && e.browserEvent.detail === 2) || (<GestureEvent>e.browserEvent).tapCount === 2) {
383-
// keybinding (list service command)
384-
// OR double click
385-
// OR double tap
386-
// -> close widget and goto target
387-
onEvent(e.elements[0], 'goto');
377+
if (e.sideBySide) {
378+
onEvent(e.element, 'side');
379+
} else if (e.editorOptions.pinned) {
380+
onEvent(e.element, 'goto');
388381
} else {
389-
// preview location
390-
onEvent(e.elements[0], 'show');
382+
onEvent(e.element, 'show');
391383
}
392384
});
393385

src/vs/editor/contrib/suggest/suggestWidget.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -605,7 +605,6 @@ export class SuggestWidget implements IContentWidget, IListVirtualDelegate<Compl
605605

606606
this.list = new List('SuggestWidget', this.listElement, this, [renderer], {
607607
useShadows: false,
608-
openController: { shouldOpen: () => false },
609608
mouseSupport: false,
610609
accessibilityProvider: {
611610
getRole: () => 'option',

0 commit comments

Comments
 (0)