re_component_ui 0.37.0

Provides ui editors for Rerun component data for registration with the Rerun Viewer component ui registry.
Documentation
use egui::NumExt as _;
use re_sdk_types::encodings::Range1D;
use re_ui::syntax_highlighting::SyntaxHighlightedBuilder;
use re_viewer_context::{MaybeMutRef, UiLayout};

pub fn edit_view_range1d(
    _ctx: &re_viewer_context::AppContext<'_>,
    ui: &mut egui::Ui,
    value: &mut MaybeMutRef<'_, impl std::ops::DerefMut<Target = Range1D>>,
) -> egui::Response {
    let mut value: MaybeMutRef<'_, Range1D> = match value {
        MaybeMutRef::Ref(value) => MaybeMutRef::Ref(value),
        MaybeMutRef::MutRef(value) => MaybeMutRef::MutRef(value),
    };
    edit_view_range1d_impl(ui, &mut value)
}

fn edit_view_range1d_impl(
    ui: &mut egui::Ui,
    value: &mut MaybeMutRef<'_, Range1D>,
) -> egui::Response {
    if let Some(value) = value.as_mut() {
        let [min, max] = &mut value.0;
        let range = (*max - *min).abs();
        let speed = (range * 0.01).at_least(0.001);

        let response_min = ui.add(
            egui::DragValue::new(min)
                .clamp_existing_to_range(false)
                .range(f64::NEG_INFINITY..=*max)
                .speed(speed),
        );
        ui.label("-");
        let response_max = ui.add(
            egui::DragValue::new(max)
                .clamp_existing_to_range(false)
                .range(*min..=f64::INFINITY)
                .speed(speed),
        );

        response_min | response_max
    } else {
        let [min, max] = value.0;
        UiLayout::List.data_label(
            ui,
            SyntaxHighlightedBuilder::new()
                .with(&min)
                .with_syntax(" - ")
                .with(&max),
        )
    }
}