Implement Selection::replace to replace a single range

Fixes #985

Co-authored-by: Daniel S Poulin <crimsonmage+github@gmail.com>
This commit is contained in:
Blaž Hrastnik 2021-11-06 17:37:45 +09:00
parent 911b9b3276
commit 6431b26a6a
2 changed files with 12 additions and 2 deletions

View file

@ -362,6 +362,11 @@ impl Selection {
/// Adds a new range to the selection and makes it the primary range.
pub fn remove(mut self, index: usize) -> Self {
assert!(
self.ranges.len() > 1,
"can't remove the last range from a selection!"
);
self.ranges.remove(index);
if index < self.primary_index || self.primary_index == self.ranges.len() {
self.primary_index -= 1;
@ -369,6 +374,12 @@ impl Selection {
self
}
/// Replace a range in the selection with a new range.
pub fn replace(mut self, index: usize, range: Range) -> Self {
self.ranges[index] = range;
self.normalize()
}
/// Map selections over a set of changes. Useful for adjusting the selection position after
/// applying changes to a document.
pub fn map(self, changes: &ChangeSet) -> Self {

View file

@ -1227,8 +1227,7 @@ fn search_impl(
Movement::Extend => selection.clone().push(Range::new(start, end)),
Movement::Move => selection
.clone()
.remove(selection.primary_index())
.push(Range::new(start, end)),
.replace(selection.primary_index(), Range::new(start, end)),
};
doc.set_selection(view.id, selection);