mirror of
https://github.com/Microsoft/vscode
synced 2024-09-18 01:58:27 +00:00
Fix #79519
This commit is contained in:
parent
8031c495a6
commit
744b516131
|
@ -11,7 +11,7 @@ import { IStorageService, StorageScope } from 'vs/platform/storage/common/storag
|
|||
import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet';
|
||||
import { IContextKeyService, IContextKeyChangeEvent, IReadableSet, IContextKey, RawContextKey, ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey';
|
||||
import { Event, Emitter } from 'vs/base/common/event';
|
||||
import { sortedDiff, firstIndex, move, isNonEmptyArray } from 'vs/base/common/arrays';
|
||||
import { firstIndex, move, isNonEmptyArray } from 'vs/base/common/arrays';
|
||||
import { isUndefinedOrNull, isUndefined } from 'vs/base/common/types';
|
||||
import { MenuId, MenuRegistry, ICommandAction } from 'vs/platform/actions/common/actions';
|
||||
import { CommandsRegistry } from 'vs/platform/commands/common/commands';
|
||||
|
@ -223,7 +223,11 @@ export interface IAddedViewDescriptorRef extends IViewDescriptorRef {
|
|||
|
||||
export class ContributableViewsModel extends Disposable {
|
||||
|
||||
readonly viewDescriptors: IViewDescriptor[] = [];
|
||||
private _viewDescriptors: IViewDescriptor[] = [];
|
||||
get viewDescriptors(): ReadonlyArray<IViewDescriptor> {
|
||||
return this._viewDescriptors;
|
||||
}
|
||||
|
||||
get visibleViewDescriptors(): IViewDescriptor[] {
|
||||
return this.viewDescriptors.filter(v => this.isViewDescriptorVisible(v));
|
||||
}
|
||||
|
@ -240,8 +244,8 @@ export class ContributableViewsModel extends Disposable {
|
|||
private _onDidChangeViewState = this._register(new Emitter<IViewDescriptorRef>());
|
||||
protected readonly onDidChangeViewState: Event<IViewDescriptorRef> = this._onDidChangeViewState.event;
|
||||
|
||||
private _onDidChangeActiveViews = this._register(new Emitter<IViewDescriptor[]>());
|
||||
readonly onDidChangeActiveViews: Event<IViewDescriptor[]> = this._onDidChangeActiveViews.event;
|
||||
private _onDidChangeActiveViews = this._register(new Emitter<ReadonlyArray<IViewDescriptor>>());
|
||||
readonly onDidChangeActiveViews: Event<ReadonlyArray<IViewDescriptor>> = this._onDidChangeActiveViews.event;
|
||||
|
||||
constructor(
|
||||
container: ViewContainer,
|
||||
|
@ -338,7 +342,7 @@ export class ContributableViewsModel extends Disposable {
|
|||
const fromViewDescriptor = this.viewDescriptors[fromIndex];
|
||||
const toViewDescriptor = this.viewDescriptors[toIndex];
|
||||
|
||||
move(this.viewDescriptors, fromIndex, toIndex);
|
||||
move(this._viewDescriptors, fromIndex, toIndex);
|
||||
|
||||
for (let index = 0; index < this.viewDescriptors.length; index++) {
|
||||
const state = this.viewStates.get(this.viewDescriptors[index].id)!;
|
||||
|
@ -384,7 +388,7 @@ export class ContributableViewsModel extends Disposable {
|
|||
return 0;
|
||||
}
|
||||
|
||||
return (this.getViewOrder(a) - this.getViewOrder(b)) || this.getGroupOrderResult(a, b) || (a.id < b.id ? -1 : 1);
|
||||
return (this.getViewOrder(a) - this.getViewOrder(b)) || this.getGroupOrderResult(a, b);
|
||||
}
|
||||
|
||||
private getGroupOrderResult(a: IViewDescriptor, b: IViewDescriptor) {
|
||||
|
@ -406,14 +410,6 @@ export class ContributableViewsModel extends Disposable {
|
|||
}
|
||||
|
||||
private onDidChangeViewDescriptors(viewDescriptors: IViewDescriptor[]): void {
|
||||
const ids = new Set<string>();
|
||||
|
||||
for (const viewDescriptor of this.viewDescriptors) {
|
||||
ids.add(viewDescriptor.id);
|
||||
}
|
||||
|
||||
viewDescriptors = viewDescriptors.sort(this.compareViewDescriptors.bind(this));
|
||||
|
||||
for (const viewDescriptor of viewDescriptors) {
|
||||
const viewState = this.viewStates.get(viewDescriptor.id);
|
||||
if (viewState) {
|
||||
|
@ -433,37 +429,25 @@ export class ContributableViewsModel extends Disposable {
|
|||
}
|
||||
}
|
||||
|
||||
const splices = sortedDiff<IViewDescriptor>(
|
||||
this.viewDescriptors,
|
||||
viewDescriptors,
|
||||
this.compareViewDescriptors.bind(this)
|
||||
).reverse();
|
||||
|
||||
const toRemove: { index: number, viewDescriptor: IViewDescriptor; }[] = [];
|
||||
const toAdd: { index: number, viewDescriptor: IViewDescriptor, size?: number, collapsed: boolean; }[] = [];
|
||||
|
||||
for (const splice of splices) {
|
||||
const startViewDescriptor = this.viewDescriptors[splice.start];
|
||||
let startIndex = startViewDescriptor ? this.find(startViewDescriptor.id).visibleIndex : this.viewDescriptors.length;
|
||||
const previous = this._viewDescriptors;
|
||||
this._viewDescriptors = viewDescriptors.sort(this.compareViewDescriptors.bind(this));
|
||||
|
||||
for (let i = 0; i < splice.deleteCount; i++) {
|
||||
const viewDescriptor = this.viewDescriptors[splice.start + i];
|
||||
|
||||
if (this.isViewDescriptorVisible(viewDescriptor)) {
|
||||
toRemove.push({ index: startIndex++, viewDescriptor });
|
||||
for (let index = 0; index < previous.length; index++) {
|
||||
if (this._viewDescriptors.every(viewDescriptor => viewDescriptor.id !== previous[index].id)) {
|
||||
toRemove.push({ index, viewDescriptor: previous[index] });
|
||||
}
|
||||
}
|
||||
|
||||
for (const viewDescriptor of splice.toInsert) {
|
||||
for (let index = 0; index < this._viewDescriptors.length; index++) {
|
||||
const viewDescriptor = this._viewDescriptors[index];
|
||||
if (previous.every(previousViewDescriptor => previousViewDescriptor.id !== viewDescriptor.id)) {
|
||||
const state = this.viewStates.get(viewDescriptor.id)!;
|
||||
|
||||
if (this.isViewDescriptorVisible(viewDescriptor)) {
|
||||
toAdd.push({ index: startIndex++, viewDescriptor, size: state.size, collapsed: !!state.collapsed });
|
||||
toAdd.push({ index, viewDescriptor, size: state.size, collapsed: !!state.collapsed });
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
this.viewDescriptors.splice(0, this.viewDescriptors.length, ...viewDescriptors);
|
||||
|
||||
if (toRemove.length) {
|
||||
this._onDidRemove.fire(toRemove);
|
||||
|
|
|
@ -354,7 +354,7 @@ export abstract class FilterViewContainerViewlet extends ViewContainerViewlet {
|
|||
}));
|
||||
}
|
||||
|
||||
private updateAllViews(viewDescriptors: IViewDescriptor[]) {
|
||||
private updateAllViews(viewDescriptors: ReadonlyArray<IViewDescriptor>) {
|
||||
viewDescriptors.forEach(descriptor => {
|
||||
let filterOnValue = this.getFilterOn(descriptor);
|
||||
if (!filterOnValue) {
|
||||
|
|
Loading…
Reference in a new issue