Skip to content

Commit 067c637

Browse files
grtlrWumpf
andauthored
Make Position2D components editable in selection panel (#8357)
### Related <!-- Include links to any related issues/PRs in a bulleted list, for example: * Closes #1234 * Part of #1337 --> * Part of #8299 ### What This adds a simple single line edit for position 2D. There is no `speed_fn` because I think in most applications UI coordinates are probably good unit (for example in graphs). https://github.com/user-attachments/assets/2fad00c4-8e68-40fe-a474-32fa5806814e <!-- Make sure the PR title and labels are set to maximize their usefulness for the CHANGELOG, and our `git log`. If you have noticed any breaking changes, include them in the migration guide. We track various metrics at <https://build.rerun.io>. For maintainers: * To run all checks from `main`, comment on the PR with `@rerun-bot full-check`. * To deploy documentation changes immediately after merging this PR, add the `deploy docs` label. --> --------- Co-authored-by: Andreas Reich <[email protected]>
1 parent 1aa3427 commit 067c637

File tree

3 files changed

+85
-39
lines changed

3 files changed

+85
-39
lines changed

crates/viewer/re_component_ui/src/datatype_uis/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,6 @@ pub use range1d::edit_view_range1d;
2020
pub use singleline_string::{
2121
display_name_ui, display_text_ui, edit_multiline_string, edit_singleline_string,
2222
};
23-
pub use vec::{edit_or_view_vec3d, edit_or_view_vec3d_raw};
23+
pub use vec::{edit_or_view_vec2d, edit_or_view_vec3d, edit_or_view_vec3d_raw};
2424
pub use view_id::view_view_id;
2525
pub use view_uuid::view_uuid;
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,20 @@
1+
use std::ops::RangeInclusive;
2+
3+
use egui::NumExt as _;
14
use re_types::datatypes;
25
use re_viewer_context::MaybeMutRef;
36

4-
use super::float_drag::edit_f32_float_raw;
7+
pub fn edit_or_view_vec2d(
8+
_ctx: &re_viewer_context::ViewerContext<'_>,
9+
ui: &mut egui::Ui,
10+
value: &mut MaybeMutRef<'_, impl std::ops::DerefMut<Target = datatypes::Vec2D>>,
11+
) -> egui::Response {
12+
let mut value: MaybeMutRef<'_, datatypes::Vec2D> = match value {
13+
MaybeMutRef::Ref(value) => MaybeMutRef::Ref(value),
14+
MaybeMutRef::MutRef(value) => MaybeMutRef::MutRef(value),
15+
};
16+
edit_or_view_vec2d_raw(ui, &mut value)
17+
}
518

619
pub fn edit_or_view_vec3d(
720
_ctx: &re_viewer_context::ViewerContext<'_>,
@@ -12,50 +25,80 @@ pub fn edit_or_view_vec3d(
1225
MaybeMutRef::Ref(value) => MaybeMutRef::Ref(value),
1326
MaybeMutRef::MutRef(value) => MaybeMutRef::MutRef(value),
1427
};
15-
edit_or_view_vec3d_raw_immutable(ui, &mut value)
28+
edit_or_view_vec3d_raw(ui, &mut value)
1629
}
1730

18-
// TODO(#6743): Since overrides are not yet taken into account, editing this value has no effect.
19-
//MaybeMutRef::MutRef(value) => MaybeMutRef::MutRef(&mut value[i]),
20-
fn edit_or_view_vec3d_raw_immutable(
21-
ui: &mut egui::Ui,
22-
value: &mut MaybeMutRef<'_, datatypes::Vec3D>,
23-
) -> egui::Response {
24-
edit_or_view_vector_component_immutable(ui, value, 0)
25-
| edit_or_view_vector_component_immutable(ui, value, 1)
26-
| edit_or_view_vector_component_immutable(ui, value, 2)
31+
fn drag<'a>(value: &'a mut f32, range: RangeInclusive<f32>, suffix: &str) -> egui::DragValue<'a> {
32+
let speed = (value.abs() * 0.01).at_least(0.001);
33+
egui::DragValue::new(value)
34+
.clamp_existing_to_range(false)
35+
.range(range)
36+
.speed(speed)
37+
.suffix(suffix)
2738
}
2839

29-
fn edit_or_view_vector_component_immutable(
40+
// TODO(#6743): Since overrides are not yet taken into account, editing this value has no effect.
41+
pub fn edit_or_view_vec2d_raw(
3042
ui: &mut egui::Ui,
31-
value: &mut MaybeMutRef<'_, datatypes::Vec3D>,
32-
i: usize,
43+
value: &mut MaybeMutRef<'_, datatypes::Vec2D>,
3344
) -> egui::Response {
34-
let mut value: MaybeMutRef<'_, f32> = match value {
35-
MaybeMutRef::Ref(value) => MaybeMutRef::Ref(&value[i]),
45+
let x = value.0[0];
46+
let y = value.0[1];
3647

37-
MaybeMutRef::MutRef(value) => MaybeMutRef::Ref(&value[i]),
38-
};
39-
edit_f32_float_raw(ui, &mut value, f32::MIN..=f32::MAX, "")
48+
if let Some(value) = value.as_mut() {
49+
let mut x_edit = x;
50+
let mut y_edit = y;
51+
52+
let response_x = ui.add(drag(&mut x_edit, f32::MIN..=f32::MAX, ""));
53+
let response_y = ui.add(drag(&mut y_edit, f32::MIN..=f32::MAX, ""));
54+
55+
let response = response_y | response_x;
56+
57+
if response.changed() {
58+
*value = datatypes::Vec2D([x_edit, y_edit]);
59+
}
60+
61+
response
62+
} else {
63+
ui.label(format!(
64+
"[ {} , {} ]",
65+
re_format::format_f32(x),
66+
re_format::format_f32(y),
67+
))
68+
}
4069
}
4170

