Skip to content
This repository was archived by the owner on Apr 16, 2026. It is now read-only.

Commit 665417c

Browse files
committed
Show a drop location cursor when dragging over the editor
Closes #2645
1 parent bd62685 commit 665417c

2 files changed

Lines changed: 34 additions & 7 deletions

File tree

lib/codemirror.css

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,10 @@ div.CodeMirror-cursors {
297297
position: relative;
298298
z-index: 3;
299299
}
300+
div.CodeMirror-dragcursors {
301+
visibility: visible;
302+
}
303+
300304
.CodeMirror-focused div.CodeMirror-cursors {
301305
visibility: visible;
302306
}

lib/codemirror.js

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2271,16 +2271,16 @@
22712271
var range = doc.sel.ranges[i];
22722272
var collapsed = range.empty();
22732273
if (collapsed || cm.options.showCursorWhenSelecting)
2274-
drawSelectionCursor(cm, range, curFragment);
2274+
drawSelectionCursor(cm, range.head, curFragment);
22752275
if (!collapsed)
22762276
drawSelectionRange(cm, range, selFragment);
22772277
}
22782278
return result;
22792279
}
22802280

22812281
// Draws a cursor for the given range
2282-
function drawSelectionCursor(cm, range, output) {
2283-
var pos = cursorCoords(cm, range.head, "div", null, null, !cm.options.singleCursorHeightPerLine);
2282+
function drawSelectionCursor(cm, head, output) {
2283+
var pos = cursorCoords(cm, head, "div", null, null, !cm.options.singleCursorHeightPerLine);
22842284

22852285
var cursor = output.appendChild(elt("div", "\u00a0", "CodeMirror-cursor"));
22862286
cursor.style.left = pos.left + "px";
@@ -3444,9 +3444,11 @@
34443444
on(d.wrapper, "scroll", function() { d.wrapper.scrollTop = d.wrapper.scrollLeft = 0; });
34453445

34463446
d.dragFunctions = {
3447-
simple: function(e) {if (!signalDOMEvent(cm, e)) e_stop(e);},
3447+
enter: function(e) {if (!signalDOMEvent(cm, e)) e_stop(e);},
3448+
over: function(e) {if (!signalDOMEvent(cm, e)) { onDragOver(cm, e); e_stop(e); }},
34483449
start: function(e){onDragStart(cm, e);},
3449-
drop: operation(cm, onDrop)
3450+
drop: operation(cm, onDrop),
3451+
leave: function() {clearDragCursor(cm);}
34503452
};
34513453

34523454
var inp = d.input.getField();
@@ -3463,8 +3465,9 @@
34633465
var funcs = cm.display.dragFunctions;
34643466
var toggle = value ? on : off;
34653467
toggle(cm.display.scroller, "dragstart", funcs.start);
3466-
toggle(cm.display.scroller, "dragenter", funcs.simple);
3467-
toggle(cm.display.scroller, "dragover", funcs.simple);
3468+
toggle(cm.display.scroller, "dragenter", funcs.enter);
3469+
toggle(cm.display.scroller, "dragover", funcs.over);
3470+
toggle(cm.display.scroller, "dragleave", funcs.leave);
34683471
toggle(cm.display.scroller, "drop", funcs.drop);
34693472
}
34703473
}
@@ -3787,6 +3790,7 @@
37873790

37883791
function onDrop(e) {
37893792
var cm = this;
3793+
clearDragCursor(cm);
37903794
if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e))
37913795
return;
37923796
e_preventDefault(e);
@@ -3859,6 +3863,25 @@
38593863
}
38603864
}
38613865

3866+
function onDragOver(cm, e) {
3867+
var pos = posFromMouse(cm, e);
3868+
if (!pos) return;
3869+
var frag = document.createDocumentFragment();
3870+
drawSelectionCursor(cm, pos, frag);
3871+
if (!cm.display.dragCursor) {
3872+
cm.display.dragCursor = elt("div", null, "CodeMirror-cursors CodeMirror-dragcursors");
3873+
cm.display.lineSpace.insertBefore(cm.display.dragCursor, cm.display.cursorDiv);
3874+
}
3875+
removeChildrenAndAdd(cm.display.dragCursor, frag);
3876+
}
3877+
3878+
function clearDragCursor(cm) {
3879+
if (cm.display.dragCursor) {
3880+
cm.display.lineSpace.removeChild(cm.display.dragCursor);
3881+
cm.display.dragCursor = null;
3882+
}
3883+
}
3884+
38623885
// SCROLL EVENTS
38633886

38643887
// Sync the scrollable area and scrollbars, ensure the viewport

0 commit comments

Comments
 (0)