Use better check for equality that works with floats and make sure the position of a hit test result is always contained in the range

This commit is contained in:
Alex Dima
2022-11-18 21:47:06 +01:00
parent fcb512b8c5
commit ce01435c9a
+10 -10
View File
@@ -495,15 +495,17 @@ export class MouseTargetFactory {
const request = new HitTestRequest(ctx, editorPos, pos, relativePos, target);
try {
const r = MouseTargetFactory._createMouseTarget(ctx, request, false);
// console.log(MouseTarget.toString(r));
if (r.type === MouseTargetType.CONTENT_TEXT) {
// Snap to the nearest soft tab boundary if atomic soft tabs are enabled.
if (ctx.stickyTabStops && r.position !== null) {
const position = MouseTargetFactory._snapToSoftTabBoundary(r.position, ctx.viewModel);
return request.fulfillContentText(position, r.range, r.detail);
const range = EditorRange.fromPositions(position, position).plusRange(r.range);
return request.fulfillContentText(position, range, r.detail);
}
}
// console.log(MouseTarget.toString(r));
return r;
} catch (err) {
// console.log(err);
@@ -782,12 +784,10 @@ export class MouseTargetFactory {
const lineNumber = pos.lineNumber;
const column = pos.column;
const mouseContentHorizontalOffset = Math.floor(request.mouseContentHorizontalOffset);
const lineWidth = ctx.getLineWidth(lineNumber);
if (mouseContentHorizontalOffset > lineWidth) {
const detail = createEmptyContentDataInLines(mouseContentHorizontalOffset - lineWidth);
if (request.mouseContentHorizontalOffset > lineWidth) {
const detail = createEmptyContentDataInLines(request.mouseContentHorizontalOffset - lineWidth);
return request.fulfillContentEmpty(pos, detail);
}
@@ -799,7 +799,7 @@ export class MouseTargetFactory {
const columnHorizontalOffset = visibleRange.left;
if (mouseContentHorizontalOffset === columnHorizontalOffset) {
if (Math.abs(request.mouseContentHorizontalOffset - columnHorizontalOffset) < 1) {
return request.fulfillContentText(pos, null, { mightBeForeignElement: !!injectedText, injectedText });
}
@@ -833,15 +833,15 @@ export class MouseTargetFactory {
for (let i = 1; i < points.length; i++) {
const prev = points[i - 1];
const curr = points[i];
if (prev.offset <= mouseContentHorizontalOffset && mouseContentHorizontalOffset <= curr.offset) {
if (prev.offset <= request.mouseContentHorizontalOffset && request.mouseContentHorizontalOffset <= curr.offset) {
rng = new EditorRange(lineNumber, prev.column, lineNumber, curr.column);
// See https://github.com/microsoft/vscode/issues/152819
// Due to the use of zwj, the browser's hit test result is skewed towards the left
// Here we try to correct that if the mouse horizontal offset is closer to the right than the left
const prevDelta = Math.abs(prev.offset - mouseContentHorizontalOffset);
const nextDelta = Math.abs(curr.offset - mouseContentHorizontalOffset);
const prevDelta = Math.abs(prev.offset - request.mouseContentHorizontalOffset);
const nextDelta = Math.abs(curr.offset - request.mouseContentHorizontalOffset);
pos = (
prevDelta < nextDelta