diff --git a/src/app/bin.rs b/src/app/bin.rs index d061c50..901413d 100644 --- a/src/app/bin.rs +++ b/src/app/bin.rs @@ -233,12 +233,12 @@ fn main() -> Result<(), String> { (left_button, left_button && !previous_left_button), (right_button, right_button && !previous_right_button), (rl.get_char_pressed(), rl.get_key_pressed_number()), - rl.get_time() + rl.get_time(), ); let mut d = rl.begin_drawing(&thread); - d.clear_background(Color::WHITE); + d.clear_background(clay2ray((46, 52, 64).into())); for command in render_commands { match command.config { @@ -255,7 +255,8 @@ fn main() -> Result<(), String> { width: command.bounding_box.width, height: command.bounding_box.height, }, - rectangle.corner_radii.top_left, + rectangle.corner_radii.top_left + / command.bounding_box.width.min(command.bounding_box.height), 8, clay2ray(rectangle.color), ); diff --git a/src/app/gui/document.rs b/src/app/gui/document.rs deleted file mode 100644 index 2468ea6..0000000 --- a/src/app/gui/document.rs +++ /dev/null @@ -1,224 +0,0 @@ -use std::mem::ManuallyDrop; - -use clay_layout::{ - Clay, Declaration, fit, fixed, grow, - layout::{LayoutDirection, Padding}, - text::TextConfig, -}; -use raylib::ffi::KeyboardKey; - -pub type LineType = String; - -pub struct Document { - lines: Vec<(String, LineType)>, - total_lines: usize, - current_line: Option, - current_char: usize, - lines_to_delete: Vec, - lines_to_add: Vec<(usize, LineType)>, - last_type_time: f64, -} - -impl Document { - pub fn new() -> Self { - Self { - lines: vec![("0".to_owned(), "".to_string())], - total_lines: 1, - current_line: Some(0), - current_char: 0, - lines_to_delete: vec![], - lines_to_add: vec![], - last_type_time: -100., - } - } - - pub fn add_line(&mut self, content: impl Into) { - self.add_line_at(self.lines.len(), content); - } - - pub fn add_line_at(&mut self, idx: usize, content: impl Into) { - self.lines - .insert(idx, (self.total_lines.to_string(), content.into())); - self.total_lines += 1; - } - - pub fn render<'a>( - &'a mut self, - clay: &'a Clay, - (left_held, left_pressed): (bool, bool), - (righ_held, right_pressed): (bool, bool), - (latest_char, latest_key): (Option, Option), - time: f64, - ) { - if !self.lines_to_delete.is_empty() { - self.lines_to_delete.sort(); - - for line in self.lines_to_delete.iter().rev() { - self.lines.remove(*line); - } - - self.lines_to_delete.clear(); - - self.current_line = if let Some(i) = self.current_line { - if self.lines.len() == 0 { - self.add_line("".to_string()); - } - Some( - (TryInto::::try_into(i).unwrap() - 1) - .max(0) - .min(TryInto::::try_into(self.lines.len()).unwrap() - 1) - .try_into() - .unwrap(), - ) - } else { - None - }; - } - - if !self.lines_to_add.is_empty() { - // i am NOT cloning this shit - let lines_to_add: ManuallyDrop> = unsafe { - let len = self.lines_to_add.len(); - let cap = self.lines_to_add.capacity(); - let fuck = self.lines_to_add.as_mut_ptr(); - std::mem::ManuallyDrop::new(Vec::from_raw_parts(fuck, len, cap)) - }; - - for (idx, line) in lines_to_add.iter() { - self.add_line_at(*idx, line); - } - - self.lines_to_add.clear(); - self.current_line = if let Some(i) = self.current_line { - Some(i + 1) - } else { - None - }; - } - - if left_pressed && clay.pointer_over(clay.id("document")) { - self.current_line = None; - } - - let len = self.lines.len(); - let mut can_go_down = true; - - clay.with( - &Declaration::new() - .id(clay.id("document")) - .layout() - .width(grow!(0.)) - .height(grow!(0.)) - .direction(LayoutDirection::TopToBottom) - .padding(Padding::all(8)) - .child_gap(0) - .end() - .background_color((46, 52, 64).into()) - .scroll(false, true), - |clay| { - for (i, line) in self.lines.iter_mut().enumerate() { - let current_selected = - if left_pressed && clay.pointer_over(clay.id(line.0.as_str())) { - self.current_line = Some(i); - true - } else { - Some(i) == self.current_line - }; - - if current_selected { - if let Some(char) = latest_char { - line.1 += char.to_string().as_str(); - self.last_type_time = time; - } - - match latest_key { - Some(val) if val == KeyboardKey::KEY_BACKSPACE as u32 => { - if line.1.len() == 0 { - self.lines_to_delete.push(i); - } else { - let _ = line.1.pop(); - } - } - Some(val) if val == KeyboardKey::KEY_ENTER as u32 => { - self.lines_to_add.push((i + 1, "".to_string())); - } - Some(val) if val == KeyboardKey::KEY_UP as u32 => { - self.current_line = Some( - (TryInto::::try_into(self.current_line.unwrap()).unwrap() - - 1) - .max(0) - .try_into() - .unwrap(), - ); - } - Some(val) if val == KeyboardKey::KEY_DOWN as u32 && can_go_down => { - self.current_line = Some( - (TryInto::::try_into(self.current_line.unwrap()).unwrap() - + 1) - .min(TryInto::::try_into(len).unwrap() - 1) - .try_into() - .unwrap(), - ); - can_go_down = false; - } - _ => {} - } - } - - clay.with( - &Declaration::new() - .id(clay.id(line.0.as_str())) - .layout() - .width(grow!(0.)) - .height(fit!(21.)) - .direction(LayoutDirection::LeftToRight) - .padding(Padding::new(4, 4, 0, 1)) - .child_alignment(clay_layout::layout::Alignment { - x: clay_layout::layout::LayoutAlignmentX::Left, - y: clay_layout::layout::LayoutAlignmentY::Center, - }) - // .child_gap(2) - // .end() - // .border() - // .color((67, 76, 94).into()) - // .bottom(2) - // .end() - // .corner_radius() - // .all(4.) - .end(), - |clay| { - clay.text( - line.1.as_str(), - TextConfig::new() - .color((229, 233, 240).into()) - .font_size(20) - .font_id(0) - .letter_spacing(2) - .end(), - ); - if current_selected - && can_go_down - && ((time - self.last_type_time) < 0.5 || time % 1.2 < 0.6) - { - clay.with( - &Declaration::new() - .id(clay.id("text_cursor")) - .layout() - .height(grow!(0.)) - .width(fixed!(8.)) - .end() - .background_color((229, 233, 240, 100).into()) - // .corner_radius() - // .all(2.) - // .end(), - , - |_| {}, - ); - } - }, - ); - } - }, - ); - } -} diff --git a/src/app/gui/document/line.rs b/src/app/gui/document/line.rs new file mode 100644 index 0000000..a2fd272 --- /dev/null +++ b/src/app/gui/document/line.rs @@ -0,0 +1,19 @@ +use std::rc::Rc; + +use libopenbirch::node::NodeEnum; + +pub struct Line { + segments: Vec, +} + +pub enum LineSegment { + Text(String), + // Link(String, Link), + Math(Rc), +} + +impl LineSegment { + pub fn draw<'a>(&'a self, clay: &'a clay_layout::Clay) { + + } +} diff --git a/src/app/gui/document/mod.rs b/src/app/gui/document/mod.rs new file mode 100644 index 0000000..575a128 --- /dev/null +++ b/src/app/gui/document/mod.rs @@ -0,0 +1,229 @@ +use std::{alloc::alloc, mem::ManuallyDrop}; + +use clay_layout::{ + Clay, Declaration, fit, fixed, grow, + layout::{LayoutDirection, Padding}, + text::TextConfig, +}; +use raylib::ffi::KeyboardKey; + +pub type LineType = String; + +mod line; + +pub struct Document { + lines: Vec<(String, LineType)>, + total_lines: usize, + current_line: Option, + current_char: usize, + lines_to_delete: Vec, + lines_to_add: Vec<(usize, LineType)>, + last_type_time: f64, +} + +impl Document { + pub fn new() -> Self { + Self { + lines: vec![("0".to_owned(), "".to_string())], + total_lines: 1, + current_line: Some(0), + current_char: 0, + lines_to_delete: vec![], + lines_to_add: vec![], + last_type_time: -100., + } + } + + pub fn add_line(&mut self, content: impl Into) { + self.add_line_at(self.lines.len(), content); + } + + pub fn add_line_at(&mut self, idx: usize, content: impl Into) { + self.lines + .insert(idx, (self.total_lines.to_string(), content.into())); + self.total_lines += 1; + } + + pub fn render<'a>( + &'a mut self, + clay: &'a Clay, + (left_held, left_pressed): (bool, bool), + (righ_held, right_pressed): (bool, bool), + (latest_char, latest_key): (Option, Option), + time: f64, + ) { + // if !self.lines_to_delete.is_empty() { + // self.lines_to_delete.sort(); + // + // for line in self.lines_to_delete.iter().rev() { + // let contents = &self.lines.remove(*line).1; + // self.lines[*line - 1].1 += contents; + // } + // + // self.lines_to_delete.clear(); + // + // self.current_line = if let Some(i) = self.current_line { + // if self.lines.len() == 0 { + // self.add_line("".to_string()); + // } + // Some( + // (TryInto::::try_into(i).unwrap() - 1) + // .max(0) + // .min(TryInto::::try_into(self.lines.len()).unwrap() - 1) + // .try_into() + // .unwrap(), + // ) + // } else { + // None + // }; + // } + // + // if !self.lines_to_add.is_empty() { + // // i am NOT cloning this shit + // let lines_to_add: ManuallyDrop> = unsafe { + // let len = self.lines_to_add.len(); + // let cap = self.lines_to_add.capacity(); + // let fuck = self.lines_to_add.as_mut_ptr(); + // std::mem::ManuallyDrop::new(Vec::from_raw_parts(fuck, len, cap)) + // }; + // + // for (idx, line) in lines_to_add.iter() { + // self.add_line_at(*idx, line); + // } + // + // self.lines_to_add.clear(); + // self.current_line = if let Some(i) = self.current_line { + // Some(i + 1) + // } else { + // None + // }; + // } + // + // if left_pressed && clay.pointer_over(clay.id("document")) { + // self.current_line = None; + // } + // + // let len = self.lines.len(); + // let mut can_go_down = true; + + clay.with( + &Declaration::new() + .id(clay.id("document")) + .layout() + .width(grow!(0.)) + .height(grow!(0.)) + .direction(LayoutDirection::TopToBottom) + .padding(Padding::all(8)) + .child_gap(0) + .end() + .corner_radius() + .all(8.) + .end() + .background_color((67, 76, 94).into()) + .scroll(false, true), + |clay| { + // for (i, line) in self.lines.iter_mut().enumerate() { + // let current_selected = + // if left_pressed && clay.pointer_over(clay.id(line.0.as_str())) { + // self.current_line = Some(i); + // true + // } else { + // Some(i) == self.current_line + // }; + // + // if current_selected { + // if let Some(char) = latest_char { + // line.1 += char.to_string().as_str(); + // self.last_type_time = time; + // } + // + // match latest_key { + // Some(val) if val == KeyboardKey::KEY_BACKSPACE as u32 => { + // if line.1.len() == 0 { + // self.lines_to_delete.push(i); + // } else { + // // let _ = line.1.pop(); + // line.1.remove(self.current_char); + // } + // } + // Some(val) if val == KeyboardKey::KEY_ENTER as u32 => { + // self.lines_to_add.push((i + 1, "".to_string())); + // } + // Some(val) if val == KeyboardKey::KEY_UP as u32 => { + // self.current_line = Some( + // (TryInto::::try_into(self.current_line.unwrap()).unwrap() + // - 1) + // .max(0) + // .try_into() + // .unwrap(), + // ); + // } + // Some(val) if val == KeyboardKey::KEY_DOWN as u32 && can_go_down => { + // self.current_line = Some( + // (TryInto::::try_into(self.current_line.unwrap()).unwrap() + // + 1) + // .min(TryInto::::try_into(len).unwrap() - 1) + // .try_into() + // .unwrap(), + // ); + // can_go_down = false; + // } + // _ => {} + // } + // } + // + // clay.with( + // &Declaration::new() + // .id(clay.id(line.0.as_str())) + // .layout() + // .width(grow!(0.)) + // .height(fit!(21.)) + // .direction(LayoutDirection::LeftToRight) + // .padding(Padding::new(4, 4, 0, 1)) + // .child_alignment(clay_layout::layout::Alignment { + // x: clay_layout::layout::LayoutAlignmentX::Left, + // y: clay_layout::layout::LayoutAlignmentY::Center, + // }) + // // .child_gap(2) + // // .end() + // // .border() + // // .color((67, 76, 94).into()) + // // .bottom(2) + // // .end() + // // .corner_radius() + // // .all(4.) + // .end(), + // |clay| { + // clay.text( + // line.1.as_str(), + // TextConfig::new() + // .color((229, 233, 240).into()) + // .font_size(20) + // .font_id(0) + // .letter_spacing(2) + // .end(), + // ); + // if current_selected + // && can_go_down + // && ((time - self.last_type_time) < 0.5 || time % 1.2 < 0.6) + // { + // clay.with( + // &Declaration::new() + // .id(clay.id("text_cursor")) + // .layout() + // .height(grow!(0.)) + // .width(fixed!(8.)) + // .end() + // .background_color((229, 233, 240, 100).into()), // .corner_radius() + // // .all(2.) + // // .end(), + // |_| {}, + // ); + // } + // }, + // ); + // } + }, + ); + } +}