Bläddra i källkod

wallet: editbox, draw() means draw, not reload cached draw

darkfi 2 år sedan
förälder
incheckning
e1d21ebb5d
1 ändrade filer med 22 tillägg och 25 borttagningar
  1. 22 25
      bin/darkwallet/src/ui/editbox.rs

+ 22 - 25
bin/darkwallet/src/ui/editbox.rs

@@ -1176,9 +1176,6 @@ impl EditBox {
     }
 
     async fn redraw(&self) {
-        // draw will recalc this when it's None
-        let old = std::mem::replace(&mut *self.render_info.lock().unwrap(), None);
-
         let sg = self.sg.lock().await;
         let node = sg.get_node(self.node_id).unwrap();
 
@@ -1192,13 +1189,6 @@ impl EditBox {
         };
         self.render_api.replace_draw_calls(draw_update.draw_calls).await;
         debug!(target: "ui::editbox", "replace draw calls done");
-
-        // We're finished with these so clean up.
-        if let Some(old) = old {
-            self.render_api.delete_buffer(old.mesh.vertex_buffer);
-            self.render_api.delete_buffer(old.mesh.index_buffer);
-            self.render_api.delete_texture(old.texture_id);
-        }
     }
 
     pub async fn draw(&self, sg: &SceneGraph, parent_rect: &Rectangle) -> Option<DrawUpdate> {
@@ -1217,21 +1207,16 @@ impl EditBox {
         rect.x += parent_rect.x;
         rect.y += parent_rect.y;
 
-        // We do this here because that's when we finally have the accurate rect
-        // For drawing we want the rect to be correct.
-        // TODO: parent rect changing should update this cache
-        //       do we have to subscribe to parent rect and set this None? meh
-        //       or is it better that parent can invalidate child somehow and force redraw?
-        // TODO: store drawcalls directly
-        let render_info = self.render_info.lock().unwrap().clone();
-        let render_info = match render_info {
-            Some(render_info) => render_info,
-            None => {
-                let render_info = self.regen_mesh(rect.clone()).await;
-                *self.render_info.lock().unwrap() = Some(render_info.clone());
-                render_info
-            }
-        };
+        // draw will recalc this when it's None
+        let render_info = self.regen_mesh(rect.clone()).await;
+        let old_render_info =
+            std::mem::replace(&mut *self.render_info.lock().unwrap(), Some(render_info.clone()));
+        // We're finished with these so clean up.
+        if let Some(old) = old_render_info {
+            self.render_api.delete_buffer(old.mesh.vertex_buffer);
+            self.render_api.delete_buffer(old.mesh.index_buffer);
+            self.render_api.delete_texture(old.texture_id);
+        }
 
         let mesh = DrawMesh {
             vertex_buffer: render_info.mesh.vertex_buffer,
@@ -1271,6 +1256,18 @@ impl EditBox {
     }
 }
 
+impl Drop for EditBox {
+    fn drop(&mut self) {
+        let render_info = std::mem::replace(&mut *self.render_info.lock().unwrap(), None);
+        // We're finished with these so clean up.
+        if let Some(old) = render_info {
+            self.render_api.delete_buffer(old.mesh.vertex_buffer);
+            self.render_api.delete_buffer(old.mesh.index_buffer);
+            self.render_api.delete_texture(old.texture_id);
+        }
+    }
+}
+
 impl Stoppable for EditBox {
     async fn stop(&self) {
         // TODO: Delete own draw call