Use uniform biases in AnchorMap, AnchorRangeMap
Specifying a different bias for every point makes the interface feel pretty unwieldy and we don't really use it.
This commit is contained in:
parent
612b4404a9
commit
2f39dee28b
4 changed files with 92 additions and 54 deletions
|
@ -19,7 +19,8 @@ pub struct Anchor {
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct AnchorMap<T> {
|
pub struct AnchorMap<T> {
|
||||||
pub(crate) version: clock::Global,
|
pub(crate) version: clock::Global,
|
||||||
pub(crate) entries: Vec<((FullOffset, Bias), T)>,
|
pub(crate) bias: Bias,
|
||||||
|
pub(crate) entries: Vec<(FullOffset, T)>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
|
|
|
@ -519,11 +519,17 @@ impl Buffer {
|
||||||
self.content().anchor_at(position, bias)
|
self.content().anchor_at(position, bias)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn anchor_range_set<E>(&self, entries: E) -> AnchorRangeSet
|
pub fn anchor_range_set<E>(
|
||||||
|
&self,
|
||||||
|
start_bias: Bias,
|
||||||
|
end_bias: Bias,
|
||||||
|
entries: E,
|
||||||
|
) -> AnchorRangeSet
|
||||||
where
|
where
|
||||||
E: IntoIterator<Item = Range<(usize, Bias)>>,
|
E: IntoIterator<Item = Range<usize>>,
|
||||||
{
|
{
|
||||||
self.content().anchor_range_set(entries)
|
self.content()
|
||||||
|
.anchor_range_set(start_bias, end_bias, entries)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn point_for_offset(&self, offset: usize) -> Result<Point> {
|
pub fn point_for_offset(&self, offset: usize) -> Result<Point> {
|
||||||
|
@ -1251,20 +1257,21 @@ impl Buffer {
|
||||||
&self,
|
&self,
|
||||||
selections: &[Selection<T>],
|
selections: &[Selection<T>],
|
||||||
) -> Arc<AnchorRangeMap<SelectionState>> {
|
) -> Arc<AnchorRangeMap<SelectionState>> {
|
||||||
Arc::new(
|
Arc::new(self.content().anchor_range_map(
|
||||||
self.content()
|
Bias::Left,
|
||||||
.anchor_range_map(selections.iter().map(|selection| {
|
Bias::Left,
|
||||||
let start = selection.start.to_offset(self);
|
selections.iter().map(|selection| {
|
||||||
let end = selection.end.to_offset(self);
|
let start = selection.start.to_offset(self);
|
||||||
let range = (start, Bias::Left)..(end, Bias::Left);
|
let end = selection.end.to_offset(self);
|
||||||
let state = SelectionState {
|
let range = start..end;
|
||||||
id: selection.id,
|
let state = SelectionState {
|
||||||
reversed: selection.reversed,
|
id: selection.id,
|
||||||
goal: selection.goal,
|
reversed: selection.reversed,
|
||||||
};
|
goal: selection.goal,
|
||||||
(range, state)
|
};
|
||||||
})),
|
(range, state)
|
||||||
)
|
}),
|
||||||
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn update_selection_set<T: ToOffset>(
|
pub fn update_selection_set<T: ToOffset>(
|
||||||
|
@ -1764,8 +1771,8 @@ impl<'a> Content<'a> {
|
||||||
let mut summary = D::default();
|
let mut summary = D::default();
|
||||||
let mut rope_cursor = self.visible_text.cursor(0);
|
let mut rope_cursor = self.visible_text.cursor(0);
|
||||||
let mut cursor = self.fragments.cursor::<(VersionedFullOffset, usize)>();
|
let mut cursor = self.fragments.cursor::<(VersionedFullOffset, usize)>();
|
||||||
map.entries.iter().map(move |((offset, bias), value)| {
|
map.entries.iter().map(move |(offset, value)| {
|
||||||
cursor.seek_forward(&VersionedFullOffset::Offset(*offset), *bias, &cx);
|
cursor.seek_forward(&VersionedFullOffset::Offset(*offset), map.bias, &cx);
|
||||||
let overshoot = if cursor.item().map_or(false, |fragment| fragment.visible) {
|
let overshoot = if cursor.item().map_or(false, |fragment| fragment.visible) {
|
||||||
*offset - cursor.start().0.full_offset()
|
*offset - cursor.start().0.full_offset()
|
||||||
} else {
|
} else {
|
||||||
|
@ -1827,27 +1834,36 @@ impl<'a> Content<'a> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn anchor_map<T, E>(&self, entries: E) -> AnchorMap<T>
|
pub fn anchor_map<T, E>(&self, bias: Bias, entries: E) -> AnchorMap<T>
|
||||||
where
|
where
|
||||||
E: IntoIterator<Item = ((usize, Bias), T)>,
|
E: IntoIterator<Item = (usize, T)>,
|
||||||
{
|
{
|
||||||
let version = self.version.clone();
|
let version = self.version.clone();
|
||||||
let mut cursor = self.fragments.cursor::<FragmentTextSummary>();
|
let mut cursor = self.fragments.cursor::<FragmentTextSummary>();
|
||||||
let entries = entries
|
let entries = entries
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|((offset, bias), value)| {
|
.map(|(offset, value)| {
|
||||||
cursor.seek_forward(&offset, bias, &None);
|
cursor.seek_forward(&offset, bias, &None);
|
||||||
let full_offset = FullOffset(cursor.start().deleted + offset);
|
let full_offset = FullOffset(cursor.start().deleted + offset);
|
||||||
((full_offset, bias), value)
|
(full_offset, value)
|
||||||
})
|
})
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
AnchorMap { version, entries }
|
AnchorMap {
|
||||||
|
version,
|
||||||
|
bias,
|
||||||
|
entries,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn anchor_range_map<T, E>(&self, entries: E) -> AnchorRangeMap<T>
|
pub fn anchor_range_map<T, E>(
|
||||||
|
&self,
|
||||||
|
start_bias: Bias,
|
||||||
|
end_bias: Bias,
|
||||||
|
entries: E,
|
||||||
|
) -> AnchorRangeMap<T>
|
||||||
where
|
where
|
||||||
E: IntoIterator<Item = (Range<(usize, Bias)>, T)>,
|
E: IntoIterator<Item = (Range<usize>, T)>,
|
||||||
{
|
{
|
||||||
let version = self.version.clone();
|
let version = self.version.clone();
|
||||||
let mut cursor = self.fragments.cursor::<FragmentTextSummary>();
|
let mut cursor = self.fragments.cursor::<FragmentTextSummary>();
|
||||||
|
@ -1855,8 +1871,8 @@ impl<'a> Content<'a> {
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|(range, value)| {
|
.map(|(range, value)| {
|
||||||
let Range {
|
let Range {
|
||||||
start: (start_offset, start_bias),
|
start: start_offset,
|
||||||
end: (end_offset, end_bias),
|
end: end_offset,
|
||||||
} = range;
|
} = range;
|
||||||
cursor.seek_forward(&start_offset, start_bias, &None);
|
cursor.seek_forward(&start_offset, start_bias, &None);
|
||||||
let full_start_offset = FullOffset(cursor.start().deleted + start_offset);
|
let full_start_offset = FullOffset(cursor.start().deleted + start_offset);
|
||||||
|
@ -1872,18 +1888,27 @@ impl<'a> Content<'a> {
|
||||||
AnchorRangeMap { version, entries }
|
AnchorRangeMap { version, entries }
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn anchor_set<E>(&self, entries: E) -> AnchorSet
|
pub fn anchor_set<E>(&self, bias: Bias, entries: E) -> AnchorSet
|
||||||
where
|
where
|
||||||
E: IntoIterator<Item = (usize, Bias)>,
|
E: IntoIterator<Item = usize>,
|
||||||
{
|
{
|
||||||
AnchorSet(self.anchor_map(entries.into_iter().map(|range| (range, ()))))
|
AnchorSet(self.anchor_map(bias, entries.into_iter().map(|range| (range, ()))))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn anchor_range_set<E>(&self, entries: E) -> AnchorRangeSet
|
pub fn anchor_range_set<E>(
|
||||||
|
&self,
|
||||||
|
start_bias: Bias,
|
||||||
|
end_bias: Bias,
|
||||||
|
entries: E,
|
||||||
|
) -> AnchorRangeSet
|
||||||
where
|
where
|
||||||
E: IntoIterator<Item = Range<(usize, Bias)>>,
|
E: IntoIterator<Item = Range<usize>>,
|
||||||
{
|
{
|
||||||
AnchorRangeSet(self.anchor_range_map(entries.into_iter().map(|range| (range, ()))))
|
AnchorRangeSet(self.anchor_range_map(
|
||||||
|
start_bias,
|
||||||
|
end_bias,
|
||||||
|
entries.into_iter().map(|range| (range, ())),
|
||||||
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn anchor_range_multimap<T, E, O>(
|
pub fn anchor_range_multimap<T, E, O>(
|
||||||
|
|
|
@ -999,11 +999,15 @@ impl Editor {
|
||||||
if pair.end.len() == 1 {
|
if pair.end.len() == 1 {
|
||||||
let mut delta = 0;
|
let mut delta = 0;
|
||||||
Some(BracketPairState {
|
Some(BracketPairState {
|
||||||
ranges: buffer.anchor_range_set(selections.iter().map(move |selection| {
|
ranges: buffer.anchor_range_set(
|
||||||
let offset = selection.start + delta;
|
Bias::Left,
|
||||||
delta += 1;
|
Bias::Right,
|
||||||
(offset, Bias::Left)..(offset, Bias::Right)
|
selections.iter().map(move |selection| {
|
||||||
})),
|
let offset = selection.start + delta;
|
||||||
|
delta += 1;
|
||||||
|
offset..offset
|
||||||
|
}),
|
||||||
|
),
|
||||||
pair,
|
pair,
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -1266,14 +1266,17 @@ impl Buffer {
|
||||||
self.pending_autoindent.take();
|
self.pending_autoindent.take();
|
||||||
let autoindent_request = if autoindent && self.language.is_some() {
|
let autoindent_request = if autoindent && self.language.is_some() {
|
||||||
let before_edit = self.snapshot();
|
let before_edit = self.snapshot();
|
||||||
let edited = self.content().anchor_set(ranges.iter().filter_map(|range| {
|
let edited = self.content().anchor_set(
|
||||||
let start = range.start.to_point(&*self);
|
Bias::Left,
|
||||||
if new_text.starts_with('\n') && start.column == self.line_len(start.row) {
|
ranges.iter().filter_map(|range| {
|
||||||
None
|
let start = range.start.to_point(&*self);
|
||||||
} else {
|
if new_text.starts_with('\n') && start.column == self.line_len(start.row) {
|
||||||
Some((range.start, Bias::Left))
|
None
|
||||||
}
|
} else {
|
||||||
}));
|
Some(range.start)
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
);
|
||||||
Some((before_edit, edited))
|
Some((before_edit, edited))
|
||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
|
@ -1288,12 +1291,17 @@ impl Buffer {
|
||||||
let mut inserted = None;
|
let mut inserted = None;
|
||||||
if let Some(first_newline_ix) = first_newline_ix {
|
if let Some(first_newline_ix) = first_newline_ix {
|
||||||
let mut delta = 0isize;
|
let mut delta = 0isize;
|
||||||
inserted = Some(self.content().anchor_range_set(ranges.iter().map(|range| {
|
inserted = Some(self.content().anchor_range_set(
|
||||||
let start = (delta + range.start as isize) as usize + first_newline_ix + 1;
|
Bias::Left,
|
||||||
let end = (delta + range.start as isize) as usize + new_text_len;
|
Bias::Right,
|
||||||
delta += (range.end as isize - range.start as isize) + new_text_len as isize;
|
ranges.iter().map(|range| {
|
||||||
(start, Bias::Left)..(end, Bias::Right)
|
let start = (delta + range.start as isize) as usize + first_newline_ix + 1;
|
||||||
})));
|
let end = (delta + range.start as isize) as usize + new_text_len;
|
||||||
|
delta +=
|
||||||
|
(range.end as isize - range.start as isize) + new_text_len as isize;
|
||||||
|
start..end
|
||||||
|
}),
|
||||||
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
let selection_set_ids = self
|
let selection_set_ids = self
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue