Skip to content

Commit 2483e08

Browse files
committed
changes from review from yesterday
1 parent 2e83346 commit 2483e08

File tree

3 files changed

+35
-31
lines changed

3 files changed

+35
-31
lines changed

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

Lines changed: 13 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { coalesce } from 'vs/base/common/arrays';
99
import { CancellationToken } from 'vs/base/common/cancellation';
1010
import { KeyCode } from 'vs/base/common/keyCodes';
1111
import { Disposable, DisposableStore, toDisposable } from 'vs/base/common/lifecycle';
12-
import { ContentWidgetPositionPreference, IActiveCodeEditor, ICodeEditor, IEditorMouseEvent, MouseTargetType } from 'vs/editor/browser/editorBrowser';
12+
import { ContentWidgetPositionPreference, IActiveCodeEditor, ICodeEditor, IContentWidgetPosition, IEditorMouseEvent, MouseTargetType } from 'vs/editor/browser/editorBrowser';
1313
import { ConfigurationChangedEvent, EditorOption } from 'vs/editor/common/config/editorOptions';
1414
import { Position } from 'vs/editor/common/core/position';
1515
import { Range } from 'vs/editor/common/core/range';
@@ -452,7 +452,6 @@ export class ContentHoverWidget extends ResizableContentWidget {
452452

453453
private _visibleData: ContentHoverVisibleData | undefined;
454454
private _positionPreference: ContentWidgetPositionPreference | undefined;
455-
private _position: Position | undefined;
456455

457456
private readonly _hover: HoverWidget = this._register(new HoverWidget());
458457
private readonly _hoverVisibleKey: IContextKey<boolean>;
@@ -470,14 +469,6 @@ export class ContentHoverWidget extends ResizableContentWidget {
470469
return this._hoverVisibleKey.get() ?? false;
471470
}
472471

473-
get position(): Position | undefined {
474-
return this._position;
475-
}
476-
477-
set position(position: Position | undefined) {
478-
this._position = position;
479-
}
480-
481472
constructor(
482473
_editor: ICodeEditor,
483474
@IContextKeyService _contextKeyService: IContextKeyService
@@ -504,6 +495,7 @@ export class ContentHoverWidget extends ResizableContentWidget {
504495
}));
505496
this._setHoverData(undefined);
506497
this._layout();
498+
this._editor.addContentWidget(this);
507499
}
508500

