Skip to main content

re_component_ui/
lib.rs

1//! This crate implements various component editors.
2//!
3//! The only entry point is [`create_component_ui_registry`], which registers all editors in the component UI registry.
4//! This should be called by `re_viewer` on startup.
5
6mod color;
7pub mod color_swatch;
8mod encoding_uis;
9mod entity_path;
10mod geo_line_string;
11mod image_format;
12mod lat_lon;
13mod line_strip;
14mod map_provider;
15mod marker_shape;
16mod pinhole;
17mod plane3d;
18mod radius;
19mod resolution;
20mod response_utils;
21mod text_log_columns;
22mod time_range;
23mod timeline_columns;
24mod transform_frame_id;
25mod transforms;
26mod variant_uis;
27mod video_timestamp;
28mod view_coordinates;
29mod visible_dnd;
30mod visual_bounds2d;
31mod zoom_level;
32
33/// Variant used to render editable and read-only table flags.
34pub const TABLE_FLAG_VARIANT: &str = "table_flag";
35
36use encoding_uis::{
37    edit_bool, edit_f32_min_to_max_float, edit_f32_zero_to_max, edit_f32_zero_to_one,
38    edit_f64_min_to_max_float, edit_f64_zero_to_max, edit_multiline_string, edit_or_view_vec2d,
39    edit_or_view_vec3d, edit_or_view_vec3d_positive, edit_singleline_string, edit_u32_range,
40    edit_u64_range, edit_ui_points, edit_view_enum, edit_view_enum_with_variant_available,
41    edit_view_range1d, view_timestamp, view_uuid, view_view_id,
42};
43use re_sdk_types::ColormapSelection;
44use re_sdk_types::blueprint::components::{
45    AngularSpeed, BackgroundKind, Corner2D, Enabled, Eye3DKind, ForceDistance, ForceIterations,
46    ForceStrength, GridSpacing, LinkAxis, LockRangeDuringZoom, MapProvider, NearClipPlane,
47    RootContainer, ViewFit, ViewMaximized,
48};
49use re_sdk_types::components::{
50    AggregationPolicy, AlbedoFactor, AxisLength, Color, DepthMeter, DrawOrder, FillMode, FillRatio,
51    GammaCorrection, GraphType, HalfSize3D, ImagePlaneDistance, InterpolationMode, IsKeyframe,
52    Length, LinearSpeed, MagnificationFilter, MarkerSize, MeshFaceRendering, Name, Opacity,
53    PointShading, Position2D, Position3D, Range1D, Scale3D, ShowLabels, SphericalHarmonicsDegree,
54    StrokeWidth, Text, Timestamp, TransformRelation, Translation3D, ValueRange, Vector3D,
55    VideoCodec, Visible,
56};
57use re_sdk_types::{archetypes, components};
58use re_viewer_context::gpu_bridge::colormap_edit_or_view_ui_with_selection;
59
60/// Default number of ui points to show a number.
61const DEFAULT_NUMBER_WIDTH: f32 = 52.0;
62
63// ---
64
65pub const REDAP_URI_BUTTON_VARIANT: &str = "redap_uri";
66
67pub const REDAP_ENTRY_KIND_VARIANT: &str = "redap_entry_kind";
68
69pub const REDAP_THUMBNAIL_VARIANT: &str = "redap_thumbnail";
70
71// ----
72
73/// Crates a component ui registry and registers all editors of this crate to it.
74///
75/// ⚠️ This is supposed to be the only export of this crate.
76/// This crate is meant to be a leaf crate in the viewer ecosystem and should only be used by the `re_viewer` crate itself.
77pub fn create_component_ui_registry() -> re_viewer_context::ComponentUiRegistry {
78    re_tracing::profile_function!();
79
80    let mut registry = re_viewer_context::ComponentUiRegistry::new();
81
82    // Color components:
83    registry.add_singleline_edit_or_view::<Color>(color::edit_rgba32);
84    registry.add_singleline_array_edit_or_view::<Color>(color::edit_rgba32_array);
85    registry.add_singleline_edit_or_view::<AlbedoFactor>(color::edit_rgba32);
86
87    // 0-inf float components:
88    registry.add_singleline_edit_or_view::<AngularSpeed>(edit_f64_min_to_max_float);
89    registry.add_singleline_edit_or_view::<AxisLength>(edit_f32_zero_to_max);
90    registry.add_singleline_edit_or_view::<DepthMeter>(edit_f32_zero_to_max);
91    registry.add_singleline_edit_or_view::<FillRatio>(edit_f32_zero_to_max);
92    registry.add_singleline_edit_or_view::<ForceDistance>(edit_f64_zero_to_max);
93    registry.add_singleline_edit_or_view::<GammaCorrection>(edit_f32_zero_to_max);
94    registry.add_singleline_edit_or_view::<GridSpacing>(edit_f32_zero_to_max);
95    registry.add_singleline_edit_or_view::<ImagePlaneDistance>(edit_f32_zero_to_max);
96    registry.add_singleline_edit_or_view::<Length>(edit_f32_zero_to_max);
97    registry.add_singleline_edit_or_view::<LinearSpeed>(edit_f64_zero_to_max);
98    registry.add_singleline_edit_or_view::<MarkerSize>(edit_ui_points);
99    registry.add_singleline_edit_or_view::<NearClipPlane>(edit_f32_zero_to_max);
100    registry.add_singleline_edit_or_view::<StrokeWidth>(edit_ui_points);
101
102    // float min-max components:
103    registry.add_singleline_edit_or_view::<DrawOrder>(edit_f32_min_to_max_float);
104    registry.add_singleline_edit_or_view::<ForceStrength>(edit_f64_min_to_max_float);
105
106    // float 0-1 components:
107    registry.add_singleline_edit_or_view::<Opacity>(edit_f32_zero_to_one);
108
109    // integer range components:
110    registry.add_singleline_edit_or_view::<ForceIterations>(|ctx, ui, value| {
111        edit_u64_range(ctx, ui, value, 1..=5)
112    });
113    registry.add_singleline_edit_or_view::<SphericalHarmonicsDegree>(|ctx, ui, value| {
114        edit_u32_range(ctx, ui, value, 0..=SphericalHarmonicsDegree::MAX)
115    });
116
117    // Bool components:
118    registry.add_singleline_edit_or_view::<Enabled>(edit_bool);
119    registry.add_singleline_edit_or_view::<LockRangeDuringZoom>(edit_bool);
120    registry.add_singleline_edit_or_view::<ShowLabels>(edit_bool);
121    registry.add_singleline_edit_or_view::<Visible>(edit_bool);
122
123    // `IsKeyframe` is logged data with no blueprint override path, so force
124    // read-only: any edit here would have nowhere to flow.
125    registry.add_singleline_edit_or_view::<IsKeyframe>(|ctx, ui, value| {
126        edit_bool(
127            ctx,
128            ui,
129            &mut re_viewer_context::MaybeMutRef::Ref(value.as_ref()),
130        )
131    });
132
133    // Date components:
134    registry.add_singleline_edit_or_view::<Timestamp>(view_timestamp);
135
136    // Text components:
137    registry.add_singleline_edit_or_view::<Text>(edit_singleline_string);
138    registry.add_multiline_edit_or_view::<Text>(edit_multiline_string);
139    registry.add_singleline_edit_or_view::<Name>(edit_singleline_string);
140    registry.add_multiline_edit_or_view::<Name>(edit_multiline_string);
141    registry.add_singleline_edit_or_view(transform_frame_id::edit_or_view_transform_frame_id);
142
143    // Enums:
144    // TODO(#6974): Enums editors trivial and always the same, provide them automatically!
145    registry.add_singleline_edit_or_view::<AggregationPolicy>(edit_view_enum);
146    registry.add_singleline_edit_or_view::<BackgroundKind>(edit_view_enum);
147    registry.add_singleline_edit_or_view::<Corner2D>(edit_view_enum);
148    registry.add_singleline_edit_or_view::<MeshFaceRendering>(edit_view_enum);
149    registry.add_singleline_edit_or_view::<Eye3DKind>(edit_view_enum);
150    registry.add_singleline_edit_or_view::<FillMode>(edit_view_enum);
151    registry.add_singleline_edit_or_view::<GraphType>(edit_view_enum);
152    registry.add_singleline_edit_or_view::<InterpolationMode>(edit_view_enum);
153    registry.add_singleline_edit_or_view::<LinkAxis>(edit_view_enum);
154    registry.add_singleline_edit_or_view::<PointShading>(edit_view_enum);
155    registry.add_singleline_edit_or_view::<MapProvider>(
156        edit_view_enum_with_variant_available::<
157            MapProvider,
158            crate::map_provider::MapProviderVariantAvailable,
159        >,
160    );
161    registry.add_singleline_edit_or_view::<MagnificationFilter>(edit_view_enum);
162    registry.add_singleline_edit_or_view::<TransformRelation>(edit_view_enum);
163    registry.add_singleline_edit_or_view::<VideoCodec>(|ctx, ui, value| {
164        // Hack to make this field never editable.
165        // Editing the codec rarely makes sense and isn't supported by the visualizer.
166        // (to change this we'd have to do a blueprint query, but `VideoStreamCache` needs more context for that
167        // and the result is almost certainly just decoding failure)
168        edit_view_enum(
169            ctx,
170            ui,
171            &mut re_viewer_context::MaybeMutRef::Ref(value.as_ref()),
172        )
173    });
174    registry.add_singleline_edit_or_view::<ViewFit>(edit_view_enum);
175
176    // Vec2 components:
177    registry.add_singleline_edit_or_view::<Position2D>(edit_or_view_vec2d);
178
179    // Vec3 components:
180    registry.add_singleline_edit_or_view::<HalfSize3D>(edit_or_view_vec3d_positive);
181    registry.add_singleline_edit_or_view::<Position3D>(edit_or_view_vec3d);
182    registry.add_singleline_edit_or_view::<Scale3D>(edit_or_view_vec3d);
183    registry.add_singleline_edit_or_view::<Translation3D>(edit_or_view_vec3d);
184    registry.add_singleline_edit_or_view::<Vector3D>(edit_or_view_vec3d);
185
186    // Components that refer to views:
187    registry.add_singleline_edit_or_view::<ViewMaximized>(view_view_id);
188
189    registry.add_singleline_edit_or_view::<RootContainer>(view_uuid);
190
191    // Range1D components:
192    registry.add_singleline_edit_or_view::<Range1D>(edit_view_range1d);
193    registry.add_singleline_edit_or_view::<ValueRange>(edit_view_range1d);
194
195    // --------------------------------------------------------------------------------
196    // All other special components:
197    // --------------------------------------------------------------------------------
198
199    registry.add_multiline_edit_or_view(time_range::time_range_multiline_edit_or_view_ui);
200    registry.add_singleline_edit_or_view(time_range::time_range_singleline_view_ui);
201
202    // `Colormap` _is_ an enum, but its custom editor is far better.
203    registry.add_singleline_edit_or_view::<components::Colormap>(|ctx, ui, map| {
204        colormap_edit_or_view_ui_with_selection(ctx, ui, map, ColormapSelection::Standard)
205    });
206    // Include the grid map colormap category iff we have a `GridMap:colormap` component identifier.
207    registry.add_singleline_edit_or_view_for_component::<components::Colormap>(
208        archetypes::GridMap::descriptor_colormap().component,
209        |ctx, ui, _component_descriptor, map| {
210            colormap_edit_or_view_ui_with_selection(ctx, ui, map, ColormapSelection::IncludeGridMap)
211        },
212    );
213
214    registry.add_multiline_edit_or_view(visual_bounds2d::multiline_edit_visual_bounds2d);
215    registry.add_singleline_edit_or_view(visual_bounds2d::singleline_edit_visual_bounds2d);
216
217    registry.add_multiline_edit_or_view(transforms::multiline_view_transform_mat3x3);
218    registry.add_singleline_edit_or_view(transforms::singleline_view_transform_mat3x3);
219
220    registry.add_singleline_edit_or_view(image_format::edit_or_view_image_format);
221    registry.add_singleline_edit_or_view(resolution::edit_or_view_resolution);
222
223    registry
224        .add_singleline_edit_or_view(view_coordinates::singleline_edit_or_view_view_coordinates);
225    registry.add_multiline_edit_or_view(view_coordinates::multiline_edit_or_view_view_coordinates);
226
227    registry.add_singleline_edit_or_view(radius::edit_radius_ui);
228    registry.add_singleline_edit_or_view(marker_shape::edit_marker_shape_ui);
229
230    registry.add_singleline_edit_or_view(pinhole::singleline_view_pinhole);
231    registry.add_multiline_edit_or_view(pinhole::multiline_view_pinhole);
232
233    line_strip::register_linestrip_component_ui(&mut registry);
234    geo_line_string::register_geo_line_string_component_ui(&mut registry);
235
236    registry.add_singleline_edit_or_view(entity_path::edit_or_view_entity_path);
237
238    registry.add_singleline_edit_or_view(video_timestamp::edit_or_view_timestamp);
239
240    registry.add_singleline_edit_or_view(lat_lon::singleline_view_lat_lon);
241
242    registry.add_singleline_edit_or_view(zoom_level::edit_zoom_level);
243
244    registry.add_singleline_edit_or_view(plane3d::edit_or_view_plane3d);
245    registry.add_multiline_edit_or_view(plane3d::multiline_edit_or_view_plane3d);
246
247    registry.add_singleline_array_edit_or_view(timeline_columns::edit_or_view_columns_singleline);
248    registry.add_multiline_array_edit_or_view(timeline_columns::edit_or_view_columns_multiline);
249
250    registry.add_singleline_array_edit_or_view(text_log_columns::edit_or_view_columns_singleline);
251    registry.add_multiline_array_edit_or_view(text_log_columns::edit_or_view_columns_multiline);
252
253    // --------------------------------------------------------------------------------
254    // All variant UIs:
255    // --------------------------------------------------------------------------------
256
257    registry.add_variant_ui(REDAP_URI_BUTTON_VARIANT, variant_uis::redap_uri_button);
258    registry.add_variant_ui(REDAP_ENTRY_KIND_VARIANT, variant_uis::redap_entry_kind);
259    registry.add_variant_ui(REDAP_THUMBNAIL_VARIANT, variant_uis::redap_thumbnail);
260    registry.add_edit_or_view_variant_ui(TABLE_FLAG_VARIANT, variant_uis::table_flag);
261
262    registry
263}