Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
  • Loading branch information
joaomoreno committed Dec 2, 2020
1 parent 806eadd commit f4187f2
Show file tree
Hide file tree
Showing 7 changed files with 44 additions and 36 deletions.
4 changes: 4 additions & 0 deletions src/vs/base/browser/ui/list/listPaging.ts
Expand Up @@ -258,6 +258,10 @@ export class PagedList<T> implements IThemable, IDisposable {
return this.list.getSelection();
}

getSelectedElements(): T[] {
return this.getSelection().map(i => this.model.get(i));
}

layout(height?: number, width?: number): void {
this.list.layout(height, width);
}
Expand Down
46 changes: 28 additions & 18 deletions src/vs/platform/list/browser/listService.ts
Expand Up @@ -445,11 +445,11 @@ abstract class ResourceNavigator<T> extends Disposable {
private readonly openOnFocus: boolean;
private openOnSingleClick: boolean;

private readonly _onDidOpen = this._register(new Emitter<IOpenEvent<T | null>>());
readonly onDidOpen: Event<IOpenEvent<T | null>> = this._onDidOpen.event;
private readonly _onDidOpen = this._register(new Emitter<IOpenEvent<T | undefined>>());
readonly onDidOpen: Event<IOpenEvent<T | undefined>> = this._onDidOpen.event;

constructor(
private readonly widget: ListWidget,
protected readonly widget: ListWidget,
options?: IResourceNavigatorOptions
) {
super();
Expand Down Expand Up @@ -478,25 +478,23 @@ abstract class ResourceNavigator<T> extends Disposable {
const focus = this.widget.getFocus();
this.widget.setSelection(focus, event.browserEvent);

const element = this.widget.getSelection()[0];
const preserveFocus = typeof (event.browserEvent as SelectionKeyboardEvent).preserveFocus === 'boolean' ? (event.browserEvent as SelectionKeyboardEvent).preserveFocus! : true;
const pinned = !preserveFocus;
const sideBySide = false;

this._open(element, preserveFocus, pinned, sideBySide, event.browserEvent);
this._open(this.getSelectedElement(), preserveFocus, pinned, sideBySide, event.browserEvent);
}

private onSelectionFromKeyboard(event: ITreeEvent<any>): void {
if (event.elements.length !== 1) {
return;
}

const element = this.widget.getSelection()[0];
const preserveFocus = typeof (event.browserEvent as SelectionKeyboardEvent).preserveFocus === 'boolean' ? (event.browserEvent as SelectionKeyboardEvent).preserveFocus! : true;
const pinned = !preserveFocus;
const sideBySide = false;

this._open(element, preserveFocus, pinned, sideBySide, event.browserEvent);
this._open(this.getSelectedElement(), preserveFocus, pinned, sideBySide, event.browserEvent);
}

private onPointer(element: T | undefined, browserEvent: MouseEvent): void {
Expand Down Expand Up @@ -546,23 +544,35 @@ abstract class ResourceNavigator<T> extends Disposable {
browserEvent
});
}

abstract getSelectedElement(): T | undefined;
}

