From f79540dc651e2bd6ac7399a4c90bec1ab78e8849 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 8 Sep 2020 17:19:03 -0700 Subject: [PATCH] Add show method to webview view Fixes #106085 --- src/vs/vscode.proposed.d.ts | 9 +++++++++ src/vs/workbench/api/browser/mainThreadWebviewViews.ts | 5 +++++ src/vs/workbench/api/common/extHost.protocol.ts | 2 ++ src/vs/workbench/api/common/extHostWebviewView.ts | 5 +++++ .../contrib/webviewView/browser/webviewViewPane.ts | 7 ++++++- .../contrib/webviewView/browser/webviewViewService.ts | 2 ++ 6 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 99fd543ff64..b732e88f1ec 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -2095,6 +2095,15 @@ declare module 'vscode' { * Note that hiding a view using the context menu instead disposes of the view and fires `onDidDispose`. */ readonly onDidChangeVisibility: Event; + + /** + * Reveal the view in the UI. + * + * If the view is collapsed, this will expand it. + * + * @param preserveFocus When `true` the view will not take focus. + */ + show(preserveFocus?: boolean): void; } interface WebviewViewResolveContext { diff --git a/src/vs/workbench/api/browser/mainThreadWebviewViews.ts b/src/vs/workbench/api/browser/mainThreadWebviewViews.ts index f906a84854c..eae46c714d0 100644 --- a/src/vs/workbench/api/browser/mainThreadWebviewViews.ts +++ b/src/vs/workbench/api/browser/mainThreadWebviewViews.ts @@ -38,6 +38,11 @@ export class MainThreadWebviewsViews extends Disposable implements extHostProtoc webviewView.description = value; } + public $show(handle: extHostProtocol.WebviewHandle, preserveFocus: boolean): void { + const webviewView = this.getWebviewView(handle); + webviewView.show(preserveFocus); + } + public $registerWebviewViewProvider(viewType: string, options?: { retainContextWhenHidden?: boolean }): void { if (this._webviewViewProviders.has(viewType)) { throw new Error(`View provider for ${viewType} already registered`); diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index 2f9b6700921..da717e7f0e1 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -641,6 +641,8 @@ export interface MainThreadWebviewViewsShape extends IDisposable { $setWebviewViewTitle(handle: WebviewHandle, value: string | undefined): void; $setWebviewViewDescription(handle: WebviewHandle, value: string | undefined): void; + + $show(handle: WebviewHandle, preserveFocus: boolean): void; } export interface WebviewPanelViewStateData { diff --git a/src/vs/workbench/api/common/extHostWebviewView.ts b/src/vs/workbench/api/common/extHostWebviewView.ts index 40758443c25..dcb76f3afd3 100644 --- a/src/vs/workbench/api/common/extHostWebviewView.ts +++ b/src/vs/workbench/api/common/extHostWebviewView.ts @@ -99,6 +99,11 @@ class ExtHostWebviewView extends Disposable implements vscode.WebviewView { this.#onDidChangeVisibility.fire(); } + public show(preserveFocus?: boolean): void { + this.assertNotDisposed(); + this.#proxy.$show(this.#handle, !!preserveFocus); + } + private assertNotDisposed() { if (this.#isDisposed) { throw new Error('Webview is disposed'); diff --git a/src/vs/workbench/contrib/webviewView/browser/webviewViewPane.ts b/src/vs/workbench/contrib/webviewView/browser/webviewViewPane.ts index 4ca95f26344..ad5ba7e2796 100644 --- a/src/vs/workbench/contrib/webviewView/browser/webviewViewPane.ts +++ b/src/vs/workbench/contrib/webviewView/browser/webviewViewPane.ts @@ -21,7 +21,7 @@ import { IThemeService } from 'vs/platform/theme/common/themeService'; import { ViewPane } from 'vs/workbench/browser/parts/views/viewPaneContainer'; import { IViewletViewOptions } from 'vs/workbench/browser/parts/views/viewsViewlet'; import { Memento, MementoObject } from 'vs/workbench/common/memento'; -import { IViewDescriptorService } from 'vs/workbench/common/views'; +import { IViewDescriptorService, IViewsService } from 'vs/workbench/common/views'; import { IWebviewService, WebviewOverlay } from 'vs/workbench/contrib/webview/browser/webview'; import { IWebviewViewService, WebviewView } from 'vs/workbench/contrib/webviewView/browser/webviewViewService'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; @@ -57,6 +57,7 @@ export class WebviewViewPane extends ViewPane { @IProgressService private readonly progressService: IProgressService, @IWebviewService private readonly webviewService: IWebviewService, @IWebviewViewService private readonly webviewViewService: IWebviewViewService, + @IViewsService private readonly viewService: IViewsService, ) { super({ ...options, titleMenuId: MenuId.ViewTitle }, keybindingService, contextMenuService, configurationService, contextKeyService, viewDescriptorService, instantiationService, openerService, themeService, telemetryService); @@ -168,6 +169,10 @@ export class WebviewViewPane extends ViewPane { get description(): string | undefined { return self.titleDescription; }, set description(value: string | undefined) { self.updateTitleDescription(value); }, + + show: (preserveFocus) => { + this.viewService.openView(this.id, !preserveFocus); + } }; await this.webviewViewService.resolve(this.id, webviewView, source.token); diff --git a/src/vs/workbench/contrib/webviewView/browser/webviewViewService.ts b/src/vs/workbench/contrib/webviewView/browser/webviewViewService.ts index f29936baa8f..60d4a3a7a6f 100644 --- a/src/vs/workbench/contrib/webviewView/browser/webviewViewService.ts +++ b/src/vs/workbench/contrib/webviewView/browser/webviewViewService.ts @@ -19,6 +19,8 @@ export interface WebviewView { readonly onDidChangeVisibility: Event; readonly onDispose: Event; + + show(preserveFocus: boolean): void; } export interface IWebviewViewResolver {