From 2a8142f7b43be67db502ffe02ca8932f3ffa5b5f Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Wed, 8 Nov 2017 12:02:08 +0100 Subject: [PATCH] [folding] optimize mouse click listening --- .../editor/browser/controller/mouseTarget.ts | 13 ++++-- src/vs/editor/contrib/folding/folding.ts | 42 +++++++++---------- 2 files changed, 30 insertions(+), 25 deletions(-) diff --git a/src/vs/editor/browser/controller/mouseTarget.ts b/src/vs/editor/browser/controller/mouseTarget.ts index bc8982232d3..ff6bc23c170 100644 --- a/src/vs/editor/browser/controller/mouseTarget.ts +++ b/src/vs/editor/browser/controller/mouseTarget.ts @@ -32,6 +32,10 @@ export interface IMarginData { offsetX: number; } +export interface IEmptyContentData { + isAfterLines: boolean; +} + interface IETextRange { boundingHeight: number; boundingLeft: number; @@ -397,6 +401,9 @@ class HitTestRequest extends BareHitTestRequest { } } +const EMPTY_CONTENT_AFTER_LINES: IEmptyContentData = { isAfterLines: true }; +const EMPTY_CONTENT_IN_LINES: IEmptyContentData = { isAfterLines: false }; + export class MouseTargetFactory { private _context: ViewContext; @@ -608,7 +615,7 @@ export class MouseTargetFactory { // This most likely indicates it happened after the last view-line const lineCount = ctx.model.getLineCount(); const maxLineColumn = ctx.model.getLineMaxColumn(lineCount); - return request.fulfill(MouseTargetType.CONTENT_EMPTY, new Position(lineCount, maxLineColumn)); + return request.fulfill(MouseTargetType.CONTENT_EMPTY, new Position(lineCount, maxLineColumn), void 0, EMPTY_CONTENT_AFTER_LINES); } if (domHitTestExecuted) { @@ -682,9 +689,9 @@ export class MouseTargetFactory { if (request.mouseContentHorizontalOffset > lineWidth) { if (browser.isEdge && pos.column === 1) { // See https://github.com/Microsoft/vscode/issues/10875 - return request.fulfill(MouseTargetType.CONTENT_EMPTY, new Position(lineNumber, ctx.model.getLineMaxColumn(lineNumber))); + return request.fulfill(MouseTargetType.CONTENT_EMPTY, new Position(lineNumber, ctx.model.getLineMaxColumn(lineNumber)), void 0, EMPTY_CONTENT_IN_LINES); } - return request.fulfill(MouseTargetType.CONTENT_EMPTY, pos); + return request.fulfill(MouseTargetType.CONTENT_EMPTY, pos, void 0, EMPTY_CONTENT_IN_LINES); } let visibleRange = ctx.visibleRangeForPosition2(lineNumber, column); diff --git a/src/vs/editor/contrib/folding/folding.ts b/src/vs/editor/contrib/folding/folding.ts index 76e5122e89d..f45ce6b6b3e 100644 --- a/src/vs/editor/contrib/folding/folding.ts +++ b/src/vs/editor/contrib/folding/folding.ts @@ -8,7 +8,6 @@ import * as nls from 'vs/nls'; import * as types from 'vs/base/common/types'; -import * as dom from 'vs/base/browser/dom'; import { RunOnceScheduler, Delayer } from 'vs/base/common/async'; import { KeyCode, KeyMod, KeyChord } from 'vs/base/common/keyCodes'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; @@ -21,7 +20,7 @@ import { FoldingModel, setCollapseStateAtLevel, CollapseMemento, setCollapseStat import { FoldingDecorationProvider } from './foldingDecorations'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { IConfigurationChangedEvent } from 'vs/editor/common/config/editorOptions'; -import { IMarginData } from 'vs/editor/browser/controller/mouseTarget'; +import { IMarginData, IEmptyContentData } from 'vs/editor/browser/controller/mouseTarget'; import { HiddenRangeModel } from 'vs/editor/contrib/folding/hiddenRangeModel'; import { IRange } from 'vs/editor/common/core/range'; @@ -184,11 +183,11 @@ export class FoldingController { private onHiddenRangesChanges(hiddenRanges: IRange[]) { if (hiddenRanges.length) { - let selections = this.editor.getSelections(); + let selections = this.editor.getSelections(); if (selections) { - if (this.hiddenRangeModel.adjustSelections(selections)) { - this.editor.setSelections(selections); - } + if (this.hiddenRangeModel.adjustSelections(selections)) { + this.editor.setSelections(selections); + } } } this.editor.setHiddenAreas(hiddenRanges); @@ -205,15 +204,15 @@ export class FoldingController { if (foldingModel) { let selections = this.editor.getSelections(); if (selections) { - for (let selection of selections) { - let lineNumber = selection.selectionStartLineNumber; - if (this.hiddenRangeModel.isHidden(lineNumber)) { - let toToggle = foldingModel.getAllRegionsAtLine(lineNumber, r => r.isCollapsed && lineNumber > r.startLineNumber); - foldingModel.toggleCollapseState(toToggle); + for (let selection of selections) { + let lineNumber = selection.selectionStartLineNumber; + if (this.hiddenRangeModel.isHidden(lineNumber)) { + let toToggle = foldingModel.getAllRegionsAtLine(lineNumber, r => r.isCollapsed && lineNumber > r.startLineNumber); + foldingModel.toggleCollapseState(toToggle); + } } } } - } }); } @@ -244,21 +243,20 @@ export class FoldingController { iconClicked = true; break; case MouseTargetType.CONTENT_EMPTY: { - let model = this.editor.getModel(); - if (range.startColumn === model.getLineMaxColumn(range.startLineNumber)) { - let editorCoords = dom.getDomNodePagePosition(this.editor.getDomNode()); - let pos = this.editor.getScrolledVisiblePosition(range.getEndPosition()); - if (e.event.posy > editorCoords.top + pos.top + pos.height) { - return; + if (this.hiddenRangeModel.hasRanges()) { + const data = e.target.detail as IEmptyContentData; + if (!data.isAfterLines) { + break; } - break; } return; } case MouseTargetType.CONTENT_TEXT: { - let model = this.editor.getModel(); - if (range.startColumn === model.getLineMaxColumn(range.startLineNumber)) { - break; + if (this.hiddenRangeModel.hasRanges()) { + let model = this.editor.getModel(); + if (range.startColumn === model.getLineMaxColumn(range.startLineNumber)) { + break; + } } return; }