A simple CPU rendered GUI IDE experience.
Diffstat (limited to 'src/text.rs')
-rw-r--r--src/text.rs42
1 files changed, 42 insertions, 0 deletions
diff --git a/src/text.rs b/src/text.rs
new file mode 100644
index 0000000..e2cffa9
--- /dev/null
+++ b/src/text.rs
@@ -0,0 +1,42 @@
+use std::iter::{repeat, repeat_n};
+
+use dsb::Cell;
+use dsb::cell::Style;
+use ropey::Rope;
+#[derive(Debug, Default, Clone)]
+pub struct TextArea {
+ rope: Rope,
+ cursor: usize,
+}
+
+impl TextArea {
+ pub fn insert(&mut self, c: &str) {
+ self.rope.insert(self.cursor, c);
+ self.cursor += c.chars().count();
+ }
+
+ pub fn cells(
+ &self,
+ (c, r): (usize, usize),
+ color: [u8; 3],
+ bg: [u8; 3],
+ ) -> Vec<Cell> {
+ let mut cells = vec![
+ Cell {
+ style: Style {
+ color,
+ bg,
+ flags: 0,
+ },
+ letter: None,
+ };
+ c * r
+ ];
+ for (l, y) in self.rope.lines().take(r).zip(0..) {
+ for (e, x) in l.chars().take(c).zip(0..) {
+ cells[y * c + x].letter = Some(e);
+ }
+ }
+ cells
+ }
+}