diff options
| -rw-r--r-- | examples/tour.rs | 4 | ||||
| -rw-r--r-- | native/src/mouse_cursor.rs | 6 | ||||
| -rw-r--r-- | native/src/widget.rs | 3 | ||||
| -rw-r--r-- | native/src/widget/space.rs | 104 | ||||
| -rw-r--r-- | src/native.rs | 2 | ||||
| -rw-r--r-- | web/src/widget.rs | 2 | ||||
| -rw-r--r-- | web/src/widget/space.rs | 69 | ||||
| -rw-r--r-- | wgpu/src/primitive.rs | 6 | ||||
| -rw-r--r-- | wgpu/src/renderer/widget.rs | 1 | ||||
| -rw-r--r-- | wgpu/src/renderer/widget/space.rs | 8 | 
10 files changed, 202 insertions, 3 deletions
| diff --git a/examples/tour.rs b/examples/tour.rs index da05b396..91b75296 100644 --- a/examples/tour.rs +++ b/examples/tour.rs @@ -1,7 +1,7 @@  use iced::{      button, scrollable, slider, text_input, Button, Checkbox, Color, Column,      Container, Element, HorizontalAlignment, Image, Length, Radio, Row, -    Sandbox, Scrollable, Settings, Slider, Text, TextInput, +    Sandbox, Scrollable, Settings, Slider, Space, Text, TextInput,  };  pub fn main() { @@ -67,7 +67,7 @@ impl Sandbox for Tour {              );          } -        controls = controls.push(Column::new()); +        controls = controls.push(Space::with_width(Length::Fill));          if steps.can_continue() {              controls = controls.push( diff --git a/native/src/mouse_cursor.rs b/native/src/mouse_cursor.rs index a4740a27..c7297e0e 100644 --- a/native/src/mouse_cursor.rs +++ b/native/src/mouse_cursor.rs @@ -22,3 +22,9 @@ pub enum MouseCursor {      /// The cursor is over a text widget.      Text,  } + +impl Default for MouseCursor { +    fn default() -> MouseCursor { +        MouseCursor::OutOfBounds +    } +} diff --git a/native/src/widget.rs b/native/src/widget.rs index 26889280..dcc99645 100644 --- a/native/src/widget.rs +++ b/native/src/widget.rs @@ -29,6 +29,7 @@ pub mod radio;  pub mod row;  pub mod scrollable;  pub mod slider; +pub mod space;  pub mod svg;  pub mod text;  pub mod text_input; @@ -52,6 +53,8 @@ pub use scrollable::Scrollable;  #[doc(no_inline)]  pub use slider::Slider;  #[doc(no_inline)] +pub use space::Space; +#[doc(no_inline)]  pub use svg::Svg;  #[doc(no_inline)]  pub use text::Text; diff --git a/native/src/widget/space.rs b/native/src/widget/space.rs new file mode 100644 index 00000000..2029c52f --- /dev/null +++ b/native/src/widget/space.rs @@ -0,0 +1,104 @@ +//! 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. +#[derive(Debug)] +pub struct Space { +    width: Length, +    height: Length, +} + +impl Space { +    /// Creates an amount of empty [`Space`] with the given width and height. +    /// +    /// [`Space`]: struct.Space.html +    pub fn new(width: Length, height: Length) -> Self { +        Space { width, height } +    } + +    /// Creates an amount of horizontal [`Space`]. +    /// +    /// [`Space`]: struct.Space.html +    pub fn with_width(width: Length) -> Self { +        Space { +            width, +            height: Length::Shrink, +        } +    } + +    /// Creates an amount of vertical [`Space`]. +    /// +    /// [`Space`]: struct.Space.html +    pub fn with_height(height: Length) -> Self { +        Space { +            width: Length::Shrink, +            height, +        } +    } +} + +impl<'a, Message, Renderer> Widget<Message, Renderer> for Space +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::<Space>().hash(state); +        self.width.hash(state); +        self.height.hash(state); +    } +} + +/// The renderer of an amount of [`Space`]. +/// +/// [`Space`]: struct.Space.html +pub trait Renderer: crate::Renderer { +    /// Draws an amount of empty [`Space`]. +    /// +    /// You should most likely return an empty primitive here. +    /// +    /// [`Space`]: struct.Space.html +    fn draw(&mut self, bounds: Rectangle) -> Self::Output; +} + +impl<'a, Message, Renderer> From<Space> for Element<'a, Message, Renderer> +where +    Renderer: self::Renderer, +    Message: 'static, +{ +    fn from(space: Space) -> Element<'a, Message, Renderer> { +        Element::new(space) +    } +} diff --git a/src/native.rs b/src/native.rs index f06f1c99..cf48a391 100644 --- a/src/native.rs +++ b/src/native.rs @@ -1,6 +1,6 @@  pub use iced_winit::{      Align, Background, Color, Command, Font, HorizontalAlignment, Length, -    Subscription, VerticalAlignment, +    Space, Subscription, VerticalAlignment,  };  pub mod widget { diff --git a/web/src/widget.rs b/web/src/widget.rs index b0e16692..0ac536bd 100644 --- a/web/src/widget.rs +++ b/web/src/widget.rs @@ -28,6 +28,7 @@ mod container;  mod image;  mod radio;  mod row; +mod space;  mod text;  #[doc(no_inline)] @@ -47,6 +48,7 @@ pub use container::Container;  pub use image::Image;  pub use radio::Radio;  pub use row::Row; +pub use space::Space;  /// A component that displays information and allows interaction.  /// diff --git a/web/src/widget/space.rs b/web/src/widget/space.rs new file mode 100644 index 00000000..baf4c80b --- /dev/null +++ b/web/src/widget/space.rs @@ -0,0 +1,69 @@ +use crate::{style, Bus, Element, Length, Widget}; +use dodrio::bumpalo; + +/// An amount of empty space. +/// +/// It can be useful if you want to fill some space with nothing. +#[derive(Debug)] +pub struct Space { +    width: Length, +    height: Length, +} + +impl Space { +    /// Creates an amount of empty [`Space`] with the given width and height. +    /// +    /// [`Space`]: struct.Space.html +    pub fn new(width: Length, height: Length) -> Self { +        Space { width, height } +    } + +    /// Creates an amount of horizontal [`Space`]. +    /// +    /// [`Space`]: struct.Space.html +    pub fn with_width(width: Length) -> Self { +        Space { +            width, +            height: Length::Shrink, +        } +    } + +    /// Creates an amount of vertical [`Space`]. +    /// +    /// [`Space`]: struct.Space.html +    pub fn with_height(height: Length) -> Self { +        Space { +            width: Length::Shrink, +            height, +        } +    } +} + +impl<'a, Message> Widget<Message> for Space { +    fn node<'b>( +        &self, +        bump: &'b bumpalo::Bump, +        _publish: &Bus<Message>, +        _style_sheet: &mut style::Sheet<'b>, +    ) -> dodrio::Node<'b> { +        use dodrio::builder::*; + +        let width = style::length(self.width); +        let height = style::length(self.height); + +        let style = bumpalo::format!( +            in bump, +            "width: {}; height: {};", +            width, +            height +        ); + +        div(bump).attr("style", style.into_bump_str()).finish() +    } +} + +impl<'a, Message> From<Space> for Element<'a, Message> { +    fn from(space: Space) -> Element<'a, Message> { +        Element::new(space) +    } +} diff --git a/wgpu/src/primitive.rs b/wgpu/src/primitive.rs index 958cc17f..6c61f800 100644 --- a/wgpu/src/primitive.rs +++ b/wgpu/src/primitive.rs @@ -64,3 +64,9 @@ pub enum Primitive {          content: Box<Primitive>,      },  } + +impl Default for Primitive { +    fn default() -> Primitive { +        Primitive::None +    } +} diff --git a/wgpu/src/renderer/widget.rs b/wgpu/src/renderer/widget.rs index 91f107e8..f82631d5 100644 --- a/wgpu/src/renderer/widget.rs +++ b/wgpu/src/renderer/widget.rs @@ -6,6 +6,7 @@ mod radio;  mod row;  mod scrollable;  mod slider; +mod space;  mod text;  mod text_input; diff --git a/wgpu/src/renderer/widget/space.rs b/wgpu/src/renderer/widget/space.rs new file mode 100644 index 00000000..28e05437 --- /dev/null +++ b/wgpu/src/renderer/widget/space.rs @@ -0,0 +1,8 @@ +use crate::{Primitive, Renderer}; +use iced_native::{space, MouseCursor, Rectangle}; + +impl space::Renderer for Renderer { +    fn draw(&mut self, _bounds: Rectangle) -> Self::Output { +        (Primitive::None, MouseCursor::OutOfBounds) +    } +} | 
