@@ -45,6 +45,7 @@ export class StickyScrollWidget extends Disposable implements IOverlayWidget {
45
45
private _lineNumbers : number [ ] = [ ] ;
46
46
private _lastLineRelativePosition : number = 0 ;
47
47
private _minContentWidthInPx : number = 0 ;
48
+ private _isOnGlyphMargin : boolean = false ;
48
49
49
50
constructor (
50
51
private readonly _editor : ICodeEditor
@@ -147,6 +148,20 @@ export class StickyScrollWidget extends Disposable implements IOverlayWidget {
147
148
this . _rootDomNode . style . display = 'none' ;
148
149
}
149
150
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
+
150
165
private async _renderRootNode ( ) : Promise < void > {
151
166
152
167
const foldingModel = await FoldingController . get ( this . _editor ) ?. getFoldingModel ( ) ;
@@ -159,6 +174,7 @@ export class StickyScrollWidget extends Disposable implements IOverlayWidget {
159
174
}
160
175
if ( foldingModel ) {
161
176
this . _setFoldingHoverListeners ( ) ;
177
+ this . _useFoldingOpacityTransition ( ! this . _isOnGlyphMargin ) ;
162
178
}
163
179
164
180
const widgetHeight : number = this . _lineNumbers . length * this . _lineHeight + this . _lastLineRelativePosition ;
@@ -187,30 +203,14 @@ export class StickyScrollWidget extends Disposable implements IOverlayWidget {
187
203
return ;
188
204
}
189
205
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 ) ;
208
208
} ) ) ;
209
209
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
+
214
214
} ) ) ;
215
215
}
216
216
@@ -318,8 +318,7 @@ export class StickyScrollWidget extends Disposable implements IOverlayWidget {
318
318
const isCollapsed = foldingRegions . isCollapsed ( indexOfFoldingRegion ) ;
319
319
const foldingIcon = new StickyFoldingIcon ( isCollapsed , this . _lineHeight ) ;
320
320
container . append ( foldingIcon . domNode ) ;
321
- foldingIcon . setVisible ( isCollapsed || showFoldingControls === 'always' ) ;
322
- foldingIcon . setTransitionRequired ( true ) ;
321
+ foldingIcon . setVisible ( this . _isOnGlyphMargin ? true : ( isCollapsed || showFoldingControls === 'always' ) ) ;
323
322
324
323
this . _foldingIconStore . add ( dom . addDisposableListener ( foldingIcon . domNode , dom . EventType . CLICK , ( ) => {
325
324
toggleCollapseState ( foldingModel , Number . MAX_VALUE , [ line ] ) ;
@@ -440,8 +439,4 @@ class StickyFoldingIcon {
440
439
this . domNode . style . cursor = visible ? 'pointer' : 'default' ;
441
440
this . domNode . style . opacity = visible ? '1' : '0' ;
442
441
}
443
-
444
- public setTransitionRequired ( transitionRequired : boolean ) {
445
- this . domNode . style . transition = `opacity ${ transitionRequired ? 0.5 : 0 } s` ;
446
- }
447
442
}
0 commit comments