From 7d749080dc4d33ca86a5809fbf143eee02ec9baa Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Tue, 30 Aug 2022 08:48:49 -0700 Subject: [PATCH] Delay the tooltip hover --- .../browser/links/terminalLinkManager.ts | 55 ++++++++++++------- 1 file changed, 35 insertions(+), 20 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/browser/links/terminalLinkManager.ts b/src/vs/workbench/contrib/terminal/browser/links/terminalLinkManager.ts index b414044bdf0..8e1b47734cf 100644 --- a/src/vs/workbench/contrib/terminal/browser/links/terminalLinkManager.ts +++ b/src/vs/workbench/contrib/terminal/browser/links/terminalLinkManager.ts @@ -5,7 +5,7 @@ import { EventType } from 'vs/base/browser/dom'; import { IMarkdownString, MarkdownString } from 'vs/base/common/htmlContent'; -import { DisposableStore, dispose, IDisposable } from 'vs/base/common/lifecycle'; +import { DisposableStore, dispose, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; import { Schemas } from 'vs/base/common/network'; import { posix, win32 } from 'vs/base/common/path'; import { isMacintosh, OperatingSystem, OS } from 'vs/base/common/platform'; @@ -33,6 +33,7 @@ import { ITerminalConfiguration, ITerminalProcessManager, TERMINAL_CONFIG_SECTIO import { IHoverAction } from 'vs/workbench/services/hover/browser/hover'; import type { ILink, ILinkProvider, IViewportRange, Terminal } from 'xterm'; import { convertBufferRangeToViewport } from 'vs/workbench/contrib/terminal/browser/links/terminalLinkHelpers'; +import { RunOnceScheduler } from 'vs/base/common/async'; export type XtermLinkMatcherHandler = (event: MouseEvent | undefined, link: string) => Promise; export type XtermLinkMatcherValidationCallback = (uri: string, callback: (isValid: boolean) => void) => void; @@ -94,8 +95,14 @@ export class TerminalLinkManager extends DisposableStore { this._registerStandardLinkProviders(); + let activeHoverDisposable: IDisposable | undefined; + let activeTooltipScheduler: RunOnceScheduler | undefined; + this.add(toDisposable(() => { + activeHoverDisposable?.dispose(); + activeTooltipScheduler?.dispose(); + })); this._xterm.options.linkHandler = { - activate: (e, text) => { + activate: (_, text) => { this._openers.get(TerminalBuiltinLinkType.Url)?.open({ type: TerminalBuiltinLinkType.Url, text, @@ -104,23 +111,29 @@ export class TerminalLinkManager extends DisposableStore { }); }, hover: (e, text, range) => { - const core = (this._xterm as any)._core as IXtermCore; - const cellDimensions = { - width: core._renderService.dimensions.actualCellWidth, - height: core._renderService.dimensions.actualCellHeight - }; - const terminalDimensions = { - width: this._xterm.cols, - height: this._xterm.rows - }; - this._showHover({ - viewportRange: convertBufferRangeToViewport(range, this._xterm.buffer.active.viewportY), - cellDimensions, - terminalDimensions - }, this._getLinkHoverString(text, text), undefined, (text) => this._xterm.options.linkHandler!.activate(e, text, range)); - }, - leave: (e, text) => { - console.log('leave'); + activeHoverDisposable?.dispose(); + activeHoverDisposable = undefined; + activeTooltipScheduler?.dispose(); + activeTooltipScheduler = new RunOnceScheduler(() => { + const core = (this._xterm as any)._core as IXtermCore; + const cellDimensions = { + width: core._renderService.dimensions.actualCellWidth, + height: core._renderService.dimensions.actualCellHeight + }; + const terminalDimensions = { + width: this._xterm.cols, + height: this._xterm.rows + }; + activeHoverDisposable = this._showHover({ + viewportRange: convertBufferRangeToViewport(range, this._xterm.buffer.active.viewportY), + cellDimensions, + terminalDimensions + }, this._getLinkHoverString(text, text), undefined, (text) => this._xterm.options.linkHandler?.activate(e, text, range)); + // Clear out scheduler until next hover event + activeTooltipScheduler?.dispose(); + activeTooltipScheduler = undefined; + }, this._configurationService.getValue('workbench.hover.delay')); + activeTooltipScheduler.schedule(); } }; } @@ -267,14 +280,16 @@ export class TerminalLinkManager extends DisposableStore { actions: IHoverAction[] | undefined, linkHandler: (url: string) => void, link?: TerminalLink - ) { + ): IDisposable | undefined { if (this._widgetManager) { const widget = this._instantiationService.createInstance(TerminalHover, targetOptions, text, actions, linkHandler); const attached = this._widgetManager.attachWidget(widget); if (attached) { link?.onInvalidated(() => attached.dispose()); } + return attached; } + return undefined; } setWidgetManager(widgetManager: TerminalWidgetManager): void {