Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
20 changes: 20 additions & 0 deletions extensions/ql-vscode/src/model-editor/model-editor-module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}
24 changes: 24 additions & 0 deletions extensions/ql-vscode/src/model-editor/model-editor-view.ts
Original file line number Diff line number Diff line change
Expand Up @@ -352,6 +352,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();

Expand Down Expand Up @@ -520,6 +524,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,
Expand All @@ -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.
existingView = this.viewTracker.getView(
addedDatabase.databaseUri.toString(),
);
if (existingView) {
await existingView.focusView();

return;
}

const view = new ModelEditorView(
this.app,
this.modelingStore,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
});
}