diff options
Diffstat (limited to '')
| -rw-r--r-- | native/src/widget.rs | 3 | ||||
| -rw-r--r-- | native/src/widget/empty.rs | 103 | 
2 files changed, 106 insertions, 0 deletions
| diff --git a/native/src/widget.rs b/native/src/widget.rs index 26889280..b73f229e 100644 --- a/native/src/widget.rs +++ b/native/src/widget.rs @@ -24,6 +24,7 @@ pub mod button;  pub mod checkbox;  pub mod column;  pub mod container; +pub mod empty;  pub mod image;  pub mod radio;  pub mod row; @@ -42,6 +43,8 @@ pub use column::Column;  #[doc(no_inline)]  pub use container::Container;  #[doc(no_inline)] +pub use empty::Empty; +#[doc(no_inline)]  pub use image::Image;  #[doc(no_inline)]  pub use radio::Radio; diff --git a/native/src/widget/empty.rs b/native/src/widget/empty.rs new file mode 100644 index 00000000..f670048f --- /dev/null +++ b/native/src/widget/empty.rs @@ -0,0 +1,103 @@ +//! Distribute content vertically. +use std::hash::Hash; + +use crate::{ +    layout, Element, Hasher, Layout, Length, Point, Rectangle, Size, Widget, +}; + +/// An amount of empty space. +/// +/// It can be useful if you want to fill some space with nothing. +/// +/// [`Empty`]: struct.Empty.html +#[derive(Debug)] +pub struct Empty { +    width: Length, +    height: Length, +} + +impl Empty { +    /// Creates an amount of [`Empty`] space. +    /// +    /// [`Empty`]: struct.Empty.html +    pub fn new() -> Self { +        Empty { +            width: Length::Shrink, +            height: Length::Shrink, +        } +    } + +    /// Sets the width of the [`Empty`] space. +    /// +    /// [`Empty`]: struct..html +    pub fn width(mut self, width: Length) -> Self { +        self.width = width; +        self +    } + +    /// Sets the height of the [`Empty`] space. +    /// +    /// [`Empty`]: struct.Column.html +    pub fn height(mut self, height: Length) -> Self { +        self.height = height; +        self +    } +} + +impl<'a, Message, Renderer> Widget<Message, Renderer> for Empty +where +    Renderer: self::Renderer, +{ +    fn width(&self) -> Length { +        self.width +    } + +    fn height(&self) -> Length { +        self.height +    } + +    fn layout( +        &self, +        _renderer: &Renderer, +        limits: &layout::Limits, +    ) -> layout::Node { +        let limits = limits.width(self.width).height(self.height); + +        layout::Node::new(limits.resolve(Size::ZERO)) +    } + +    fn draw( +        &self, +        renderer: &mut Renderer, +        layout: Layout<'_>, +        _cursor_position: Point, +    ) -> Renderer::Output { +        renderer.draw(layout.bounds()) +    } + +    fn hash_layout(&self, state: &mut Hasher) { +        std::any::TypeId::of::<Empty>().hash(state); +        self.width.hash(state); +        self.height.hash(state); +    } +} + +/// The renderer of an amount of [`Empty`] space. +/// +/// [`Empty`]: struct.Empty.html +pub trait Renderer: crate::Renderer { +    /// Draws an amount of [`Empty`] space. +    /// +    /// You should most likely return an empty primitive here. +    fn draw(&mut self, bounds: Rectangle) -> Self::Output; +} + +impl<'a, Message, Renderer> From<Empty> for Element<'a, Message, Renderer> +where +    Renderer: self::Renderer, +    Message: 'static, +{ +    fn from(empty: Empty) -> Element<'a, Message, Renderer> { +        Element::new(empty) +    } +} | 