509501
public override dispose(): void {
@@ -643,7 +635,6 @@ export class ContentHoverWidget extends ResizableContentWidget {
643635
}
644636

645637
private _setHoverData(hoverData: ContentHoverVisibleData | undefined): void {
646-
this._position = hoverData?.showAtPosition;
647638
this._visibleData?.disposables.dispose();
648639
this._visibleData = hoverData;
649640
this._hoverVisibleKey.set(!!hoverData);
@@ -687,9 +678,6 @@ export class ContentHoverWidget extends ResizableContentWidget {
687678
}
688679

689680
private _render(node: DocumentFragment, hoverData: ContentHoverVisibleData) {
690-
if (!this._hoverVisibleKey.get()) {
691-
this._editor.addContentWidget(this);
692-
}
693681
this._setHoverData(hoverData);
694682
this._updateFont();
695683
this._updateContent(node);
@@ -700,25 +688,26 @@ export class ContentHoverWidget extends ResizableContentWidget {
700688
this._editor.render();
701689
}
702690

703-
private _setContentPosition(hoverData: ContentHoverVisibleData, preference?: ContentWidgetPositionPreference) {
704-
this._contentPosition = {
705-
position: hoverData.showAtPosition,
706-
secondaryPosition: hoverData.showAtSecondaryPosition,
707-
positionAffinity: hoverData.isBeforeContent ? PositionAffinity.LeftOfInjectedText : undefined,
708-
preference: [preference ?? ContentWidgetPositionPreference.ABOVE]
691+
override getPosition(): IContentWidgetPosition | null {
692+
if (!this._visibleData) {
693+
return null;
694+
}
695+
return {
696+
position: this._visibleData.showAtPosition,
697+
secondaryPosition: this._visibleData.showAtSecondaryPosition,
698+
positionAffinity: this._visibleData.isBeforeContent ? PositionAffinity.LeftOfInjectedText : undefined,
699+
preference: [this._positionPreference ?? ContentWidgetPositionPreference.ABOVE]
709700
};
710701
}
711702

712703
public showAt(node: DocumentFragment, hoverData: ContentHoverVisibleData): void {
713704
if (!this._editor || !this._editor.hasModel()) {
714705
return;
715706
}
716-
this._setContentPosition(hoverData);
717707
this._render(node, hoverData);
718708
const widgetHeight = this._getWidgetHeight();
719709
const widgetPosition = hoverData.showAtPosition;
720710
this._positionPreference = this._findPositionPreference(widgetHeight, widgetPosition) ?? ContentWidgetPositionPreference.ABOVE;
721-
this._setContentPosition(hoverData, this._positionPreference);
722711

723712
// See https://github.com/microsoft/vscode/issues/140339
724713
// TODO: Doing a second layout of the hover after force rendering the editor
@@ -733,13 +722,13 @@ export class ContentHoverWidget extends ResizableContentWidget {
733722
if (!this._visibleData) {
734723
return;
735724
}
725+
const stoleFocus = this._visibleData.stoleFocus;
736726
this._setHoverData(undefined);
737727
this._resizableNode.maxSize = new dom.Dimension(Infinity, Infinity);
738728
this._resizableNode.clearSashHoverState();
739-
this._editor.removeContentWidget(this);
740729
this._hoverFocusedKey.set(false);
741730
this._editor.layoutContentWidget(this);
742-
if (this._visibleData.stoleFocus) {
731+
if (stoleFocus) {
743732
this._editor.focus();
744733
}
745734
}

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

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,11 @@ import { ResultKind } from 'vs/platform/keybinding/common/keybindingResolver';
3232
import * as nls from 'vs/nls';
3333
import 'vs/css!./hover';
3434

35+
// sticky suggest widget which doesn't disappear on focus out and such
36+
const _sticky = false
37+
// || Boolean("true") // done "weirdly" so that a lint warning prevents you from pushing this
38+
;
39+
3540
export class ModesHoverController implements IEditorContribution {
3641

3742
public static readonly ID = 'editor.contrib.hover';
@@ -138,7 +143,9 @@ export class ModesHoverController implements IEditorContribution {
138143
// when the mouse is inside hover widget
139144
return;
140145
}
141-
this._hideWidgets();
146+
if (!_sticky) {
147+
this._hideWidgets();
148+
}
142149
}
143150

144151
private _onEditorMouseMove(mouseEvent: IEditorMouseEvent): void {
@@ -177,7 +184,7 @@ export class ModesHoverController implements IEditorContribution {
177184
return;
178185
}
179186

180-
if (!this._isHoverEnabled) {
187+
if (!this._isHoverEnabled && !_sticky) {
181188
this._hideWidgets();
182189
return;
183190
}
@@ -197,7 +204,7 @@ export class ModesHoverController implements IEditorContribution {
197204
this._glyphWidget.startShowingAt(target.position.lineNumber);
198205
return;
199206
}
200-
if (!this._contentWidget?.widget.isResizing) {
207+
if (!this._contentWidget?.widget.isResizing && !_sticky) {
201208
this._hideWidgets();
202209
}
203210
}
@@ -219,6 +226,9 @@ export class ModesHoverController implements IEditorContribution {
219226
}
220227

221228
private _hideWidgets(): void {
229+
if (_sticky) {
230+
return;
231+
}
222232
if ((this._isMouseDown && this._hoverClicked && this._contentWidget?.isColorPickerVisible()) || InlineSuggestionHintsContentWidget.dropDownVisible) {
223233
return;
224234
}

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

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,11 @@ import { Disposable } from 'vs/base/common/lifecycle';
88
import { ContentWidgetPositionPreference, ICodeEditor, IContentWidget, IContentWidgetPosition } from 'vs/editor/browser/editorBrowser';
99
import { EditorOption } from 'vs/editor/common/config/editorOptions';
1010
import { clamp } from 'vs/base/common/numbers';
11-
import { IPosition } from 'vs/editor/common/core/position';
11+
import { IPosition, Position } from 'vs/editor/common/core/position';
1212
import * as dom from 'vs/base/browser/dom';
1313

14-
const HEADER_HEIGHT = 30;
14+
const TOP_HEIGHT = 30;
15+
const BOTTOM_HEIGHT = 24;
1516
const MIN_HEIGHT = 24;
1617

1718
export abstract class ResizableContentWidget extends Disposable implements IContentWidget {
@@ -58,14 +59,18 @@ export abstract class ResizableContentWidget extends Disposable implements ICont
5859
return this._contentPosition;
5960
}
6061

62+
get position(): Position | undefined {
63+
return this._contentPosition?.position ? Position.lift(this._contentPosition.position) : undefined;
64+
}
65+
6166
protected _availableVerticalSpaceAbove(position: IPosition): number | undefined {
6267
const editorDomNode = this._editor.getDomNode();
6368
const mouseBox = this._editor.getScrolledVisiblePosition(position);
6469
if (!editorDomNode || !mouseBox) {
6570
return;
6671
}
6772
const editorBox = dom.getDomNodePagePosition(editorDomNode);
68-
return editorBox.top + mouseBox.top - HEADER_HEIGHT;
73+
return editorBox.top + mouseBox.top - TOP_HEIGHT;
6974
}
7075

7176
protected _availableVerticalSpaceBelow(position: IPosition): number | undefined {
@@ -77,7 +82,7 @@ export abstract class ResizableContentWidget extends Disposable implements ICont
7782
const editorBox = dom.getDomNodePagePosition(editorDomNode);
7883
const bodyBox = dom.getClientArea(document.body);
7984
const mouseBottom = editorBox.top + mouseBox.top + mouseBox.height;
80-
return bodyBox.height - mouseBottom;
85+
return bodyBox.height - mouseBottom - BOTTOM_HEIGHT;
8186
}
8287

8388
protected _findPositionPreference(widgetHeight: number, showAtPosition: IPosition): ContentWidgetPositionPreference | undefined {

0 commit comments

Comments
 (0)