A simple CPU rendered GUI IDE experience.
Diffstat (limited to 'src/text/mapper.rs')
-rw-r--r--src/text/mapper.rs62
1 files changed, 47 insertions, 15 deletions
diff --git a/src/text/mapper.rs b/src/text/mapper.rs
index 2d29286..36b55ad 100644
--- a/src/text/mapper.rs
+++ b/src/text/mapper.rs
@@ -87,6 +87,31 @@ impl Mapper {
// y.checked_sub(self.oy)? + self.vo,
// ))
// }
+ pub gen fn range(
+ self,
+ (x1, y1): (usize, usize),
+ (x2, y2): (usize, usize),
+ ) -> (usize, usize) {
+ let m = self;
+ let mut p = (x1, y1);
+ while p != (x2, y2) {
+ yield p;
+
+ p.0 += 1;
+ if p.0.checked_sub(m.ho) == Some(m.from_c) {
+ p.0 = 0;
+ p.1 += 1;
+ if p.1 > y2 {
+ break;
+ }
+ }
+ if let Some(x) = p.0.checked_sub(m.ho)
+ && x > m.from_c
+ {
+ break;
+ }
+ }
+ }
}
impl<'a> Output<'a> {
// /// get an index thats relative over the viewable area¹ of the global text area
@@ -103,6 +128,7 @@ impl<'a> Output<'a> {
) -> impl Iterator<Item = &mut Cell> {
self.get_range_enumerated(a, b).map(|x| x.0)
}
+
// needs rope to work properly (see [xy])
// pub fn get_char_range(
// &mut self,
@@ -130,26 +156,32 @@ impl<'a> Output<'a> {
// let a = m.from_point_global(m.translate(m.to_point(a)).unwrap());
// let b = m.from_point_global(m.translate(m.to_point(b)).unwrap());
// dbg!(a, b);
- let mut p = (x1, y1);
- while p != (x2, y2) {
+ for p in self.range((x1, y1), (x2, y2)) {
if let Some(x) = m.translate(p) {
// SAFETY: trust me very disjoint
yield (unsafe { &mut *c.add(m.from_point_global(x)) }, p)
}
- p.0 += 1;
- if p.0.checked_sub(m.ho) == Some(m.from_c) {
- p.0 = 0;
- p.1 += 1;
- if p.1 > y2 {
- break;
- }
- }
- if let Some(x) = p.0.checked_sub(m.ho)
- && x > m.from_c
- {
- break;
- }
}
+ // let mut p = (x1, y1);
+ // while p != (x2, y2) {
+ // if let Some(x) = m.translate(p) {
+ // SAFETY: trust me very disjoint
+ // yield (unsafe { &mut *c.add(m.from_point_global(x)) }, p)
+ // }
+ // p.0 += 1;
+ // if p.0.checked_sub(m.ho) == Some(m.from_c) {
+ // p.0 = 0;
+ // p.1 += 1;
+ // if p.1 > y2 {
+ // break;
+ // }
+ // }
+ // if let Some(x) = p.0.checked_sub(m.ho)
+ // && x > m.from_c
+ // {
+ // break;
+ // }
+ // }
// (a..=b)
// .filter_map(move |x| {