Merge pull request #2949 from github/koesie10/single-model-editor-per-db

Only allow a single model editor per database
This commit is contained in:
Koen Vlaswinkel
2023-10-12 09:37:56 +02:00
committed by GitHub
5 changed files with 56 additions and 24 deletions

View File

@@ -144,14 +144,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,6 +128,15 @@ export class ModelEditorModule extends DisposableObject {
return;
}
const existingView = this.editorViewTracker.getView(
db.databaseUri.toString(),
);
if (existingView) {
await existingView.focusView();
return;
}
return withProgress(
async (progress) => {
const maxStep = 4;
@@ -192,6 +201,17 @@ export class ModelEditorModule extends DisposableObject {
maxStep,
});
// Check again just before opening the editor to ensure no model editor has been opened between
// our first check and now.
const existingView = this.editorViewTracker.getView(
db.databaseUri.toString(),
);
if (existingView) {
await existingView.focusView();
return;
}
const view = new ModelEditorView(
this.app,
this.modelingStore,

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

@@ -349,6 +349,10 @@ export class ModelEditorView extends AbstractWebview<
return this.databaseItem.databaseUri.toString();
}
public async focusView(): Promise<void> {
this.panel?.reveal();
}
public async revealMethod(method: Method): Promise<void> {
this.panel?.reveal();
@@ -521,6 +525,15 @@ export class ModelEditorView extends AbstractWebview<
return;
}
let existingView = this.viewTracker.getView(
addedDatabase.databaseUri.toString(),
);
if (existingView) {
await existingView.focusView();
return;
}
const modelFile = await pickExtensionPack(
this.cliServer,
addedDatabase,
@@ -533,6 +546,17 @@ export class ModelEditorView extends AbstractWebview<
return;
}
// Check again just before opening the editor to ensure no model editor has been opened between
// our first check and now.
existingView = this.viewTracker.getView(
addedDatabase.databaseUri.toString(),
);
if (existingView) {
await existingView.focusView();
return;
}
const view = new ModelEditorView(
this.app,
this.modelingStore,

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,
});
}