use std::ops::RangeInclusive;
use egui::NumExt as _;
use re_sdk_types::encodings;
use re_ui::syntax_highlighting::SyntaxHighlightedBuilder;
use re_viewer_context::{MaybeMutRef, UiLayout};
pub fn edit_or_view_vec2d(
_ctx: &re_viewer_context::AppContext<'_>,
ui: &mut egui::Ui,
value: &mut MaybeMutRef<'_, impl std::ops::DerefMut<Target = encodings::Vec2D>>,
) -> egui::Response {
let mut value: MaybeMutRef<'_, encodings::Vec2D> = match value {
MaybeMutRef::Ref(value) => MaybeMutRef::Ref(value),
MaybeMutRef::MutRef(value) => MaybeMutRef::MutRef(value),
};
edit_or_view_vec2d_raw(ui, &mut value)
}
pub fn edit_or_view_vec3d(
_ctx: &re_viewer_context::AppContext<'_>,
ui: &mut egui::Ui,
value: &mut MaybeMutRef<'_, impl std::ops::DerefMut<Target = encodings::Vec3D>>,
) -> egui::Response {
let mut value: MaybeMutRef<'_, encodings::Vec3D> = match value {
MaybeMutRef::Ref(value) => MaybeMutRef::Ref(value),
MaybeMutRef::MutRef(value) => MaybeMutRef::MutRef(value),
};
edit_or_view_vec3d_raw(ui, &mut value, f32::MIN..=f32::MAX)
}
pub fn edit_or_view_vec3d_positive(
_ctx: &re_viewer_context::AppContext<'_>,
ui: &mut egui::Ui,
value: &mut MaybeMutRef<'_, impl std::ops::DerefMut<Target = encodings::Vec3D>>,
) -> egui::Response {
let mut value: MaybeMutRef<'_, encodings::Vec3D> = match value {
MaybeMutRef::Ref(value) => MaybeMutRef::Ref(value),
MaybeMutRef::MutRef(value) => MaybeMutRef::MutRef(value),
};
edit_or_view_vec3d_raw(ui, &mut value, 0.0..=f32::MAX)
}
fn drag<'a>(value: &'a mut f32, range: RangeInclusive<f32>, suffix: &str) -> egui::DragValue<'a> {
let speed = (value.abs() * 0.01).at_least(0.001);
egui::DragValue::new(value)
.clamp_existing_to_range(false)
.range(range)
.speed(speed)
.suffix(suffix)
}
pub fn edit_or_view_vec2d_raw(
ui: &mut egui::Ui,
value: &mut MaybeMutRef<'_, encodings::Vec2D>,
) -> egui::Response {
let x = value.0[0];
let y = value.0[1];
if let Some(value) = value.as_mut() {
let mut x_edit = x;
let mut y_edit = y;
let response_x = ui.add(drag(&mut x_edit, f32::MIN..=f32::MAX, ""));
let response_y = ui.add(drag(&mut y_edit, f32::MIN..=f32::MAX, ""));
let response = response_y | response_x;
if response.changed() {
*value = encodings::Vec2D([x_edit, y_edit]);
}
response
} else {
UiLayout::List.data_label(
ui,
SyntaxHighlightedBuilder::new()
.with_syntax("[")
.with(&x)
.with_syntax(", ")
.with(&y)
.with_syntax("]"),
)
}
}
pub fn edit_or_view_vec3d_raw(
ui: &mut egui::Ui,
value: &mut MaybeMutRef<'_, encodings::Vec3D>,
range: RangeInclusive<f32>,
) -> egui::Response {
let x = value.0[0];
let y = value.0[1];
let z = value.0[2];
if let Some(value) = value.as_mut() {
let mut x_edit = x;
let mut y_edit = y;
let mut z_edit = z;
let response_x = ui.add(drag(&mut x_edit, range.clone(), ""));
let response_y = ui.add(drag(&mut y_edit, range.clone(), ""));
let response_z = ui.add(drag(&mut z_edit, range, ""));
let response = response_y | response_x | response_z;
if response.changed() {
*value = encodings::Vec3D([x_edit, y_edit, z_edit]);
}
response
} else {
UiLayout::List.data_label(
ui,
SyntaxHighlightedBuilder::new()
.with_syntax("[")
.with(&x)
.with_syntax(", ")
.with(&y)
.with_syntax(", ")
.with(&z)
.with_syntax("]"),
)
}
}