Only allow 1 view in the view tracker

This will change the model editor view tracker to only store 1 view per
database item instead of an array of views per database item.
This commit is contained in:
Koen Vlaswinkel
2023-10-11 11:54:47 +02:00
parent 76db520ce7
commit 039b28235d
5 changed files with 24 additions and 36 deletions

View File

@@ -149,14 +149,10 @@ export class MethodModelingViewProvider extends AbstractWebviewViewProvider<
return;
}
const views = this.editorViewTracker.getViews(
const view = this.editorViewTracker.getView(
this.databaseItem.databaseUri.toString(),
);
if (views.length === 0) {
return;
}
await Promise.all(views.map((view) => view.revealMethod(method)));
await view?.revealMethod(method);
}
private registerToModelingStoreEvents(): void {

View File

@@ -128,11 +128,11 @@ export class ModelEditorModule extends DisposableObject {
return;
}
const existingViews = this.editorViewTracker.getViews(
const existingView = this.editorViewTracker.getView(
db.databaseUri.toString(),
);
if (existingViews.length > 0) {
await Promise.all(existingViews.map((view) => view.focusView()));
if (existingView) {
await existingView.focusView();
return;
}
@@ -203,11 +203,11 @@ export class ModelEditorModule extends DisposableObject {
// Check again just before opening the editor to ensure no model editor has been opened between
// our first check and now.
const existingViews = this.editorViewTracker.getViews(
const existingView = this.editorViewTracker.getView(
db.databaseUri.toString(),
);
if (existingViews.length > 0) {
await Promise.all(existingViews.map((view) => view.focusView()));
if (existingView) {
await existingView.focusView();
return;
}

View File

@@ -9,33 +9,25 @@ interface ModelEditorViewInterface {
export class ModelEditorViewTracker<
T extends ModelEditorViewInterface = ModelEditorViewInterface,
> {
private readonly views = new Map<string, T[]>();
private readonly views = new Map<string, T>();
constructor() {}
public registerView(view: T): void {
const databaseUri = view.databaseUri;
if (!this.views.has(databaseUri)) {
this.views.set(databaseUri, []);
if (this.views.has(databaseUri)) {
throw new Error(`View for database ${databaseUri} already registered`);
}
this.views.get(databaseUri)?.push(view);
this.views.set(databaseUri, view);
}
public unregisterView(view: T): void {
const views = this.views.get(view.databaseUri);
if (!views) {
return;
}
const index = views.indexOf(view);
if (index !== -1) {
views.splice(index, 1);
}
this.views.delete(view.databaseUri);
}
public getViews(databaseUri: string): T[] {
return this.views.get(databaseUri) ?? [];
public getView(databaseUri: string): T | undefined {
return this.views.get(databaseUri);
}
}

View File

@@ -524,11 +524,11 @@ export class ModelEditorView extends AbstractWebview<
return;
}
let existingViews = this.viewTracker.getViews(
let existingView = this.viewTracker.getView(
addedDatabase.databaseUri.toString(),
);
if (existingViews.length > 0) {
await Promise.all(existingViews.map((view) => view.focusView()));
if (existingView) {
await existingView.focusView();
return;
}
@@ -547,11 +547,11 @@ export class ModelEditorView extends AbstractWebview<
// Check again just before opening the editor to ensure no model editor has been opened between
// our first check and now.
existingViews = this.viewTracker.getViews(
existingView = this.viewTracker.getView(
addedDatabase.databaseUri.toString(),
);
if (existingViews.length > 0) {
await Promise.all(existingViews.map((view) => view.focusView()));
if (existingView) {
await existingView.focusView();
return;
}

View File

@@ -5,15 +5,15 @@ import { ModelEditorView } from "../../../src/model-editor/model-editor-view";
export function createMockModelEditorViewTracker({
registerView = jest.fn(),
unregisterView = jest.fn(),
getViews = jest.fn(),
getView = jest.fn(),
}: {
registerView?: ModelEditorViewTracker["registerView"];
unregisterView?: ModelEditorViewTracker["unregisterView"];
getViews?: ModelEditorViewTracker["getViews"];
getView?: ModelEditorViewTracker["getView"];
} = {}): ModelEditorViewTracker<ModelEditorView> {
return mockedObject<ModelEditorViewTracker<ModelEditorView>>({
registerView,
unregisterView,
getViews,
getView,
});
}