Skip to content

Commit 2cb7ce5

Browse files
authored
Refactor the showsOrWillShow code (microsoft#209452)
* refactoring the showsOrWillShow code * removing useless check, renaming
1 parent d9a8a36 commit 2cb7ce5

File tree

2 files changed

+36
-21
lines changed

2 files changed

+36
-21
lines changed

src/vs/editor/contrib/hover/browser/hover.ts

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,13 @@ import { ConfigurationChangedEvent, EditorOption } from 'vs/editor/common/config
1212
import { Range } from 'vs/editor/common/core/range';
1313
import { IEditorContribution, IScrollEvent } from 'vs/editor/common/editorCommon';
1414
import { EditorContextKeys } from 'vs/editor/common/editorContextKeys';
15-
import { ILanguageService } from 'vs/editor/common/languages/language';
1615
import { GotoDefinitionAtPositionEditorContribution } from 'vs/editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition';
1716
import { HoverStartMode, HoverStartSource } from 'vs/editor/contrib/hover/browser/hoverOperation';
1817
import { ContentHoverWidget, ContentHoverController } from 'vs/editor/contrib/hover/browser/contentHover';
1918
import { MarginHoverWidget } from 'vs/editor/contrib/hover/browser/marginHover';
2019
import { AccessibilitySupport } from 'vs/platform/accessibility/common/accessibility';
2120
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
2221
import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry';
23-
import { IOpenerService } from 'vs/platform/opener/common/opener';
2422
import { editorHoverBorder } from 'vs/platform/theme/common/colorRegistry';
2523
import { registerThemingParticipant } from 'vs/platform/theme/common/themeService';
2624
import { HoverParticipantRegistry } from 'vs/editor/contrib/hover/browser/hoverTypes';
@@ -49,6 +47,11 @@ interface IHoverState {
4947
activatedByDecoratorClick: boolean;
5048
}
5149

50+
const enum HoverWidgetType {
51+
Content,
52+
Glyph,
53+
}
54+
5255
export class HoverController extends Disposable implements IEditorContribution {
5356

5457
public static readonly ID = 'editor.contrib.hover';
@@ -70,8 +73,6 @@ export class HoverController extends Disposable implements IEditorContribution {
7073
constructor(
7174
private readonly _editor: ICodeEditor,
7275
@IInstantiationService private readonly _instantiationService: IInstantiationService,
73-
@IOpenerService private readonly _openerService: IOpenerService,
74-
@ILanguageService private readonly _languageService: ILanguageService,
7576
@IKeybindingService private readonly _keybindingService: IKeybindingService
7677
) {
7778
super();
@@ -276,23 +277,13 @@ export class HoverController extends Disposable implements IEditorContribution {
276277
return;
277278
}
278279

279-
const contentWidget = this._getOrCreateContentWidget();
280-
281-
if (contentWidget.showsOrWillShow(mouseEvent)) {
282-
this._glyphWidget?.hide();
280+
const contentHoverShowsOrWillShow = this._tryShowHoverWidget(mouseEvent, HoverWidgetType.Content);
281+
if (contentHoverShowsOrWillShow) {
283282
return;
284283
}
285284

286-
if (target.type === MouseTargetType.GUTTER_GLYPH_MARGIN && target.position && target.detail.glyphMarginLane) {
287-
this._contentWidget?.hide();
288-
const glyphWidget = this._getOrCreateGlyphWidget();
289-
glyphWidget.startShowingAt(target.position.lineNumber, target.detail.glyphMarginLane);
290-
return;
291-
}
292-
if (target.type === MouseTargetType.GUTTER_LINE_NUMBERS && target.position) {
293-
this._contentWidget?.hide();
294-
const glyphWidget = this._getOrCreateGlyphWidget();
295-
glyphWidget.startShowingAt(target.position.lineNumber, 'lineNo');
285+
const glyphWidgetShowsOrWillShow = this._tryShowHoverWidget(mouseEvent, HoverWidgetType.Glyph);
286+
if (glyphWidgetShowsOrWillShow) {
296287
return;
297288
}
298289
if (_sticky) {
@@ -301,6 +292,17 @@ export class HoverController extends Disposable implements IEditorContribution {
301292
this._hideWidgets();
302293
}
303294

295+
private _tryShowHoverWidget(mouseEvent: IEditorMouseEvent, hoverWidgetType: HoverWidgetType): boolean {
296+
const isContentWidget = hoverWidgetType === HoverWidgetType.Content;
297+
const currentWidget = isContentWidget ? this._getOrCreateContentWidget() : this._getOrCreateGlyphWidget();
298+
const otherWidget = isContentWidget ? this._getOrCreateGlyphWidget() : this._getOrCreateContentWidget();
299+
const showsOrWillShow = currentWidget.showsOrWillShow(mouseEvent);
300+
if (showsOrWillShow) {
301+
otherWidget.hide();
302+
}
303+
return showsOrWillShow;
304+
}
305+
304306
private _onKeyDown(e: IKeyboardEvent): void {
305307
if (!this._editor.hasModel()) {
306308
return;
@@ -357,7 +359,7 @@ export class HoverController extends Disposable implements IEditorContribution {
357359

358360
private _getOrCreateGlyphWidget(): MarginHoverWidget {
359361
if (!this._glyphWidget) {
360-
this._glyphWidget = new MarginHoverWidget(this._editor, this._languageService, this._openerService);
362+
this._glyphWidget = this._instantiationService.createInstance(MarginHoverWidget, this._editor);
361363
}
362364
return this._glyphWidget;
363365
}

src/vs/editor/contrib/hover/browser/marginHover.ts

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { asArray } from 'vs/base/common/arrays';
88
import { IMarkdownString, isEmptyMarkdownString } from 'vs/base/common/htmlContent';
99
import { Disposable, DisposableStore } from 'vs/base/common/lifecycle';
1010
import { MarkdownRenderer } from 'vs/editor/browser/widget/markdownRenderer/browser/markdownRenderer';
11-
import { ICodeEditor, IOverlayWidget, IOverlayWidgetPosition } from 'vs/editor/browser/editorBrowser';
11+
import { ICodeEditor, IEditorMouseEvent, IOverlayWidget, IOverlayWidgetPosition, MouseTargetType } from 'vs/editor/browser/editorBrowser';
1212
import { ConfigurationChangedEvent, EditorOption } from 'vs/editor/common/config/editorOptions';
1313
import { ILanguageService } from 'vs/editor/common/languages/language';
1414
import { HoverOperation, HoverStartMode, IHoverComputer } from 'vs/editor/contrib/hover/browser/hoverOperation';
@@ -101,7 +101,20 @@ export class MarginHoverWidget extends Disposable implements IOverlayWidget {
101101
}
102102
}
103103

104-
public startShowingAt(lineNumber: number, laneOrLine: LaneOrLineNumber): void {
104+
public showsOrWillShow(mouseEvent: IEditorMouseEvent): boolean {
105+
const target = mouseEvent.target;
106+
if (target.type === MouseTargetType.GUTTER_GLYPH_MARGIN && target.detail.glyphMarginLane) {
107+
this._startShowingAt(target.position.lineNumber, target.detail.glyphMarginLane);
108+
return true;
109+
}
110+
if (target.type === MouseTargetType.GUTTER_LINE_NUMBERS) {
111+
this._startShowingAt(target.position.lineNumber, 'lineNo');
112+
return true;
113+
}
114+
return false;
115+
}
116+
117+
private _startShowingAt(lineNumber: number, laneOrLine: LaneOrLineNumber): void {
105118
if (this._computer.lineNumber === lineNumber && this._computer.lane === laneOrLine) {
106119
// We have to show the widget at the exact same line number as before, so no work is needed
107120
return;

0 commit comments

Comments
 (0)