From 5b217220faf03eae4e969409ebbd0f6fa0e4631d Mon Sep 17 00:00:00 2001 From: Koen Vlaswinkel Date: Mon, 31 Oct 2022 11:18:00 +0100 Subject: [PATCH] Close view when variant analyis is deleted from query history This will close the variant analysis view when the corresponding variant analysis history item is deleted from the query history. This required some extra code to handle `dispose` being called on the view to ensure this actually disposes the panel, but we can now call `dispose()` on the view to close it. --- extensions/ql-vscode/src/abstract-webview.ts | 7 ++++++- .../src/remote-queries/variant-analysis-manager.ts | 7 +++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/extensions/ql-vscode/src/abstract-webview.ts b/extensions/ql-vscode/src/abstract-webview.ts index 4206f3303e7..1a0f68a4fda 100644 --- a/extensions/ql-vscode/src/abstract-webview.ts +++ b/extensions/ql-vscode/src/abstract-webview.ts @@ -9,7 +9,7 @@ import { } from 'vscode'; import * as path from 'path'; -import { DisposableObject } from './pure/disposable-object'; +import { DisposableObject, DisposeHandler } from './pure/disposable-object'; import { tmpDir } from './helpers'; import { getHtmlForWebview, WebviewMessage, WebviewView } from './interface-utils'; @@ -126,4 +126,9 @@ export abstract class AbstractWebview { return this.getPanel().webview.postMessage(msg); } + + public dispose(disposeHandler?: DisposeHandler) { + this.panel?.dispose(); + super.dispose(disposeHandler); + } } diff --git a/extensions/ql-vscode/src/remote-queries/variant-analysis-manager.ts b/extensions/ql-vscode/src/remote-queries/variant-analysis-manager.ts index 2622f30be06..9f1d591bc2d 100644 --- a/extensions/ql-vscode/src/remote-queries/variant-analysis-manager.ts +++ b/extensions/ql-vscode/src/remote-queries/variant-analysis-manager.ts @@ -27,7 +27,6 @@ import { createTimestampFile, showAndLogErrorMessage } from '../helpers'; import { QueryStatus } from '../query-status'; import * as fs from 'fs-extra'; - export class VariantAnalysisManager extends DisposableObject implements VariantAnalysisViewManager { private readonly _onVariantAnalysisAdded = this.push(new EventEmitter()); public readonly onVariantAnalysisAdded = this._onVariantAnalysisAdded.event; @@ -75,6 +74,9 @@ export class VariantAnalysisManager extends DisposableObject implements VariantA this.variantAnalysisResultsManager.removeAnalysisResults(variantAnalysis); await this.removeStorageDirectory(variantAnalysis.id); this.variantAnalyses.delete(variantAnalysis.id); + + // This will automatically unregister the view + this.views.get(variantAnalysis.id)?.dispose(); } private async removeStorageDirectory(variantAnalysisId: number) { @@ -88,7 +90,7 @@ export class VariantAnalysisManager extends DisposableObject implements VariantA } if (!this.views.has(variantAnalysisId)) { // The view will register itself with the manager, so we don't need to do anything here. - this.push(new VariantAnalysisView(this.ctx, variantAnalysisId, this)); + this.track(new VariantAnalysisView(this.ctx, variantAnalysisId, this)); } const variantAnalysisView = this.views.get(variantAnalysisId)!; @@ -106,6 +108,7 @@ export class VariantAnalysisManager extends DisposableObject implements VariantA public unregisterView(view: VariantAnalysisView): void { this.views.delete(view.variantAnalysisId); + this.disposeAndStopTracking(view); } public getView(variantAnalysisId: number): VariantAnalysisView | undefined {