From b7810ef1061acf19b2bd9a353fa663babd4f9ef0 Mon Sep 17 00:00:00 2001 From: Alice Date: Mon, 26 Jun 2023 21:47:48 +0200 Subject: [PATCH 01/13] fix bug in guttertooltip --- src/layer/lines.js | 9 +++++++++ src/mouse/default_gutter_handler.js | 14 +++++++++----- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/layer/lines.js b/src/layer/lines.js index e2f9a1e808d..79287598300 100644 --- a/src/layer/lines.js +++ b/src/layer/lines.js @@ -42,6 +42,15 @@ class Lines { get(index) { return this.cells[index]; } + + getAtRow(row) { + for (var i = 0; i < this.getLength(); i++){ + var cell = this.get(i); + if (cell.row == row) + return cell; + } + return null; + } shift() { this.$cacheCell(this.cells.shift()); diff --git a/src/mouse/default_gutter_handler.js b/src/mouse/default_gutter_handler.js index c53fd57e9c4..aa413f6bc3c 100644 --- a/src/mouse/default_gutter_handler.js +++ b/src/mouse/default_gutter_handler.js @@ -57,11 +57,15 @@ function GutterHandler(mouseHandler) { if (mouseHandler.$tooltipFollowsMouse) { moveTooltip(mouseEvent); } else { - var gutterElement = gutter.$lines.cells[row].element.querySelector("[class*=ace_icon]"); - var rect = gutterElement.getBoundingClientRect(); - var style = tooltip.getElement().style; - style.left = rect.right + "px"; - style.top = rect.bottom + "px"; + var gutterElement = gutter.$lines.getAtRow(row).element.querySelector("[class*=ace_icon]"); + if (gutterElement) { + var rect = gutterElement.getBoundingClientRect(); + var style = tooltip.getElement().style; + style.left = rect.right + "px"; + style.top = rect.bottom + "px"; + } else { + moveTooltip(mouseEvent); + } } } From 83a5a6f5fa24b49aa8df71dd55f19f115382dcfc Mon Sep 17 00:00:00 2001 From: Alice Date: Mon, 26 Jun 2023 21:57:58 +0200 Subject: [PATCH 02/13] add tooltipFollowsMouse as option to kitchen-sink --- src/ext/options.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/ext/options.js b/src/ext/options.js index 2e2beb36f0d..d65819d3b28 100644 --- a/src/ext/options.js +++ b/src/ext/options.js @@ -203,7 +203,11 @@ var optionGroups = { }, "Keyboard Accessibility Mode": { path: "enableKeyboardAccessibility" - } + }, + "Gutter tooltip follows mouse": { + path: "tooltipFollowsMouse", + defaultValue: true + }, } }; From ca39515243374a6e8a4a80060e1d9554cf597766 Mon Sep 17 00:00:00 2001 From: Alice Date: Mon, 26 Jun 2023 22:01:41 +0200 Subject: [PATCH 03/13] small tweak --- src/mouse/default_gutter_handler.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/mouse/default_gutter_handler.js b/src/mouse/default_gutter_handler.js index aa413f6bc3c..cd3fe39c618 100644 --- a/src/mouse/default_gutter_handler.js +++ b/src/mouse/default_gutter_handler.js @@ -57,8 +57,9 @@ function GutterHandler(mouseHandler) { if (mouseHandler.$tooltipFollowsMouse) { moveTooltip(mouseEvent); } else { - var gutterElement = gutter.$lines.getAtRow(row).element.querySelector("[class*=ace_icon]"); - if (gutterElement) { + var gutterCell = gutter.$lines.getAtRow(row); + if (gutterCell) { + var gutterElement = gutterCell.element.querySelector("[class*=ace_icon]"); var rect = gutterElement.getBoundingClientRect(); var style = tooltip.getElement().style; style.left = rect.right + "px"; From e0519979c32e2e10122b98431717ac27de36d2a6 Mon Sep 17 00:00:00 2001 From: Alice Date: Mon, 26 Jun 2023 22:05:41 +0200 Subject: [PATCH 04/13] fix dangling comma --- src/ext/options.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ext/options.js b/src/ext/options.js index d65819d3b28..f82b82dcc5e 100644 --- a/src/ext/options.js +++ b/src/ext/options.js @@ -207,7 +207,7 @@ var optionGroups = { "Gutter tooltip follows mouse": { path: "tooltipFollowsMouse", defaultValue: true - }, + } } }; From dc1bd06cbd2e5180b3d86fd5b3e365a66f3e54b6 Mon Sep 17 00:00:00 2001 From: Alice Date: Mon, 26 Jun 2023 23:35:20 +0200 Subject: [PATCH 05/13] add test --- src/mouse/default_gutter_handler_test.js | 27 ++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/mouse/default_gutter_handler_test.js b/src/mouse/default_gutter_handler_test.js index 03a23d4989f..92e8ed68a87 100644 --- a/src/mouse/default_gutter_handler_test.js +++ b/src/mouse/default_gutter_handler_test.js @@ -217,6 +217,33 @@ module.exports = { // Annotation node should NOT have fold class. var annotation = lines.cells[0].element.children[2]; assert.notOk(/fold/.test(annotation.className)); + },"test: sets position correctly when tooltipFollowsMouse false" : function(done) { + var editor = this.editor; + var value = ""; + + editor.session.setMode(new Mode()); + editor.setValue(value, -1); + editor.session.setAnnotations([{row: 0, column: 0, text: "error test", type: "error"}]); + editor.setOption("tooltipFollowsMouse", false); + editor.setOption("useSvgGutterIcons", true); + editor.renderer.$loop._flush(); + + var lines = editor.renderer.$gutterLayer.$lines; + var annotation = lines.cells[0].element.childNodes[2].firstChild; + assert.ok(/ace_error/.test(annotation.className)); + + var rect = annotation.getBoundingClientRect(); + annotation.dispatchEvent(new MouseEvent("move", {x: rect.left, y: rect.top})); + + // Wait for the tooltip to appear after its timeout. + setTimeout(function() { + editor.renderer.$loop._flush(); + var tooltip = editor.container.querySelector(".ace_tooltip"); + assert.ok(/error test/.test(tooltip.textContent)); + assert.equal(tooltip.style.left, `${rect.right}px`); + assert.equal(tooltip.style.top, `${rect.bottom}px`); + done(); + }, 100); }, tearDown : function() { From b8041e38e0df4f34d6cdd6d70b37faee00310294 Mon Sep 17 00:00:00 2001 From: Alice Date: Mon, 26 Jun 2023 23:37:33 +0200 Subject: [PATCH 06/13] fix test --- src/mouse/default_gutter_handler.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mouse/default_gutter_handler.js b/src/mouse/default_gutter_handler.js index cd3fe39c618..1ab80543a1e 100644 --- a/src/mouse/default_gutter_handler.js +++ b/src/mouse/default_gutter_handler.js @@ -59,7 +59,7 @@ function GutterHandler(mouseHandler) { } else { var gutterCell = gutter.$lines.getAtRow(row); if (gutterCell) { - var gutterElement = gutterCell.element.querySelector("[class*=ace_icon]"); + var gutterElement = gutterCell.element.childNodes[2]; var rect = gutterElement.getBoundingClientRect(); var style = tooltip.getElement().style; style.left = rect.right + "px"; From c47e6d2929e67301e722f63589400a0eee2b7a6b Mon Sep 17 00:00:00 2001 From: Alice Date: Mon, 26 Jun 2023 23:53:08 +0200 Subject: [PATCH 07/13] fix selector --- src/mouse/default_gutter_handler.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mouse/default_gutter_handler.js b/src/mouse/default_gutter_handler.js index 1ab80543a1e..b4ea87fbd7b 100644 --- a/src/mouse/default_gutter_handler.js +++ b/src/mouse/default_gutter_handler.js @@ -59,7 +59,7 @@ function GutterHandler(mouseHandler) { } else { var gutterCell = gutter.$lines.getAtRow(row); if (gutterCell) { - var gutterElement = gutterCell.element.childNodes[2]; + var gutterElement = gutterCell.element.querySelector(".ace_gutter_annotation"); var rect = gutterElement.getBoundingClientRect(); var style = tooltip.getElement().style; style.left = rect.right + "px"; From d5306ccc1348509eb9c436b0f7fc88c4678e489f Mon Sep 17 00:00:00 2001 From: Alice Date: Mon, 3 Jul 2023 21:02:08 +0200 Subject: [PATCH 08/13] rename --- src/layer/lines.js | 2 +- src/mouse/default_gutter_handler.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/layer/lines.js b/src/layer/lines.js index 79287598300..a4c7f812c42 100644 --- a/src/layer/lines.js +++ b/src/layer/lines.js @@ -43,7 +43,7 @@ class Lines { return this.cells[index]; } - getAtRow(row) { + getCellAtRow(row) { for (var i = 0; i < this.getLength(); i++){ var cell = this.get(i); if (cell.row == row) diff --git a/src/mouse/default_gutter_handler.js b/src/mouse/default_gutter_handler.js index b4ea87fbd7b..09d35a106e2 100644 --- a/src/mouse/default_gutter_handler.js +++ b/src/mouse/default_gutter_handler.js @@ -57,7 +57,7 @@ function GutterHandler(mouseHandler) { if (mouseHandler.$tooltipFollowsMouse) { moveTooltip(mouseEvent); } else { - var gutterCell = gutter.$lines.getAtRow(row); + var gutterCell = gutter.$lines.getCellAtRow(row); if (gutterCell) { var gutterElement = gutterCell.element.querySelector(".ace_gutter_annotation"); var rect = gutterElement.getBoundingClientRect(); From 301addf84423c98159a596ada1430e453c9f5b0e Mon Sep 17 00:00:00 2001 From: Alice Koreman Date: Tue, 4 Jul 2023 14:50:48 +0200 Subject: [PATCH 09/13] binary search --- src/layer/lines.js | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/layer/lines.js b/src/layer/lines.js index a4c7f812c42..928350482ba 100644 --- a/src/layer/lines.js +++ b/src/layer/lines.js @@ -44,11 +44,24 @@ class Lines { } getCellAtRow(row) { - for (var i = 0; i < this.getLength(); i++){ - var cell = this.get(i); - if (cell.row == row) - return cell; + // Use binary search to find the matching cell for the given row. + var lowPoint = 0; + var highPoint = this.getLength(); + + while (lowPoint <= highPoint) { + var midPoint = Math.floor((highPoint + lowPoint) / 2); + var midCell = this.get(midPoint); + + if (midCell.row === row) { + return midCell; + } else if (midCell.row > row) { + highPoint = midPoint - 1; + } else { + lowPoint = midPoint + 1; + } } + + // If there is no cell matching the row, return null. return null; } From 5f50e4360e7a89f4370ac00588769d57a1676b6e Mon Sep 17 00:00:00 2001 From: Alice Koreman Date: Tue, 4 Jul 2023 18:28:49 +0200 Subject: [PATCH 10/13] change to get gutter row in mouseevent --- src/mouse/default_gutter_handler.js | 3 ++- src/mouse/mouse_event.js | 12 ++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/mouse/default_gutter_handler.js b/src/mouse/default_gutter_handler.js index 09d35a106e2..91c78ad37bb 100644 --- a/src/mouse/default_gutter_handler.js +++ b/src/mouse/default_gutter_handler.js @@ -57,7 +57,8 @@ function GutterHandler(mouseHandler) { if (mouseHandler.$tooltipFollowsMouse) { moveTooltip(mouseEvent); } else { - var gutterCell = gutter.$lines.getCellAtRow(row); + var gutterRow = mouseEvent.getGutterRow(); + var gutterCell = gutter.$lines.get(gutterRow); if (gutterCell) { var gutterElement = gutterCell.element.querySelector(".ace_gutter_annotation"); var rect = gutterElement.getBoundingClientRect(); diff --git a/src/mouse/mouse_event.js b/src/mouse/mouse_event.js index c0f242fa4d2..bae346607fa 100644 --- a/src/mouse/mouse_event.js +++ b/src/mouse/mouse_event.js @@ -48,6 +48,18 @@ class MouseEvent { this.$pos = this.editor.renderer.screenToTextCoordinates(this.clientX, this.clientY); return this.$pos; } + + /** + * Get the relative position within the gutter. + * + * @return {Number} 'row' within the gutter. + */ + getGutterRow() { + var documentRow = this.editor.renderer.screenToTextCoordinates(this.clientX, this.clientY).row; + var screenRow = this.editor.session.documentToScreenRow(documentRow, 0); + var screenTopRow = this.editor.session.documentToScreenRow(this.editor.renderer.$gutterLayer.$lines.get(0).row, 0); + return screenRow - screenTopRow; + } /** * Check if the mouse cursor is inside of the text selection From a13be6b992f33a1284dbd9a007a00a6debac6bc4 Mon Sep 17 00:00:00 2001 From: Alice Koreman Date: Tue, 4 Jul 2023 18:29:58 +0200 Subject: [PATCH 11/13] remove unneeded method --- src/layer/lines.js | 22 ---------------------- 1 file changed, 22 deletions(-) diff --git a/src/layer/lines.js b/src/layer/lines.js index 928350482ba..038e5e5b1cc 100644 --- a/src/layer/lines.js +++ b/src/layer/lines.js @@ -43,28 +43,6 @@ class Lines { return this.cells[index]; } - getCellAtRow(row) { - // Use binary search to find the matching cell for the given row. - var lowPoint = 0; - var highPoint = this.getLength(); - - while (lowPoint <= highPoint) { - var midPoint = Math.floor((highPoint + lowPoint) / 2); - var midCell = this.get(midPoint); - - if (midCell.row === row) { - return midCell; - } else if (midCell.row > row) { - highPoint = midPoint - 1; - } else { - lowPoint = midPoint + 1; - } - } - - // If there is no cell matching the row, return null. - return null; - } - shift() { this.$cacheCell(this.cells.shift()); } From 0c5b23129133ab39c6445e98a4d8c51e1066543c Mon Sep 17 00:00:00 2001 From: Alice Koreman Date: Tue, 4 Jul 2023 18:35:54 +0200 Subject: [PATCH 12/13] whitespace --- src/layer/lines.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layer/lines.js b/src/layer/lines.js index 038e5e5b1cc..e2f9a1e808d 100644 --- a/src/layer/lines.js +++ b/src/layer/lines.js @@ -42,7 +42,7 @@ class Lines { get(index) { return this.cells[index]; } - + shift() { this.$cacheCell(this.cells.shift()); } From 6dcb1cb2bf9e5dbb896b693e1eb79150f6e0c87c Mon Sep 17 00:00:00 2001 From: Alice Koreman Date: Wed, 5 Jul 2023 11:05:52 +0200 Subject: [PATCH 13/13] reuse getdocpos method --- src/mouse/mouse_event.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mouse/mouse_event.js b/src/mouse/mouse_event.js index bae346607fa..eca34f95ce3 100644 --- a/src/mouse/mouse_event.js +++ b/src/mouse/mouse_event.js @@ -55,7 +55,7 @@ class MouseEvent { * @return {Number} 'row' within the gutter. */ getGutterRow() { - var documentRow = this.editor.renderer.screenToTextCoordinates(this.clientX, this.clientY).row; + var documentRow = this.getDocumentPosition().row; var screenRow = this.editor.session.documentToScreenRow(documentRow, 0); var screenTopRow = this.editor.session.documentToScreenRow(this.editor.renderer.$gutterLayer.$lines.get(0).row, 0); return screenRow - screenTopRow;