pub struct Overlay { /* private fields */ }Expand description
A portal layer: its content is laid out out-of-flow, filling the viewport, and hoisted to the top at
compose time — drawn above everything and free of any ancestor clip/transform. A base primitive:
unstyled; wrap content in a box for a scrim/panel, and position it with normal flex (align/justify).
The content is a separate layout node attached to the layout root (the overlay host), not to the
widget’s DOM parent — so a portal declared deep in the tree (e.g. inside a reactive if) still covers
the whole window instead of collapsing to its parent’s box. The widget hands its DOM parent only a
zero-size placeholder, so it never affects sibling layout. If no host has been laid out yet (a portal
present at the very first frame), it falls back to laying the content out in place.
Positioned pointer events reach the content with priority via a thread-local overlay registry (see
ui_tree::overlay_dispatch): a click on the overlay is routed here before the main tree walk and does
not fall through to the content behind it, so a scrim that fills the viewport reads as a modal.
Variants (all portal the same way, they differ in how they route clicks and where the content sits):
Overlay::new— modal: blocks every click inside its content rect (a full-viewport scrim).Overlay::anchored_click_through— positions the content next to a trigger widget (dropdowns, menus, tooltips) and takes no pointer, so clicks anywhere fall through to the tree behind.
Implementations§
Source§impl Overlay
impl Overlay
Sourcepub fn new(
layout_style: LayoutStyle,
children: Vec<Box<dyn LayoutItem>>,
) -> Result<Self, LayoutError>
pub fn new( layout_style: LayoutStyle, children: Vec<Box<dyn LayoutItem>>, ) -> Result<Self, LayoutError>
A modal portal: the content fills the viewport and blocks every click behind it.
Sourcepub fn toggleable(
layout_style: LayoutStyle,
children: Vec<Box<dyn LayoutItem>>,
visible: impl Fn() -> bool + 'static,
) -> Result<Self, LayoutError>
pub fn toggleable( layout_style: LayoutStyle, children: Vec<Box<dyn LayoutItem>>, visible: impl Fn() -> bool + 'static, ) -> Result<Self, LayoutError>
A modal portal that is kept mounted and shown/hidden by visible (read each frame). Unlike disposing
and rebuilding the overlay on every open, this preserves its content across close/reopen — needed for a
dialog whose body arrives as a pre-built slot (which cannot be rebuilt once consumed). Hidden, it draws
nothing and blocks nothing.
Sourcepub fn anchored_click_through(
layout_style: LayoutStyle,
children: Vec<Box<dyn LayoutItem>>,
trigger: RwSignal<Rect>,
placement: Placement,
) -> Result<Self, LayoutError>
pub fn anchored_click_through( layout_style: LayoutStyle, children: Vec<Box<dyn LayoutItem>>, trigger: RwSignal<Rect>, placement: Placement, ) -> Result<Self, LayoutError>
A portal whose content is positioned next to trigger (a dropdown/menu/tooltip popping up by its
button) and takes no pointer: a tooltip bubble, a hint, anything that appears because the pointer is
near it and would be dismissed by touching it. The content sizes to its intrinsic panel and is
translated to the trigger’s rect per placement.
Source§impl Overlay
impl Overlay
Sourcepub fn content_node(&self) -> NodeId
pub fn content_node(&self) -> NodeId
The node its content actually hangs from, which is the portaled one when it has a host and the in-tree
node before that. What a caller asks for to reason about the content by ancestry — autofocusing what is
inside it, say — since layout_node is a 0×0 placeholder once portaled.
Trait Implementations§
Source§impl Component for Overlay
impl Component for Overlay
fn view(&self) -> RenderNode
fn on_event(&mut self, event: &Event) -> EventResult
Source§fn debug_name(&self) -> &'static str
fn debug_name(&self) -> &'static str
Source§impl LayoutItem for Overlay
impl LayoutItem for Overlay
Source§fn pointer_opaque(&self) -> bool
fn pointer_opaque(&self) -> bool
An overlay is reached through the registry, before the tree walk, so its in-tree node must not hit-test at all. Normally it is a 0×0 placeholder and the question never comes up; on the first frame, before a host exists, the content is laid out in place and would otherwise cover its own siblings.