mirror of
https://github.com/microsoft/vscode.git
synced 2026-07-16 08:53:26 +01:00
Delay the tooltip hover
This commit is contained in:
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user