fix bug with ghost selections
This commit is contained in:
parent
d91c9f7074
commit
b77c3b348e
5 changed files with 58 additions and 23 deletions
|
|
@ -141,7 +141,7 @@ var Cursor = function(parentEl) {
|
||||||
this.update = function(config) {
|
this.update = function(config) {
|
||||||
this.config = config;
|
this.config = config;
|
||||||
|
|
||||||
if (this.session.selectionMarkerCount > 1) {
|
if (this.session.selectionMarkerCount > 0) {
|
||||||
var selections = this.session.$selectionMarkers;
|
var selections = this.session.$selectionMarkers;
|
||||||
var i = 0, sel, cursorIndex = 0;
|
var i = 0, sel, cursorIndex = 0;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -111,9 +111,10 @@ function onMouseDown(e) {
|
||||||
if (!isMultiSelect && inSelection)
|
if (!isMultiSelect && inSelection)
|
||||||
return; // dragging
|
return; // dragging
|
||||||
|
|
||||||
if (!isMultiSelect)
|
if (!isMultiSelect) {
|
||||||
selection.addRange(selection.toOrientedRange());
|
var range = selection.toOrientedRange();
|
||||||
|
editor.addSelectionMarker(range);
|
||||||
|
}
|
||||||
|
|
||||||
var oldRange = selection.rangeList.rangeAtPoint(pos);
|
var oldRange = selection.rangeList.rangeAtPoint(pos);
|
||||||
|
|
||||||
|
|
@ -122,8 +123,13 @@ function onMouseDown(e) {
|
||||||
|
|
||||||
if (oldRange && tmpSel.isEmpty() && isSamePoint(oldRange.cursor, tmpSel.cursor))
|
if (oldRange && tmpSel.isEmpty() && isSamePoint(oldRange.cursor, tmpSel.cursor))
|
||||||
selection.substractPoint(tmpSel.cursor);
|
selection.substractPoint(tmpSel.cursor);
|
||||||
else
|
else {
|
||||||
|
if (range) {
|
||||||
|
editor.removeSelectionMarkers([range]);
|
||||||
|
selection.addRange(range);
|
||||||
|
}
|
||||||
selection.addRange(tmpSel);
|
selection.addRange(tmpSel);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
} else if (!shift && alt && button == 0) {
|
} else if (!shift && alt && button == 0) {
|
||||||
|
|
|
||||||
|
|
@ -77,17 +77,21 @@ var EditSession = require("./edit_session").EditSession;
|
||||||
* adds a range to selection entering multiselect mode if necessary
|
* adds a range to selection entering multiselect mode if necessary
|
||||||
**/
|
**/
|
||||||
this.addRange = function(range) {
|
this.addRange = function(range) {
|
||||||
if (!this.inMultiSelectMode && this.rangeCount == 0) {
|
|
||||||
var oldRange = this.toOrientedRange();
|
|
||||||
if (!range || !range.isEqual(oldRange)) {
|
|
||||||
this.rangeList.add(oldRange);
|
|
||||||
this.$onAddRange(oldRange);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!range)
|
if (!range)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (!this.inMultiSelectMode && this.rangeCount == 0) {
|
||||||
|
var oldRange = this.toOrientedRange();
|
||||||
|
if (range.intersects(oldRange)) {
|
||||||
|
this.fromOrientedRange(range);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.rangeList.add(oldRange);
|
||||||
|
this.$onAddRange(oldRange);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
if (!range.cursor)
|
if (!range.cursor)
|
||||||
range.cursor = range.end;
|
range.cursor = range.end;
|
||||||
|
|
||||||
|
|
@ -98,7 +102,7 @@ var EditSession = require("./edit_session").EditSession;
|
||||||
if (removed.length)
|
if (removed.length)
|
||||||
this.$onRemoveRange(removed);
|
this.$onRemoveRange(removed);
|
||||||
|
|
||||||
if (this.rangeCount > 0 && !this.inMultiSelectMode) {
|
if (this.rangeCount > 1 && !this.inMultiSelectMode) {
|
||||||
this._emit("multiSelect");
|
this._emit("multiSelect");
|
||||||
this.inMultiSelectMode = true;
|
this.inMultiSelectMode = true;
|
||||||
this.session.$undoSelect = false;
|
this.session.$undoSelect = false;
|
||||||
|
|
|
||||||
|
|
@ -57,7 +57,7 @@ var exec = function(name, times, args) {
|
||||||
} while(times --> 1)
|
} while(times --> 1)
|
||||||
};
|
};
|
||||||
var testRanges = function(str) {
|
var testRanges = function(str) {
|
||||||
assert.equal(editor.selection.getAllRanges()+"", str);
|
assert.equal(editor.selection.getAllRanges() + "", str + "");
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
|
|
@ -78,8 +78,8 @@ module.exports = {
|
||||||
assert.ok(editor.inMultiSelectMode);
|
assert.ok(editor.inMultiSelectMode);
|
||||||
assert.equal(editor.selection.getAllRanges().length, 4);
|
assert.equal(editor.selection.getAllRanges().length, 4);
|
||||||
|
|
||||||
var newLine = editor.session.getDocument().getNewLineCharacter();
|
var newLine = editor.session.getDocument().getNewLineCharacter();
|
||||||
var copyText = "wwww".split("").join(newLine);
|
var copyText = "wwww".split("").join(newLine);
|
||||||
assert.equal(editor.getCopyText(), copyText);
|
assert.equal(editor.getCopyText(), copyText);
|
||||||
exec("insertstring", 1, "a");
|
exec("insertstring", 1, "a");
|
||||||
exec("backspace", 2);
|
exec("backspace", 2);
|
||||||
|
|
@ -120,14 +120,11 @@ module.exports = {
|
||||||
" wtt.w",
|
" wtt.w",
|
||||||
" wtt.w"
|
" wtt.w"
|
||||||
]);
|
]);
|
||||||
var editor = new Editor(new MockRenderer(), doc);
|
editor = new Editor(new MockRenderer(), doc);
|
||||||
MultiSelect(editor);
|
MultiSelect(editor);
|
||||||
|
|
||||||
editor.selectMoreLines(1)
|
editor.selectMoreLines(1)
|
||||||
assert.equal(
|
testRanges("Range: [0/0] -> [0/0],Range: [1/0] -> [1/0]");
|
||||||
editor.selection.getAllRanges()+"",
|
|
||||||
"Range: [0/0] -> [0/0],Range: [1/0] -> [1/0]"
|
|
||||||
);
|
|
||||||
assert.ok(editor.inMultiSelectMode);
|
assert.ok(editor.inMultiSelectMode);
|
||||||
|
|
||||||
var doc2 = new EditSession(["w1"]);
|
var doc2 = new EditSession(["w1"]);
|
||||||
|
|
@ -136,6 +133,34 @@ module.exports = {
|
||||||
|
|
||||||
editor.setSession(doc);
|
editor.setSession(doc);
|
||||||
assert.ok(editor.inMultiSelectMode);
|
assert.ok(editor.inMultiSelectMode);
|
||||||
|
},
|
||||||
|
|
||||||
|
"test: multiselect addRange": function() {
|
||||||
|
var doc = new EditSession([
|
||||||
|
"w1.w2",
|
||||||
|
" wtt.w",
|
||||||
|
" wtt.w"
|
||||||
|
]);
|
||||||
|
editor = new Editor(new MockRenderer(), doc);
|
||||||
|
MultiSelect(editor);
|
||||||
|
var selection = editor.selection;
|
||||||
|
|
||||||
|
var range1 = new Range(0, 2, 0, 4);
|
||||||
|
editor.selection.fromOrientedRange(range1);
|
||||||
|
|
||||||
|
var range2 = new Range(0, 3, 0, 4);
|
||||||
|
selection.addRange(range2);
|
||||||
|
assert.ok(!editor.inMultiSelectMode);
|
||||||
|
assert.ok(range2.isEqual(editor.selection.getRange()));
|
||||||
|
|
||||||
|
var range3 = new Range(0, 1, 0, 1);
|
||||||
|
selection.addRange(range3);
|
||||||
|
assert.ok(editor.inMultiSelectMode);
|
||||||
|
testRanges([range3, range2]);
|
||||||
|
|
||||||
|
var range4 = new Range(0, 0, 4, 0);
|
||||||
|
selection.addRange(range4);
|
||||||
|
assert.ok(!editor.inMultiSelectMode);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -117,7 +117,7 @@ var Range = function(startRow, startColumn, endRow, endColumn) {
|
||||||
return this.comparePoint(range.start) == 0 && this.comparePoint(range.end) == 0;
|
return this.comparePoint(range.start) == 0 && this.comparePoint(range.end) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.intersectsRange = function(range) {
|
this.intersects = function(range) {
|
||||||
var cmp = this.compareRange(range);
|
var cmp = this.compareRange(range);
|
||||||
return (cmp == -1 || cmp == 0 || cmp == 1);
|
return (cmp == -1 || cmp == 0 || cmp == 1);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue