diff options
Diffstat (limited to 'src/vs/editor/contrib/folding/browser/foldingDecorations.ts')
-rw-r--r-- | src/vs/editor/contrib/folding/browser/foldingDecorations.ts | 33 |
1 files changed, 27 insertions, 6 deletions
diff --git a/src/vs/editor/contrib/folding/browser/foldingDecorations.ts b/src/vs/editor/contrib/folding/browser/foldingDecorations.ts index bdb63ab19e9..132dd19a9fa 100644 --- a/src/vs/editor/contrib/folding/browser/foldingDecorations.ts +++ b/src/vs/editor/contrib/folding/browser/foldingDecorations.ts @@ -5,7 +5,7 @@ import { Codicon } from 'vs/base/common/codicons'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; -import { IModelDecorationsChangeAccessor, TrackedRangeStickiness } from 'vs/editor/common/model'; +import { IModelDecorationOptions, IModelDecorationsChangeAccessor, TrackedRangeStickiness } from 'vs/editor/common/model'; import { ModelDecorationOptions } from 'vs/editor/common/model/textModel'; import { IDecorationProvider } from 'vs/editor/contrib/folding/browser/foldingModel'; import { localize } from 'vs/nls'; @@ -14,6 +14,7 @@ import { ThemeIcon } from 'vs/platform/theme/common/themeService'; export const foldingExpandedIcon = registerIcon('folding-expanded', Codicon.chevronDown, localize('foldingExpandedIcon', 'Icon for expanded ranges in the editor glyph margin.')); export const foldingCollapsedIcon = registerIcon('folding-collapsed', Codicon.chevronRight, localize('foldingCollapsedIcon', 'Icon for collapsed ranges in the editor glyph margin.')); +export const foldingManualIcon = registerIcon('folding-manual', Codicon.ellipsis, localize('foldingManualIcon', 'Icon for manually collapsed ranges in the editor glyph margin.')); export class FoldingDecorationProvider implements IDecorationProvider { private static readonly COLLAPSED_VISUAL_DECORATION = ModelDecorationOptions.register({ @@ -33,6 +34,23 @@ export class FoldingDecorationProvider implements IDecorationProvider { firstLineDecorationClassName: ThemeIcon.asClassName(foldingCollapsedIcon) }); + private static readonly MANUALLY_COLLAPSED_VISUAL_DECORATION = ModelDecorationOptions.register({ + description: 'folding-manually-collapsed-visual-decoration', + stickiness: TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, + afterContentClassName: 'inline-folded', + isWholeLine: true, + firstLineDecorationClassName: ThemeIcon.asClassName(foldingManualIcon) + }); + + private static readonly MANUALLY_COLLAPSED_HIGHLIGHTED_VISUAL_DECORATION = ModelDecorationOptions.register({ + description: 'folding-manually-collapsed-highlighted-visual-decoration', + stickiness: TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, + afterContentClassName: 'inline-folded', + className: 'folded-background', + isWholeLine: true, + firstLineDecorationClassName: ThemeIcon.asClassName(foldingManualIcon) + }); + private static readonly EXPANDED_AUTO_HIDE_VISUAL_DECORATION = ModelDecorationOptions.register({ description: 'folding-expanded-auto-hide-visual-decoration', stickiness: TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, @@ -52,20 +70,23 @@ export class FoldingDecorationProvider implements IDecorationProvider { stickiness: TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges }); - public autoHideFoldingControls: boolean = true; + public showFoldingControls: 'always' | 'never' | 'mouseover' = 'mouseover'; public showFoldingHighlights: boolean = true; constructor(private readonly editor: ICodeEditor) { } - getDecorationOption(isCollapsed: boolean, isHidden: boolean): ModelDecorationOptions { - if (isHidden) { + getDecorationOption(isCollapsed: boolean, isHidden: boolean, isManualSelection: boolean): IModelDecorationOptions { + if (isHidden // is inside another collapsed region + || this.showFoldingControls === 'never' || (isManualSelection && !isCollapsed)) { // return FoldingDecorationProvider.HIDDEN_RANGE_DECORATION; } if (isCollapsed) { - return this.showFoldingHighlights ? FoldingDecorationProvider.COLLAPSED_HIGHLIGHTED_VISUAL_DECORATION : FoldingDecorationProvider.COLLAPSED_VISUAL_DECORATION; - } else if (this.autoHideFoldingControls) { + return isManualSelection ? + (this.showFoldingHighlights ? FoldingDecorationProvider.MANUALLY_COLLAPSED_HIGHLIGHTED_VISUAL_DECORATION : FoldingDecorationProvider.MANUALLY_COLLAPSED_VISUAL_DECORATION) + : (this.showFoldingHighlights ? FoldingDecorationProvider.COLLAPSED_HIGHLIGHTED_VISUAL_DECORATION : FoldingDecorationProvider.COLLAPSED_VISUAL_DECORATION); + } else if (this.showFoldingControls === 'mouseover') { return FoldingDecorationProvider.EXPANDED_AUTO_HIDE_VISUAL_DECORATION; } else { return FoldingDecorationProvider.EXPANDED_VISUAL_DECORATION; |