Skip to content

Commit 320d601

Browse files
authored
Merge pull request microsoft#163947 from microsoft/tyriar/161622_suggest_layout
Run suggestWidget.showSuggestions and showDetails in an animation frame
2 parents fec87f3 + 9ed5a10 commit 320d601

File tree

1 file changed

+27
-13
lines changed

1 file changed

+27
-13
lines changed

src/vs/editor/contrib/suggest/browser/suggestWidget.ts

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { List } from 'vs/base/browser/ui/list/listWidget';
1111
import { CancelablePromise, createCancelablePromise, disposableTimeout, TimeoutTimer } from 'vs/base/common/async';
1212
import { onUnexpectedError } from 'vs/base/common/errors';
1313
import { Emitter, Event, PauseableEmitter } from 'vs/base/common/event';
14-
import { DisposableStore, IDisposable } from 'vs/base/common/lifecycle';
14+
import { DisposableStore, IDisposable, MutableDisposable } from 'vs/base/common/lifecycle';
1515
import { clamp } from 'vs/base/common/numbers';
1616
import * as strings from 'vs/base/common/strings';
1717
import 'vs/css!./media/suggest';
@@ -104,6 +104,8 @@ export class SuggestWidget implements IDisposable {
104104
private _state: State = State.Hidden;
105105
private _isAuto: boolean = false;
106106
private _loadingTimeout?: IDisposable;
107+
private readonly _pendingLayout = new MutableDisposable();
108+
private readonly _pendingShowDetails = new MutableDisposable();
107109
private _currentSuggestionDetails?: CancelablePromise<void>;
108110
private _focusedItem?: CompletionItem;
109111
private _ignoreFocusEvents: boolean = false;
@@ -300,6 +302,8 @@ export class SuggestWidget implements IDisposable {
300302
this._status.dispose();
301303
this._disposables.dispose();
302304
this._loadingTimeout?.dispose();
305+
this._pendingLayout.dispose();
306+
this._pendingShowDetails.dispose();
303307
this._showTimeout.dispose();
304308
this._contentWidget.dispose();
305309
this.element.dispose();
@@ -559,9 +563,12 @@ export class SuggestWidget implements IDisposable {
559563
this._onDidSelect.resume();
560564
}
561565

562-
this._layout(this.element.size);
563-
// Reset focus border
564-
this._details.widget.domNode.classList.remove('focused');
566+
this._pendingLayout.value = dom.runAtThisOrScheduleAtNextAnimationFrame(() => {
567+
this._pendingLayout.clear();
568+
this._layout(this.element.size);
569+
// Reset focus border
570+
this._details.widget.domNode.classList.remove('focused');
571+
});
565572
}
566573

567574
selectNextPage(): boolean {
@@ -678,6 +685,7 @@ export class SuggestWidget implements IDisposable {
678685
toggleDetails(): void {
679686
if (this._isDetailsVisible()) {
680687
// hide details widget
688+
this._pendingShowDetails.clear();
681689
this._ctxSuggestWidgetDetailsVisible.set(false);
682690
this._setDetailsVisible(false);
683691
this._details.hide();
@@ -692,15 +700,18 @@ export class SuggestWidget implements IDisposable {
692700
}
693701

694702
showDetails(loading: boolean): void {
695-
this._details.show();
696-
if (loading) {
697-
this._details.widget.renderLoading();
698-
} else {
699-
this._details.widget.renderItem(this._list.getFocusedElements()[0], this._explainMode);
700-
}
701-
this._positionDetails();
702-
this.editor.focus();
703-
this.element.domNode.classList.add('shows-details');
703+
this._pendingShowDetails.value = dom.runAtThisOrScheduleAtNextAnimationFrame(() => {
704+
this._pendingShowDetails.clear();
705+
this._details.show();
706+
if (loading) {
707+
this._details.widget.renderLoading();
708+
} else {
709+
this._details.widget.renderItem(this._list.getFocusedElements()[0], this._explainMode);
710+
}
711+
this._positionDetails();
712+
this.editor.focus();
713+
this.element.domNode.classList.add('shows-details');
714+
});
704715
}
705716

706717
toggleExplainMode(): void {
@@ -719,7 +730,10 @@ export class SuggestWidget implements IDisposable {
719730
}
720731

721732
hideWidget(): void {
733+
this._pendingLayout.clear();
734+
this._pendingShowDetails.clear();
722735
this._loadingTimeout?.dispose();
736+
723737
this._setState(State.Hidden);
724738
this._onDidHide.fire(this);
725739
this.element.clearSashHoverState();

0 commit comments

Comments
 (0)