未验证 提交 8c76afad 编写于 作者: A Alex Dima

Fixes #108160: Handle padding in mouse target computation

上级 9d389f03
......@@ -329,6 +329,14 @@ export class HitTestContext {
return this._context.viewLayout.isAfterLines(mouseVerticalOffset);
}
public isInTopPadding(mouseVerticalOffset: number): boolean {
return this._context.viewLayout.isInTopPadding(mouseVerticalOffset);
}
public isInBottomPadding(mouseVerticalOffset: number): boolean {
return this._context.viewLayout.isInBottomPadding(mouseVerticalOffset);
}
public getVerticalOffsetForLineNumber(lineNumber: number): number {
return this._context.viewLayout.getVerticalOffsetForLineNumber(lineNumber);
}
......@@ -656,8 +664,12 @@ export class MouseTargetFactory {
return null;
}
if (ctx.isInTopPadding(request.mouseVerticalOffset)) {
return request.fulfill(MouseTargetType.CONTENT_EMPTY, new Position(1, 1), undefined, EMPTY_CONTENT_AFTER_LINES);
}
// Check if it is below any lines and any view zones
if (ctx.isAfterLines(request.mouseVerticalOffset)) {
if (ctx.isAfterLines(request.mouseVerticalOffset) || ctx.isInBottomPadding(request.mouseVerticalOffset)) {
// This most likely indicates it happened after the last view-line
const lineCount = ctx.model.getLineCount();
const maxLineColumn = ctx.model.getLineMaxColumn(lineCount);
......
......@@ -546,6 +546,23 @@ export class LinesLayout {
return verticalOffset > totalHeight;
}
public isInTopPadding(verticalOffset: number): boolean {
if (this._paddingTop === 0) {
return false;
}
this._checkPendingChanges();
return (verticalOffset < this._paddingTop);
}
public isInBottomPadding(verticalOffset: number): boolean {
if (this._paddingBottom === 0) {
return false;
}
this._checkPendingChanges();
const totalHeight = this.getLinesTotalHeight();
return (verticalOffset >= totalHeight - this._paddingBottom);
}
/**
* Find the first line number that is at or after vertical offset `verticalOffset`.
* i.e. if getVerticalOffsetForLine(line) is x and getVerticalOffsetForLine(line + 1) is y, then
......
......@@ -364,6 +364,13 @@ export class ViewLayout extends Disposable implements IViewLayout {
public isAfterLines(verticalOffset: number): boolean {
return this._linesLayout.isAfterLines(verticalOffset);
}
public isInTopPadding(verticalOffset: number): boolean {
return this._linesLayout.isInTopPadding(verticalOffset);
}
isInBottomPadding(verticalOffset: number): boolean {
return this._linesLayout.isInBottomPadding(verticalOffset);
}
public getLineNumberAtVerticalOffset(verticalOffset: number): number {
return this._linesLayout.getLineNumberAtOrAfterVerticalOffset(verticalOffset);
}
......
......@@ -61,6 +61,8 @@ export interface IViewLayout {
getWhitespaces(): IEditorWhitespace[];
isAfterLines(verticalOffset: number): boolean;
isInTopPadding(verticalOffset: number): boolean;
isInBottomPadding(verticalOffset: number): boolean;
getLineNumberAtVerticalOffset(verticalOffset: number): number;
getVerticalOffsetForLineNumber(lineNumber: number): number;
getWhitespaceAtVerticalOffset(verticalOffset: number): IViewWhitespaceViewportData | null;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册