Forráskód Böngészése

wallet: chatview and editbox rect exprs reeval when changed. Use this to make chatview dynamically resize depending on editbox height.

darkfi 1 éve
szülő
commit
affb11184d

+ 4 - 1
bin/darkwallet/src/app/schema.rs

@@ -634,8 +634,9 @@ pub(super) async fn make(app: &App, window: SceneNodePtr) {
     prop.set_f32(Role::App, 1, EDITCHAT_HEIGHT).unwrap();
     prop.set_f32(Role::App, 1, EDITCHAT_HEIGHT).unwrap();
     let code = cc.compile("w - 30").unwrap();
     let code = cc.compile("w - 30").unwrap();
     prop.set_expr(Role::App, 2, code).unwrap();
     prop.set_expr(Role::App, 2, code).unwrap();
-    let code = cc.compile("h - 2 * EDITCHAT_HEIGHT").unwrap();
+    let code = cc.compile("h - EDITCHAT_HEIGHT - editz_h").unwrap();
     prop.set_expr(Role::App, 3, code).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();
     node.set_property_f32(Role::App, "font_size", FONTSIZE).unwrap();
     node.set_property_f32(Role::App, "timestamp_font_size", TIMESTAMP_FONTSIZE).unwrap();
     node.set_property_f32(Role::App, "timestamp_font_size", TIMESTAMP_FONTSIZE).unwrap();
     node.set_property_f32(Role::App, "timestamp_width", TIMESTAMP_WIDTH).unwrap();
     node.set_property_f32(Role::App, "timestamp_width", TIMESTAMP_WIDTH).unwrap();
@@ -810,6 +811,8 @@ pub(super) async fn make(app: &App, window: SceneNodePtr) {
     prop.set_expr(Role::App, 2, code).unwrap();
     prop.set_expr(Role::App, 2, code).unwrap();
     prop.set_f32(Role::App, 3, EDITCHAT_HEIGHT).unwrap();
     prop.set_f32(Role::App, 3, EDITCHAT_HEIGHT).unwrap();
 
 
+    chatview_rect_prop.add_depend(&prop, 3, "editz_h");
+
     node.set_property_f32(Role::App, "baseline", TEXTBAR_BASELINE).unwrap();
     node.set_property_f32(Role::App, "baseline", TEXTBAR_BASELINE).unwrap();
     node.set_property_f32(Role::App, "font_size", FONTSIZE).unwrap();
     node.set_property_f32(Role::App, "font_size", FONTSIZE).unwrap();
     //node.set_property_str(Role::App, "text", "hello king!😁🍆jelly 🍆1234").unwrap();
     //node.set_property_str(Role::App, "text", "hello king!😁🍆jelly 🍆1234").unwrap();

+ 1 - 0
bin/darkwallet/src/prop/wrap.rs

@@ -294,6 +294,7 @@ impl PropertyRect {
 
 
             globals.push((dep.local_name, SExprVal::Float32(value)));
             globals.push((dep.local_name, SExprVal::Float32(value)));
         }
         }
+        debug!(target: "prop::wrap", "PropertyRect::eval() [globals = {globals:?}]");
 
 
         for i in 0..4 {
         for i in 0..4 {
             if !self.prop.is_expr(i)? {
             if !self.prop.is_expr(i)? {

+ 15 - 13
bin/darkwallet/src/ui/chatview/mod.rs

@@ -677,6 +677,10 @@ impl ChatView {
     /// Invalidates cache and redraws everything
     /// Invalidates cache and redraws everything
     async fn redraw_all(&self) {
     async fn redraw_all(&self) {
         debug!(target: "ui::chatview", "redraw_all()");
         debug!(target: "ui::chatview", "redraw_all()");
+
+        let parent_rect = self.parent_rect.lock().unwrap().unwrap().clone();
+        self.rect.eval(&parent_rect).expect("unable to eval rect");
+
         let mut msgbuf = self.msgbuf.lock().await;
         let mut msgbuf = self.msgbuf.lock().await;
         msgbuf.adjust_params();
         msgbuf.adjust_params();
         msgbuf.clear_meshes();
         msgbuf.clear_meshes();
@@ -750,20 +754,18 @@ impl UIObject for ChatView {
         }
         }
 
 
         // These should be inside the class
         // These should be inside the class
-        /*
-        on_modify.when_change(self.baseline.prop(), redraw);
-        on_modify.when_change(self.font_size.prop(), redraw);
-        on_modify.when_change(self.timestamp_font_size.prop(), redraw);
-        on_modify.when_change(self.timestamp_color.prop(), redraw);
-        on_modify.when_change(self.timestamp_width.prop(), redraw);
-        on_modify.when_change(self.line_height.prop(), redraw);
-        on_modify.when_change(self.message_spacing.prop(), redraw);
-        on_modify.when_change(self.text_color.prop(), redraw);
-        on_modify.when_change(self.nick_colors.clone(), redraw);
-        on_modify.when_change(self.hi_bg_color.prop(), redraw);
+        //on_modify.when_change(self.baseline.prop(), redraw);
+        //on_modify.when_change(self.font_size.prop(), redraw);
+        //on_modify.when_change(self.timestamp_font_size.prop(), redraw);
+        //on_modify.when_change(self.timestamp_color.prop(), redraw);
+        //on_modify.when_change(self.timestamp_width.prop(), redraw);
+        //on_modify.when_change(self.line_height.prop(), redraw);
+        //on_modify.when_change(self.message_spacing.prop(), redraw);
+        //on_modify.when_change(self.text_color.prop(), redraw);
+        //on_modify.when_change(self.nick_colors.clone(), redraw);
+        //on_modify.when_change(self.hi_bg_color.prop(), redraw);
         on_modify.when_change(self.rect.prop(), redraw);
         on_modify.when_change(self.rect.prop(), redraw);
-        on_modify.when_change(self.debug.prop(), redraw);
-        */
+        //on_modify.when_change(self.debug.prop(), redraw);
 
 
         let mut tasks =
         let mut tasks =
             vec![insert_line_method_task, insert_unconf_line_method_task, motion_task, bgload_task];
             vec![insert_line_method_task, insert_unconf_line_method_task, motion_task, bgload_task];

+ 6 - 1
bin/darkwallet/src/ui/editbox/mod.rs

@@ -1233,6 +1233,11 @@ impl EditBox {
     }
     }
 
 
     async fn redraw(&self) {
     async fn redraw(&self) {
+        debug!(target: "ui::editbox", "redraw()");
+
+        let parent_rect = self.parent_rect.lock().unwrap().unwrap().clone();
+        self.rect.eval(&parent_rect).expect("unable to eval rect");
+
         let Some(draw_update) = self.make_draw_calls() else {
         let Some(draw_update) = self.make_draw_calls() else {
             error!(target: "ui::editbox", "Text failed to draw");
             error!(target: "ui::editbox", "Text failed to draw");
             return;
             return;
@@ -1345,7 +1350,7 @@ impl UIObject for EditBox {
             self_.redraw();
             self_.redraw();
         }
         }
         async fn redraw(self_: Arc<EditBox>) {
         async fn redraw(self_: Arc<EditBox>) {
-            self_.redraw();
+            self_.redraw().await;
         }
         }
         on_modify.when_change(self.rect.prop(), redraw);
         on_modify.when_change(self.rect.prop(), redraw);
         on_modify.when_change(self.baseline.prop(), redraw);
         on_modify.when_change(self.baseline.prop(), redraw);