Skip to content

Commit 07a6890

Browse files
authored
Merge pull request microsoft#191440 from microsoft/aiday/simplifyingCode
Simplifying sticky widget folding icon code
2 parents ebd6724 + 14c1d7c commit 07a6890

File tree

3 files changed

+26
-29
lines changed

3 files changed

+26
-29
lines changed

build/lib/stylelint/vscode-known-variables.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -757,6 +757,7 @@
757757
"--vscode-sash-hover-size",
758758
"--vscode-sash-size",
759759
"--vscode-editorStickyScroll-scrollableWidth",
760+
"--vscode-editorStickyScroll-foldingOpacityTransition",
760761
"--window-border-color",
761762
"--workspace-trust-check-color",
762763
"--workspace-trust-selected-color",
@@ -779,4 +780,4 @@
779780
"--z-index-notebook-sticky-scroll",
780781
"--zoom-factor"
781782
]
782-
}
783+
}

src/vs/editor/contrib/stickyScroll/browser/stickyScroll.css

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535

3636
.monaco-editor .sticky-line-number .codicon {
3737
float: right;
38+
transition: var(--vscode-editorStickyScroll-foldingOpacityTransition);
3839
}
3940

4041
.monaco-editor .sticky-line-content {

src/vs/editor/contrib/stickyScroll/browser/stickyScrollWidget.ts

Lines changed: 23 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ export class StickyScrollWidget extends Disposable implements IOverlayWidget {
4545
private _lineNumbers: number[] = [];
4646
private _lastLineRelativePosition: number = 0;
4747
private _minContentWidthInPx: number = 0;
48+
private _isOnGlyphMargin: boolean = false;
4849

4950
constructor(
5051
private readonly _editor: ICodeEditor
@@ -147,6 +148,20 @@ export class StickyScrollWidget extends Disposable implements IOverlayWidget {
147148
this._rootDomNode.style.display = 'none';
148149
}
149150

151+
private _useFoldingOpacityTransition(requireTransitions: boolean) {
152+
this._lineNumbersDomNode.style.setProperty('--vscode-editorStickyScroll-foldingOpacityTransition', `opacity ${requireTransitions ? 0.5 : 0}s`);
153+
}
154+
155+
private _setFoldingIconsVisibility(allVisible: boolean) {
156+
for (const line of this._stickyLines) {
157+
const foldingIcon = line.foldingIcon;
158+
if (!foldingIcon) {
159+
continue;
160+
}
161+
foldingIcon.setVisible(allVisible ? true : foldingIcon.isCollapsed);
162+
}
163+
}
164+
150165
private async _renderRootNode(): Promise<void> {
151166

152167
const foldingModel = await FoldingController.get(this._editor)?.getFoldingModel();
@@ -159,6 +174,7 @@ export class StickyScrollWidget extends Disposable implements IOverlayWidget {
159174
}
160175
if (foldingModel) {
161176
this._setFoldingHoverListeners();
177+
this._useFoldingOpacityTransition(!this._isOnGlyphMargin);
162178
}
163179

164180
const widgetHeight: number = this._lineNumbers.length * this._lineHeight + this._lastLineRelativePosition;
@@ -187,30 +203,14 @@ export class StickyScrollWidget extends Disposable implements IOverlayWidget {
187203
return;
188204
}
189205
this._foldingIconStore.add(dom.addDisposableListener(this._lineNumbersDomNode, dom.EventType.MOUSE_ENTER, (e) => {
190-
const mouseEventTriggerredByClick =
191-
'fromElement' in e
192-
&& e.fromElement instanceof HTMLElement
193-
&& e.fromElement.classList.contains('codicon');
194-
195-
for (const line of this._stickyLines) {
196-
const foldingIcon = line.foldingIcon;
197-
if (!foldingIcon) {
198-
continue;
199-
}
200-
if (mouseEventTriggerredByClick) {
201-
foldingIcon.setTransitionRequired(false);
202-
foldingIcon.setVisible(true);
203-
setTimeout(() => { foldingIcon.setTransitionRequired(true); }, 300);
204-
} else {
205-
foldingIcon.setVisible(true);
206-
}
207-
}
206+
this._isOnGlyphMargin = true;
207+
this._setFoldingIconsVisibility(true);
208208
}));
209209
this._foldingIconStore.add(dom.addDisposableListener(this._lineNumbersDomNode, dom.EventType.MOUSE_LEAVE, () => {
210-
for (const line of this._stickyLines) {
211-
const foldingIcon = line.foldingIcon;
212-
foldingIcon?.setVisible(foldingIcon.isCollapsed);
213-
}
210+
this._isOnGlyphMargin = false;
211+
this._useFoldingOpacityTransition(true);
212+
this._setFoldingIconsVisibility(false);
213+
214214
}));
215215
}
216216

@@ -318,8 +318,7 @@ export class StickyScrollWidget extends Disposable implements IOverlayWidget {
318318
const isCollapsed = foldingRegions.isCollapsed(indexOfFoldingRegion);
319319
const foldingIcon = new StickyFoldingIcon(isCollapsed, this._lineHeight);
320320
container.append(foldingIcon.domNode);
321-
foldingIcon.setVisible(isCollapsed || showFoldingControls === 'always');
322-
foldingIcon.setTransitionRequired(true);
321+
foldingIcon.setVisible(this._isOnGlyphMargin ? true : (isCollapsed || showFoldingControls === 'always'));
323322

324323
this._foldingIconStore.add(dom.addDisposableListener(foldingIcon.domNode, dom.EventType.CLICK, () => {
325324
toggleCollapseState(foldingModel, Number.MAX_VALUE, [line]);
@@ -440,8 +439,4 @@ class StickyFoldingIcon {
440439
this.domNode.style.cursor = visible ? 'pointer' : 'default';
441440
this.domNode.style.opacity = visible ? '1' : '0';
442441
}
443-
444-
public setTransitionRequired(transitionRequired: boolean) {
445-
this.domNode.style.transition = `opacity ${transitionRequired ? 0.5 : 0}s`;
446-
}
447442
}

0 commit comments

Comments
 (0)