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_f32_zero_to_max(
ctx: &re_viewer_context::AppContext<'_>,
ui: &mut egui::Ui,
value: &mut MaybeMutRef<'_, impl std::ops::DerefMut<Target = encodings::Float32>>,
) -> egui::Response {
edit_f32_zero_to_max_with_suffix(ctx, ui, value, "")
}
pub fn edit_f32_zero_to_max_with_suffix(
_ctx: &re_viewer_context::AppContext<'_>,
ui: &mut egui::Ui,
value: &mut MaybeMutRef<'_, impl std::ops::DerefMut<Target = encodings::Float32>>,
suffix: &str,
) -> egui::Response {
let mut value: MaybeMutRef<'_, f32> = match value {
MaybeMutRef::Ref(value) => MaybeMutRef::Ref(value),
MaybeMutRef::MutRef(value) => MaybeMutRef::MutRef(&mut value.deref_mut().0),
};
edit_f32_float_raw(ui, &mut value, 0.0..=f32::MAX, suffix)
}
pub fn edit_ui_points(
ctx: &re_viewer_context::AppContext<'_>,
ui: &mut egui::Ui,
value: &mut MaybeMutRef<'_, impl std::ops::DerefMut<Target = encodings::Float32>>,
) -> egui::Response {
edit_f32_zero_to_max_with_suffix(ctx, ui, value, "pt")
}
pub fn edit_f32_min_to_max_float(
_ctx: &re_viewer_context::AppContext<'_>,
ui: &mut egui::Ui,
value: &mut MaybeMutRef<'_, impl std::ops::DerefMut<Target = encodings::Float32>>,
) -> egui::Response {
let mut value: MaybeMutRef<'_, f32> = match value {
MaybeMutRef::Ref(value) => MaybeMutRef::Ref(value),
MaybeMutRef::MutRef(value) => MaybeMutRef::MutRef(&mut value.deref_mut().0),
};
edit_f32_float_raw(ui, &mut value, f32::MIN..=f32::MAX, "")
}
pub fn edit_f32_float_raw(
ui: &mut egui::Ui,
value: &mut MaybeMutRef<'_, f32>,
range: RangeInclusive<f32>,
suffix: &str,
) -> egui::Response {
let speed = (value.abs() * 0.01).at_least(0.001);
edit_f32_float_raw_with_speed_impl(ui, value, range, speed, suffix)
}
pub fn edit_f32_float_raw_with_speed_impl(
ui: &mut egui::Ui,
value: &mut MaybeMutRef<'_, f32>,
range: RangeInclusive<f32>,
speed: f32,
suffix: &str,
) -> egui::Response {
if let Some(value) = value.as_mut() {
ui.add(
egui::DragValue::new(value)
.clamp_existing_to_range(false)
.range(range)
.speed(speed)
.suffix(suffix),
)
} else {
UiLayout::List.data_label(
ui,
SyntaxHighlightedBuilder::new()
.with(&**value)
.with_primitive(suffix),
)
}
}
pub fn edit_f32_zero_to_one(
_ctx: &re_viewer_context::AppContext<'_>,
ui: &mut egui::Ui,
value: &mut MaybeMutRef<'_, impl std::ops::DerefMut<Target = encodings::Float32>>,
) -> egui::Response {
let mut value: MaybeMutRef<'_, f32> = match value {
MaybeMutRef::Ref(value) => MaybeMutRef::Ref(value),
MaybeMutRef::MutRef(value) => MaybeMutRef::MutRef(&mut value.deref_mut().0),
};
edit_f32_zero_to_one_raw(ui, &mut value)
}
fn edit_f32_zero_to_one_raw(ui: &mut egui::Ui, value: &mut MaybeMutRef<'_, f32>) -> egui::Response {
if let Some(value) = value.as_mut() {
ui.add(
egui::DragValue::new(value)
.clamp_existing_to_range(false)
.range(0.0..=1.0)
.speed(0.005)
.fixed_decimals(2),
)
} else {
UiLayout::List.data_label(ui, **value)
}
}
pub fn edit_f64_zero_to_max(
_ctx: &re_viewer_context::AppContext<'_>,
ui: &mut egui::Ui,
value: &mut MaybeMutRef<'_, impl std::ops::DerefMut<Target = encodings::Float64>>,
) -> egui::Response {
let mut value: MaybeMutRef<'_, f64> = match value {
MaybeMutRef::Ref(value) => MaybeMutRef::Ref(value),
MaybeMutRef::MutRef(value) => MaybeMutRef::MutRef(&mut value.deref_mut().0),
};
edit_f64_float_raw_impl(ui, &mut value, 0.0..=f64::MAX)
}
pub fn edit_f64_min_to_max_float(
_ctx: &re_viewer_context::AppContext<'_>,
ui: &mut egui::Ui,
value: &mut MaybeMutRef<'_, impl std::ops::DerefMut<Target = encodings::Float64>>,
) -> egui::Response {
let mut value: MaybeMutRef<'_, f64> = match value {
MaybeMutRef::Ref(value) => MaybeMutRef::Ref(value),
MaybeMutRef::MutRef(value) => MaybeMutRef::MutRef(&mut value.deref_mut().0),
};
edit_f64_float_raw_impl(ui, &mut value, f64::MIN..=f64::MAX)
}
pub fn edit_f64_float_raw_impl(
ui: &mut egui::Ui,
value: &mut MaybeMutRef<'_, f64>,
range: RangeInclusive<f64>,
) -> egui::Response {
let speed = (value.abs() * 0.01).at_least(0.001);
edit_f64_float_raw_with_speed_impl(ui, value, range, speed)
}
pub fn edit_f64_float_raw_with_speed_impl(
ui: &mut egui::Ui,
value: &mut MaybeMutRef<'_, f64>,
range: RangeInclusive<f64>,
speed: f64,
) -> egui::Response {
if let Some(value) = value.as_mut() {
ui.add(
egui::DragValue::new(value)
.clamp_existing_to_range(false)
.range(range)
.speed(speed),
)
} else {
UiLayout::List.data_label(ui, **value)
}
}