we frikin did it bois
gui library works frrr implementation: - containers now store a Widget type. - every widget has a unique id - there is a data store that maps the id to the internally stored gui component. - the compoenents can be fetched from the datastore using their Widget type - the datastore uses a hashmap so fetching shouldnt have any real performance penalty. - widgets can be fetched, inserted, updated and rendered from the datastore - the render method can be called directly from the Widget type without having to know the underlying type that it references
This commit is contained in:
+41
-16
@@ -3,6 +3,7 @@ use alloc::{format, vec};
|
||||
use alloc::vec::Vec;
|
||||
use alloc::boxed::Box;
|
||||
use alloc::sync::Arc;
|
||||
use core::any::Any;
|
||||
use async_trait::async_trait;
|
||||
use spin::Mutex;
|
||||
use crate::{println, serial_println};
|
||||
@@ -17,18 +18,20 @@ use crate::user::lib::libgui::{
|
||||
cg_widgets::CgContainer,
|
||||
cg_inputs::CgLineEdit,
|
||||
};
|
||||
use crate::user::lib::libgui::cg_core::CgTextEdit;
|
||||
use crate::user::lib::libgui::cg_core::{CgTextEdit, Widget};
|
||||
|
||||
use super::calc;
|
||||
|
||||
const OFFSET_X: i64 = 39;
|
||||
const OFFSET_Y: i64 = 10;
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct Grapher {
|
||||
points: Vec<PointF64>,
|
||||
frame: Frame,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
struct PointF64 {
|
||||
x: f64,
|
||||
y: f64,
|
||||
@@ -71,35 +74,40 @@ impl Application for Grapher {
|
||||
return Ok(());
|
||||
}
|
||||
else {
|
||||
let mut entry_box = CgLineEdit::new(
|
||||
let mut container = CgContainer::new(
|
||||
Position::new(0, 0),
|
||||
Dimensions::new(80, 25),
|
||||
true,
|
||||
);
|
||||
|
||||
container.insert("entry_box", Widget::insert(CgLineEdit::new(
|
||||
Position::new(1, 23),
|
||||
78,
|
||||
String::from("function >")
|
||||
);
|
||||
)));
|
||||
container.insert("grapher", Widget::insert(self.clone()));
|
||||
|
||||
let mut commandresult = String::new();
|
||||
|
||||
while let c = Stdin::keystroke().await {
|
||||
let mut container = CgContainer::new(
|
||||
Position::new(0, 0),
|
||||
Dimensions::new(80, 25),
|
||||
true,
|
||||
);
|
||||
|
||||
let mut entry_widget = container.elements.get("entry_box").unwrap();
|
||||
let mut entry = entry_widget.fetch::<CgLineEdit>().unwrap();
|
||||
|
||||
match c {
|
||||
KeyStroke::Char('\n') => {
|
||||
commandresult = entry_box.text.iter().collect();
|
||||
entry_box.clear();
|
||||
commandresult = entry.text.iter().collect();
|
||||
entry.clear();
|
||||
},
|
||||
KeyStroke::Char(Stdin::BACKSPACE) => {
|
||||
entry_box.backspace()
|
||||
entry.backspace()
|
||||
},
|
||||
KeyStroke::Char('`') => {
|
||||
break;
|
||||
}
|
||||
KeyStroke::Char(c) => entry_box.write_char(c),
|
||||
KeyStroke::Left => entry_box.move_cursor(false),
|
||||
KeyStroke::Right => entry_box.move_cursor(true),
|
||||
KeyStroke::Char(c) => entry.write_char(c),
|
||||
KeyStroke::Left => entry.move_cursor(false),
|
||||
KeyStroke::Right => entry.move_cursor(true),
|
||||
KeyStroke::Alt => break,
|
||||
_ => {}
|
||||
}
|
||||
@@ -107,13 +115,27 @@ impl Application for Grapher {
|
||||
if commandresult.len() > 0 {
|
||||
self.reset_frame();
|
||||
self.graph_equation(commandresult.clone());
|
||||
|
||||
let self_widget = container.elements.get("grapher").unwrap();
|
||||
self_widget.update(self.clone());
|
||||
|
||||
commandresult.clear();
|
||||
}
|
||||
|
||||
container.insert(Box::new(self));
|
||||
container.insert(Box::new(&entry_box));
|
||||
serial_println!("{:?}", entry.text);
|
||||
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();
|
||||
serial_println!("{:?}", self_clone.points);
|
||||
|
||||
let entry = container.elements.get("entry_box").unwrap();
|
||||
let entry_clone = entry.fetch::<CgLineEdit>().unwrap();
|
||||
serial_println!("{:?}", entry_clone.text);
|
||||
|
||||
|
||||
frame.write_to_screen().map_err(|_| Error::ApplicationError(String::from("failed to write to screen")))?;
|
||||
}
|
||||
}
|
||||
@@ -171,6 +193,9 @@ impl CgComponent for Grapher {
|
||||
fn render(&self) -> Result<Frame, RenderError> {
|
||||
Ok(self.frame.clone())
|
||||
}
|
||||
fn as_any(&self) -> &dyn Any {
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
+58
-33
@@ -16,6 +16,7 @@ use crate::user::lib::libgui::{
|
||||
cg_widgets::{CgTextBox, CgContainer, CgIndicatorBar, CgIndicatorWidget, CgLabel, CgStatusBar},
|
||||
cg_inputs::CgLineEdit,
|
||||
};
|
||||
use crate::user::lib::libgui::cg_core::Widget;
|
||||
|
||||
lazy_static! {
|
||||
pub static ref CMD: Mutex<CommandHandler> = Mutex::new(CommandHandler::new());
|
||||
@@ -268,6 +269,8 @@ async fn setup_ui(input: impl Fn(KeyStroke) -> (KeyStroke, bool)) {
|
||||
40,
|
||||
);
|
||||
|
||||
test_new_datastore().await;
|
||||
|
||||
let mut statusbar = CgStatusBar::new(Position::new(0, 0), Dimensions::new(80, 1));
|
||||
|
||||
let mut textedit = CgLineEdit::new(
|
||||
@@ -278,41 +281,65 @@ async fn setup_ui(input: impl Fn(KeyStroke) -> (KeyStroke, bool)) {
|
||||
|
||||
let mut commandresult = String::new();
|
||||
|
||||
while let (c, false) = input(Stdin::keystroke().await) {
|
||||
let mut container = CgContainer::new(
|
||||
Position::new(0, 0),
|
||||
Dimensions::new(80, 25),
|
||||
false,
|
||||
);
|
||||
// while let (c, false) = input(Stdin::keystroke().await) {
|
||||
// let mut container = CgContainer::new(
|
||||
// Position::new(0, 0),
|
||||
// Dimensions::new(80, 25),
|
||||
// false,
|
||||
// );
|
||||
//
|
||||
// match c {
|
||||
// KeyStroke::Char('\n') => {
|
||||
// commandresult = textedit.text.iter().collect();
|
||||
// textedit.clear();
|
||||
// },
|
||||
// KeyStroke::Char(Stdin::BACKSPACE) => {
|
||||
// serial_println!("backspace");
|
||||
// textedit.backspace()
|
||||
// },
|
||||
// KeyStroke::Char(c) => textedit.write_char(c),
|
||||
// KeyStroke::Left => textedit.move_cursor(false),
|
||||
// KeyStroke::Right => textedit.move_cursor(true),
|
||||
// _ => {}
|
||||
// }
|
||||
//
|
||||
// if commandresult.len() > 0 {
|
||||
// let string = commandresult.clone();
|
||||
// textbox.content = string;
|
||||
// }
|
||||
//
|
||||
// container.insert(Box::new(textbox.clone()));
|
||||
// container.insert(Box::new(statusbar.clone()));
|
||||
// container.insert(Box::new(textedit.clone()));
|
||||
//
|
||||
// if let Ok(frame) = container.render() {
|
||||
// frame.write_to_screen().unwrap();
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
||||
match c {
|
||||
KeyStroke::Char('\n') => {
|
||||
commandresult = textedit.text.iter().collect();
|
||||
textedit.clear();
|
||||
},
|
||||
KeyStroke::Char(Stdin::BACKSPACE) => {
|
||||
serial_println!("backspace");
|
||||
textedit.backspace()
|
||||
},
|
||||
KeyStroke::Char(c) => textedit.write_char(c),
|
||||
KeyStroke::Left => textedit.move_cursor(false),
|
||||
KeyStroke::Right => textedit.move_cursor(true),
|
||||
_ => {}
|
||||
}
|
||||
async fn test_new_datastore() {
|
||||
let container = Widget::insert(CgContainer::new(
|
||||
Position::new(0, 0),
|
||||
Dimensions::new(80, 25),
|
||||
true,
|
||||
));
|
||||
|
||||
if commandresult.len() > 0 {
|
||||
let string = commandresult.clone();
|
||||
textbox.content = string;
|
||||
}
|
||||
let textbox = Widget::insert(CgTextBox::new(
|
||||
String::from("test textbox"),
|
||||
String::from("dam"),
|
||||
Position::new(2, 5),
|
||||
Dimensions::new(40, 12),
|
||||
true,
|
||||
));
|
||||
|
||||
container.insert(Box::new(&textbox));
|
||||
container.insert(Box::new(&statusbar));
|
||||
container.insert(Box::new(&textedit));
|
||||
let mut c = textbox.fetch::<CgTextBox>().unwrap();
|
||||
c.content = String::from("dam2");
|
||||
textbox.update(c);
|
||||
|
||||
if let Ok(frame) = container.render() {
|
||||
frame.write_to_screen().unwrap();
|
||||
}
|
||||
}
|
||||
let c = textbox.fetch::<CgTextBox>().unwrap();
|
||||
|
||||
serial_println!("{}", c.content);
|
||||
}
|
||||
|
||||
|
||||
@@ -333,8 +360,6 @@ async fn setup_ui(input: impl Fn(KeyStroke) -> (KeyStroke, bool)) {
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user