88 lines · 2.4 KB · Rust
RawDownload
use crate::{    AnyElement, App, Bounds, Element, GlobalElementId, IntoElement, LayoutId, Pixels, Window,}; /// Builds a `Deferred` element, which delays the layout and paint of its child.pub fn deferred(child: impl IntoElement) -> Deferred {    Deferred {        child: Some(child.into_any_element()),        priority: 0,    }} /// An element which delays the painting of its child until after all of/// its ancestors, while keeping its layout as part of the current element tree.pub struct Deferred {    child: Option<AnyElement>,    priority: usize,} impl Deferred {    /// Sets the `priority` value of the `deferred` element, which    /// determines the drawing order relative to other deferred elements,    /// with higher values being drawn on top.    pub fn with_priority(mut self, priority: usize) -> Self {        self.priority = priority;        self    }} impl Element for Deferred {    type RequestLayoutState = ();    type PrepaintState = ();     fn id(&self) -> Option<crate::ElementId> {        None    }     fn request_layout(        &mut self,        _id: Option<&GlobalElementId>,        window: &mut Window,        cx: &mut App,    ) -> (LayoutId, ()) {        let layout_id = self.child.as_mut().unwrap().request_layout(window, cx);        (layout_id, ())    }     fn prepaint(        &mut self,        _id: Option<&GlobalElementId>,        _bounds: Bounds<Pixels>,        _request_layout: &mut Self::RequestLayoutState,        window: &mut Window,        _cx: &mut App,    ) {        let child = self.child.take().unwrap();        let element_offset = window.element_offset();        window.defer_draw(child, element_offset, self.priority)    }     fn paint(        &mut self,        _id: Option<&GlobalElementId>,        _bounds: Bounds<Pixels>,        _request_layout: &mut Self::RequestLayoutState,        _prepaint: &mut Self::PrepaintState,        _window: &mut Window,        _cx: &mut App,    ) {    }} impl IntoElement for Deferred {    type Element = Self;     fn into_element(self) -> Self::Element {        self    }} impl Deferred {    /// Sets a priority for the element. A higher priority conceptually means painting the element    /// on top of deferred draws with a lower priority (i.e. closer to the viewer).    pub fn priority(mut self, priority: usize) -> Self {        self.priority = priority;        self    }}