Fix `shrink_selection` with multiple cursors. (#6093)

* Fix #6092

Cause were some incorrect assumptions that missed an edge case in the
`Selection.contains()` calculation. Tests were added accordingly.

* Fix Selection.contains() edge-case handling.

Removing the len check short-circuit was the only thing needed as
pointed out by @dead10ck.
pull/6242/head
gibbz00 2 years ago committed by GitHub
parent aabc8af95d
commit 2cf4ce2356
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -625,11 +625,6 @@ impl Selection {
// returns true if self ⊇ other // returns true if self ⊇ other
pub fn contains(&self, other: &Selection) -> bool { pub fn contains(&self, other: &Selection) -> bool {
// can't contain other if it is larger
if other.len() > self.len() {
return false;
}
let (mut iter_self, mut iter_other) = (self.iter(), other.iter()); let (mut iter_self, mut iter_other) = (self.iter(), other.iter());
let (mut ele_self, mut ele_other) = (iter_self.next(), iter_other.next()); let (mut ele_self, mut ele_other) = (iter_self.next(), iter_other.next());
@ -1240,5 +1235,11 @@ mod test {
vec!((3, 4), (7, 9)) vec!((3, 4), (7, 9))
)); ));
assert!(!contains(vec!((1, 1), (5, 6)), vec!((1, 6)))); assert!(!contains(vec!((1, 1), (5, 6)), vec!((1, 6))));
// multiple ranges of other are all contained in some ranges of self,
assert!(contains(
vec!((1, 4), (7, 10)),
vec!((1, 2), (3, 4), (7, 9))
));
} }
} }

@ -4371,7 +4371,6 @@ fn shrink_selection(cx: &mut Context) {
// try to restore previous selection // try to restore previous selection
if let Some(prev_selection) = view.object_selections.pop() { if let Some(prev_selection) = view.object_selections.pop() {
if current_selection.contains(&prev_selection) { if current_selection.contains(&prev_selection) {
// allow shrinking the selection only if current selection contains the previous object selection
doc.set_selection(view.id, prev_selection); doc.set_selection(view.id, prev_selection);
return; return;
} else { } else {

Loading…
Cancel
Save