use crate::bevy_ryot::drawing::*;
use crate::position::TilePosition;
#[cfg(feature = "lmdb")]
use bevy::utils::HashMap;
#[cfg(feature = "lmdb")]
use crate::bevy_ryot::lmdb::LmdbEnv;
#[cfg(feature = "lmdb")]
use crate::lmdb::{GetKey, ItemRepository, ItemsFromHeedLmdb};
#[derive(Eq, PartialEq, Component, Default, Clone, Reflect)]
pub struct Deletion {
pub state: CommandState,
}
pub fn apply_deletion(
mut q_deleted: Query<
(&mut Visibility, &mut Deletion),
Or<(Changed<Deletion>, Added<Deletion>)>,
>,
) {
for (mut visibility, mut deletion) in q_deleted.iter_mut() {
if !deletion.state.applied {
*visibility = Visibility::Hidden;
deletion.state.applied = true;
}
}
}
pub fn persist_deletion(
#[cfg(feature = "lmdb")] lmdb_env: ResMut<LmdbEnv>,
mut q_deleted: Query<(&TilePosition, &Layer, &mut Deletion), Changed<Deletion>>,
) {
#[cfg(feature = "lmdb")]
{
let Some(lmdb_env) = &lmdb_env.0 else {
return;
};
let mut layer_per_pos: HashMap<Vec<u8>, Layer> = HashMap::new();
for (tile_pos, layer, deletion) in q_deleted.iter() {
if !deletion.state.persisted {
layer_per_pos.insert(tile_pos.get_binary_key(), *layer);
}
}
let item_repository = ItemsFromHeedLmdb::new(lmdb_env.clone());
let tiles =
item_repository.get_for_keys(layer_per_pos.clone().into_keys().collect::<Vec<_>>());
if let Err(e) = tiles {
error!("Failed to get tiles: {}", e);
return;
};
let mut to_update = vec![];
let mut to_delete = vec![];
for tile in tiles.unwrap().iter_mut() {
let key = tile.position.get_binary_key();
let Some(layer) = layer_per_pos.get(&key) else {
continue;
};
tile.items.remove(layer);
if tile.items.is_empty() {
to_delete.push(key);
} else {
to_update.push(tile.clone());
}
}
if let Err(e) = item_repository.save_from_tiles(to_update) {
error!("Failed to delete tile: {}", e);
return;
}
if let Err(e) = item_repository.delete_multiple(to_delete) {
error!("Failed to delete tile: {}", e);
return;
}
}
for (.., mut deletion) in q_deleted.iter_mut() {
if !deletion.state.persisted {
deletion.state.persisted = true;
}
}
}