Skip to content

Commit 1a0dcf8

Browse files
authored
Close custom hover on escape (microsoft#205527)
close custom hover on escape
1 parent 4915ad8 commit 1a0dcf8

File tree

1 file changed

+18
-1
lines changed

1 file changed

+18
-1
lines changed

src/vs/platform/hover/browser/hover.ts

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,13 @@
44
*--------------------------------------------------------------------------------------------*/
55

66
import { createDecorator } from 'vs/platform/instantiation/common/instantiation';
7-
import { Disposable, IDisposable } from 'vs/base/common/lifecycle';
7+
import { Disposable, DisposableStore, IDisposable } from 'vs/base/common/lifecycle';
88
import { IMarkdownString } from 'vs/base/common/htmlContent';
99
import { HoverPosition } from 'vs/base/browser/ui/hover/hoverWidget';
1010
import { IHoverDelegate, IHoverDelegateOptions, IHoverWidget } from 'vs/base/browser/ui/iconLabel/iconHoverDelegate';
1111
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
12+
import { addStandardDisposableListener } from 'vs/base/browser/dom';
13+
import { KeyCode } from 'vs/base/common/keyCodes';
1214

1315
export const IHoverService = createDecorator<IHoverService>('hoverService');
1416

@@ -245,6 +247,8 @@ export class WorkbenchHoverDelegate extends Disposable implements IHoverDelegate
245247
return this._delay;
246248
}
247249

250+
private hoverDisposables = this._register(new DisposableStore());
251+
248252
constructor(
249253
public readonly placement: 'mouse' | 'element',
250254
private readonly instantHover: boolean,
@@ -264,6 +268,18 @@ export class WorkbenchHoverDelegate extends Disposable implements IHoverDelegate
264268

265269
showHover(options: IHoverDelegateOptions, focus?: boolean): IHoverWidget | undefined {
266270
const overrideOptions = typeof this.overrideOptions === 'function' ? this.overrideOptions(options, focus) : this.overrideOptions;
271+
272+
// close hover on escape
273+
this.hoverDisposables.clear();
274+
const targets = options.target instanceof HTMLElement ? [options.target] : options.target.targetElements;
275+
for (const target of targets) {
276+
this.hoverDisposables.add(addStandardDisposableListener(target, 'keydown', (e) => {
277+
if (e.equals(KeyCode.Escape)) {
278+
this.hoverService.hideHover();
279+
}
280+
}));
281+
}
282+
267283
return this.hoverService.showHover({
268284
...options,
269285
persistence: {
@@ -278,6 +294,7 @@ export class WorkbenchHoverDelegate extends Disposable implements IHoverDelegate
278294
}
279295

280296
onDidHideHover(): void {
297+
this.hoverDisposables.clear();
281298
if (this.instantHover) {
282299
this.lastHoverHideTime = Date.now();
283300
}

0 commit comments

Comments
 (0)