提交 18570a1c 编写于 作者: J Joao Moreno

list: proper identity provider

上级 9a57732a
...@@ -49,3 +49,7 @@ export interface IListContextMenuEvent<T> { ...@@ -49,3 +49,7 @@ export interface IListContextMenuEvent<T> {
index: number | undefined; index: number | undefined;
anchor: HTMLElement | { x: number; y: number; } | undefined; anchor: HTMLElement | { x: number; y: number; } | undefined;
} }
export interface IIdentityProvider<T> {
getId(element: T): { toString(): string; };
}
\ No newline at end of file
...@@ -16,7 +16,7 @@ import { KeyCode } from 'vs/base/common/keyCodes'; ...@@ -16,7 +16,7 @@ import { KeyCode } from 'vs/base/common/keyCodes';
import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent';
import { Event, Emitter, EventBufferer, chain, mapEvent, anyEvent } from 'vs/base/common/event'; import { Event, Emitter, EventBufferer, chain, mapEvent, anyEvent } from 'vs/base/common/event';
import { domEvent } from 'vs/base/browser/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 { ListView, IListViewOptions } from './listView';
import { Color } from 'vs/base/common/color'; import { Color } from 'vs/base/common/color';
import { mixin } from 'vs/base/common/objects'; import { mixin } from 'vs/base/common/objects';
...@@ -25,10 +25,6 @@ import { ISpliceable } from 'vs/base/common/sequence'; ...@@ -25,10 +25,6 @@ import { ISpliceable } from 'vs/base/common/sequence';
import { CombinedSpliceable } from 'vs/base/browser/ui/list/splice'; import { CombinedSpliceable } from 'vs/base/browser/ui/list/splice';
import { clamp } from 'vs/base/common/numbers'; import { clamp } from 'vs/base/common/numbers';
export interface IIdentityProvider<T, R extends string | number = string | number> {
(element: T): R;
}
interface ITraitChangeEvent { interface ITraitChangeEvent {
indexes: number[]; indexes: number[];
browserEvent?: UIEvent; browserEvent?: UIEvent;
...@@ -187,7 +183,7 @@ class Trait<T> implements ISpliceable<boolean>, IDisposable { ...@@ -187,7 +183,7 @@ class Trait<T> implements ISpliceable<boolean>, IDisposable {
class FocusTrait<T> extends Trait<T> { class FocusTrait<T> extends Trait<T> {
constructor( constructor(
private getDomId: IIdentityProvider<number, string> private getDomId: (index: number) => string
) { ) {
super('focused'); super('focused');
} }
...@@ -215,17 +211,16 @@ class TraitSpliceable<T> implements ISpliceable<T> { ...@@ -215,17 +211,16 @@ class TraitSpliceable<T> implements ISpliceable<T> {
constructor( constructor(
private trait: Trait<T>, private trait: Trait<T>,
private view: ListView<T>, private view: ListView<T>,
private getId?: IIdentityProvider<T> private identityProvider?: IIdentityProvider<T>
) { } ) { }
splice(start: number, deleteCount: number, elements: T[]): void { splice(start: number, deleteCount: number, elements: T[]): void {
if (!this.getId) { if (!this.identityProvider) {
return this.trait.splice(start, deleteCount, elements.map(e => false)); return this.trait.splice(start, deleteCount, elements.map(e => false));
} }
const getId = this.getId; const pastElementsWithTrait = this.trait.get().map(i => this.identityProvider!.getId(this.view.element(i)).toString());
const pastElementsWithTrait = this.trait.get().map(i => getId(this.view.element(i))); const elementsWithTrait = elements.map(e => pastElementsWithTrait.indexOf(this.identityProvider!.getId(e).toString()) > -1);
const elementsWithTrait = elements.map(e => pastElementsWithTrait.indexOf(getId(e)) > -1);
this.trait.splice(start, deleteCount, elementsWithTrait); this.trait.splice(start, deleteCount, elementsWithTrait);
} }
......
...@@ -5,8 +5,8 @@ ...@@ -5,8 +5,8 @@
import 'vs/css!./media/tree'; import 'vs/css!./media/tree';
import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { IDisposable, dispose } from 'vs/base/common/lifecycle';
import { IListOptions, List, IIdentityProvider, IMultipleSelectionController, IListStyles, IAccessibilityProvider } from 'vs/base/browser/ui/list/listWidget'; import { IListOptions, List, IMultipleSelectionController, IListStyles, IAccessibilityProvider } from 'vs/base/browser/ui/list/listWidget';
import { IListVirtualDelegate, IListRenderer, IListMouseEvent, IListEvent, IListContextMenuEvent } from 'vs/base/browser/ui/list/list'; import { IListVirtualDelegate, IListRenderer, IListMouseEvent, IListEvent, IListContextMenuEvent, IIdentityProvider } from 'vs/base/browser/ui/list/list';
import { append, $, toggleClass } from 'vs/base/browser/dom'; import { append, $, toggleClass } from 'vs/base/browser/dom';
import { Event, Relay, chain, mapEvent } from 'vs/base/common/event'; import { Event, Relay, chain, mapEvent } from 'vs/base/common/event';
import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent';
...@@ -23,7 +23,11 @@ export function createComposedTreeListOptions<T, R extends { element: T }>(optio ...@@ -23,7 +23,11 @@ export function createComposedTreeListOptions<T, R extends { element: T }>(optio
if (options.identityProvider) { if (options.identityProvider) {
const ip = options.identityProvider; const ip = options.identityProvider;
identityProvider = el => ip(el.element); identityProvider = {
getId(el) {
return ip.getId(el.element);
}
};
} }
let multipleSelectionController: IMultipleSelectionController<R> | undefined = undefined; let multipleSelectionController: IMultipleSelectionController<R> | undefined = undefined;
......
...@@ -244,7 +244,7 @@ export class QuickInputList { ...@@ -244,7 +244,7 @@ export class QuickInputList {
this.container = dom.append(this.parent, $('.quick-input-list')); this.container = dom.append(this.parent, $('.quick-input-list'));
const delegate = new ListElementDelegate(); const delegate = new ListElementDelegate();
this.list = this.instantiationService.createInstance(WorkbenchList, this.container, delegate, [new ListElementRenderer()], { 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 openController: { shouldOpen: () => false }, // Workaround #58124
setRowLineHeight: false, setRowLineHeight: false,
multipleSelectionSupport: false multipleSelectionSupport: false
......
...@@ -74,7 +74,7 @@ export class BreakpointsView extends ViewletPanel { ...@@ -74,7 +74,7 @@ export class BreakpointsView extends ViewletPanel {
this.instantiationService.createInstance(FunctionBreakpointsRenderer), this.instantiationService.createInstance(FunctionBreakpointsRenderer),
new FunctionBreakpointInputRenderer(this.debugService, this.contextViewService, this.themeService) new FunctionBreakpointInputRenderer(this.debugService, this.contextViewService, this.themeService)
], { ], {
identityProvider: element => element.getId(), identityProvider: { getId: element => element.getId() },
multipleSelectionSupport: false multipleSelectionSupport: false
}) as WorkbenchList<IEnablement>; }) as WorkbenchList<IEnablement>;
......
...@@ -217,7 +217,7 @@ export class OpenEditorsView extends ViewletPanel { ...@@ -217,7 +217,7 @@ export class OpenEditorsView extends ViewletPanel {
new EditorGroupRenderer(this.keybindingService, this.instantiationService, this.editorGroupService), new EditorGroupRenderer(this.keybindingService, this.instantiationService, this.editorGroupService),
new OpenEditorRenderer(getSelectedElements, this.instantiationService, this.keybindingService, this.configurationService, 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 */ selectOnMouseDown: false /* disabled to better support DND */
}) as WorkbenchList<OpenEditor | IEditorGroup>; }) as WorkbenchList<OpenEditor | IEditorGroup>;
this.disposables.push(this.list); this.disposables.push(this.list);
......
...@@ -289,6 +289,12 @@ export class MarkersPanel extends Panel implements IMarkerFilterController { ...@@ -289,6 +289,12 @@ export class MarkersPanel extends Panel implements IMarkerFilterController {
this.filter = new Filter(); this.filter = new Filter();
const accessibilityProvider = this.instantiationService.createInstance(MarkersTreeAccessibilityProvider); const accessibilityProvider = this.instantiationService.createInstance(MarkersTreeAccessibilityProvider);
const identityProvider = {
getId(element: TreeElement) {
return element.hash;
}
};
this.tree = this.instantiationService.createInstance(WorkbenchObjectTree, this.tree = this.instantiationService.createInstance(WorkbenchObjectTree,
this.treeContainer, this.treeContainer,
virtualDelegate, virtualDelegate,
...@@ -296,7 +302,7 @@ export class MarkersPanel extends Panel implements IMarkerFilterController { ...@@ -296,7 +302,7 @@ export class MarkersPanel extends Panel implements IMarkerFilterController {
{ {
filter: this.filter, filter: this.filter,
accessibilityProvider, accessibilityProvider,
identityProvider: (element: TreeElement) => element.hash identityProvider
} }
) as any as WorkbenchObjectTree<TreeElement, FilterData>; ) as any as WorkbenchObjectTree<TreeElement, FilterData>;
......
...@@ -398,7 +398,7 @@ export class KeybindingsEditor extends BaseEditor implements IKeybindingsEditor ...@@ -398,7 +398,7 @@ export class KeybindingsEditor extends BaseEditor implements IKeybindingsEditor
this.keybindingsListContainer = DOM.append(parent, $('.keybindings-list-container')); 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)], 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<IListEntry>; { identityProvider: { getId: e => e.id }, mouseSupport: true, ariaLabel: localize('keybindingsLabel', "Keybindings"), setRowLineHeight: false })) as WorkbenchList<IListEntry>;
this._register(this.keybindingsList.onContextMenu(e => this.onContextMenu(e))); this._register(this.keybindingsList.onContextMenu(e => this.onContextMenu(e)));
this._register(this.keybindingsList.onFocusChange(e => this.onFocusChange(e))); this._register(this.keybindingsList.onFocusChange(e => this.onFocusChange(e)));
this._register(this.keybindingsList.onDidFocus(() => { this._register(this.keybindingsList.onDidFocus(() => {
......
...@@ -262,10 +262,9 @@ class MainPanel extends ViewletPanel { ...@@ -262,10 +262,9 @@ class MainPanel extends ViewletPanel {
protected renderBody(container: HTMLElement): void { protected renderBody(container: HTMLElement): void {
const delegate = new ProvidersListDelegate(); const delegate = new ProvidersListDelegate();
const renderer = this.instantiationService.createInstance(ProviderRenderer); const renderer = this.instantiationService.createInstance(ProviderRenderer);
const identityProvider = { getId: r => r.provider.id };
this.list = this.instantiationService.createInstance(WorkbenchList, container, delegate, [renderer], { this.list = this.instantiationService.createInstance(WorkbenchList, container, delegate, [renderer], { identityProvider }) as WorkbenchList<ISCMRepository>;
identityProvider: repository => repository.provider.id
}) as WorkbenchList<ISCMRepository>;
this.list.onSelectionChange(this.onListSelectionChange, this, this.disposables); this.list.onSelectionChange(this.onListSelectionChange, this, this.disposables);
this.list.onContextMenu(this.onListContextMenu, this, this.disposables); this.list.onContextMenu(this.onListContextMenu, this, this.disposables);
...@@ -580,16 +579,18 @@ class ProviderListDelegate implements IListVirtualDelegate<ISCMResourceGroup | I ...@@ -580,16 +579,18 @@ class ProviderListDelegate implements IListVirtualDelegate<ISCMResourceGroup | I
} }
} }
function scmResourceIdentityProvider(r: ISCMResourceGroup | ISCMResource): string { const scmResourceIdentityProvider = {
if (isSCMResource(r)) { getId(r: ISCMResourceGroup | ISCMResource): string {
const group = r.resourceGroup; if (isSCMResource(r)) {
const provider = group.provider; const group = r.resourceGroup;
return `${provider.contextValue}/${group.id}/${r.sourceUri.toString()}`; const provider = group.provider;
} else { return `${provider.contextValue}/${group.id}/${r.sourceUri.toString()}`;
const provider = r.provider; } else {
return `${provider.contextValue}/${r.id}`; const provider = r.provider;
return `${provider.contextValue}/${r.id}`;
}
} }
} };
function isGroupVisible(group: ISCMResourceGroup) { function isGroupVisible(group: ISCMResourceGroup) {
return group.elements.length > 0 || !group.hideWhenEmpty; return group.elements.length > 0 || !group.hideWhenEmpty;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册