提交 744b5161 编写于 作者: S Sandeep Somavarapu

Fix #79519

上级 8031c495
......@@ -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,38 +429,26 @@ 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;
for (let i = 0; i < splice.deleteCount; i++) {
const viewDescriptor = this.viewDescriptors[splice.start + i];
const previous = this._viewDescriptors;
this._viewDescriptors = viewDescriptors.sort(this.compareViewDescriptors.bind(this));
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) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册