Kaynağa Gözat

wallet: when chat is a single line, restrict it to a min size and put line in the middle

darkfi 1 yıl önce
ebeveyn
işleme
9fe1788040
2 değiştirilmiş dosya ile 105 ekleme ve 16 silme
  1. 41 14
      bin/darkwallet/src/app/schema.rs
  2. 64 2
      bin/darkwallet/src/expr/compile.rs

+ 41 - 14
bin/darkwallet/src/app/schema.rs

@@ -51,7 +51,7 @@ mod android_ui_consts {
     pub const BACKARROW_SCALE: f32 = 30.;
     pub const BACKARROW_X: f32 = 50.;
     pub const BACKARROW_Y: f32 = 70.;
-    pub const CHATEDIT_HEIGHT: f32 = 163.;
+    pub const CHATEDIT_MAX_HEIGHT: f32 = 163.;
     pub const CHATEDIT_BOTTOM_PAD: f32 = 10.;
     pub const CHATEDIT_CURSOR_ASCENT: f32 = 50.;
     pub const CHATEDIT_CURSOR_DESCENT: f32 = 20.;
@@ -106,7 +106,8 @@ mod ui_consts {
     pub const BACKARROW_SCALE: f32 = 15.;
     pub const BACKARROW_X: f32 = 38.;
     pub const BACKARROW_Y: f32 = 23.;
-    pub const CHATEDIT_HEIGHT: f32 = 50.;
+    pub const CHATEDIT_MIN_HEIGHT: f32 = 60.;
+    pub const CHATEDIT_MAX_HEIGHT: f32 = 50.;
     pub const CHATEDIT_BOTTOM_PAD: f32 = 5.;
     pub const CHATEDIT_CURSOR_ASCENT: f32 = 25.;
     pub const CHATEDIT_CURSOR_DESCENT: f32 = 8.;
@@ -139,9 +140,10 @@ pub(super) async fn make(app: &App, window: SceneNodePtr) {
 
     let mut cc = Compiler::new();
 
-    cc.add_const_f32("CHATEDIT_HEIGHT", CHATEDIT_HEIGHT);
+    cc.add_const_f32("CHATEDIT_MAX_HEIGHT", CHATEDIT_MAX_HEIGHT);
     cc.add_const_f32("CHATEDIT_BOTTOM_PAD", CHATEDIT_BOTTOM_PAD);
     cc.add_const_f32("CHATEDIT_NEG_W", CHATEDIT_NEG_W);
+    cc.add_const_f32("CHATEDIT_MIN_HEIGHT", CHATEDIT_MIN_HEIGHT);
     cc.add_const_f32("SENDARROW_NEG_X", SENDARROW_NEG_X);
     cc.add_const_f32("SENDARROW_NEG_Y", SENDARROW_NEG_Y);
     cc.add_const_f32("EMOJI_NEG_Y", EMOJI_NEG_Y);
@@ -230,7 +232,7 @@ pub(super) async fn make(app: &App, window: SceneNodePtr) {
     prop.set_f32(Role::App, 0, 0.).unwrap();
     prop.set_f32(Role::App, 1, 0.).unwrap();
     prop.set_expr(Role::App, 2, expr::load_var("w")).unwrap();
-    prop.set_f32(Role::App, 3, CHATEDIT_HEIGHT).unwrap();
+    prop.set_f32(Role::App, 3, CHATEDIT_MAX_HEIGHT).unwrap();
     node.set_property_u32(Role::App, "z_index", 2).unwrap();
 
     let mut shape = VectorShape::new();
@@ -282,7 +284,7 @@ pub(super) async fn make(app: &App, window: SceneNodePtr) {
     prop.set_f32(Role::App, 0, CHATEDIT_LHS_PAD).unwrap();
     prop.set_f32(Role::App, 1, CHANNEL_LABEL_Y).unwrap();
     prop.set_expr(Role::App, 2, expr::load_var("w")).unwrap();
-    prop.set_f32(Role::App, 3, CHATEDIT_HEIGHT).unwrap();
+    prop.set_f32(Role::App, 3, CHATEDIT_MAX_HEIGHT).unwrap();
     node.set_property_u32(Role::App, "z_index", 2).unwrap();
     node.set_property_f32(Role::App, "baseline", 0.).unwrap();
     node.set_property_f32(Role::App, "font_size", FONTSIZE).unwrap();
@@ -312,10 +314,10 @@ pub(super) async fn make(app: &App, window: SceneNodePtr) {
     let node = create_chatview("chatty");
     let prop = node.get_property("rect").unwrap();
     prop.set_f32(Role::App, 0, 10.).unwrap();
-    prop.set_f32(Role::App, 1, CHATEDIT_HEIGHT).unwrap();
+    prop.set_f32(Role::App, 1, CHATEDIT_MAX_HEIGHT).unwrap();
     let code = cc.compile("w - 30").unwrap();
     prop.set_expr(Role::App, 2, code).unwrap();
-    let code = cc.compile("h - CHATEDIT_HEIGHT - editz_h - 2 * CHATEDIT_BOTTOM_PAD").unwrap();
+    let code = cc.compile("h - CHATEDIT_MAX_HEIGHT - editz_h - 2 * CHATEDIT_BOTTOM_PAD").unwrap();
     prop.set_expr(Role::App, 3, code).unwrap();
     let chatview_rect_prop = prop.clone();
     node.set_property_f32(Role::App, "font_size", FONTSIZE).unwrap();
@@ -407,11 +409,22 @@ pub(super) async fn make(app: &App, window: SceneNodePtr) {
     let node = create_vector_art("editbox_bg");
     let prop = node.get_property("rect").unwrap();
     prop.set_f32(Role::App, 0, 0.).unwrap();
-    let code = cc.compile("h - editz_h - 2 * CHATEDIT_BOTTOM_PAD").unwrap();
+    let code = cc
+        .compile(
+"
+        height = if editz_h < CHATEDIT_MIN_HEIGHT {
+            CHATEDIT_MIN_HEIGHT
+        } else {
+            editz_h
+        };
+
+        h - height - 2 * CHATEDIT_BOTTOM_PAD
+",
+        )
+        .unwrap();
     prop.set_expr(Role::App, 1, code).unwrap();
     prop.set_expr(Role::App, 2, expr::load_var("w")).unwrap();
-    let code = cc.compile("editz_h + 2 * CHATEDIT_BOTTOM_PAD").unwrap();
-    prop.set_expr(Role::App, 3, code).unwrap();
+    prop.set_f32(Role::App, 3, 500.).unwrap();
     node.set_property_u32(Role::App, "z_index", 2).unwrap();
 
     let editbox_bg_rect_prop = prop.clone();
@@ -497,11 +510,25 @@ pub(super) async fn make(app: &App, window: SceneNodePtr) {
 
     let prop = node.get_property("rect").unwrap();
     prop.set_f32(Role::App, 0, CHATEDIT_LHS_PAD).unwrap();
-    let code = cc.compile("parent_h - rect_h - CHATEDIT_BOTTOM_PAD").unwrap();
+    let code = cc
+        .compile(
+"
+        height = if rect_h < CHATEDIT_MIN_HEIGHT {
+            CHATEDIT_MIN_HEIGHT
+        } else {
+            rect_h
+        };
+
+        nudge_y = (height - rect_h) / 2;
+
+        parent_h - (height - nudge_y + CHATEDIT_BOTTOM_PAD)
+",
+        )
+        .unwrap();
     prop.set_expr(Role::App, 1, code).unwrap();
     let code = cc.compile("parent_w - CHATEDIT_NEG_W").unwrap();
     prop.set_expr(Role::App, 2, code).unwrap();
-    prop.set_f32(Role::App, 3, CHATEDIT_HEIGHT).unwrap();
+    prop.set_f32(Role::App, 3, CHATEDIT_MAX_HEIGHT).unwrap();
 
     chatview_rect_prop.add_depend(&prop, 3, "editz_h");
     editbox_bg_rect_prop.add_depend(&prop, 3, "editz_h");
@@ -598,10 +625,10 @@ pub(super) async fn make(app: &App, window: SceneNodePtr) {
     let prop = node.get_property("rect").unwrap();
     let code = cc.compile("w - SENDLABEL_WIDTH").unwrap();
     prop.set_expr(Role::App, 0, code).unwrap();
-    let code = cc.compile("h - CHATEDIT_HEIGHT").unwrap();
+    let code = cc.compile("h - CHATEDIT_MAX_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, CHATEDIT_HEIGHT).unwrap();
+    prop.set_f32(Role::App, 3, CHATEDIT_MAX_HEIGHT).unwrap();
 
     let node = node.setup(|me| Button::new(me, app.ex.clone())).await;
     layer_node.clone().link(node);

+ 64 - 2
bin/darkwallet/src/expr/compile.rs

@@ -89,8 +89,18 @@ impl Compiler {
     }
     */
 
-    pub fn compile<S: AsRef<str>>(&self, stmts: S) -> Result<SExprCode> {
-        let stmts = stmts.as_ref();
+    pub fn compile<S: AsRef<str>>(&self, prestmts: S) -> Result<SExprCode> {
+        let prestmts = prestmts.as_ref();
+        // Strip all comments
+        let mut stmts = String::new();
+        for line in prestmts.lines() {
+            if let Some(chr) = line.trim_start().chars().next() {
+                if chr != '#' {
+                    stmts.push_str(line);
+                }
+            }
+        }
+
         let mut code = vec![];
         for stmt in stmts.split(';') {
             code.push(self.compile_line(stmt)?);
@@ -651,4 +661,56 @@ mod tests {
         ))];
         assert_eq!(code, code2);
     }
+
+    #[test]
+    fn multiline() {
+        let mut compiler = Compiler::new();
+        let code = compiler
+            .compile(
+                "
+            # This is a comment
+            r = 10 / 4;
+
+            s = if h < 4 {
+                h - 1
+            } else {
+                2 * h + 5
+            };
+
+            r + 1
+        ",
+            )
+            .unwrap();
+        let code2 = vec![
+            Op::StoreVar((
+                "r".to_string(),
+                Box::new(Op::Div((
+                    Box::new(Op::ConstFloat32(10.)),
+                    Box::new(Op::ConstFloat32(4.)),
+                ))),
+            )),
+            Op::StoreVar((
+                "s".to_string(),
+                Box::new(Op::IfElse((
+                    Box::new(Op::LessThan((
+                        Box::new(Op::LoadVar("h".to_string())),
+                        Box::new(Op::ConstFloat32(4.)),
+                    ))),
+                    vec![Op::Sub((
+                        Box::new(Op::LoadVar("h".to_string())),
+                        Box::new(Op::ConstFloat32(1.)),
+                    ))],
+                    vec![Op::Add((
+                        Box::new(Op::Mul((
+                            Box::new(Op::ConstFloat32(2.)),
+                            Box::new(Op::LoadVar("h".to_string())),
+                        ))),
+                        Box::new(Op::ConstFloat32(5.)),
+                    ))],
+                ))),
+            )),
+            Op::Add((Box::new(Op::LoadVar("r".to_string())), Box::new(Op::ConstFloat32(1.)))),
+        ];
+        assert_eq!(code, code2);
+    }
 }