diff --git a/extensions/ql-vscode/src/model-editor/model-editor-module.ts b/extensions/ql-vscode/src/model-editor/model-editor-module.ts index 53101f4ba..3140daf71 100644 --- a/extensions/ql-vscode/src/model-editor/model-editor-module.ts +++ b/extensions/ql-vscode/src/model-editor/model-editor-module.ts @@ -128,6 +128,15 @@ export class ModelEditorModule extends DisposableObject { return; } + const existingViews = this.editorViewTracker.getViews( + db.databaseUri.toString(), + ); + if (existingViews.length > 0) { + await Promise.all(existingViews.map((view) => view.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 existingViews = this.editorViewTracker.getViews( + db.databaseUri.toString(), + ); + if (existingViews.length > 0) { + await Promise.all(existingViews.map((view) => view.focusView())); + + return; + } + const view = new ModelEditorView( this.app, this.modelingStore, diff --git a/extensions/ql-vscode/src/model-editor/model-editor-view.ts b/extensions/ql-vscode/src/model-editor/model-editor-view.ts index 4e0fc8f62..f2cad6028 100644 --- a/extensions/ql-vscode/src/model-editor/model-editor-view.ts +++ b/extensions/ql-vscode/src/model-editor/model-editor-view.ts @@ -352,6 +352,10 @@ export class ModelEditorView extends AbstractWebview< return this.databaseItem.databaseUri.toString(); } + public async focusView(): Promise { + this.panel?.reveal(); + } + public async revealMethod(method: Method): Promise { this.panel?.reveal(); @@ -520,6 +524,15 @@ export class ModelEditorView extends AbstractWebview< return; } + let existingViews = this.viewTracker.getViews( + addedDatabase.databaseUri.toString(), + ); + if (existingViews.length > 0) { + await Promise.all(existingViews.map((view) => view.focusView())); + + return; + } + const modelFile = await pickExtensionPack( this.cliServer, addedDatabase, @@ -532,6 +545,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. + existingViews = this.viewTracker.getViews( + addedDatabase.databaseUri.toString(), + ); + if (existingViews.length > 0) { + await Promise.all(existingViews.map((view) => view.focusView())); + + return; + } + const view = new ModelEditorView( this.app, this.modelingStore,