mirror of
https://github.com/darkrenaissance/darkfi.git
synced 2026-04-28 03:00:18 -04:00
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:
@@ -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();
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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"));
|
||||
|
||||
Reference in New Issue
Block a user