export class ListResourceNavigator<T> extends ResourceNavigator<number> {
export class ListResourceNavigator<T> extends ResourceNavigator<T> {

constructor(
list: List<T> | PagedList<T>,
protected readonly widget: List<T> | PagedList<T>,
options?: IResourceNavigatorOptions
) {
super(list, options);
super(widget, options);
}

getSelectedElement(): T | undefined {
return this.widget.getSelectedElements()[0];
}
}

class TreeResourceNavigator<T, TFilterData> extends ResourceNavigator<T> {

constructor(
tree: ObjectTree<T, TFilterData> | CompressibleObjectTree<T, TFilterData> | DataTree<any, T, TFilterData> | AsyncDataTree<any, T, TFilterData> | CompressibleAsyncDataTree<any, T, TFilterData>,
protected readonly widget: ObjectTree<T, TFilterData> | CompressibleObjectTree<T, TFilterData> | DataTree<any, T, TFilterData> | AsyncDataTree<any, T, TFilterData> | CompressibleAsyncDataTree<any, T, TFilterData>,
options: IResourceNavigatorOptions
) {
super(tree, options);
super(widget, options);
}

getSelectedElement(): T | undefined {
return this.widget.getSelection()[0] ?? undefined;
}
}

Expand Down Expand Up @@ -597,7 +607,7 @@ export class WorkbenchObjectTree<T extends NonNullable<any>, TFilterData = void>
private internals: WorkbenchTreeInternals<any, T, TFilterData>;
get contextKeyService(): IContextKeyService { return this.internals.contextKeyService; }
get useAltAsMultipleSelectionModifier(): boolean { return this.internals.useAltAsMultipleSelectionModifier; }
get onDidOpen(): Event<IOpenEvent<T | null>> { return this.internals.onDidOpen; }
get onDidOpen(): Event<IOpenEvent<T | undefined>> { return this.internals.onDidOpen; }

constructor(
user: string,
Expand Down Expand Up @@ -633,7 +643,7 @@ export class WorkbenchCompressibleObjectTree<T extends NonNullable<any>, TFilter
private internals: WorkbenchTreeInternals<any, T, TFilterData>;
get contextKeyService(): IContextKeyService { return this.internals.contextKeyService; }
get useAltAsMultipleSelectionModifier(): boolean { return this.internals.useAltAsMultipleSelectionModifier; }
get onDidOpen(): Event<IOpenEvent<T | null>> { return this.internals.onDidOpen; }
get onDidOpen(): Event<IOpenEvent<T | undefined>> { return this.internals.onDidOpen; }

constructor(
user: string,
Expand Down Expand Up @@ -677,7 +687,7 @@ export class WorkbenchDataTree<TInput, T, TFilterData = void> extends DataTree<T
private internals: WorkbenchTreeInternals<TInput, T, TFilterData>;
get contextKeyService(): IContextKeyService { return this.internals.contextKeyService; }
get useAltAsMultipleSelectionModifier(): boolean { return this.internals.useAltAsMultipleSelectionModifier; }
get onDidOpen(): Event<IOpenEvent<T | null>> { return this.internals.onDidOpen; }
get onDidOpen(): Event<IOpenEvent<T | undefined>> { return this.internals.onDidOpen; }

constructor(
user: string,
Expand Down Expand Up @@ -722,7 +732,7 @@ export class WorkbenchAsyncDataTree<TInput, T, TFilterData = void> extends Async
private internals: WorkbenchTreeInternals<TInput, T, TFilterData>;
get contextKeyService(): IContextKeyService { return this.internals.contextKeyService; }
get useAltAsMultipleSelectionModifier(): boolean { return this.internals.useAltAsMultipleSelectionModifier; }
get onDidOpen(): Event<IOpenEvent<T | null>> { return this.internals.onDidOpen; }
get onDidOpen(): Event<IOpenEvent<T | undefined>> { return this.internals.onDidOpen; }

constructor(
user: string,
Expand Down Expand Up @@ -764,7 +774,7 @@ export class WorkbenchCompressibleAsyncDataTree<TInput, T, TFilterData = void> e
private internals: WorkbenchTreeInternals<TInput, T, TFilterData>;
get contextKeyService(): IContextKeyService { return this.internals.contextKeyService; }
get useAltAsMultipleSelectionModifier(): boolean { return this.internals.useAltAsMultipleSelectionModifier; }
get onDidOpen(): Event<IOpenEvent<T | null>> { return this.internals.onDidOpen; }
get onDidOpen(): Event<IOpenEvent<T | undefined>> { return this.internals.onDidOpen; }

constructor(
user: string,
Expand Down Expand Up @@ -855,7 +865,7 @@ class WorkbenchTreeInternals<TInput, T, TFilterData> {
private styler: IDisposable | undefined;
private navigator: TreeResourceNavigator<T, TFilterData>;

get onDidOpen(): Event<IOpenEvent<T | null>> { return this.navigator.onDidOpen; }
get onDidOpen(): Event<IOpenEvent<T | undefined>> { return this.navigator.onDidOpen; }

constructor(
private tree: WorkbenchObjectTree<T, TFilterData> | WorkbenchCompressibleObjectTree<T, TFilterData> | WorkbenchDataTree<TInput, T, TFilterData> | WorkbenchAsyncDataTree<TInput, T, TFilterData> | WorkbenchCompressibleAsyncDataTree<TInput, T, TFilterData>,
Expand Down
Expand Up @@ -298,7 +298,7 @@ export class BulkEditPane extends ViewPane {
}
}

private async _openElementAsEditor(e: IOpenEvent<BulkEditElement | null>): Promise<void> {
private async _openElementAsEditor(e: IOpenEvent<BulkEditElement | undefined>): Promise<void> {
type Mutable<T> = {
-readonly [P in keyof T]: T[P]
};
Expand Down
12 changes: 5 additions & 7 deletions src/vs/workbench/contrib/debug/browser/breakpointsView.ts
Expand Up @@ -124,22 +124,20 @@ export class BreakpointsView extends ViewPane {

const resourceNavigator = this._register(new ListResourceNavigator(this.list, { configurationService: this.configurationService }));
this._register(resourceNavigator.onDidOpen(async e => {
if (e.element === null) {
if (!e.element) {
return;
}

if (e.browserEvent instanceof MouseEvent && e.browserEvent.button === 1) { // middle click
return;
}

const element = this.list.element(e.element);

if (element instanceof Breakpoint) {
openBreakpointSource(element, e.sideBySide, e.editorOptions.preserveFocus || false, e.editorOptions.pinned || !e.editorOptions.preserveFocus, this.debugService, this.editorService);
if (e.element instanceof Breakpoint) {
openBreakpointSource(e.element, e.sideBySide, e.editorOptions.preserveFocus || false, e.editorOptions.pinned || !e.editorOptions.preserveFocus, this.debugService, this.editorService);
}
if (e.browserEvent instanceof MouseEvent && e.browserEvent.detail === 2 && element instanceof FunctionBreakpoint && element !== this.debugService.getViewModel().getSelectedBreakpoint()) {
if (e.browserEvent instanceof MouseEvent && e.browserEvent.detail === 2 && e.element instanceof FunctionBreakpoint && e.element !== this.debugService.getViewModel().getSelectedBreakpoint()) {
// double click
this.debugService.getViewModel().setSelectedBreakpoint(element);
this.debugService.getViewModel().setSelectedBreakpoint(e.element);
this.onBreakpointsChange();
}
}));
Expand Down
Expand Up @@ -177,7 +177,7 @@ export class ExtensionsListView extends ViewPane {

const resourceNavigator = this._register(new ListResourceNavigator(this.list, { openOnSingleClick: true }));
this._register(Event.debounce(Event.filter(resourceNavigator.onDidOpen, e => e.element !== null), (_, event) => event, 75, true)(options => {
this.openExtension(this.list!.model.get(options.element!), { sideByside: options.sideBySide, ...options.editorOptions });
this.openExtension(options.element!, { sideByside: options.sideBySide, ...options.editorOptions });
}));

this.bodyTemplate = {
Expand Down
12 changes: 4 additions & 8 deletions src/vs/workbench/contrib/files/browser/views/openEditorsView.ts
Expand Up @@ -267,20 +267,16 @@ export class OpenEditorsView extends ViewPane {
}));
const resourceNavigator = this._register(new ListResourceNavigator(this.list, { configurationService: this.configurationService }));
this._register(resourceNavigator.onDidOpen(e => {
if (typeof e.element !== 'number') {
if (!e.element) {
return;
}

const element = this.list.element(e.element);

if (element instanceof OpenEditor) {
} else if (e.element instanceof OpenEditor) {
if (e.browserEvent instanceof MouseEvent && e.browserEvent.button === 1) {
return; // middle click already handled above: closes the editor
}

this.openEditor(element, { preserveFocus: e.editorOptions.preserveFocus, pinned: e.editorOptions.pinned, sideBySide: e.sideBySide });
this.openEditor(e.element, { preserveFocus: e.editorOptions.preserveFocus, pinned: e.editorOptions.pinned, sideBySide: e.sideBySide });
} else {
this.editorGroupService.activateGroup(element);
this.editorGroupService.activateGroup(e.element);
}
}));

Expand Down
2 changes: 1 addition & 1 deletion src/vs/workbench/contrib/scm/browser/scmViewPane.ts
Expand Up @@ -1900,7 +1900,7 @@ export class SCMViewPane extends ViewPane {
return this.viewModel.getViewActionsContext();
}

private async open(e: IOpenEvent<TreeElement | null>): Promise<void> {
private async open(e: IOpenEvent<TreeElement | undefined>): Promise<void> {
if (!e.element) {
return;
} else if (isSCMRepository(e.element)) {
Expand Down

0 comments on commit f4187f2

Please sign in to comment.