Parcourir la source

app: allow storing tasks in nodes so we can clear them before unlinking

darkfi il y a 5 mois
Parent
commit
4a99a6bd93
3 fichiers modifiés avec 26 ajouts et 17 suppressions
  1. 15 17
      bin/app/src/app/schema/chat.rs
  2. 1 0
      bin/app/src/app/schema/menu.rs
  3. 10 0
      bin/app/src/scene.rs

+ 15 - 17
bin/app/src/app/schema/chat.rs

@@ -317,15 +317,14 @@ pub async fn make(
     // Menu doesn't exist yet ;)
     // So look it up in the callback.
     let sg_root = app.sg_root.clone();
-    let layer_node_weak = Arc::downgrade(&layer_node);
+    let layer_node2 = layer_node.clone();
     let chatview_is_visible = PropertyBool::wrap(&layer_node, Role::App, "is_visible", 0).unwrap();
     let renderer = app.renderer.clone();
     let goback = async move || {
         info!(target: "app::chat", "clicked back");
         let atom = &mut renderer.make_guard(gfxtag!("goback action"));
 
-        let layer_node = layer_node_weak.upgrade().unwrap();
-        let editz_node = layer_node.lookup_node("/content/editz").unwrap();
+        let editz_node = layer_node2.lookup_node("/content/editz").unwrap();
         editz_node.call_method("unfocus", vec![]).await.unwrap();
 
         let menu_node = sg_root.lookup_node("/window/content/menu_layer").unwrap();
@@ -342,7 +341,7 @@ pub async fn make(
             goback2().await;
         }
     });
-    app.tasks.lock().unwrap().push(listen_click);
+    layer_node.push_task(listen_click);
 
     let node = node.setup(Button::new).await;
     layer_node.link(node);
@@ -365,7 +364,7 @@ pub async fn make(
             goback().await;
         }
     });
-    app.tasks.lock().unwrap().push(listen_enter);
+    layer_node.push_task(listen_enter);
 
     let node = node.setup(|me| Shortcut::new(me)).await;
     layer_node.link(node);
@@ -580,7 +579,7 @@ pub async fn make(
             }
         }
     });
-    app.tasks.lock().unwrap().push(listen_fileurl);
+    layer_node.push_task(listen_fileurl);
 
     let (slot, recvr) = Slot::new("file_download_request");
     chatview_node.register("file_download_request", slot).unwrap();
@@ -592,7 +591,7 @@ pub async fn make(
             }
         }
     });
-    app.tasks.lock().unwrap().push(listen_file_download);
+    layer_node.push_task(listen_file_download);
 
     if is_first_time {
         let chatview = match chatview_node.pimpl() {
@@ -847,15 +846,14 @@ pub async fn make(
 
     let (slot, recvr) = Slot::new("emoji_selected");
     emoji_picker_node.register("emoji_select", slot).unwrap();
-    let chatedit_node_weak = Arc::downgrade(&chatedit_node);
+    let chatedit_node2 = chatedit_node.clone();
     let listen_click = app.ex.spawn(async move {
         while let Ok(data) = recvr.recv().await {
             // No need to decode the data. Just pass it straight along
-            let chatedit_node = chatedit_node_weak.upgrade().unwrap();
-            chatedit_node.call_method("insert_text", data).await.unwrap();
+            chatedit_node2.call_method("insert_text", data).await.unwrap();
         }
     });
-    app.tasks.lock().unwrap().push(listen_click);
+    layer_node.push_task(listen_click);
 
     // No way to get the top of the editbox until eval has been called.
     // But this is on top so it happens before the eval. So the value is 0.
@@ -982,7 +980,7 @@ pub async fn make(
             sendmsg2().await;
         }
     });
-    app.tasks.lock().unwrap().push(listen_click);
+    layer_node.push_task(listen_click);
 
     let node = node.setup(Button::new).await;
     layer_node.link(node);
@@ -998,7 +996,7 @@ pub async fn make(
             sendmsg().await;
         }
     });
-    app.tasks.lock().unwrap().push(listen_enter);
+    layer_node.push_task(listen_enter);
 
     let node = node.setup(|me| Shortcut::new(me)).await;
     layer_node.link(node);
@@ -1026,7 +1024,7 @@ pub async fn make(
             }
         }
     });
-    app.tasks.lock().unwrap().push(listen_click);
+    layer_node.push_task(listen_click);
 
     // Emoji button is clicked
     let (slot, recvr) = Slot::new("emoji_clicked");
@@ -1086,7 +1084,7 @@ pub async fn make(
             }
         }
     });
-    app.tasks.lock().unwrap().push(listen_click);
+    layer_node.push_task(listen_click);
 
     let node = node.setup(Button::new).await;
     layer_node.link(node);
@@ -1133,7 +1131,7 @@ pub async fn make(
             editz_text2.set(atom, "/nick ");
         }
     });
-    app.tasks.lock().unwrap().push(listen_click);
+    layer_node.push_task(listen_click);
 
     let node = node.setup(Button::new).await;
     cmd_layer_node.link(node);
@@ -1250,7 +1248,7 @@ pub async fn make(
             }
         }
     });
-    app.tasks.lock().unwrap().push(editz_text_task);
+    layer_node.push_task(editz_text_task);
 }
 
 // Just for testing

+ 1 - 0
bin/app/src/app/schema/menu.rs

@@ -368,6 +368,7 @@ pub async fn make(app: &App, content: SceneNodePtr, i18n_fish: &I18nBabelFish) {
             for item in deleted_items {
                 let path = format!("/window/content/{}_chat_layer", item);
                 let node = sg_root.lookup_node(path).unwrap();
+                node.clear_tasks();
                 debug!(target: "app::menu", "deleted item: {item}");
                 node.unlink();
             }

+ 10 - 0
bin/app/src/scene.rs

@@ -20,6 +20,7 @@ use async_channel::{Receiver, Sender};
 use async_trait::async_trait;
 use darkfi_serial::{FutAsyncWriteExt, SerialDecodable, SerialEncodable};
 use futures::{stream::FuturesUnordered, StreamExt};
+use parking_lot::Mutex as SyncMutex;
 use std::{
     collections::{HashMap, VecDeque},
     fmt,
@@ -132,6 +133,7 @@ pub struct SceneNode {
     pub sigs: SyncRwLock<Vec<SignalPtr>>,
     pub methods: Vec<Method>,
     pub pimpl: OnceLock<Pimpl>,
+    tasks: SyncMutex<Vec<smol::Task<()>>>,
 }
 
 impl SceneNode {
@@ -150,6 +152,7 @@ impl SceneNode {
             sigs: SyncRwLock::new(vec![]),
             methods: vec![],
             pimpl: OnceLock::new(),
+            tasks: SyncMutex::new(vec![]),
         }
     }
 
@@ -449,6 +452,13 @@ impl SceneNode {
 
         Some(parent.get_full_path()? + &subpath)
     }
+
+    pub fn push_task(&self, task: smol::Task<()>) {
+        self.tasks.lock().push(task);
+    }
+    pub fn clear_tasks(&self) {
+        self.tasks.lock().clear();
+    }
 }
 
 impl std::fmt::Debug for SceneNode {