pub struct ComponentUiRegistry {
    fallback_ui: Box<dyn Fn(&ViewerContext<'_>, &mut Ui, UiLayout, &LatestAtQuery, &EntityDb, &EntityPath, Option<RowId>, &dyn Array) + Send + Sync>,
    legacy_display_component_uis: BTreeMap<ComponentName, Box<dyn Fn(&ViewerContext<'_>, &mut Ui, UiLayout, &LatestAtQuery, &EntityDb, &EntityPath, Option<RowId>, &dyn Array) + Send + Sync>>,
    component_singleline_edit_or_view: BTreeMap<ComponentName, Box<dyn Fn(&ViewerContext<'_>, &mut Ui, &dyn Array, EditOrView) -> Option<Box<dyn Array>> + Send + Sync>>,
    component_multiline_edit_or_view: BTreeMap<ComponentName, Box<dyn Fn(&ViewerContext<'_>, &mut Ui, &dyn Array, EditOrView) -> Option<Box<dyn Array>> + Send + Sync>>,
}
Expand description

How to display components in a Ui.

Fields§

§fallback_ui: Box<dyn Fn(&ViewerContext<'_>, &mut Ui, UiLayout, &LatestAtQuery, &EntityDb, &EntityPath, Option<RowId>, &dyn Array) + Send + Sync>

Ui method to use if there was no specific one registered for a component.

§legacy_display_component_uis: BTreeMap<ComponentName, Box<dyn Fn(&ViewerContext<'_>, &mut Ui, UiLayout, &LatestAtQuery, &EntityDb, &EntityPath, Option<RowId>, &dyn Array) + Send + Sync>>

Older component uis - TODO(#6661): we’re in the process of removing these.

The main issue with these is that they take a lot of parameters: Not only does it make them more verbose to implement, it also makes them on overly flexible (they know a lot about the context of a component) on one hand and too inflexible on the other - these additional parameters are not always be meaningful in all contexts. -> They are unsuitable for interacting with blueprint overrides & defaults, as there are several entity paths associated with single component (the blueprint entity path where the component is stored and the entity path in the store that they apply to).

Other issues:

  • duality of edit & view: In this old system we didn’t take into account that most types should also be editable in the UI. This makes implementations of view & edit overly asymmetric when instead they are often rather similar.
  • unawareness of ListItem context: We often want to display components as list items and in the older callbacks we don’t know whether we’re in a list item or not.
§component_singleline_edit_or_view: BTreeMap<ComponentName, Box<dyn Fn(&ViewerContext<'_>, &mut Ui, &dyn Array, EditOrView) -> Option<Box<dyn Array>> + Send + Sync>>

Implements viewing and probably editing

§component_multiline_edit_or_view: BTreeMap<ComponentName, Box<dyn Fn(&ViewerContext<'_>, &mut Ui, &dyn Array, EditOrView) -> Option<Box<dyn Array>> + Send + Sync>>

Implements viewing and probably editing

Implementations§

source§

impl ComponentUiRegistry

source

pub fn new( fallback_ui: Box<dyn Fn(&ViewerContext<'_>, &mut Ui, UiLayout, &LatestAtQuery, &EntityDb, &EntityPath, Option<RowId>, &dyn Array) + Send + Sync> ) -> Self

source

pub fn add_legacy_display_ui( &mut self, name: ComponentName, callback: Box<dyn Fn(&ViewerContext<'_>, &mut Ui, UiLayout, &LatestAtQuery, &EntityDb, &EntityPath, Option<RowId>, &dyn Array) + Send + Sync> )

Registers how to show a given component in the UI.

If the component has already a display UI registered, the new callback replaces the old one.

source

pub fn add_singleline_edit_or_view<C: Component>( &mut self, callback: impl Fn(&ViewerContext<'_>, &mut Ui, &mut MaybeMutRef<'_, C>) -> Response + Send + Sync + 'static )

Registers how to view, and maybe edit, a given component in the UI in a single list item line.

If the component already has a singleline editor registered, the new callback replaces the old one.

Typed editors do not handle absence of a value as well as lists of values and will be skipped in these cases. (This means that there must always be at least a fallback value available.)

The value is only updated if the editor callback returns a egui::Response::changed. On the flip side, this means that even if the data has not changed it may be written back to the store. This can be relevant for transitioning from a fallback or default value to a custom value even if they are equal.

Design principles for writing editors:

  • This is the value column function for a re_ui::list_item::PropertyContent, behave accordingly!
  • Don’t show a tooltip, this is solved at a higher level.
  • Try not to assume context of the component beyond its inherent semantics (e.g. if you get a Color you can’t assume whether it’s a background color or a point color)
  • The returned [egui::Response] should be for the widget that has the tooltip, not any pop-up content.
    • Make sure that changes are propagated via [egui::Response::mark_changed] if necessary.
source

pub fn add_multiline_edit_or_view<C: Component>( &mut self, callback: impl Fn(&ViewerContext<'_>, &mut Ui, &mut MaybeMutRef<'_, C>) -> Response + Send + Sync + 'static )

Registers how to view, and maybe edit, a given component in the UI with multiple list items.

If the component already has a singleline editor registered, the new callback replaces the old one.

Typed editors do not handle absence of a value as well as lists of values and will be skipped in these cases. (This means that there must always be at least a fallback value available.)

The value is only updated if the editor callback returns a egui::Response::changed. On the flip side, this means that even if the data has not changed it may be written back to the store. This can be relevant for transitioning from a fallback or default value to a custom value even if they are equal.

Design principles for writing editors:

  • This is the content function for hierarchical re_ui::list_item::ListItem, behave accordingly!
  • Try not to assume context of the component beyond its inherent semantics (e.g. if you get a Color you can’t assume whether it’s a background color or a point color)
  • The returned [egui::Response] should be for the widget that has the tooltip, not any pop-up content.
    • Make sure that changes are propagated via [egui::Response::mark_changed] if necessary.
source

fn add_editor_ui<C: Component>( &mut self, multiline: bool, callback: impl Fn(&ViewerContext<'_>, &mut Ui, &mut MaybeMutRef<'_, C>) -> Response + Send + Sync + 'static )

source

pub fn registered_ui_types(&self, name: ComponentName) -> ComponentUiTypes

Queries which UI types are registered for a component.

Note that there’s always a fallback display UI.

source

pub fn ui( &self, ctx: &ViewerContext<'_>, ui: &mut Ui, ui_layout: UiLayout, query: &LatestAtQuery, db: &EntityDb, entity_path: &EntityPath, component_name: ComponentName, unit: &UnitChunkShared, instance: &Instance )

Show a UI for a component instance.

Has a fallback to show an info text if the instance is not specific, but in these cases LatestAtComponentResults::data_ui should be used instead!

source

pub fn ui_raw( &self, ctx: &ViewerContext<'_>, ui: &mut Ui, ui_layout: UiLayout, query: &LatestAtQuery, db: &EntityDb, entity_path: &EntityPath, component_name: ComponentName, row_id: Option<RowId>, component_raw: &dyn Array )

Show a UI for a single raw component.

source

pub fn multiline_edit_ui( &self, ctx: &QueryContext<'_>, ui: &mut Ui, origin_db: &EntityDb, blueprint_write_path: &EntityPath, component_name: ComponentName, row_id: Option<RowId>, component_array: Option<&dyn ArrowArray>, fallback_provider: &dyn ComponentFallbackProvider )

Show a multi-line editor for this instance of this component.

Changes will be written to the blueprint store at the given override path. Any change is expected to be effective next frame and passed in via the component_query_result parameter. (Otherwise, this method is agnostic to where the component data is stored.)

source

pub fn singleline_edit_ui( &self, ctx: &QueryContext<'_>, ui: &mut Ui, origin_db: &EntityDb, blueprint_write_path: &EntityPath, component_name: ComponentName, row_id: Option<RowId>, component_query_result: Option<&dyn ArrowArray>, fallback_provider: &dyn ComponentFallbackProvider )

Show a single-line editor for this instance of this component.

Changes will be written to the blueprint store at the given override path. Any change is expected to be effective next frame and passed in via the component_query_result parameter. (Otherwise, this method is agnostic to where the component data is stored.)

source

fn edit_ui( &self, ctx: &QueryContext<'_>, ui: &mut Ui, origin_db: &EntityDb, blueprint_write_path: &EntityPath, component_name: ComponentName, row_id: Option<RowId>, component_array: Option<&dyn ArrowArray>, fallback_provider: &dyn ComponentFallbackProvider, allow_multiline: bool )

source

pub fn edit_ui_raw( &self, ctx: &QueryContext<'_>, ui: &mut Ui, origin_db: &EntityDb, blueprint_write_path: &EntityPath, component_name: ComponentName, row_id: Option<RowId>, component_raw: &dyn Array, allow_multiline: bool )

source

pub fn try_show_edit_ui( &self, ctx: &ViewerContext<'_>, ui: &mut Ui, raw_current_value: &dyn Array, blueprint_write_path: &EntityPath, component_name: ComponentName, allow_multiline: bool ) -> bool

Tries to show a UI for editing a component.

Returns true if the passed component is a single value and has a registered editor for multiline or singleline editing respectively.

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Az for T

source§

fn az<Dst>(self) -> Dst
where T: Cast<Dst>,

Casts the value.
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<Src, Dst> CastFrom<Src> for Dst
where Src: Cast<Dst>,

source§

fn cast_from(src: Src) -> Dst

Casts the value.
source§

impl<T> CheckedAs for T

source§

fn checked_as<Dst>(self) -> Option<Dst>
where T: CheckedCast<Dst>,

Casts the value.
source§

impl<Src, Dst> CheckedCastFrom<Src> for Dst
where Src: CheckedCast<Dst>,

source§

fn checked_cast_from(src: Src) -> Option<Dst>

Casts the value.
§

impl<T> Downcast<T> for T

§

fn downcast(&self) -> &T

§

impl<T> Downcast for T
where T: Any,

§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.
§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Convert Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Sync + Send>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T> IntoEither for T

source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
source§

impl<T> IntoRequest<T> for T

source§

fn into_request(self) -> Request<T>

Wrap the input message T in a tonic::Request
source§

impl<Src, Dst> LosslessTryInto<Dst> for Src
where Dst: LosslessTryFrom<Src>,

source§

fn lossless_try_into(self) -> Option<Dst>

Performs the conversion.
source§

impl<Src, Dst> LossyInto<Dst> for Src
where Dst: LossyFrom<Src>,

source§

fn lossy_into(self) -> Dst

Performs the conversion.
source§

impl<T> OverflowingAs for T

source§

fn overflowing_as<Dst>(self) -> (Dst, bool)
where T: OverflowingCast<Dst>,

Casts the value.
source§

impl<Src, Dst> OverflowingCastFrom<Src> for Dst
where Src: OverflowingCast<Dst>,

source§

fn overflowing_cast_from(src: Src) -> (Dst, bool)

Casts the value.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> SaturatingAs for T

source§

fn saturating_as<Dst>(self) -> Dst
where T: SaturatingCast<Dst>,

Casts the value.
source§

impl<Src, Dst> SaturatingCastFrom<Src> for Dst
where Src: SaturatingCast<Dst>,

source§

fn saturating_cast_from(src: Src) -> Dst

Casts the value.
§

impl<T> To for T
where T: ?Sized,

§

fn to<T>(self) -> T
where Self: Into<T>,

Converts to T by calling Into<T>::into.
§

fn try_to<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Tries to convert to T by calling TryInto<T>::try_into.
source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
source§

impl<T> UnwrappedAs for T

source§

fn unwrapped_as<Dst>(self) -> Dst
where T: UnwrappedCast<Dst>,

Casts the value.
source§

impl<Src, Dst> UnwrappedCastFrom<Src> for Dst
where Src: UnwrappedCast<Dst>,

source§

fn unwrapped_cast_from(src: Src) -> Dst

Casts the value.
§

impl<T> Upcast<T> for T

§

fn upcast(&self) -> Option<&T>

§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more
source§

impl<T> WrappingAs for T

source§

fn wrapping_as<Dst>(self) -> Dst
where T: WrappingCast<Dst>,

Casts the value.
source§

impl<Src, Dst> WrappingCastFrom<Src> for Dst
where Src: WrappingCast<Dst>,

source§

fn wrapping_cast_from(src: Src) -> Dst

Casts the value.
§

impl<T> Ungil for T
where T: Send,

§

impl<T> WasmNotSend for T
where T: Send,

§

impl<T> WasmNotSendSync for T
where T: WasmNotSend + WasmNotSync,

§

impl<T> WasmNotSync for T
where T: Sync,