re_space_view_text_box/
view_part_system.rs

1use re_arrow_store::LatestAtQuery;
2use re_query::{query_entity_with_primary, QueryError};
3use re_types::Loggable as _;
4use re_viewer_context::{
5    ArchetypeDefinition, SpaceViewSystemExecutionError, ViewContextCollection, ViewPartSystem,
6    ViewQuery, ViewerContext,
7};
8
9// ---
10
11#[derive(Debug, Clone)]
12pub struct TextBoxEntry {
13    pub body: String,
14}
15
16/// A text scene, with everything needed to render it.
17#[derive(Default)]
18pub struct TextBoxSystem {
19    pub text_entries: Vec<TextBoxEntry>,
20}
21
22impl ViewPartSystem for TextBoxSystem {
23    fn archetype(&self) -> ArchetypeDefinition {
24        vec1::vec1![re_components::TextBox::name()]
25    }
26
27    fn execute(
28        &mut self,
29        ctx: &mut ViewerContext<'_>,
30        query: &ViewQuery<'_>,
31        _view_ctx: &ViewContextCollection,
32    ) -> Result<Vec<re_renderer::QueueableDrawData>, SpaceViewSystemExecutionError> {
33        let store = &ctx.store_db.entity_db.data_store;
34
35        for (ent_path, props) in query.iter_entities() {
36            if !props.visible {
37                continue;
38            }
39
40            let query = LatestAtQuery::new(query.timeline, query.latest_at);
41            match query_entity_with_primary::<re_components::TextBox>(store, &query, ent_path, &[])
42                .and_then(|ent_view| {
43                    for text_entry in ent_view.iter_primary()?.flatten() {
44                        let re_components::TextBox { body } = text_entry;
45                        self.text_entries.push(TextBoxEntry { body });
46                    }
47                    Ok(())
48                }) {
49                Ok(_) | Err(QueryError::PrimaryNotFound) => {}
50                Err(_) => {
51                    re_log::warn_once!("text-box query failed for {ent_path:?}");
52                }
53            }
54        }
55        Ok(Vec::new())
56    }
57
58    fn as_any(&self) -> &dyn std::any::Any {
59        self
60    }
61}