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
6#![warn(clippy::iter_over_hash_type)] //  TODO(#6198): enable everywhere
7
8mod color;
9mod datatype_uis;
10mod entity_path;
11mod geo_line_string;
12mod image_format;
13mod lat_lon;
14mod line_strip;
15mod map_provider;
16mod marker_shape;
17mod pinhole;
18mod plane3d;
19mod radius;
20mod resolution;
21mod response_utils;
22mod time_range;
23mod transforms;
24mod variant_uis;
25mod video_timestamp;
26mod view_coordinates;
27mod visual_bounds2d;
28mod zoom_level;
29
30use datatype_uis::{
31    edit_bool, edit_f32_min_to_max_float, edit_f32_zero_to_max, edit_f32_zero_to_one,
32    edit_f64_min_to_max_float, edit_f64_zero_to_max, edit_multiline_string, edit_or_view_vec2d,
33    edit_or_view_vec3d, edit_singleline_string, edit_u64_range, edit_ui_points, edit_view_enum,
34    edit_view_enum_with_variant_available, edit_view_range1d, view_timestamp, view_uuid,
35    view_view_id,
36};
37
38use re_types::{
39    blueprint::components::{
40        AngularSpeed, BackgroundKind, Corner2D, Enabled, Eye3DKind, ForceDistance, ForceIterations,
41        ForceStrength, GridSpacing, LinkAxis, LockRangeDuringZoom, MapProvider, NearClipPlane,
42        RootContainer, ViewFit, ViewMaximized,
43    },
44    components::{
45        AggregationPolicy, AlbedoFactor, AxisLength, Color, DepthMeter, DrawOrder, FillMode,
46        FillRatio, GammaCorrection, GraphType, ImagePlaneDistance, LinearSpeed,
47        MagnificationFilter, MarkerSize, Name, Opacity, Position2D, Position3D, Range1D, Scale3D,
48        SeriesVisible, ShowLabels, StrokeWidth, Text, Timestamp, TransformRelation, Translation3D,
49        ValueRange, Vector3D, VideoCodec, Visible,
50    },
51};
52use re_viewer_context::gpu_bridge::colormap_edit_or_view_ui;
53
54/// Default number of ui points to show a number.
55const DEFAULT_NUMBER_WIDTH: f32 = 52.0;
56
57// ---
58
59pub const REDAP_URI_BUTTON_VARIANT: &str = "redap_uri";
60
61pub const REDAP_ENTRY_KIND_VARIANT: &str = "redap_entry_kind";
62
63pub const REDAP_THUMBNAIL_VARIANT: &str = "redap_thumbnail";
64
65// ----
66
67/// Crates a component ui registry and registers all editors of this crate to it.
68///
69/// ⚠️ This is supposed to be the only export of this crate.
70/// This crate is meant to be a leaf crate in the viewer ecosystem and should only be used by the `re_viewer` crate itself.
71pub fn create_component_ui_registry() -> re_viewer_context::ComponentUiRegistry {
72    re_tracing::profile_function!();
73
74    let mut registry = re_viewer_context::ComponentUiRegistry::new();
75
76    // Color components:
77    registry.add_singleline_edit_or_view::<Color>(color::edit_rgba32);
78    registry.add_singleline_edit_or_view::<AlbedoFactor>(color::edit_rgba32);
79
80    // 0-inf float components:
81    registry.add_singleline_edit_or_view::<AxisLength>(edit_f32_zero_to_max);
82    registry.add_singleline_edit_or_view::<DepthMeter>(edit_f32_zero_to_max);
83    registry.add_singleline_edit_or_view::<FillRatio>(edit_f32_zero_to_max);
84    registry.add_singleline_edit_or_view::<ForceDistance>(edit_f64_zero_to_max);
85    registry.add_singleline_edit_or_view::<GammaCorrection>(edit_f32_zero_to_max);
86    registry.add_singleline_edit_or_view::<GridSpacing>(edit_f32_zero_to_max);
87    registry.add_singleline_edit_or_view::<ImagePlaneDistance>(edit_f32_zero_to_max);
88    registry.add_singleline_edit_or_view::<LinearSpeed>(edit_f64_zero_to_max);
89    registry.add_singleline_edit_or_view::<AngularSpeed>(edit_f64_min_to_max_float);
90    registry.add_singleline_edit_or_view::<MarkerSize>(edit_ui_points);
91    registry.add_singleline_edit_or_view::<NearClipPlane>(edit_f32_zero_to_max);
92    registry.add_singleline_edit_or_view::<StrokeWidth>(edit_ui_points);
93
94    // float min-max components:
95    registry.add_singleline_edit_or_view::<DrawOrder>(edit_f32_min_to_max_float);
96    registry.add_singleline_edit_or_view::<ForceStrength>(edit_f64_min_to_max_float);
97
98    // float 0-1 components:
99    registry.add_singleline_edit_or_view::<Opacity>(edit_f32_zero_to_one);
100
101    // integer range components:
102    registry.add_singleline_edit_or_view::<ForceIterations>(|ctx, ui, value| {
103        edit_u64_range(ctx, ui, value, 1..=5)
104    });
105
106    // Bool components:
107    registry.add_singleline_edit_or_view::<Enabled>(edit_bool);
108    registry.add_singleline_edit_or_view::<LockRangeDuringZoom>(edit_bool);
109    registry.add_singleline_edit_or_view::<ShowLabels>(edit_bool);
110    registry.add_singleline_edit_or_view::<Visible>(edit_bool);
111    registry.add_singleline_edit_or_view::<SeriesVisible>(edit_bool);
112
113    // Date components:
114    registry.add_singleline_edit_or_view::<Timestamp>(view_timestamp);
115
116    // Text components:
117    registry.add_singleline_edit_or_view::<Text>(edit_singleline_string);
118    registry.add_multiline_edit_or_view::<Text>(edit_multiline_string);
119    registry.add_singleline_edit_or_view::<Name>(edit_singleline_string);
120    registry.add_multiline_edit_or_view::<Name>(edit_multiline_string);
121
122    // Enums:
123    // TODO(#6974): Enums editors trivial and always the same, provide them automatically!
124    registry.add_singleline_edit_or_view::<AggregationPolicy>(edit_view_enum);
125    registry.add_singleline_edit_or_view::<BackgroundKind>(edit_view_enum);
126    registry.add_singleline_edit_or_view::<Corner2D>(edit_view_enum);
127    registry.add_singleline_edit_or_view::<Eye3DKind>(edit_view_enum);
128    registry.add_singleline_edit_or_view::<FillMode>(edit_view_enum);
129    registry.add_singleline_edit_or_view::<GraphType>(edit_view_enum);
130    registry.add_singleline_edit_or_view::<LinkAxis>(edit_view_enum);
131    registry.add_singleline_edit_or_view::<MapProvider>(
132        edit_view_enum_with_variant_available::<
133            MapProvider,
134            crate::map_provider::MapProviderVariantAvailable,
135        >,
136    );
137    registry.add_singleline_edit_or_view::<MagnificationFilter>(edit_view_enum);
138    registry.add_singleline_edit_or_view::<TransformRelation>(edit_view_enum);
139    registry.add_singleline_edit_or_view::<VideoCodec>(|ctx, ui, value| {
140        // Hack to make this field never editable.
141        // Editing the codec rarely makes sense and isn't supported by the visualizer.
142        // (to change this we'd have to do a blueprint query, but `VideoStreamCache` needs more context for that
143        // and the result is almost certainly just decoding failure)
144        edit_view_enum(
145            ctx,
146            ui,
147            &mut re_viewer_context::MaybeMutRef::Ref(value.as_ref()),
148        )
149    });
150    registry.add_singleline_edit_or_view::<ViewFit>(edit_view_enum);
151
152    // Vec2 components:
153    registry.add_singleline_edit_or_view::<Position2D>(edit_or_view_vec2d);
154
155    // Vec3 components:
156    registry.add_singleline_edit_or_view::<Translation3D>(edit_or_view_vec3d);
157    registry.add_singleline_edit_or_view::<Scale3D>(edit_or_view_vec3d);
158    registry.add_singleline_edit_or_view::<Position3D>(edit_or_view_vec3d);
159    registry.add_singleline_edit_or_view::<Vector3D>(edit_or_view_vec3d);
160
161    // Components that refer to views:
162    registry.add_singleline_edit_or_view::<ViewMaximized>(view_view_id);
163
164    registry.add_singleline_edit_or_view::<RootContainer>(view_uuid);
165
166    // Range1D components:
167    registry.add_singleline_edit_or_view::<Range1D>(edit_view_range1d);
168    registry.add_singleline_edit_or_view::<ValueRange>(edit_view_range1d);
169
170    // --------------------------------------------------------------------------------
171    // All other special components:
172    // --------------------------------------------------------------------------------
173
174    registry.add_multiline_edit_or_view(time_range::time_range_multiline_edit_or_view_ui);
175    registry.add_singleline_edit_or_view(time_range::time_range_singleline_view_ui);
176
177    // `Colormap` _is_ an enum, but its custom editor is far better.
178    registry.add_singleline_edit_or_view(colormap_edit_or_view_ui);
179
180    registry.add_multiline_edit_or_view(visual_bounds2d::multiline_edit_visual_bounds2d);
181    registry.add_singleline_edit_or_view(visual_bounds2d::singleline_edit_visual_bounds2d);
182
183    registry.add_multiline_edit_or_view(transforms::multiline_view_transform_mat3x3);
184    registry.add_singleline_edit_or_view(transforms::singleline_view_transform_mat3x3);
185
186    registry.add_singleline_edit_or_view(image_format::edit_or_view_image_format);
187    registry.add_singleline_edit_or_view(resolution::edit_or_view_resolution);
188    registry.add_singleline_edit_or_view(view_coordinates::edit_or_view_view_coordinates);
189
190    registry.add_singleline_edit_or_view(radius::edit_radius_ui);
191    registry.add_singleline_edit_or_view(marker_shape::edit_marker_shape_ui);
192
193    registry.add_singleline_edit_or_view(pinhole::singleline_view_pinhole);
194    registry.add_multiline_edit_or_view(pinhole::multiline_view_pinhole);
195
196    line_strip::register_linestrip_component_ui(&mut registry);
197    geo_line_string::register_geo_line_string_component_ui(&mut registry);
198
199    registry.add_singleline_edit_or_view(entity_path::edit_or_view_entity_path);
200
201    registry.add_singleline_edit_or_view(video_timestamp::edit_or_view_timestamp);
202
203    registry.add_singleline_edit_or_view(lat_lon::singleline_view_lat_lon);
204
205    registry.add_singleline_edit_or_view(zoom_level::edit_zoom_level);
206
207    registry.add_singleline_edit_or_view(plane3d::edit_or_view_plane3d);
208    registry.add_multiline_edit_or_view(plane3d::multiline_edit_or_view_plane3d);
209
210    // --------------------------------------------------------------------------------
211    // All variant UIs:
212    // --------------------------------------------------------------------------------
213
214    registry.add_variant_ui(REDAP_URI_BUTTON_VARIANT, variant_uis::redap_uri_button);
215    registry.add_variant_ui(REDAP_ENTRY_KIND_VARIANT, variant_uis::redap_entry_kind);
216    registry.add_variant_ui(REDAP_THUMBNAIL_VARIANT, variant_uis::redap_thumbnail);
217
218    registry
219}