diff options
author | 2019-11-10 06:05:20 +0100 | |
---|---|---|
committer | 2019-11-11 03:08:00 +0100 | |
commit | 0240c3981b716c82ecb3364945815335b420a63e (patch) | |
tree | 441eebaa9441649a4e878bde71cdec20d4a67391 /native/src/widget | |
parent | 2303111e09d806ef2a652bddc2b73be6dccf6ae2 (diff) | |
download | iced-0240c3981b716c82ecb3364945815335b420a63e.tar.gz iced-0240c3981b716c82ecb3364945815335b420a63e.tar.bz2 iced-0240c3981b716c82ecb3364945815335b420a63e.zip |
Draft custom layout engine based on `druid`
Diffstat (limited to 'native/src/widget')
-rw-r--r-- | native/src/widget/button.rs | 16 | ||||
-rw-r--r-- | native/src/widget/checkbox.rs | 14 | ||||
-rw-r--r-- | native/src/widget/column.rs | 41 | ||||
-rw-r--r-- | native/src/widget/image.rs | 12 | ||||
-rw-r--r-- | native/src/widget/radio.rs | 20 | ||||
-rw-r--r-- | native/src/widget/row.rs | 39 | ||||
-rw-r--r-- | native/src/widget/scrollable.rs | 32 | ||||
-rw-r--r-- | native/src/widget/slider.rs | 20 | ||||
-rw-r--r-- | native/src/widget/text.rs | 18 | ||||
-rw-r--r-- | native/src/widget/text_input.rs | 33 |
10 files changed, 171 insertions, 74 deletions
diff --git a/native/src/widget/button.rs b/native/src/widget/button.rs index 882d4a6c..980c2aae 100644 --- a/native/src/widget/button.rs +++ b/native/src/widget/button.rs @@ -7,7 +7,7 @@ //! [`Class`]: enum.Class.html use crate::input::{mouse, ButtonState}; -use crate::{layout, Element, Event, Hasher, Layout, Point, Widget}; +use crate::{layout, Element, Event, Hasher, Layout, Length, Point, Widget}; use std::hash::Hash; pub use iced_core::button::State; @@ -21,14 +21,18 @@ where Renderer: self::Renderer, Message: Clone + std::fmt::Debug, { - fn layout(&self, renderer: &Renderer, limits: &layout::Limits) -> Layout { + fn layout( + &self, + renderer: &Renderer, + limits: &layout::Limits, + ) -> layout::Node { renderer.layout(&self, limits) } fn on_event( &mut self, event: Event, - layout: &Layout, + layout: Layout<'_>, cursor_position: Point, messages: &mut Vec<Message>, _renderer: &Renderer, @@ -66,7 +70,7 @@ where fn draw( &self, renderer: &mut Renderer, - layout: &Layout, + layout: Layout<'_>, cursor_position: Point, ) -> Renderer::Output { renderer.draw(&self, layout, cursor_position) @@ -95,7 +99,7 @@ pub trait Renderer: crate::Renderer + Sized { &self, button: &Button<'_, Message, Self>, limits: &layout::Limits, - ) -> Layout; + ) -> layout::Node; /// Draws a [`Button`]. /// @@ -103,7 +107,7 @@ pub trait Renderer: crate::Renderer + Sized { fn draw<Message>( &mut self, button: &Button<'_, Message, Self>, - layout: &Layout, + layout: Layout<'_>, cursor_position: Point, ) -> Self::Output; } diff --git a/native/src/widget/checkbox.rs b/native/src/widget/checkbox.rs index 12a6a728..a7040e02 100644 --- a/native/src/widget/checkbox.rs +++ b/native/src/widget/checkbox.rs @@ -10,14 +10,18 @@ impl<Message, Renderer> Widget<Message, Renderer> for Checkbox<Message> where Renderer: self::Renderer, { - fn layout(&self, renderer: &Renderer, limits: &layout::Limits) -> Layout { + fn layout( + &self, + renderer: &Renderer, + limits: &layout::Limits, + ) -> layout::Node { renderer.layout(&self, limits) } fn on_event( &mut self, event: Event, - layout: &Layout, + layout: Layout<'_>, cursor_position: Point, messages: &mut Vec<Message>, _renderer: &Renderer, @@ -40,7 +44,7 @@ where fn draw( &self, renderer: &mut Renderer, - layout: &Layout, + layout: Layout<'_>, cursor_position: Point, ) -> Renderer::Output { renderer.draw(&self, layout, cursor_position) @@ -67,7 +71,7 @@ pub trait Renderer: crate::Renderer { &self, checkbox: &Checkbox<Message>, limits: &layout::Limits, - ) -> Layout; + ) -> layout::Node; /// Draws a [`Checkbox`]. /// @@ -81,7 +85,7 @@ pub trait Renderer: crate::Renderer { fn draw<Message>( &mut self, checkbox: &Checkbox<Message>, - layout: &Layout, + layout: Layout<'_>, cursor_position: Point, ) -> Self::Output; } diff --git a/native/src/widget/column.rs b/native/src/widget/column.rs index d0446ec9..ed8a2b89 100644 --- a/native/src/widget/column.rs +++ b/native/src/widget/column.rs @@ -1,6 +1,8 @@ use std::hash::Hash; -use crate::{layout, Element, Event, Hasher, Layout, Point, Rectangle, Widget}; +use crate::{ + layout, Element, Event, Hasher, Layout, Length, Point, Size, Widget, +}; /// A container that distributes its contents vertically. pub type Column<'a, Message, Renderer> = @@ -11,20 +13,35 @@ impl<'a, Message, Renderer> Widget<Message, Renderer> where Renderer: self::Renderer, { - fn layout(&self, renderer: &Renderer, limits: &layout::Limits) -> Layout { - // TODO - Layout::new(Rectangle { - x: 0.0, - y: 0.0, - width: 0.0, - height: 0.0, - }) + fn width(&self) -> Length { + self.width + } + + fn layout( + &self, + renderer: &Renderer, + limits: &layout::Limits, + ) -> layout::Node { + let limits = limits + .max_width(self.max_width) + .max_height(self.max_height) + .width(self.width) + .height(self.height); + + layout::flex::resolve( + layout::flex::Axis::Vertical, + renderer, + &limits, + self.padding as f32, + self.spacing as f32, + &self.children, + ) } fn on_event( &mut self, event: Event, - layout: &Layout, + layout: Layout<'_>, cursor_position: Point, messages: &mut Vec<Message>, renderer: &Renderer, @@ -45,7 +62,7 @@ where fn draw( &self, renderer: &mut Renderer, - layout: &Layout, + layout: Layout<'_>, cursor_position: Point, ) -> Renderer::Output { renderer.draw(&self, layout, cursor_position) @@ -72,7 +89,7 @@ pub trait Renderer: crate::Renderer + Sized { fn draw<Message>( &mut self, row: &Column<'_, Message, Self>, - layout: &Layout, + layout: Layout<'_>, cursor_position: Point, ) -> Self::Output; } diff --git a/native/src/widget/image.rs b/native/src/widget/image.rs index b503f95c..abc45d6a 100644 --- a/native/src/widget/image.rs +++ b/native/src/widget/image.rs @@ -10,14 +10,18 @@ impl<Message, Renderer> Widget<Message, Renderer> for Image where Renderer: self::Renderer, { - fn layout(&self, renderer: &Renderer, limits: &layout::Limits) -> Layout { + fn layout( + &self, + renderer: &Renderer, + limits: &layout::Limits, + ) -> layout::Node { renderer.layout(&self, limits) } fn draw( &self, renderer: &mut Renderer, - layout: &Layout, + layout: Layout<'_>, _cursor_position: Point, ) -> Renderer::Output { renderer.draw(&self, layout) @@ -44,12 +48,12 @@ pub trait Renderer: crate::Renderer { /// /// [`Node`]: ../../struct.Node.html /// [`Image`]: struct.Image.html - fn layout(&self, image: &Image, limits: &layout::Limits) -> Layout; + fn layout(&self, image: &Image, limits: &layout::Limits) -> layout::Node; /// Draws an [`Image`]. /// /// [`Image`]: struct.Image.html - fn draw(&mut self, image: &Image, layout: &Layout) -> Self::Output; + fn draw(&mut self, image: &Image, layout: Layout<'_>) -> Self::Output; } impl<'a, Message, Renderer> From<Image> for Element<'a, Message, Renderer> diff --git a/native/src/widget/radio.rs b/native/src/widget/radio.rs index 86d507da..b68919e5 100644 --- a/native/src/widget/radio.rs +++ b/native/src/widget/radio.rs @@ -1,6 +1,6 @@ //! Create choices using radio buttons. use crate::input::{mouse, ButtonState}; -use crate::{layout, Element, Event, Hasher, Layout, Point, Widget}; +use crate::{layout, Element, Event, Hasher, Layout, Length, Point, Widget}; use std::hash::Hash; @@ -11,14 +11,22 @@ where Renderer: self::Renderer, Message: Clone + std::fmt::Debug, { - fn layout(&self, renderer: &Renderer, limits: &layout::Limits) -> Layout { + fn width(&self) -> Length { + Length::Fill + } + + fn layout( + &self, + renderer: &Renderer, + limits: &layout::Limits, + ) -> layout::Node { renderer.layout(&self, limits) } fn on_event( &mut self, event: Event, - layout: &Layout, + layout: Layout<'_>, cursor_position: Point, messages: &mut Vec<Message>, _renderer: &Renderer, @@ -39,7 +47,7 @@ where fn draw( &self, renderer: &mut Renderer, - layout: &Layout, + layout: Layout<'_>, cursor_position: Point, ) -> Renderer::Output { renderer.draw(&self, layout, cursor_position) @@ -66,7 +74,7 @@ pub trait Renderer: crate::Renderer { &self, radio: &Radio<Message>, limits: &layout::Limits, - ) -> Layout; + ) -> layout::Node; /// Draws a [`Radio`] button. /// @@ -80,7 +88,7 @@ pub trait Renderer: crate::Renderer { fn draw<Message>( &mut self, radio: &Radio<Message>, - layout: &Layout, + layout: Layout<'_>, cursor_position: Point, ) -> Self::Output; } diff --git a/native/src/widget/row.rs b/native/src/widget/row.rs index ca1cda23..7ea54a71 100644 --- a/native/src/widget/row.rs +++ b/native/src/widget/row.rs @@ -1,6 +1,6 @@ use std::hash::Hash; -use crate::{layout, Element, Event, Hasher, Layout, Point, Rectangle, Widget}; +use crate::{layout, Element, Event, Hasher, Layout, Length, Point, Widget}; /// A container that distributes its contents horizontally. pub type Row<'a, Message, Renderer> = @@ -11,20 +11,35 @@ impl<'a, Message, Renderer> Widget<Message, Renderer> where Renderer: self::Renderer, { - fn layout(&self, renderer: &Renderer, limits: &layout::Limits) -> Layout { - // TODO - Layout::new(Rectangle { - x: 0.0, - y: 0.0, - width: 0.0, - height: 0.0, - }) + fn width(&self) -> Length { + self.width + } + + fn layout( + &self, + renderer: &Renderer, + limits: &layout::Limits, + ) -> layout::Node { + let limits = limits + .max_width(self.max_width) + .max_height(self.max_height) + .width(self.width) + .height(self.height); + + layout::flex::resolve( + layout::flex::Axis::Horizontal, + renderer, + &limits, + self.padding as f32, + self.spacing as f32, + &self.children, + ) } fn on_event( &mut self, event: Event, - layout: &Layout, + layout: Layout<'_>, cursor_position: Point, messages: &mut Vec<Message>, renderer: &Renderer, @@ -45,7 +60,7 @@ where fn draw( &self, renderer: &mut Renderer, - layout: &Layout, + layout: Layout<'_>, cursor_position: Point, ) -> Renderer::Output { renderer.draw(&self, layout, cursor_position) @@ -73,7 +88,7 @@ pub trait Renderer: crate::Renderer + Sized { fn draw<Message>( &mut self, row: &Row<'_, Message, Self>, - layout: &Layout, + layout: Layout<'_>, cursor_position: Point, ) -> Self::Output; } diff --git a/native/src/widget/scrollable.rs b/native/src/widget/scrollable.rs index a5eb2f01..775c59db 100644 --- a/native/src/widget/scrollable.rs +++ b/native/src/widget/scrollable.rs @@ -1,11 +1,13 @@ use crate::{ column, input::{mouse, ButtonState}, - layout, Element, Event, Hasher, Layout, Point, Rectangle, Widget, + layout, Element, Event, Hasher, Layout, Length, Point, Rectangle, Size, + Widget, }; pub use iced_core::scrollable::State; +use std::f32; use std::hash::Hash; /// A scrollable [`Column`]. @@ -19,15 +21,31 @@ impl<'a, Message, Renderer> Widget<Message, Renderer> where Renderer: self::Renderer + column::Renderer, { - fn layout(&self, renderer: &Renderer, limits: &layout::Limits) -> Layout { - // TODO - self.content.layout(renderer, limits) + fn layout( + &self, + renderer: &Renderer, + limits: &layout::Limits, + ) -> layout::Node { + let limits = limits + .max_height(self.max_height) + .width(Length::Fill) + .height(self.height); + + let child_limits = layout::Limits::new( + Size::new(limits.min().width, 0.0), + Size::new(limits.max().width, f32::INFINITY), + ); + + let content = self.content.layout(renderer, &child_limits); + let size = limits.resolve(content.size()); + + layout::Node::with_children(size, vec![content]) } fn on_event( &mut self, event: Event, - layout: &Layout, + layout: Layout<'_>, cursor_position: Point, messages: &mut Vec<Message>, renderer: &Renderer, @@ -130,7 +148,7 @@ where fn draw( &self, renderer: &mut Renderer, - layout: &Layout, + layout: Layout<'_>, cursor_position: Point, ) -> Renderer::Output { let bounds = layout.bounds(); @@ -168,7 +186,7 @@ pub trait Renderer: crate::Renderer + Sized { &mut self, scrollable: &Scrollable<'_, Message, Self>, bounds: Rectangle, - content_layout: &Layout, + content_layout: Layout<'_>, cursor_position: Point, ) -> Self::Output; } diff --git a/native/src/widget/slider.rs b/native/src/widget/slider.rs index be4ed564..3a998c40 100644 --- a/native/src/widget/slider.rs +++ b/native/src/widget/slider.rs @@ -7,7 +7,7 @@ use std::hash::Hash; use crate::input::{mouse, ButtonState}; -use crate::{layout, Element, Event, Hasher, Layout, Point, Widget}; +use crate::{layout, Element, Event, Hasher, Layout, Length, Point, Widget}; pub use iced_core::slider::*; @@ -15,14 +15,22 @@ impl<'a, Message, Renderer> Widget<Message, Renderer> for Slider<'a, Message> where Renderer: self::Renderer, { - fn layout(&self, renderer: &Renderer, limits: &layout::Limits) -> Layout { + fn width(&self) -> Length { + self.width + } + + fn layout( + &self, + renderer: &Renderer, + limits: &layout::Limits, + ) -> layout::Node { renderer.layout(&self, limits) } fn on_event( &mut self, event: Event, - layout: &Layout, + layout: Layout<'_>, cursor_position: Point, messages: &mut Vec<Message>, _renderer: &Renderer, @@ -70,7 +78,7 @@ where fn draw( &self, renderer: &mut Renderer, - layout: &Layout, + layout: Layout<'_>, cursor_position: Point, ) -> Renderer::Output { renderer.draw(&self, layout, cursor_position) @@ -97,7 +105,7 @@ pub trait Renderer: crate::Renderer { &self, slider: &Slider<'_, Message>, limits: &layout::Limits, - ) -> Layout; + ) -> layout::Node; /// Draws a [`Slider`]. /// @@ -114,7 +122,7 @@ pub trait Renderer: crate::Renderer { fn draw<Message>( &mut self, slider: &Slider<'_, Message>, - layout: &Layout, + layout: Layout<'_>, cursor_position: Point, ) -> Self::Output; } diff --git a/native/src/widget/text.rs b/native/src/widget/text.rs index da8563a4..10d892a3 100644 --- a/native/src/widget/text.rs +++ b/native/src/widget/text.rs @@ -1,5 +1,5 @@ //! Write some text for your users to read. -use crate::{layout, Element, Hasher, Layout, Point, Widget}; +use crate::{layout, Element, Hasher, Layout, Length, Point, Widget}; use std::hash::Hash; @@ -9,14 +9,22 @@ impl<Message, Renderer> Widget<Message, Renderer> for Text where Renderer: self::Renderer, { - fn layout(&self, renderer: &Renderer, limits: &layout::Limits) -> Layout { + fn width(&self) -> Length { + self.width + } + + fn layout( + &self, + renderer: &Renderer, + limits: &layout::Limits, + ) -> layout::Node { renderer.layout(&self, limits) } fn draw( &self, renderer: &mut Renderer, - layout: &Layout, + layout: Layout<'_>, _cursor_position: Point, ) -> Renderer::Output { renderer.draw(&self, layout) @@ -49,7 +57,7 @@ pub trait Renderer: crate::Renderer { /// [`Style`]: ../../struct.Style.html /// [`Text`]: struct.Text.html /// [`Node::with_measure`]: ../../struct.Node.html#method.with_measure - fn layout(&self, text: &Text, limits: &layout::Limits) -> Layout; + fn layout(&self, text: &Text, limits: &layout::Limits) -> layout::Node; /// Draws a [`Text`] fragment. /// @@ -64,7 +72,7 @@ pub trait Renderer: crate::Renderer { /// [`Text`]: struct.Text.html /// [`HorizontalAlignment`]: enum.HorizontalAlignment.html /// [`VerticalAlignment`]: enum.VerticalAlignment.html - fn draw(&mut self, text: &Text, layout: &Layout) -> Self::Output; + fn draw(&mut self, text: &Text, layout: Layout<'_>) -> Self::Output; } impl<'a, Message, Renderer> From<Text> for Element<'a, Message, Renderer> diff --git a/native/src/widget/text_input.rs b/native/src/widget/text_input.rs index ca72801d..7e81e257 100644 --- a/native/src/widget/text_input.rs +++ b/native/src/widget/text_input.rs @@ -1,6 +1,7 @@ use crate::{ input::{keyboard, mouse, ButtonState}, - layout, Element, Event, Hasher, Layout, Point, Rectangle, Widget, + layout, Element, Event, Hasher, Layout, Length, Point, Rectangle, Size, + Widget, }; pub use iced_core::{text_input::State, TextInput}; @@ -10,20 +11,30 @@ where Renderer: self::Renderer, Message: Clone + std::fmt::Debug, { - fn layout(&self, renderer: &Renderer, limits: &layout::Limits) -> Layout { - // TODO - Layout::new(Rectangle { - x: 0.0, - y: 0.0, - width: 0.0, - height: 0.0, - }) + fn layout( + &self, + renderer: &Renderer, + limits: &layout::Limits, + ) -> layout::Node { + let padding = self.padding as f32; + let text_size = self.size.unwrap_or(renderer.default_size()); + + let limits = limits + .pad(padding) + .width(self.width) + .height(Length::Units(text_size)); + + let mut text = layout::Node::new(limits.resolve(Size::ZERO)); + text.bounds.x = padding; + text.bounds.y = padding; + + layout::Node::with_children(text.size().pad(padding), vec![text]) } fn on_event( &mut self, event: Event, - layout: &Layout, + layout: Layout<'_>, cursor_position: Point, messages: &mut Vec<Message>, _renderer: &Renderer, @@ -95,7 +106,7 @@ where fn draw( &self, renderer: &mut Renderer, - layout: &Layout, + layout: Layout<'_>, cursor_position: Point, ) -> Renderer::Output { let bounds = layout.bounds(); |