A simple CPU rendered GUI IDE experience.
Diffstat (limited to 'src/text.rs')
-rw-r--r--src/text.rs28
1 files changed, 28 insertions, 0 deletions
diff --git a/src/text.rs b/src/text.rs
index 75b9b73..f8b9ee4 100644
--- a/src/text.rs
+++ b/src/text.rs
@@ -99,6 +99,17 @@ impl TextArea {
self.rope.len_lines()
}
+ pub fn index_at(&self, (x, y): (usize, usize)) -> usize {
+ let l_i = self.vo + y;
+ self.rope
+ .try_line_to_char(l_i)
+ .map(|l| {
+ l + (self.rope.line(l_i).len_chars() - 1)
+ .min(x.saturating_sub(self.line_number_offset() + 1))
+ })
+ .unwrap_or(self.rope.len_chars())
+ }
+
pub fn insert_(&mut self, c: SmolStr) {
self.rope.insert(self.cursor, &c);
self.cursor += c.chars().count();
@@ -468,4 +479,21 @@ impl TextArea {
_ => unreachable!(),
}
}
+
+ pub fn extend_selection_to(
+ &mut self,
+ to: usize,
+ r: std::ops::Range<usize>,
+ ) -> std::ops::Range<usize> {
+ let r = if self.cursor == r.start {
+ if to < r.start { to..r.end } else { r.end..to } // to > r.end
+ } else if self.cursor == r.end {
+ if to > r.end { r.start..to } else { to..r.start } // to < r.start
+ } else {
+ panic!()
+ };
+ self.cursor = to;
+ self.setc();
+ r
+ }
}