Delay the tooltip hover

This commit is contained in:
Daniel Imms
2022-08-30 08:48:49 -07:00
parent 76384da25e
commit 7d749080dc
@@ -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<void>;
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 {