From 18570a1c9bd030cf605d7bd9b9cca682e20513c7 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 28 Nov 2018 13:00:39 +0100 Subject: [PATCH] list: proper identity provider --- src/vs/base/browser/ui/list/list.ts | 4 +++ src/vs/base/browser/ui/list/listWidget.ts | 17 +++++-------- src/vs/base/browser/ui/tree/abstractTree.ts | 10 +++++--- .../parts/quickinput/quickInputList.ts | 2 +- .../parts/debug/browser/breakpointsView.ts | 2 +- .../electron-browser/views/openEditorsView.ts | 2 +- .../markers/electron-browser/markersPanel.ts | 8 +++++- .../preferences/browser/keybindingsEditor.ts | 2 +- .../parts/scm/electron-browser/scmViewlet.ts | 25 ++++++++++--------- 9 files changed, 41 insertions(+), 31 deletions(-) diff --git a/src/vs/base/browser/ui/list/list.ts b/src/vs/base/browser/ui/list/list.ts index c3e4c0d2471..72c0a025499 100644 --- a/src/vs/base/browser/ui/list/list.ts +++ b/src/vs/base/browser/ui/list/list.ts @@ -49,3 +49,7 @@ export interface IListContextMenuEvent { index: number | undefined; anchor: HTMLElement | { x: number; y: number; } | undefined; } + +export interface IIdentityProvider { + getId(element: T): { toString(): string; }; +} \ No newline at end of file diff --git a/src/vs/base/browser/ui/list/listWidget.ts b/src/vs/base/browser/ui/list/listWidget.ts index b12622a6e38..948a6aeb5f7 100644 --- a/src/vs/base/browser/ui/list/listWidget.ts +++ b/src/vs/base/browser/ui/list/listWidget.ts @@ -16,7 +16,7 @@ import { KeyCode } from 'vs/base/common/keyCodes'; import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { Event, Emitter, EventBufferer, chain, mapEvent, anyEvent } from 'vs/base/common/event'; import { domEvent } from 'vs/base/browser/event'; -import { IListVirtualDelegate, IListRenderer, IListEvent, IListContextMenuEvent, IListMouseEvent, IListTouchEvent, IListGestureEvent } from './list'; +import { IListVirtualDelegate, IListRenderer, IListEvent, IListContextMenuEvent, IListMouseEvent, IListTouchEvent, IListGestureEvent, IIdentityProvider } from './list'; import { ListView, IListViewOptions } from './listView'; import { Color } from 'vs/base/common/color'; import { mixin } from 'vs/base/common/objects'; @@ -25,10 +25,6 @@ import { ISpliceable } from 'vs/base/common/sequence'; import { CombinedSpliceable } from 'vs/base/browser/ui/list/splice'; import { clamp } from 'vs/base/common/numbers'; -export interface IIdentityProvider { - (element: T): R; -} - interface ITraitChangeEvent { indexes: number[]; browserEvent?: UIEvent; @@ -187,7 +183,7 @@ class Trait implements ISpliceable, IDisposable { class FocusTrait extends Trait { constructor( - private getDomId: IIdentityProvider + private getDomId: (index: number) => string ) { super('focused'); } @@ -215,17 +211,16 @@ class TraitSpliceable implements ISpliceable { constructor( private trait: Trait, private view: ListView, - private getId?: IIdentityProvider + private identityProvider?: IIdentityProvider ) { } splice(start: number, deleteCount: number, elements: T[]): void { - if (!this.getId) { + if (!this.identityProvider) { return this.trait.splice(start, deleteCount, elements.map(e => false)); } - const getId = this.getId; - const pastElementsWithTrait = this.trait.get().map(i => getId(this.view.element(i))); - const elementsWithTrait = elements.map(e => pastElementsWithTrait.indexOf(getId(e)) > -1); + const pastElementsWithTrait = this.trait.get().map(i => this.identityProvider!.getId(this.view.element(i)).toString()); + const elementsWithTrait = elements.map(e => pastElementsWithTrait.indexOf(this.identityProvider!.getId(e).toString()) > -1); this.trait.splice(start, deleteCount, elementsWithTrait); } diff --git a/src/vs/base/browser/ui/tree/abstractTree.ts b/src/vs/base/browser/ui/tree/abstractTree.ts index d21bf13df09..9cdde9f2631 100644 --- a/src/vs/base/browser/ui/tree/abstractTree.ts +++ b/src/vs/base/browser/ui/tree/abstractTree.ts @@ -5,8 +5,8 @@ import 'vs/css!./media/tree'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; -import { IListOptions, List, IIdentityProvider, IMultipleSelectionController, IListStyles, IAccessibilityProvider } from 'vs/base/browser/ui/list/listWidget'; -import { IListVirtualDelegate, IListRenderer, IListMouseEvent, IListEvent, IListContextMenuEvent } from 'vs/base/browser/ui/list/list'; +import { IListOptions, List, IMultipleSelectionController, IListStyles, IAccessibilityProvider } from 'vs/base/browser/ui/list/listWidget'; +import { IListVirtualDelegate, IListRenderer, IListMouseEvent, IListEvent, IListContextMenuEvent, IIdentityProvider } from 'vs/base/browser/ui/list/list'; import { append, $, toggleClass } from 'vs/base/browser/dom'; import { Event, Relay, chain, mapEvent } from 'vs/base/common/event'; import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; @@ -23,7 +23,11 @@ export function createComposedTreeListOptions(optio if (options.identityProvider) { const ip = options.identityProvider; - identityProvider = el => ip(el.element); + identityProvider = { + getId(el) { + return ip.getId(el.element); + } + }; } let multipleSelectionController: IMultipleSelectionController | undefined = undefined; diff --git a/src/vs/workbench/browser/parts/quickinput/quickInputList.ts b/src/vs/workbench/browser/parts/quickinput/quickInputList.ts index 399829c93db..4dea062dae2 100644 --- a/src/vs/workbench/browser/parts/quickinput/quickInputList.ts +++ b/src/vs/workbench/browser/parts/quickinput/quickInputList.ts @@ -244,7 +244,7 @@ export class QuickInputList { this.container = dom.append(this.parent, $('.quick-input-list')); const delegate = new ListElementDelegate(); this.list = this.instantiationService.createInstance(WorkbenchList, this.container, delegate, [new ListElementRenderer()], { - identityProvider: element => element.label, + identityProvider: { getId: element => element.label }, openController: { shouldOpen: () => false }, // Workaround #58124 setRowLineHeight: false, multipleSelectionSupport: false diff --git a/src/vs/workbench/parts/debug/browser/breakpointsView.ts b/src/vs/workbench/parts/debug/browser/breakpointsView.ts index e4e3b8549bb..7d8687dcf29 100644 --- a/src/vs/workbench/parts/debug/browser/breakpointsView.ts +++ b/src/vs/workbench/parts/debug/browser/breakpointsView.ts @@ -74,7 +74,7 @@ export class BreakpointsView extends ViewletPanel { this.instantiationService.createInstance(FunctionBreakpointsRenderer), new FunctionBreakpointInputRenderer(this.debugService, this.contextViewService, this.themeService) ], { - identityProvider: element => element.getId(), + identityProvider: { getId: element => element.getId() }, multipleSelectionSupport: false }) as WorkbenchList; diff --git a/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.ts b/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.ts index a7dbaa9fe91..a258c41cd25 100644 --- a/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.ts +++ b/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.ts @@ -217,7 +217,7 @@ export class OpenEditorsView extends ViewletPanel { new EditorGroupRenderer(this.keybindingService, this.instantiationService, this.editorGroupService), new OpenEditorRenderer(getSelectedElements, this.instantiationService, this.keybindingService, this.configurationService, this.editorGroupService) ], { - identityProvider: (element: OpenEditor | IEditorGroup) => element instanceof OpenEditor ? element.getId() : element.id.toString(), + identityProvider: { getId: (element: OpenEditor | IEditorGroup) => element instanceof OpenEditor ? element.getId() : element.id.toString() }, selectOnMouseDown: false /* disabled to better support DND */ }) as WorkbenchList; this.disposables.push(this.list); diff --git a/src/vs/workbench/parts/markers/electron-browser/markersPanel.ts b/src/vs/workbench/parts/markers/electron-browser/markersPanel.ts index 8e166ec8987..2be484dbca8 100644 --- a/src/vs/workbench/parts/markers/electron-browser/markersPanel.ts +++ b/src/vs/workbench/parts/markers/electron-browser/markersPanel.ts @@ -289,6 +289,12 @@ export class MarkersPanel extends Panel implements IMarkerFilterController { this.filter = new Filter(); const accessibilityProvider = this.instantiationService.createInstance(MarkersTreeAccessibilityProvider); + const identityProvider = { + getId(element: TreeElement) { + return element.hash; + } + }; + this.tree = this.instantiationService.createInstance(WorkbenchObjectTree, this.treeContainer, virtualDelegate, @@ -296,7 +302,7 @@ export class MarkersPanel extends Panel implements IMarkerFilterController { { filter: this.filter, accessibilityProvider, - identityProvider: (element: TreeElement) => element.hash + identityProvider } ) as any as WorkbenchObjectTree; diff --git a/src/vs/workbench/parts/preferences/browser/keybindingsEditor.ts b/src/vs/workbench/parts/preferences/browser/keybindingsEditor.ts index 4a24205d7e1..b554332ad59 100644 --- a/src/vs/workbench/parts/preferences/browser/keybindingsEditor.ts +++ b/src/vs/workbench/parts/preferences/browser/keybindingsEditor.ts @@ -398,7 +398,7 @@ export class KeybindingsEditor extends BaseEditor implements IKeybindingsEditor this.keybindingsListContainer = DOM.append(parent, $('.keybindings-list-container')); this.keybindingsList = this._register(this.instantiationService.createInstance(WorkbenchList, this.keybindingsListContainer, new Delegate(), [new KeybindingHeaderRenderer(), new KeybindingItemRenderer(this, this.keybindingsService)], - { identityProvider: e => e.id, mouseSupport: true, ariaLabel: localize('keybindingsLabel', "Keybindings"), setRowLineHeight: false })) as WorkbenchList; + { identityProvider: { getId: e => e.id }, mouseSupport: true, ariaLabel: localize('keybindingsLabel', "Keybindings"), setRowLineHeight: false })) as WorkbenchList; this._register(this.keybindingsList.onContextMenu(e => this.onContextMenu(e))); this._register(this.keybindingsList.onFocusChange(e => this.onFocusChange(e))); this._register(this.keybindingsList.onDidFocus(() => { diff --git a/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts b/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts index 3f3b422a84f..abc88669b61 100644 --- a/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts +++ b/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts @@ -262,10 +262,9 @@ class MainPanel extends ViewletPanel { protected renderBody(container: HTMLElement): void { const delegate = new ProvidersListDelegate(); const renderer = this.instantiationService.createInstance(ProviderRenderer); + const identityProvider = { getId: r => r.provider.id }; - this.list = this.instantiationService.createInstance(WorkbenchList, container, delegate, [renderer], { - identityProvider: repository => repository.provider.id - }) as WorkbenchList; + this.list = this.instantiationService.createInstance(WorkbenchList, container, delegate, [renderer], { identityProvider }) as WorkbenchList; this.list.onSelectionChange(this.onListSelectionChange, this, this.disposables); this.list.onContextMenu(this.onListContextMenu, this, this.disposables); @@ -580,16 +579,18 @@ class ProviderListDelegate implements IListVirtualDelegate 0 || !group.hideWhenEmpty; -- GitLab