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

list: proper identity provider

上级 9a57732a
......@@ -49,3 +49,7 @@ export interface IListContextMenuEvent<T> {
index: 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';
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<T, R extends string | number = string | number> {
(element: T): R;
}
interface ITraitChangeEvent {
indexes: number[];
browserEvent?: UIEvent;
......@@ -187,7 +183,7 @@ class Trait<T> implements ISpliceable<boolean>, IDisposable {
class FocusTrait<T> extends Trait<T> {
constructor(
private getDomId: IIdentityProvider<number, string>
private getDomId: (index: number) => string
) {
super('focused');
}
......@@ -215,17 +211,16 @@ class TraitSpliceable<T> implements ISpliceable<T> {
constructor(
private trait: Trait<T>,
private view: ListView<T>,
private getId?: IIdentityProvider<T>
private identityProvider?: IIdentityProvider<T>
) { }
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);
}
......
......@@ -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<T, R extends { element: T }>(optio
if (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;
......
......@@ -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
......
......@@ -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<IEnablement>;
......
......@@ -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<OpenEditor | IEditorGroup>;
this.disposables.push(this.list);
......
......@@ -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<TreeElement, FilterData>;
......
......@@ -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<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.onFocusChange(e => this.onFocusChange(e)));
this._register(this.keybindingsList.onDidFocus(() => {
......
......@@ -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<ISCMRepository>;
this.list = this.instantiationService.createInstance(WorkbenchList, container, delegate, [renderer], { identityProvider }) as WorkbenchList<ISCMRepository>;
this.list.onSelectionChange(this.onListSelectionChange, this, this.disposables);
this.list.onContextMenu(this.onListContextMenu, this, this.disposables);
......@@ -580,16 +579,18 @@ class ProviderListDelegate implements IListVirtualDelegate<ISCMResourceGroup | I
}
}
function scmResourceIdentityProvider(r: ISCMResourceGroup | ISCMResource): string {
if (isSCMResource(r)) {
const group = r.resourceGroup;
const provider = group.provider;
return `${provider.contextValue}/${group.id}/${r.sourceUri.toString()}`;
} else {
const provider = r.provider;
return `${provider.contextValue}/${r.id}`;
const scmResourceIdentityProvider = {
getId(r: ISCMResourceGroup | ISCMResource): string {
if (isSCMResource(r)) {
const group = r.resourceGroup;
const provider = group.provider;
return `${provider.contextValue}/${group.id}/${r.sourceUri.toString()}`;
} else {
const provider = r.provider;
return `${provider.contextValue}/${r.id}`;
}
}
}
};
function isGroupVisible(group: ISCMResourceGroup) {
return group.elements.length > 0 || !group.hideWhenEmpty;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册