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:
@@ -144,14 +144,10 @@ export class MethodModelingViewProvider extends AbstractWebviewViewProvider<
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const views = this.editorViewTracker.getViews(
|
const view = this.editorViewTracker.getView(
|
||||||
this.databaseItem.databaseUri.toString(),
|
this.databaseItem.databaseUri.toString(),
|
||||||
);
|
);
|
||||||
if (views.length === 0) {
|
await view?.revealMethod(method);
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
await Promise.all(views.map((view) => view.revealMethod(method)));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private registerToModelingStoreEvents(): void {
|
private registerToModelingStoreEvents(): void {
|
||||||
|
|||||||
@@ -128,6 +128,15 @@ export class ModelEditorModule extends DisposableObject {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const existingView = this.editorViewTracker.getView(
|
||||||
|
db.databaseUri.toString(),
|
||||||
|
);
|
||||||
|
if (existingView) {
|
||||||
|
await existingView.focusView();
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
return withProgress(
|
return withProgress(
|
||||||
async (progress) => {
|
async (progress) => {
|
||||||
const maxStep = 4;
|
const maxStep = 4;
|
||||||
@@ -192,6 +201,17 @@ export class ModelEditorModule extends DisposableObject {
|
|||||||
maxStep,
|
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(
|
const view = new ModelEditorView(
|
||||||
this.app,
|
this.app,
|
||||||
this.modelingStore,
|
this.modelingStore,
|
||||||
|
|||||||
@@ -9,33 +9,25 @@ interface ModelEditorViewInterface {
|
|||||||
export class ModelEditorViewTracker<
|
export class ModelEditorViewTracker<
|
||||||
T extends ModelEditorViewInterface = ModelEditorViewInterface,
|
T extends ModelEditorViewInterface = ModelEditorViewInterface,
|
||||||
> {
|
> {
|
||||||
private readonly views = new Map<string, T[]>();
|
private readonly views = new Map<string, T>();
|
||||||
|
|
||||||
constructor() {}
|
constructor() {}
|
||||||
|
|
||||||
public registerView(view: T): void {
|
public registerView(view: T): void {
|
||||||
const databaseUri = view.databaseUri;
|
const databaseUri = view.databaseUri;
|
||||||
|
|
||||||
if (!this.views.has(databaseUri)) {
|
if (this.views.has(databaseUri)) {
|
||||||
this.views.set(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 {
|
public unregisterView(view: T): void {
|
||||||
const views = this.views.get(view.databaseUri);
|
this.views.delete(view.databaseUri);
|
||||||
if (!views) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const index = views.indexOf(view);
|
|
||||||
if (index !== -1) {
|
|
||||||
views.splice(index, 1);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public getViews(databaseUri: string): T[] {
|
public getView(databaseUri: string): T | undefined {
|
||||||
return this.views.get(databaseUri) ?? [];
|
return this.views.get(databaseUri);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -349,6 +349,10 @@ export class ModelEditorView extends AbstractWebview<
|
|||||||
return this.databaseItem.databaseUri.toString();
|
return this.databaseItem.databaseUri.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async focusView(): Promise<void> {
|
||||||
|
this.panel?.reveal();
|
||||||
|
}
|
||||||
|
|
||||||
public async revealMethod(method: Method): Promise<void> {
|
public async revealMethod(method: Method): Promise<void> {
|
||||||
this.panel?.reveal();
|
this.panel?.reveal();
|
||||||
|
|
||||||
@@ -521,6 +525,15 @@ export class ModelEditorView extends AbstractWebview<
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let existingView = this.viewTracker.getView(
|
||||||
|
addedDatabase.databaseUri.toString(),
|
||||||
|
);
|
||||||
|
if (existingView) {
|
||||||
|
await existingView.focusView();
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const modelFile = await pickExtensionPack(
|
const modelFile = await pickExtensionPack(
|
||||||
this.cliServer,
|
this.cliServer,
|
||||||
addedDatabase,
|
addedDatabase,
|
||||||
@@ -533,6 +546,17 @@ export class ModelEditorView extends AbstractWebview<
|
|||||||
return;
|
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(
|
const view = new ModelEditorView(
|
||||||
this.app,
|
this.app,
|
||||||
this.modelingStore,
|
this.modelingStore,
|
||||||
|
|||||||
@@ -5,15 +5,15 @@ import { ModelEditorView } from "../../../src/model-editor/model-editor-view";
|
|||||||
export function createMockModelEditorViewTracker({
|
export function createMockModelEditorViewTracker({
|
||||||
registerView = jest.fn(),
|
registerView = jest.fn(),
|
||||||
unregisterView = jest.fn(),
|
unregisterView = jest.fn(),
|
||||||
getViews = jest.fn(),
|
getView = jest.fn(),
|
||||||
}: {
|
}: {
|
||||||
registerView?: ModelEditorViewTracker["registerView"];
|
registerView?: ModelEditorViewTracker["registerView"];
|
||||||
unregisterView?: ModelEditorViewTracker["unregisterView"];
|
unregisterView?: ModelEditorViewTracker["unregisterView"];
|
||||||
getViews?: ModelEditorViewTracker["getViews"];
|
getView?: ModelEditorViewTracker["getView"];
|
||||||
} = {}): ModelEditorViewTracker<ModelEditorView> {
|
} = {}): ModelEditorViewTracker<ModelEditorView> {
|
||||||
return mockedObject<ModelEditorViewTracker<ModelEditorView>>({
|
return mockedObject<ModelEditorViewTracker<ModelEditorView>>({
|
||||||
registerView,
|
registerView,
|
||||||
unregisterView,
|
unregisterView,
|
||||||
getViews,
|
getView,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user