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

This commit is contained in:
darkfi
2026-02-18 12:43:47 +01:00
parent f87fd7a6f4
commit 904d8fd6a0
3 changed files with 37 additions and 9 deletions

View File

@@ -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();

View File

@@ -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();

View File

@@ -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"));