From da82cfc3a6d877a89ac75ba7403adf09d726489e Mon Sep 17 00:00:00 2001 From: Jeremy Leibs Date: Wed, 29 Nov 2023 01:05:44 +0100 Subject: [PATCH] Wire the remove-entity buttons to query exclusions --- .../re_space_view/src/data_query_blueprint.rs | 61 ++++++++++++++++++- crates/re_viewer/src/ui/selection_panel.rs | 3 + crates/re_viewport/src/space_view.rs | 7 +++ .../re_viewport/src/viewport_blueprint_ui.rs | 20 +++--- 4 files changed, 78 insertions(+), 13 deletions(-) diff --git a/crates/re_space_view/src/data_query_blueprint.rs b/crates/re_space_view/src/data_query_blueprint.rs index e6c8b038c9b9..c6f740dc167d 100644 --- a/crates/re_space_view/src/data_query_blueprint.rs +++ b/crates/re_space_view/src/data_query_blueprint.rs @@ -3,10 +3,11 @@ use once_cell::sync::Lazy; use re_data_store::{ EntityProperties, EntityPropertiesComponent, EntityPropertyMap, EntityTree, StoreDb, }; -use re_log_types::{EntityPath, EntityPathExpr}; +use re_log_types::{DataRow, EntityPath, EntityPathExpr, RowId, TimePoint}; use re_viewer_context::{ DataQueryId, DataQueryResult, DataResult, DataResultHandle, DataResultNode, DataResultTree, EntitiesPerSystem, EntitiesPerSystemPerClass, SpaceViewClassName, SpaceViewId, StoreContext, + SystemCommand, SystemCommandSender as _, ViewerContext, }; use slotmap::SlotMap; use smallvec::SmallVec; @@ -96,6 +97,64 @@ impl DataQueryBlueprint { .join(&Self::RECURSIVE_OVERRIDES_PREFIX.into()), } } + + pub fn remove_entity_expr(&self, ctx: &ViewerContext<'_>, expr: EntityPathExpr) { + let mut edited = false; + + let mut inclusions: Vec = self + .expressions + .inclusions + .iter() + .filter(|exp| !exp.as_str().is_empty()) + .map(|exp| EntityPathExpr::from(exp.as_str())) + .collect(); + + let mut exclusions: Vec = self + .expressions + .exclusions + .iter() + .filter(|exp| !exp.as_str().is_empty()) + .map(|exp| EntityPathExpr::from(exp.as_str())) + .collect(); + + inclusions.retain(|inc_expr| { + if inc_expr == &expr { + edited = true; + false + } else { + true + } + }); + + if !exclusions.iter().any(|exc_expr| exc_expr == &expr) { + edited = true; + exclusions.push(expr); + } + + if edited { + let timepoint = TimePoint::timeless(); + + let expressions_component = QueryExpressions { + inclusions: inclusions.iter().map(|s| s.to_string().into()).collect(), + exclusions: exclusions.iter().map(|s| s.to_string().into()).collect(), + }; + + let row = DataRow::from_cells1_sized( + RowId::random(), + self.id.as_entity_path(), + timepoint.clone(), + 1, + [expressions_component], + ) + .unwrap(); + + ctx.command_sender + .send_system(SystemCommand::UpdateBlueprint( + ctx.store_context.blueprint.store_id().clone(), + vec![row], + )); + } + } } impl DataQuery for DataQueryBlueprint { diff --git a/crates/re_viewer/src/ui/selection_panel.rs b/crates/re_viewer/src/ui/selection_panel.rs index 5537a320f8eb..9ed66c57d5ec 100644 --- a/crates/re_viewer/src/ui/selection_panel.rs +++ b/crates/re_viewer/src/ui/selection_panel.rs @@ -392,6 +392,8 @@ fn blueprint_ui( match item { Item::SpaceView(space_view_id) => { ui.horizontal(|ui| { + // TODO(#4377): Don't bother showing add/remove entities dialog since it's broken + /* if ui .button("Add/remove Entities") .on_hover_text("Manually add or remove Entities from the Space View") @@ -400,6 +402,7 @@ fn blueprint_ui( viewport .show_add_remove_entities_window(*space_view_id); } + */ if ui .button("Clone Space View") diff --git a/crates/re_viewport/src/space_view.rs b/crates/re_viewport/src/space_view.rs index 56bc1fc5a46f..daec2b19f2a9 100644 --- a/crates/re_viewport/src/space_view.rs +++ b/crates/re_viewport/src/space_view.rs @@ -2,6 +2,7 @@ use ahash::HashSet; use re_data_store::{EntityPath, EntityProperties, StoreDb, TimeInt, VisibleHistory}; use re_data_store::{EntityPropertiesComponent, EntityPropertyMap}; +use re_log_types::EntityPathExpr; use re_renderer::ScreenshotProcessor; use re_space_view::{ DataQueryBlueprint, EntityOverrides, PropertyResolver, ScreenshotMode, SpaceViewContents, @@ -327,6 +328,12 @@ impl SpaceViewBlueprint { override_path: entity_path, } } + + pub fn remove_entity_expr(&self, ctx: &ViewerContext<'_>, expr: EntityPathExpr) { + if let Some(query) = self.queries.first() { + query.remove_entity_expr(ctx, expr); + } + } } impl SpaceViewBlueprint { diff --git a/crates/re_viewport/src/viewport_blueprint_ui.rs b/crates/re_viewport/src/viewport_blueprint_ui.rs index fadf14e04dea..ebeecc8a91e0 100644 --- a/crates/re_viewport/src/viewport_blueprint_ui.rs +++ b/crates/re_viewport/src/viewport_blueprint_ui.rs @@ -3,6 +3,7 @@ use itertools::Itertools; use re_data_store::InstancePath; use re_data_ui::item_ui; +use re_log_types::EntityPathExpr; use re_ui::list_item::ListItem; use re_ui::ReUi; use re_viewer_context::{ @@ -311,8 +312,10 @@ impl ViewportBlueprint<'_> { let response = remove_button_ui(re_ui, ui, "Remove Entity from the Space View"); if response.clicked() { - // TODO(#4377): Fix entity removal - //space_view.contents.remove_entity(entity_path); + space_view.remove_entity_expr( + ctx, + EntityPathExpr::Exact(entity_path.clone()), + ); space_view.entities_determined_by_user = true; } @@ -374,16 +377,9 @@ impl ViewportBlueprint<'_> { }); if remove_group { - // TODO(#4377): Fix group removal - /* - if let Some(group_handle) = space_view - .contents - .group_handle_for_entity_path(entity_path) - { - space_view.contents.remove_group(group_handle); - space_view.entities_determined_by_user = true; - } - */ + space_view + .remove_entity_expr(ctx, EntityPathExpr::Recursive(entity_path.clone())); + space_view.entities_determined_by_user = true; } response