A simple CPU rendered GUI IDE experience.
Diffstat (limited to 'src/text.rs')
| -rw-r--r-- | src/text.rs | 255 |
1 files changed, 2 insertions, 253 deletions
diff --git a/src/text.rs b/src/text.rs index e481d4f..8f644e0 100644 --- a/src/text.rs +++ b/src/text.rs @@ -38,6 +38,8 @@ use hist::Changes; mod bookmark; pub use bookmark::*; mod manipulations; +mod mapper; +pub use mapper::*; use crate::sni::{Snippet, StopP}; use crate::text::hist::Action; @@ -117,38 +119,6 @@ pub struct TextArea { pub changes: Changes, } -#[derive(Serialize, Deserialize)] -pub struct CellBuffer { - pub c: usize, - pub vo: usize, - pub cells: Box<[Cell]>, -} -impl Debug for CellBuffer { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - f.debug_struct("CellBuffer") - .field("c", &self.c) - .field("vo", &self.vo) - .field("cells", &self.cells.len()) - .finish() - } -} -impl Deref for CellBuffer { - type Target = [Cell]; - - fn deref(&self) -> &Self::Target { - &self.cells - } -} - -impl CellBuffer { - pub fn displayable(&self, r: usize) -> &[Cell] { - &self[self.vo * self.c..((self.vo + r) * self.c).min(self.len())] - } - pub fn l(&self) -> usize { - self.len() / self.c - } -} - impl Debug for TextArea { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.debug_struct("TextArea") @@ -1406,227 +1376,6 @@ pub fn hl( // }) } -#[derive(Copy, Clone)] -/// this struct is made to mimic a simple 2d vec -/// over the entire text area -/// without requiring that entire allocation, and the subsequent copy into the output area. -/// ```text -/// text above view offset (global text area)² -/// ╶╶╶╶╶├╶╶╶╶╶╶╶╶╶╶╶╶╶╶╶ view offset -/// ┏━━━━┿━━━━━━━━━━━━┓← into_ and into_s³ -/// ┃ ╏← offset y ┃ -/// ┃ ┏╺╺┿╺╺╺╺╺╺╺╺╺╺╺╺┃ -/// ┃ ╏ v╎iewable area┃ -/// ┃ ╏ g╎oes here¹ ┃ -/// ┃ ╏ ╎ ┃ -/// ┃ ╏ ╎ ┃ -/// ┃ ╏ ╎ ┃ -/// ┗━━━━━━━━━━━━━━━━━┛ -/// ═ ══╎ -/// ↑ ↑ ╎ -/// │ ╰ horiz scroll -/// ╰ horizontal offset -/// ``` -#[allow(dead_code)] // ? -pub struct Mapper { - /// c, r - pub into_s: (usize, usize), - pub ox: usize, - pub oy: usize, - - pub from_c: usize, - pub from_r: usize, - pub vo: usize, - pub ho: usize, -} -pub struct Output<'a> { - pub into: &'a mut [Cell], - pub output: Mapper, -} -impl Deref for Output<'_> { - type Target = Mapper; - - fn deref(&self) -> &Self::Target { - &self.output - } -} - -impl Mapper { - /// translate an index into the global text buffer² into an (x, y), of the global text buffer - // fn to_point(&self, rope: &Rope, index: usize) -> (usize, usize) { - // ((index % self.from_c), (index / self.from_c)) - // } - - // fn from_point(&self, (x, y): (usize, usize)) -> usize { - // y * self.from_c + x - // } - - /// translate an (x, y) into the global text buffer² - /// to a point over the viewable area¹ (offset by the given offsets) of the global text buffer, - /// returning none if the given point is outside of the viewable area - fn translate(&self, (x, y): (usize, usize)) -> Option<(usize, usize)> { - let (x, y) = ( - x.checked_sub(self.ho)? + self.ox, - y.checked_sub(self.vo)? + self.oy, - ); - ((x < self.into_s.0) & (y < self.into_s.1) - & (x >= self.ox) // this is kind of forced already but its ok - & (y >= self.oy)) // " - .then_some((x, y)) - } - /// converts an (x, y) of the viewable area¹ to an index into [`Output::into`] - fn from_point_global(&self, (x, y): (usize, usize)) -> usize { - y * self.into_s.0 + x - } - // /// translate an index into a (x, y), of the output³ - // fn to_point_global(&self, index: usize) -> (usize, usize) { - // (index % self.into_s.0, index / self.into_s.0) - // } - // fn etalsnart_( - // &self, - // (x, y): (usize, usize), - // ) -> Option<(usize, usize)> { - // Some(( - // x.checked_sub(self.ox)? + self.ho, // - // y.checked_sub(self.oy)? + self.vo, - // )) - // } -} -impl<'a> Output<'a> { - // /// get an index thats relative over the viewable area¹ of the global text area - // fn get_at_compensated( - // &mut self, - // (x, y): (usize, usize), - // ) -> Option<&mut Cell> { - // Some(&mut self.into[(y + self.oy) * self.into_s.0 + (x + self.ox)]) - // } - pub fn get_range( - &mut self, - a: (usize, usize), - b: (usize, usize), - ) -> 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, - // a: usize, - // b: usize, - // ) -> impl Iterator<Item = &mut Cell> { - // self.get_range_enumerated(self.to_point(a), self.to_point(b)) - // .map(|x| x.0) - // } - //// coords reference global text buffer² - pub gen fn get_range_enumerated( - &mut self, - (x1, y1): (usize, usize), - (x2, y2): (usize, usize), - // impl Iterator<Item = (&mut Cell, (usize, usize))> { - ) -> (&mut Cell, (usize, usize)) { - let m = self.output; - let c = self.into.as_mut_ptr(); - // x1 = x1.checked_sub(m.ho).unwrap_or(m.ho); - // x2 = x2.checked_sub(m.ho).unwrap_or(m.ho); - // y1 = y1.checked_sub(m.vo).unwrap_or(m.vo); - // y2 = y2.checked_sub(m.vo).unwrap_or(m.vo); - // let a = m.from_point((x1, y1)); - // let b = m.from_point((x2, y2)); - // 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) { - 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| { - // // println!("{:?} {x}", m.translate(m.to_point(x))); - // let (x, y) = m.to_point(x); - // m.translate((x, y)) - // // m.to_point_global(x) - // }) - // .inspect(move |x| { - // assert!(x.0 < self.into_s.0 && x.1 < self.into_s.1); - // assert!(m.from_point_global(*x) < self.into.len()); - // }) - // .map(move |x| { - // // SAFETY: :) - // (unsafe { &mut *p.add(m.from_point_global(x)) }, x) - // }) - // self.get_char_range_enumerated( - // self.output.from_point(a), - // self.output.from_point(b), - // ) - } - - // oughtnt really be multiline - pub fn get_simple( - &mut self, - s: (usize, usize), - e: (usize, usize), - ) -> Option<&mut [Cell]> { - let s = self.from_point_global(self.translate(s)?); - let e = self.from_point_global(self.translate(e)?); - self.into.get_mut(s..e) - } - // impl<'a> IndexMut<(usize, usize)> for Output<'a> { - // fn index_mut(&mut self, p: (usize, usize)) -> &mut Self::Output { - // let x = self.from_point_global(self.translate(p).unwrap()); - // &mut self.into[x] - // } - // } - pub fn get(&mut self, p: (usize, usize)) -> Option<&mut Cell> { - let n = self.from_point_global(self.translate(p)?); - self.into.get_mut(n) - } -} - -// impl<'a> Index<usize> for Output<'a> { -// type Output = Cell; - -// fn index(&self, index: usize) -> &Self::Output { -// &self[self.translate(index).unwrap()] -// } -// } - -// impl<'a> IndexMut<usize> for Output<'a> { -// fn index_mut(&mut self, index: usize) -> &mut Self::Output { -// let x = self.translate(index).unwrap(); -// &mut self[x] -// } -// } - -// impl<'a> Index<(usize, usize)> for Output<'a> { -// type Output = Cell; - -// fn index(&self, p: (usize, usize)) -> &Self::Output { -// &self.into[self.from_point_global(self.translate(p).unwrap())] -// } -// } -// impl<'a> IndexMut<(usize, usize)> for Output<'a> { -// fn index_mut(&mut self, p: (usize, usize)) -> &mut Self::Output { -// let x = self.from_point_global(self.translate(p).unwrap()); -// &mut self.into[x] -// } -// } - pub trait CoerceOption<T> { fn coerce(self) -> impl Iterator<Item = T>; } |