made significant upgrades to the rendering API. now need to move all applications to the new API and deprecate the old one.
This commit is contained in:
@@ -3,7 +3,7 @@ use alloc::{boxed::Box, format, string::String, vec::Vec};
|
||||
use alloc::string::ToString;
|
||||
use alloc::borrow::ToOwned;
|
||||
use crate::std::render::Window;
|
||||
use crate::{println, print, mknode, std, serial_println};
|
||||
use crate::{println, print, mknode, std};
|
||||
|
||||
use async_trait::async_trait;
|
||||
use crate::std::application::{
|
||||
@@ -420,9 +420,7 @@ impl Calculator {
|
||||
"failed to tokenise: {:?}",
|
||||
e
|
||||
))?;
|
||||
|
||||
serial_println!("{:?}", tokens);
|
||||
|
||||
|
||||
let mut parser = Parser::new(tokens).unwrap();
|
||||
parser.parse().map_err(|e| format!("{:?}", e))
|
||||
}
|
||||
|
||||
+46
-47
@@ -22,6 +22,7 @@ pub struct Editor {
|
||||
unsaved: bool,
|
||||
display: Display,
|
||||
lineno_width: i32,
|
||||
window: Window,
|
||||
}
|
||||
|
||||
enum Mode {
|
||||
@@ -44,6 +45,8 @@ impl core::fmt::Display for Mode {
|
||||
|
||||
impl Editor {
|
||||
fn move_cursor(&mut self, dx: i32, dy: i32) {
|
||||
serial_println!("trying to move");
|
||||
|
||||
if dy != 0
|
||||
&& self.cursor_pos.y + dy >= 0
|
||||
&& self.cursor_pos.y + dy <= self.buffer.len() as i32
|
||||
@@ -67,39 +70,30 @@ impl Editor {
|
||||
self.cursor_pos.x += dx;
|
||||
}
|
||||
|
||||
serial_println!("cursor: {} {} offset: {} {} ", self.cursor_pos.x, self.cursor_pos.y, self.offset_pos.x, self.offset_pos.y);
|
||||
|
||||
while self.cursor_pos.x + 3 + (self.lineno_width + 2) > 80 + self.offset_pos.x {
|
||||
while self.cursor_pos.x + 2 + (self.lineno_width + 2) > self.window.dimensions().x as i32 + self.offset_pos.x {
|
||||
self.offset_pos.x += 1;
|
||||
}
|
||||
|
||||
while self.cursor_pos.x - 3 < self.offset_pos.x && self.offset_pos.x - 3 >= 0 {
|
||||
while self.cursor_pos.x - 3 < self.offset_pos.x && self.offset_pos.x - 1 >= 0 {
|
||||
self.offset_pos.x -= 1;
|
||||
}
|
||||
|
||||
while self.cursor_pos.y + 3 > self.offset_pos.y + 25 {
|
||||
while self.cursor_pos.y + 3 > self.offset_pos.y + self.window.dimensions().y as i32 {
|
||||
self.offset_pos.y += 1;
|
||||
}
|
||||
|
||||
while self.cursor_pos.y - 3 < self.offset_pos.y && self.offset_pos.y - 3 >= 0 {
|
||||
while self.cursor_pos.y - 1 < self.offset_pos.y && self.offset_pos.y - 1 >= 0 {
|
||||
self.offset_pos.y -= 1;
|
||||
}
|
||||
|
||||
serial_println!(
|
||||
"moving cursor to {}, {}",
|
||||
(self.cursor_pos.x - self.offset_pos.x + self.lineno_width + 2) as u8,
|
||||
(self.cursor_pos.y - self.offset_pos.y) as u8
|
||||
);
|
||||
serial_println!("talking to kernel");
|
||||
|
||||
// print all the values below
|
||||
serial_println!("offset: {}, {}", self.offset_pos.x, self.offset_pos.y);
|
||||
serial_println!("cursor: {}, {}", self.cursor_pos.x, self.cursor_pos.y);
|
||||
serial_println!("line width: {}", self.lineno_width + 2);
|
||||
|
||||
self.display.mv_cursor(
|
||||
(self.cursor_pos.x - self.offset_pos.x + self.lineno_width + 2) as u8,
|
||||
(self.cursor_pos.y - self.offset_pos.y) as u8
|
||||
self.window.move_cursor(
|
||||
self.cursor_pos.x - self.offset_pos.x + self.lineno_width + 2,
|
||||
self.cursor_pos.y - self.offset_pos.y
|
||||
).unwrap();
|
||||
|
||||
serial_println!("done talking to kernel");
|
||||
}
|
||||
|
||||
fn delete_char(&mut self) {
|
||||
@@ -165,34 +159,32 @@ impl Application for Editor {
|
||||
mode: Mode::Normal,
|
||||
unsaved: false,
|
||||
display: Display::borrow(),
|
||||
lineno_width: 0
|
||||
lineno_width: 0,
|
||||
window: Window::new(),
|
||||
}
|
||||
}
|
||||
|
||||
async fn run(&mut self, window: Option<Window>, _args: Vec<String>) -> Result<(), application::Error> {
|
||||
async fn run(&mut self, window: Option<Window>, args: Vec<String>) -> Result<(), application::Error> {
|
||||
|
||||
// if let Some(s) = args.get(0) {
|
||||
// self.buffer = s.lines().map(|l| l.chars().collect()).collect::<Vec<Vec<char>>>()
|
||||
// }
|
||||
if let Some(w) = window {
|
||||
self.window = w;
|
||||
}
|
||||
|
||||
self.buffer = String::from("
|
||||
/$$ /$$$$$$$$ /$$ /$$ /$$$$$$ /$$$$$$$ /$$ /$$ /$$
|
||||
/$$/|_____ $$ | $$ / $$ /$$__ $$| $$____/ /$$/| $$| $$
|
||||
/$$/ /$$/ | $$/ $$/| $$ \\ $$| $$ /$$/ \\ $$\\ $$
|
||||
/$$/ /$$/ \\ $$$$/ | $$ | $$| $$$$$$$ /$$/ \\ $$\\ $$
|
||||
| $$ /$$/ >$$ $$ | $$ | $$|_____ $$ /$$/ /$$/ /$$/
|
||||
\\ $$ /$$/ /$$/\\ $$| $$/$$ $$ /$$ \\ $$ /$$/ /$$/ /$$/
|
||||
\\ $$ /$$$$$$$$| $$ \\ $$| $$$$$$/| $$$$$$//$$/ /$$/ /$$/
|
||||
\\__/|________/|__/ |__/ \\____ $$$ \\______/|__/ |__/ |__/
|
||||
\\__/
|
||||
").lines().map(|l| l.chars().collect()).collect::<Vec<Vec<char>>>();
|
||||
self.window.set_dimensions(60, 23);
|
||||
self.window.set_position(10, 1);
|
||||
self.window.set_title("Editor");
|
||||
|
||||
|
||||
if let Some(s) = args.get(0) {
|
||||
self.buffer = s.lines().map(|l| l.chars().collect()).collect::<Vec<Vec<char>>>()
|
||||
}
|
||||
|
||||
loop {
|
||||
// start by rendering the screen
|
||||
self.lineno_width = self.buffer.len().to_string().len() as i32;
|
||||
self.render().unwrap().write_to_screen().unwrap();
|
||||
|
||||
if let Ok(frame) = self.render() {
|
||||
self.window.render(&frame).unwrap();
|
||||
}
|
||||
|
||||
// wait for a keyboard input
|
||||
let keystroke = std::io::Stdin::keystroke().await;
|
||||
@@ -247,12 +239,8 @@ impl Application for Editor {
|
||||
KeyStroke::Down => {
|
||||
self.move_cursor(0, 1);
|
||||
},
|
||||
KeyStroke::None => {
|
||||
serial_println!("none");
|
||||
},
|
||||
_ => {
|
||||
serial_println!("other");
|
||||
}
|
||||
KeyStroke::None => {},
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
Mode::Command => {
|
||||
@@ -280,11 +268,11 @@ impl Application for Editor {
|
||||
|
||||
impl CgComponent for Editor {
|
||||
fn render(&self) -> Result<Frame, RenderError> {
|
||||
let mut frame = Frame::new(Position::zero(), Position::new(80, 25))?;
|
||||
let mut frame = Frame::new(self.window.position(), self.window.dimensions())?;
|
||||
let width = self.lineno_width as usize;
|
||||
let linecolour = ColorCode::new(Color::Cyan, Color::Black);
|
||||
|
||||
for (i, line) in (self.offset_pos.y..self.offset_pos.y + 24).enumerate() {
|
||||
for (i, line) in (self.offset_pos.y..self.offset_pos.y + self.window.dimensions().y as i32 - 1).enumerate() {
|
||||
if line >= self.buffer.len() as i32 {
|
||||
break;
|
||||
}
|
||||
@@ -297,7 +285,7 @@ impl CgComponent for Editor {
|
||||
|
||||
let line = self.buffer[line as usize].iter().collect::<String>();
|
||||
|
||||
for (j, c) in line.chars().skip(self.offset_pos.x as usize).take(80 - (width + 2)).enumerate() {
|
||||
for (j, c) in line.chars().skip(self.offset_pos.x as usize).take(self.window.dimensions().x - (width + 2)).enumerate() {
|
||||
frame.write(Position::new(j + width + 2, i), ColouredChar::new(c))?;
|
||||
}
|
||||
}
|
||||
@@ -317,7 +305,7 @@ impl CgComponent for Editor {
|
||||
let toolbar = line_and_col + " " + &mode + " " + &unsaved;
|
||||
|
||||
for (i, c) in toolbar.chars().enumerate() {
|
||||
frame.write(Position::new(i, 24), ColouredChar::new(c))?;
|
||||
frame.write(Position::new(i, self.window.dimensions().y - 1), ColouredChar::new(c))?;
|
||||
}
|
||||
|
||||
Ok(frame)
|
||||
@@ -328,3 +316,14 @@ impl CgComponent for Editor {
|
||||
}
|
||||
}
|
||||
|
||||
// self.buffer = String::from("
|
||||
// /$$ /$$$$$$$$ /$$ /$$ /$$$$$$ /$$$$$$$ /$$ /$$ /$$
|
||||
// /$$/|_____ $$ | $$ / $$ /$$__ $$| $$____/ /$$/| $$| $$
|
||||
// /$$/ /$$/ | $$/ $$/| $$ \\ $$| $$ /$$/ \\ $$\\ $$
|
||||
// /$$/ /$$/ \\ $$$$/ | $$ | $$| $$$$$$$ /$$/ \\ $$\\ $$
|
||||
// | $$ /$$/ >$$ $$ | $$ | $$|_____ $$ /$$/ /$$/ /$$/
|
||||
// \\ $$ /$$/ /$$/\\ $$| $$/$$ $$ /$$ \\ $$ /$$/ /$$/ /$$/
|
||||
// \\ $$ /$$$$$$$$| $$ \\ $$| $$$$$$/| $$$$$$//$$/ /$$/ /$$/
|
||||
// \\__/|________/|__/ |__/ \\____ $$$ \\______/|__/ |__/ |__/
|
||||
// \\__/
|
||||
// ").lines().map(|l| l.chars().collect()).collect::<Vec<Vec<char>>>();
|
||||
@@ -136,13 +136,6 @@ impl Application for Grapher {
|
||||
entry_widget.update(entry);
|
||||
|
||||
if let Ok(frame) = container.render() {
|
||||
|
||||
let self_widget = container.elements.get("grapher").unwrap();
|
||||
let _self_clone = self_widget.fetch::<Grapher>().unwrap();
|
||||
|
||||
let entry = container.elements.get("entry_box").unwrap();
|
||||
let _entry_clone = entry.fetch::<CgLineEdit>().unwrap();
|
||||
|
||||
frame.write_to_screen().map_err(|_| Error::ApplicationError(String::from("failed to write to screen")))?;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user