diff options
author | 2019-12-30 19:20:59 +0100 | |
---|---|---|
committer | 2019-12-30 19:20:59 +0100 | |
commit | 8426bf953cb50f3b7fcb1e0ec8c2fdf22d2b01af (patch) | |
tree | 81f2ccbab0eba1fec581abc6d0ec0531fd9113f4 | |
parent | 7163e1d8b669b61d6fba6528c2a28fde3bfb72a0 (diff) | |
download | iced-8426bf953cb50f3b7fcb1e0ec8c2fdf22d2b01af.tar.gz iced-8426bf953cb50f3b7fcb1e0ec8c2fdf22d2b01af.tar.bz2 iced-8426bf953cb50f3b7fcb1e0ec8c2fdf22d2b01af.zip |
Implement `Empty` widget
It can be useful if you want to fill some space with nothing.
-rw-r--r-- | examples/tour.rs | 4 | ||||
-rw-r--r-- | native/src/widget.rs | 3 | ||||
-rw-r--r-- | native/src/widget/empty.rs | 103 | ||||
-rw-r--r-- | src/native.rs | 4 | ||||
-rw-r--r-- | web/src/widget.rs | 2 | ||||
-rw-r--r-- | web/src/widget/empty.rs | 70 | ||||
-rw-r--r-- | wgpu/src/renderer/widget.rs | 1 | ||||
-rw-r--r-- | wgpu/src/renderer/widget/empty.rs | 8 |
8 files changed, 191 insertions, 4 deletions
diff --git a/examples/tour.rs b/examples/tour.rs index da05b396..fcace9c3 100644 --- a/examples/tour.rs +++ b/examples/tour.rs @@ -1,6 +1,6 @@ use iced::{ button, scrollable, slider, text_input, Button, Checkbox, Color, Column, - Container, Element, HorizontalAlignment, Image, Length, Radio, Row, + Container, Element, Empty, HorizontalAlignment, Image, Length, Radio, Row, Sandbox, Scrollable, Settings, Slider, Text, TextInput, }; @@ -67,7 +67,7 @@ impl Sandbox for Tour { ); } - controls = controls.push(Column::new()); + controls = controls.push(Empty::new().width(Length::Fill)); if steps.can_continue() { controls = controls.push( 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) + } +} diff --git a/src/native.rs b/src/native.rs index f06f1c99..8a04b7c3 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, + Align, Background, Color, Command, Empty, Font, HorizontalAlignment, + Length, Subscription, VerticalAlignment, }; pub mod widget { diff --git a/web/src/widget.rs b/web/src/widget.rs index b0e16692..5cf0238a 100644 --- a/web/src/widget.rs +++ b/web/src/widget.rs @@ -25,6 +25,7 @@ pub mod text_input; mod checkbox; mod column; mod container; +mod empty; mod image; mod radio; mod row; @@ -44,6 +45,7 @@ pub use text_input::TextInput; pub use checkbox::Checkbox; pub use column::Column; pub use container::Container; +pub use empty::Empty; pub use image::Image; pub use radio::Radio; pub use row::Row; diff --git a/web/src/widget/empty.rs b/web/src/widget/empty.rs new file mode 100644 index 00000000..dda17efe --- /dev/null +++ b/web/src/widget/empty.rs @@ -0,0 +1,70 @@ +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. +/// +/// [`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> Widget<Message> for Empty { + 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<Empty> for Element<'a, Message> { + fn from(empty: Empty) -> Element<'a, Message> { + Element::new(empty) + } +} diff --git a/wgpu/src/renderer/widget.rs b/wgpu/src/renderer/widget.rs index 91f107e8..f2d443fb 100644 --- a/wgpu/src/renderer/widget.rs +++ b/wgpu/src/renderer/widget.rs @@ -1,6 +1,7 @@ mod button; mod checkbox; mod column; +mod empty; mod image; mod radio; mod row; diff --git a/wgpu/src/renderer/widget/empty.rs b/wgpu/src/renderer/widget/empty.rs new file mode 100644 index 00000000..26ee74b4 --- /dev/null +++ b/wgpu/src/renderer/widget/empty.rs @@ -0,0 +1,8 @@ +use crate::{Primitive, Renderer}; +use iced_native::{empty, MouseCursor, Rectangle}; + +impl empty::Renderer for Renderer { + fn draw(&mut self, _bounds: Rectangle) -> Self::Output { + (Primitive::None, MouseCursor::OutOfBounds) + } +} |