71+
// TODO(#6743): Since overrides are not yet taken into account, editing this value has no effect.
4272
pub fn edit_or_view_vec3d_raw(
4373
ui: &mut egui::Ui,
4474
value: &mut MaybeMutRef<'_, datatypes::Vec3D>,
4575
) -> egui::Response {
46-
edit_or_view_vector_component(ui, value, 0)
47-
| edit_or_view_vector_component(ui, value, 1)
48-
| edit_or_view_vector_component(ui, value, 2)
49-
}
76+
let x = value.0[0];
77+
let y = value.0[1];
78+
let z = value.0[2];
5079

51-
fn edit_or_view_vector_component(
52-
ui: &mut egui::Ui,
53-
value: &mut MaybeMutRef<'_, datatypes::Vec3D>,
54-
i: usize,
55-
) -> egui::Response {
56-
let mut value: MaybeMutRef<'_, f32> = match value {
57-
MaybeMutRef::Ref(value) => MaybeMutRef::Ref(&value[i]),
58-
MaybeMutRef::MutRef(value) => MaybeMutRef::MutRef(&mut value[i]),
59-
};
60-
edit_f32_float_raw(ui, &mut value, f32::MIN..=f32::MAX, "")
80+
if let Some(value) = value.as_mut() {
81+
let mut x_edit = x;
82+
let mut y_edit = y;
83+
let mut z_edit = z;
84+
85+
let response_x = ui.add(drag(&mut x_edit, f32::MIN..=f32::MAX, ""));
86+
let response_y = ui.add(drag(&mut y_edit, f32::MIN..=f32::MAX, ""));
87+
let response_z = ui.add(drag(&mut z_edit, f32::MIN..=f32::MAX, ""));
88+
89+
let response = response_y | response_x | response_z;
90+
91+
if response.changed() {
92+
*value = datatypes::Vec3D([x_edit, y_edit, z_edit]);
93+
}
94+
95+
response
96+
} else {
97+
ui.label(format!(
98+
"[ {} , {} , {} ]",
99+
re_format::format_f32(x),
100+
re_format::format_f32(y),
101+
re_format::format_f32(z),
102+
))
103+
}
61104
}

crates/viewer/re_component_ui/src/lib.rs

+8-5
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,9 @@ mod zoom_level;
2828

2929
use datatype_uis::{
3030
display_name_ui, display_text_ui, edit_bool, edit_f32_min_to_max_float, edit_f32_zero_to_max,
31-
edit_f32_zero_to_one, edit_multiline_string, edit_or_view_vec3d, edit_singleline_string,
32-
edit_ui_points, edit_view_enum, edit_view_enum_with_variant_available, edit_view_range1d,
33-
view_uuid, view_view_id,
31+
edit_f32_zero_to_one, edit_multiline_string, edit_or_view_vec2d, edit_or_view_vec3d,
32+
edit_singleline_string, edit_ui_points, edit_view_enum, edit_view_enum_with_variant_available,
33+
edit_view_range1d, view_uuid, view_view_id,
3434
};
3535

3636
use re_types::{
@@ -40,8 +40,8 @@ use re_types::{
4040
components::{
4141
AggregationPolicy, AlbedoFactor, AxisLength, Color, DepthMeter, DrawOrder, FillMode,
4242
FillRatio, GammaCorrection, GraphType, ImagePlaneDistance, MagnificationFilter, MarkerSize,
43-
Name, Opacity, Range1D, Scale3D, ShowLabels, StrokeWidth, Text, TransformRelation,
44-
Translation3D, ValueRange,
43+
Name, Opacity, Position2D, Range1D, Scale3D, ShowLabels, StrokeWidth, Text,
44+
TransformRelation, Translation3D, ValueRange,
4545
},
4646
Component as _,
4747
};
@@ -114,6 +114,9 @@ pub fn create_component_ui_registry() -> re_viewer_context::ComponentUiRegistry
114114
registry.add_singleline_edit_or_view::<TransformRelation>(edit_view_enum);
115115
registry.add_singleline_edit_or_view::<ViewFit>(edit_view_enum);
116116

117+
// Vec2 components:
118+
registry.add_singleline_edit_or_view::<Position2D>(edit_or_view_vec2d);
119+
117120
// Vec3 components:
118121
registry.add_singleline_edit_or_view::<Translation3D>(edit_or_view_vec3d);
119122
registry.add_singleline_edit_or_view::<Scale3D>(edit_or_view_vec3d);

0 commit comments

Comments
 (0)