pub struct ComponentWidget<C: Component> { /* private fields */ }Expand description
The retained widget behind a ComponentView.
Owns the component’s local State, the previous child AnyView (diffed
each rebuild), the child element wrapped in a ChildPod, the component’s
reactive Owner, and a component-local BuildCtx id counter.
The child element is stored double-boxed inside the pod (ChildPod::new( Box::new(element)), where element: Box<dyn Widget> is the AnyView’s
element): the extra box lets a rebuild recover the child as
&mut Box<dyn Widget>, the exact type AnyView::rebuild needs to swap the
widget on a concrete-type change. This mirrors frust-widgets’
build_child/rebuild_child pod convention.
§Under the hotpatch feature
The struct is repr(C), starts with the [SeamWitness] the creating image
wrote, and holds the state boxed, so every field sits at the same offset in
every image whatever C::State looks like there. rebuild, teardown and
Drop check the witness first; on a mismatch nothing C-generic touches the
state, and Drop leaks the state box (mem::forget) rather than let another
image’s layout drop or free it, while still disposing the owner.
Trait Implementations§
Source§impl<C: Component> Drop for ComponentWidget<C>
impl<C: Component> Drop for ComponentWidget<C>
Source§impl<C: Component> SliverWidget for ComponentWidget<C>
impl<C: Component> SliverWidget for ComponentWidget<C>
Source§fn layout_sliver(
&mut self,
ctx: &mut LayoutCtx<'_>,
sc: &SliverConstraints,
) -> SliverGeometry
fn layout_sliver( &mut self, ctx: &mut LayoutCtx<'_>, sc: &SliverConstraints, ) -> SliverGeometry
Pass-through, like Widget::layout: the child sits at the component’s
origin and receives sc unchanged, under the child pod’s layout skip.
Source§impl<C: Component> Widget for ComponentWidget<C>
impl<C: Component> Widget for ComponentWidget<C>
Source§fn as_sliver(&mut self) -> Option<&mut dyn SliverWidget>
fn as_sliver(&mut self) -> Option<&mut dyn SliverWidget>
A component is a sliver exactly when its child is: the boundary is as transparent to the sliver protocol as it is to box layout. The sliver face is the component itself rather than the child widget, so the layout runs through the child pod and leaves it sized and recorded for this component’s own paint, hit test and semantics.
Source§fn layout(&mut self, ctx: &mut LayoutCtx<'_>, bc: &BoxConstraints) -> Size
fn layout(&mut self, ctx: &mut LayoutCtx<'_>, bc: &BoxConstraints) -> Size
bc and return it. The chosen size must satisfy
bc (callers may additionally clamp via BoxConstraints::constrain). Read moreSource§fn paint(&mut self, ctx: &mut PaintCtx<'_>, scene: &mut dyn PaintScene)
fn paint(&mut self, ctx: &mut PaintCtx<'_>, scene: &mut dyn PaintScene)
scene. Read moreSource§fn semantics(&self, ctx: &mut SemanticsCtx)
fn semantics(&self, ctx: &mut SemanticsCtx)
ctx. Read moreSource§fn visit_children(&self, visitor: &mut dyn FnMut(&ChildPod))
fn visit_children(&self, visitor: &mut dyn FnMut(&ChildPod))
Source§fn event(&mut self, ctx: &mut EventCtx<'_>, event: &InputEvent) -> EventResult
fn event(&mut self, ctx: &mut EventCtx<'_>, event: &InputEvent) -> EventResult
ctx and reporting whether it was consumed. Read more