diff --git a/bin/app/src/app/node.rs b/bin/app/src/app/node.rs index 5140c3cd9..ce34566ff 100644 --- a/bin/app/src/app/node.rs +++ b/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(); diff --git a/bin/app/src/app/schema/menu.rs b/bin/app/src/app/schema/menu.rs index 2e5d4512d..454fb8a67 100644 --- a/bin/app/src/app/schema/menu.rs +++ b/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 = 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(); diff --git a/bin/app/src/ui/menu/mod.rs b/bin/app/src/ui/menu/mod.rs index a5b5da583..77b56fdbf 100644 --- a/bin/app/src/ui/menu/mod.rs +++ b/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 = + 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"));