Skip to content

Commit dccbcc2

Browse files
authoredSep 15, 2023
feat: Allow to set setSelectOnHover for Autocomplete (#5317)
Allows setting setSelectOnHover for Autocomplete to make the selected row follow to cursor highlight.
1 parent 921e488 commit dccbcc2

File tree

2 files changed

+99
-0
lines changed

2 files changed

+99
-0
lines changed
 

‎src/autocomplete.js

+2
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ class Autocomplete {
6161
this.keyboardHandler = new HashHandler();
6262
this.keyboardHandler.bindKeys(this.commands);
6363
this.parentNode = null;
64+
this.setSelectOnHover = false;
6465

6566
this.blurListener = this.blurListener.bind(this);
6667
this.changeListener = this.changeListener.bind(this);
@@ -191,6 +192,7 @@ class Autocomplete {
191192
this.$initInline();
192193

193194
this.popup.autoSelect = this.autoSelect;
195+
this.popup.setSelectOnHover(this.setSelectOnHover);
194196

195197
this.popup.setData(this.completions.filtered, this.completions.filterText);
196198
if (this.editor.textInput.setAriaOptions) {

‎src/autocomplete_test.js

+97
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,17 @@ var Range = require("./range").Range;
1313
require("./ext/language_tools");
1414
var Autocomplete = require("./autocomplete").Autocomplete;
1515

16+
var MouseEvent = function(type, opts){
17+
var e = document.createEvent("MouseEvents");
18+
e.initMouseEvent(/click|wheel/.test(type) ? type : "mouse" + type,
19+
true, true, window,
20+
opts.detail,
21+
opts.x, opts.y, opts.x, opts.y,
22+
opts.ctrl, opts.alt, opts.shift, opts.meta,
23+
opts.button || 0, opts.relatedTarget);
24+
return e;
25+
};
26+
1627
var editor;
1728
function initEditor(value) {
1829
if (editor) {
@@ -448,6 +459,92 @@ module.exports = {
448459

449460
editor.destroy();
450461
editor.container.remove();
462+
},
463+
"test: selection should follow hovermarker if setSelectOnHover true": function(done) {
464+
var editor = initEditor("hello world\n");
465+
466+
editor.completers = [
467+
{
468+
getCompletions: function (editor, session, pos, prefix, callback) {
469+
var completions = [
470+
{
471+
caption: "option 1",
472+
value: "one"
473+
}, {
474+
caption: "option 2",
475+
value: "two"
476+
}, {
477+
caption: "option 3",
478+
value: "three"
479+
}
480+
];
481+
callback(null, completions);
482+
}
483+
}
484+
];
485+
486+
var completer = Autocomplete.for(editor);
487+
completer.setSelectOnHover = true;
488+
user.type("Ctrl-Space");
489+
assert.equal(editor.completer.popup.isOpen, true);
490+
assert.equal(completer.popup.getRow(), 0);
491+
492+
var text = completer.popup.renderer.content.childNodes[2];
493+
var rect = text.getBoundingClientRect();
494+
495+
// We need two mouse events to trigger the updating of the hover marker.
496+
text.dispatchEvent(new MouseEvent("move", {x: rect.left, y: rect.top}));
497+
// Hover over the second row.
498+
text.dispatchEvent(new MouseEvent("move", {x: rect.left + 1, y: rect.top + 20}));
499+
500+
// Selected row should follow mouse.
501+
editor.completer.popup.renderer.$loop._flush();
502+
assert.equal(completer.popup.getRow(), 2);
503+
504+
done();
505+
},
506+
"test: selection should not follow hovermarker if setSelectOnHover not set": function(done) {
507+
var editor = initEditor("hello world\n");
508+
509+
editor.completers = [
510+
{
511+
getCompletions: function (editor, session, pos, prefix, callback) {
512+
var completions = [
513+
{
514+
caption: "option 1",
515+
value: "one"
516+
}, {
517+
caption: "option 2",
518+
value: "two"
519+
}, {
520+
caption: "option 3",
521+
value: "three"
522+
}
523+
];
524+
callback(null, completions);
525+
}
526+
}
527+
];
528+
529+
var completer = Autocomplete.for(editor);
530+
531+
user.type("Ctrl-Space");
532+
assert.equal(editor.completer.popup.isOpen, true);
533+
assert.equal(completer.popup.getRow(), 0);
534+
535+
var text = completer.popup.renderer.content.childNodes[2];
536+
var rect = text.getBoundingClientRect();
537+
538+
// We need two mouse events to trigger the updating of the hover marker.
539+
text.dispatchEvent(new MouseEvent("move", {x: rect.left, y: rect.top}));
540+
// Hover over the second row.
541+
text.dispatchEvent(new MouseEvent("move", {x: rect.left + 1, y: rect.top + 20}));
542+
543+
// Selected row should not follow mouse.
544+
editor.completer.popup.renderer.$loop._flush();
545+
assert.equal(completer.popup.getRow(), 0);
546+
547+
done();
451548
}
452549
};
453550

0 commit comments

Comments
 (0)
Please sign in to comment.