Parcourir la source

app/menu: add edit_done signal which sends list of deleted items to menu schema, and also add a listener for the signal

darkfi il y a 5 mois
Parent
commit
904d8fd6a0
3 fichiers modifiés avec 37 ajouts et 9 suppressions
  1. 7 0
      bin/app/src/app/node.rs
  2. 13 0
      bin/app/src/app/schema/menu.rs
  3. 17 9
      bin/app/src/ui/menu/mod.rs

+ 7 - 0
bin/app/src/app/node.rs

@@ -705,6 +705,13 @@ pub fn create_menu(name: &str) -> SceneNode {
 
     node.add_signal("edit_active", "Edit mode activated", vec![]).unwrap();
 
+    node.add_signal(
+        "edit_done",
+        "Edit mode completed",
+        vec![("deleted_items", "List of deleted item names", CallArgType::Str)],
+    )
+    .unwrap();
+
     node.add_method("mark_active", vec![("item_name", "Item name", CallArgType::Str)], None)
         .unwrap();
 

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

@@ -359,6 +359,19 @@ pub async fn make(app: &App, content: SceneNodePtr, i18n_fish: &I18nBabelFish) {
         node.setup(|me| Menu::new(me, window_scale.clone(), app.renderer.clone())).await;
     layer_node.link(menu_node.clone());
 
+    // Subscribe to edit_done signal to log deleted items
+    let (edit_done_slot, edit_done_recvr) = Slot::new("edit_done");
+    menu_node.register("edit_done", edit_done_slot).unwrap();
+    let edit_done_listen = app.ex.spawn(async move {
+        while let Ok(data) = edit_done_recvr.recv().await {
+            let deleted_items: Vec<String> = deserialize(&data).unwrap();
+            for item in deleted_items {
+                debug!(target: "app::menu", "deleted item: {item}");
+            }
+        }
+    });
+    app.tasks.lock().unwrap().push(edit_done_listen);
+
     // Create the cancel button
     let node = create_button("cancel_btn");
     node.set_property_bool(atom, Role::App, "is_active", true).unwrap();

+ 17 - 9
bin/app/src/ui/menu/mod.rs

@@ -638,16 +638,15 @@ impl Menu {
             return true
         };
 
-        // Restore the saved items if they exist
-        let saved = self_.saved_items.lock().take();
-        if let Some(items) = saved {
-            let atom = &mut self_.renderer.make_guard(gfxtag!("Menu::cancel_edit"));
-            self_.items.set_str_vec(atom, Role::App, items).unwrap();
-        }
+        let atom = &mut self_.renderer.make_guard(gfxtag!("Menu::cancel_edit"));
+
+        // Restore the saved items
+        // It must exist otherwise theres a logic err
+        let saved_items = self_.saved_items.lock().take().unwrap();
+        self_.items.set_str_vec(atom, Role::App, saved_items).unwrap();
 
         // Exit edit mode
         self_.is_edit_mode.store(false, Ordering::Release);
-        let atom = &mut self_.renderer.make_guard(gfxtag!("Menu::cancel_edit"));
         self_.redraw(atom);
 
         true
@@ -668,8 +667,17 @@ impl Menu {
             return true
         };
 
-        // Clear the saved items since we're finalizing the changes
-        *self_.saved_items.lock() = None;
+        // Calculate deleted items by diffing saved and current items
+        let saved_items = self_.saved_items.lock().take().unwrap();
+        let current_items = self_.items.get_str_vec().unwrap();
+
+        let deleted_items: Vec<String> =
+            saved_items.into_iter().filter(|item| !current_items.contains(item)).collect();
+
+        // Send the edit_done signal with deleted items
+        let node = self_.node.upgrade().unwrap();
+        let data = serialize(&deleted_items);
+        node.trigger("edit_done", data).await.unwrap();
 
         self_.is_edit_mode.store(false, Ordering::Release);
         let atom = &mut self_.renderer.make_guard(gfxtag!("Menu::done_edit"));