re_component_ui 0.37.0

Provides ui editors for Rerun component data for registration with the Rerun Viewer component ui registry.
Documentation
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)
}

// TODO(#6743): Since overrides are not yet taken into account, editing this value has no effect.
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("]"),
        )
    }
}

// TODO(#6743): Since overrides are not yet taken into account, editing this value has no effect.
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("]"),
        )
    }
}