use re_entity_db::EntityPath;
use re_viewer_context::{DataQueryResult, DataResult, ViewId, ViewerContext};
pub fn entity_visibility_in_view(
ctx: &ViewerContext<'_>,
view_id: ViewId,
entity_path: &EntityPath,
) -> Option<bool> {
ctx.lookup_query_result(view_id)
.result_for_entity(entity_path)
.map(DataResult::is_visible)
}
pub fn set_entity_visibility_in_view(
ctx: &ViewerContext<'_>,
view_id: ViewId,
entity_path: &EntityPath,
visible: bool,
) {
let query_result = ctx.lookup_query_result(view_id);
if let Some(data_result) = query_result.result_for_entity(entity_path) {
data_result.save_visible(ctx, &query_result.tree, visible);
}
}
pub fn set_entity_visibility_in_all_views(
ctx: &ViewerContext<'_>,
entity_path: &EntityPath,
visible: bool,
) {
for (_view_id, query_result, data_result) in iter_data_results_for_entity(ctx, entity_path) {
if data_result.is_visible() != visible {
data_result.save_visible(ctx, &query_result.tree, visible);
}
}
}
pub fn any_view_has_entity_visibility(
ctx: &ViewerContext<'_>,
entity_path: &EntityPath,
target_visibility: bool,
) -> bool {
iter_data_results_for_entity(ctx, entity_path)
.any(|(_, _, data_result)| data_result.is_visible() == target_visibility)
}
fn iter_data_results_for_entity<'a>(
ctx: &'a ViewerContext<'_>,
entity_path: &'a EntityPath,
) -> impl Iterator<Item = (ViewId, &'a DataQueryResult, &'a DataResult)> + 'a {
ctx.query_results
.iter()
.filter_map(|(&view_id, query_result)| {
let data_result = query_result.result_for_entity(entity_path)?;
Some((view_id, query_result, data_result))
})
}