From 345f623ed78374f7b86b5dbde7ffada0095d673e Mon Sep 17 00:00:00 2001 From: darkfi Date: Sun, 15 Sep 2024 15:06:56 +0200 Subject: [PATCH] wallet: replace all ASTs with compiled exprs --- bin/darkwallet/src/app/schema.rs | 102 ++++++++--------------------- bin/darkwallet/src/expr/compile.rs | 3 +- 2 files changed, 31 insertions(+), 74 deletions(-) diff --git a/bin/darkwallet/src/app/schema.rs b/bin/darkwallet/src/app/schema.rs index 3a2597300..291cdb700 100644 --- a/bin/darkwallet/src/app/schema.rs +++ b/bin/darkwallet/src/app/schema.rs @@ -21,7 +21,7 @@ use sled_overlay::sled; use crate::{ darkirc::{DarkIrcBackendPtr, Privmsg}, error::Error, - expr::Op, + expr, gfx::{GraphicsEventPublisherPtr, Rectangle, RenderApiPtr, Vertex}, mesh::{Color, MeshBuilder}, prop::{Property, PropertyBool, PropertyStr, PropertySubType, PropertyType, Role}, @@ -93,10 +93,8 @@ pub(super) async fn make_old(app: &App) { let prop = node.get_property("rect").unwrap(); prop.set_f32(Role::App, 0, 0.).unwrap(); prop.set_f32(Role::App, 1, 0.).unwrap(); - let code = vec![Op::LoadVar("w".to_string())]; - prop.set_expr(Role::App, 2, code).unwrap(); - let code = vec![Op::LoadVar("h".to_string())]; - prop.set_expr(Role::App, 3, code).unwrap(); + prop.set_expr(Role::App, 2, shape::load_var("w")).unwrap(); + prop.set_expr(Role::App, 3, shape::load_var("h")).unwrap(); node.set_property_bool(Role::App, "is_visible", true).unwrap(); // Setup the pimpl @@ -118,10 +116,8 @@ pub(super) async fn make_old(app: &App) { let prop = node.get_property("rect").unwrap(); prop.set_f32(Role::App, 0, 0.).unwrap(); prop.set_f32(Role::App, 1, 0.).unwrap(); - let code = vec![Op::LoadVar("w".to_string())]; - prop.set_expr(Role::App, 2, code).unwrap(); - let code = vec![Op::LoadVar("h".to_string())]; - prop.set_expr(Role::App, 3, code).unwrap(); + prop.set_expr(Role::App, 2, shape::load_var("w")).unwrap(); + prop.set_expr(Role::App, 3, shape::load_var("h")).unwrap(); let c = if LIGHTMODE { 1. } else { 0. }; // Setup the pimpl @@ -149,8 +145,7 @@ pub(super) async fn make_old(app: &App) { let node = sg.get_node_mut(node_id).unwrap(); let prop = node.get_property("rect").unwrap(); - let code = - vec![Op::Sub((Box::new(Op::LoadVar("w".to_string())), Box::new(Op::ConstFloat32(220.))))]; + let code = expr::compile("w - 220").unwrap(); prop.set_expr(Role::App, 0, code).unwrap(); prop.set_f32(Role::App, 1, 10.).unwrap(); prop.set_f32(Role::App, 2, 200.).unwrap(); @@ -190,8 +185,7 @@ pub(super) async fn make_old(app: &App) { let node = sg.get_node_mut(node_id).unwrap(); node.set_property_bool(Role::App, "is_active", true).unwrap(); let prop = node.get_property("rect").unwrap(); - let code = - vec![Op::Sub((Box::new(Op::LoadVar("w".to_string())), Box::new(Op::ConstFloat32(220.))))]; + let code = expr::compile("w - 220").unwrap(); prop.set_expr(Role::App, 0, code).unwrap(); prop.set_f32(Role::App, 1, 10.).unwrap(); prop.set_f32(Role::App, 2, 200.).unwrap(); @@ -253,15 +247,10 @@ pub(super) async fn make_old(app: &App) { let node = sg.get_node_mut(node_id).unwrap(); let prop = node.get_property("rect").unwrap(); prop.set_f32(Role::App, 0, 0.).unwrap(); - let code = - vec![Op::Div((Box::new(Op::LoadVar("h".to_string())), Box::new(Op::ConstFloat32(2.))))]; + let code = expr::compile("h/2").unwrap(); prop.set_expr(Role::App, 1, code).unwrap(); - let code = vec![Op::LoadVar("w".to_string())]; - prop.set_expr(Role::App, 2, code).unwrap(); - let code = vec![Op::Sub(( - Box::new(Op::Div((Box::new(Op::LoadVar("h".to_string())), Box::new(Op::ConstFloat32(2.))))), - Box::new(Op::ConstFloat32(200.)), - ))]; + prop.set_expr(Role::App, 2, shape::load_var("w")).unwrap(); + let code = expr::compile("h/2 - 200").unwrap(); prop.set_expr(Role::App, 3, code).unwrap(); node.set_property_u32(Role::App, "z_index", 2).unwrap(); @@ -277,7 +266,7 @@ pub(super) async fn make_old(app: &App) { ); shape.add_filled_box( shape::const_f32(0.), - vec![Op::Sub((Box::new(Op::LoadVar("h".to_string())), Box::new(Op::ConstFloat32(5.))))], + expr::compile("h - 5").unwrap(), shape::load_var("w"), shape::load_var("h"), [0., 1., 0., 1.], @@ -446,15 +435,10 @@ pub(super) async fn make_old(app: &App) { let node = sg.get_node(node_id).unwrap(); let prop = node.get_property("rect").unwrap(); prop.set_f32(Role::App, 0, 0.).unwrap(); - let code = - vec![Op::Div((Box::new(Op::LoadVar("h".to_string())), Box::new(Op::ConstFloat32(2.))))]; + let code = expr::compile("h/2").unwrap(); prop.set_expr(Role::App, 1, code).unwrap(); - let code = vec![Op::LoadVar("w".to_string())]; - prop.set_expr(Role::App, 2, code).unwrap(); - let code = vec![Op::Sub(( - Box::new(Op::Div((Box::new(Op::LoadVar("h".to_string())), Box::new(Op::ConstFloat32(2.))))), - Box::new(Op::ConstFloat32(200.)), - ))]; + prop.set_expr(Role::App, 2, shape::load_var("w")).unwrap(); + let code = expr::compile("h/2 - 200").unwrap(); prop.set_expr(Role::App, 3, code).unwrap(); node.set_property_f32(Role::App, "font_size", 20.).unwrap(); node.set_property_f32(Role::App, "line_height", 30.).unwrap(); @@ -553,10 +537,8 @@ pub(super) async fn make(app: &App) { let prop = node.get_property("rect").unwrap(); prop.set_f32(Role::App, 0, 0.).unwrap(); prop.set_f32(Role::App, 1, 0.).unwrap(); - let code = vec![Op::LoadVar("w".to_string())]; - prop.set_expr(Role::App, 2, code).unwrap(); - let code = vec![Op::LoadVar("h".to_string())]; - prop.set_expr(Role::App, 3, code).unwrap(); + prop.set_expr(Role::App, 2, shape::load_var("w")).unwrap(); + prop.set_expr(Role::App, 3, shape::load_var("h")).unwrap(); node.set_property_bool(Role::App, "is_visible", true).unwrap(); let node_id = node.id; @@ -577,10 +559,8 @@ pub(super) async fn make(app: &App) { let prop = node.get_property("rect").unwrap(); prop.set_f32(Role::App, 0, 0.).unwrap(); prop.set_f32(Role::App, 1, 0.).unwrap(); - let code = vec![Op::LoadVar("w".to_string())]; - prop.set_expr(Role::App, 2, code).unwrap(); - let code = vec![Op::LoadVar("h".to_string())]; - prop.set_expr(Role::App, 3, code).unwrap(); + prop.set_expr(Role::App, 2, shape::load_var("w")).unwrap(); + prop.set_expr(Role::App, 3, shape::load_var("h")).unwrap(); let c = if LIGHTMODE { 1. } else { 0.05 }; // Setup the pimpl @@ -674,10 +654,7 @@ pub(super) async fn make(app: &App) { prop.set_f32(Role::App, 0, 0.).unwrap(); prop.set_f32(Role::App, 1, EDITCHAT_HEIGHT).unwrap(); prop.set_expr(Role::App, 2, shape::load_var("w")).unwrap(); - let code = vec![Op::Sub(( - Box::new(Op::LoadVar("h".to_string())), - Box::new(Op::ConstFloat32(2. * EDITCHAT_HEIGHT)), - ))]; + let code = expr::compile(format!("h - 2 * {EDITCHAT_HEIGHT}")).unwrap(); prop.set_expr(Role::App, 3, code).unwrap(); node.set_property_f32(Role::App, "font_size", FONTSIZE).unwrap(); node.set_property_f32(Role::App, "line_height", FONTSIZE * 1.6).unwrap(); @@ -771,35 +748,24 @@ pub(super) async fn make(app: &App) { let node = sg.get_node_mut(node_id).unwrap(); let prop = node.get_property("rect").unwrap(); prop.set_f32(Role::App, 0, 0.).unwrap(); - let code = vec![Op::Sub(( - Box::new(Op::LoadVar("h".to_string())), - Box::new(Op::ConstFloat32(EDITCHAT_HEIGHT)), - ))]; + let code = expr::compile(format!("h - {EDITCHAT_HEIGHT}")).unwrap(); prop.set_expr(Role::App, 1, code).unwrap(); prop.set_expr(Role::App, 2, shape::load_var("w")).unwrap(); prop.set_f32(Role::App, 3, EDITCHAT_HEIGHT).unwrap(); node.set_property_u32(Role::App, "z_index", 0).unwrap(); drop(sg); let mut shape = VectorShape::new(); - let send_btn_lhs = vec![Op::Sub(( - Box::new(Op::LoadVar("w".to_string())), - Box::new(Op::ConstFloat32(SENDLABEL_WIDTH)), - ))]; - let send_btn_lhs_1px = vec![Op::Sub(( - Box::new(Op::LoadVar("w".to_string())), - Box::new(Op::ConstFloat32(SENDLABEL_WIDTH - 1.)), - ))]; shape.add_filled_box( shape::const_f32(0.), shape::const_f32(0.), - send_btn_lhs.clone(), + expr::compile(format!("w - {SENDLABEL_WIDTH}")).unwrap(), shape::load_var("h"), [0., 0.13, 0.08, 1.], ); shape.add_filled_box( - send_btn_lhs.clone(), + expr::compile(format!("w - {SENDLABEL_WIDTH}")).unwrap(), shape::const_f32(0.), - send_btn_lhs_1px, + expr::compile(format!("w - {SENDLABEL_WIDTH} - 1")).unwrap(), shape::load_var("h"), [0.4, 0.4, 0.4, 1.], ); @@ -826,15 +792,9 @@ pub(super) async fn make(app: &App) { let node = sg.get_node_mut(node_id).unwrap(); let prop = node.get_property("rect").unwrap(); - let code = vec![Op::Sub(( - Box::new(Op::LoadVar("w".to_string())), - Box::new(Op::ConstFloat32(SENDLABEL_WIDTH - SENDLABEL_LHS_PAD)), - ))]; + let code = expr::compile(format!("w - {}", SENDLABEL_WIDTH - SENDLABEL_LHS_PAD)).unwrap(); prop.set_expr(Role::App, 0, code).unwrap(); - let code = vec![Op::Sub(( - Box::new(Op::LoadVar("h".to_string())), - Box::new(Op::ConstFloat32(EDITCHAT_HEIGHT)), - ))]; + let code = expr::compile(format!("h - {EDITCHAT_HEIGHT}")).unwrap(); prop.set_expr(Role::App, 1, code).unwrap(); prop.set_f32(Role::App, 2, SENDLABEL_WIDTH).unwrap(); prop.set_f32(Role::App, 3, EDITCHAT_HEIGHT).unwrap(); @@ -867,19 +827,15 @@ pub(super) async fn make(app: &App) { let node_id = create_editbox(&mut sg, "editz"); let node = sg.get_node(node_id).unwrap(); node.set_property_bool(Role::App, "is_active", true).unwrap(); + let prop = node.get_property("rect").unwrap(); prop.set_f32(Role::App, 0, EDITCHAT_LHS_PAD).unwrap(); - let code = vec![Op::Sub(( - Box::new(Op::LoadVar("h".to_string())), - Box::new(Op::ConstFloat32(EDITCHAT_HEIGHT)), - ))]; + let code = expr::compile(format!("h - {EDITCHAT_HEIGHT}")).unwrap(); prop.set_expr(Role::App, 1, code).unwrap(); - let code = vec![Op::Sub(( - Box::new(Op::LoadVar("w".to_string())), - Box::new(Op::ConstFloat32(SENDLABEL_WIDTH + 20.)), - ))]; + let code = expr::compile(format!("w - ({SENDLABEL_WIDTH} + 20)")).unwrap(); prop.set_expr(Role::App, 2, code).unwrap(); prop.set_f32(Role::App, 3, EDITCHAT_HEIGHT).unwrap(); + node.set_property_f32(Role::App, "baseline", (EDITCHAT_HEIGHT + 20.) / 2.).unwrap(); node.set_property_f32(Role::App, "font_size", FONTSIZE).unwrap(); //node.set_property_str(Role::App, "text", "hello king!๐Ÿ˜๐Ÿ†jelly ๐Ÿ†1234").unwrap(); diff --git a/bin/darkwallet/src/expr/compile.rs b/bin/darkwallet/src/expr/compile.rs index 8df082bdd..709f517e6 100644 --- a/bin/darkwallet/src/expr/compile.rs +++ b/bin/darkwallet/src/expr/compile.rs @@ -27,7 +27,8 @@ fn remove_whitespace(s: &str) -> String { s.chars().filter(|c| !c.is_whitespace()).collect() } -pub fn compile(stmts: &str) -> Result { +pub fn compile>(stmts: S) -> Result { + let stmts = stmts.as_ref(); let mut code = vec![]; for stmt in stmts.split(';') { code.push(compile_line(stmt)?);