From 2303111e09d806ef2a652bddc2b73be6dccf6ae2 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Sun, 10 Nov 2019 01:55:32 +0100 Subject: Draft new layout API --- native/src/widget/button.rs | 18 ++++++++------ native/src/widget/checkbox.rs | 18 ++++++++------ native/src/widget/column.rs | 52 ++++++++++------------------------------- native/src/widget/image.rs | 12 +++++----- native/src/widget/radio.rs | 18 ++++++++------ native/src/widget/row.rs | 52 ++++++++++------------------------------- native/src/widget/scrollable.rs | 31 ++++++------------------ native/src/widget/slider.rs | 18 ++++++++------ native/src/widget/text.rs | 12 +++++----- native/src/widget/text_input.rs | 28 +++++++++------------- 10 files changed, 98 insertions(+), 161 deletions(-) (limited to 'native/src/widget') diff --git a/native/src/widget/button.rs b/native/src/widget/button.rs index 31dd6fcc..882d4a6c 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::{Element, Event, Hasher, Layout, Node, Point, Widget}; +use crate::{layout, Element, Event, Hasher, Layout, Point, Widget}; use std::hash::Hash; pub use iced_core::button::State; @@ -21,14 +21,14 @@ where Renderer: self::Renderer, Message: Clone + std::fmt::Debug, { - fn node(&self, renderer: &Renderer) -> Node { - renderer.node(&self) + fn layout(&self, renderer: &Renderer, limits: &layout::Limits) -> Layout { + renderer.layout(&self, limits) } fn on_event( &mut self, event: Event, - layout: Layout<'_>, + layout: &Layout, cursor_position: Point, messages: &mut Vec, _renderer: &Renderer, @@ -66,7 +66,7 @@ where fn draw( &self, renderer: &mut Renderer, - layout: Layout<'_>, + layout: &Layout, cursor_position: Point, ) -> Renderer::Output { renderer.draw(&self, layout, cursor_position) @@ -91,7 +91,11 @@ pub trait Renderer: crate::Renderer + Sized { /// /// [`Node`]: ../../struct.Node.html /// [`Button`]: struct.Button.html - fn node(&self, button: &Button<'_, Message, Self>) -> Node; + fn layout( + &self, + button: &Button<'_, Message, Self>, + limits: &layout::Limits, + ) -> Layout; /// Draws a [`Button`]. /// @@ -99,7 +103,7 @@ pub trait Renderer: crate::Renderer + Sized { fn draw( &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 b8053238..12a6a728 100644 --- a/native/src/widget/checkbox.rs +++ b/native/src/widget/checkbox.rs @@ -2,7 +2,7 @@ use std::hash::Hash; use crate::input::{mouse, ButtonState}; -use crate::{Element, Event, Hasher, Layout, Node, Point, Widget}; +use crate::{layout, Element, Event, Hasher, Layout, Point, Widget}; pub use iced_core::Checkbox; @@ -10,14 +10,14 @@ impl Widget for Checkbox where Renderer: self::Renderer, { - fn node(&self, renderer: &Renderer) -> Node { - renderer.node(&self) + fn layout(&self, renderer: &Renderer, limits: &layout::Limits) -> Layout { + renderer.layout(&self, limits) } fn on_event( &mut self, event: Event, - layout: Layout<'_>, + layout: &Layout, cursor_position: Point, messages: &mut Vec, _renderer: &Renderer, @@ -40,7 +40,7 @@ where fn draw( &self, renderer: &mut Renderer, - layout: Layout<'_>, + layout: &Layout, cursor_position: Point, ) -> Renderer::Output { renderer.draw(&self, layout, cursor_position) @@ -63,7 +63,11 @@ pub trait Renderer: crate::Renderer { /// /// [`Node`]: ../../struct.Node.html /// [`Checkbox`]: struct.Checkbox.html - fn node(&self, checkbox: &Checkbox) -> Node; + fn layout( + &self, + checkbox: &Checkbox, + limits: &layout::Limits, + ) -> Layout; /// Draws a [`Checkbox`]. /// @@ -77,7 +81,7 @@ pub trait Renderer: crate::Renderer { fn draw( &mut self, checkbox: &Checkbox, - layout: Layout<'_>, + layout: &Layout, cursor_position: Point, ) -> Self::Output; } diff --git a/native/src/widget/column.rs b/native/src/widget/column.rs index 086d05ef..d0446ec9 100644 --- a/native/src/widget/column.rs +++ b/native/src/widget/column.rs @@ -1,6 +1,6 @@ use std::hash::Hash; -use crate::{Element, Event, Hasher, Layout, Node, Point, Style, Widget}; +use crate::{layout, Element, Event, Hasher, Layout, Point, Rectangle, Widget}; /// A container that distributes its contents vertically. pub type Column<'a, Message, Renderer> = @@ -11,48 +11,20 @@ impl<'a, Message, Renderer> Widget where Renderer: self::Renderer, { - fn node(&self, renderer: &Renderer) -> Node { - let mut children: Vec = self - .children - .iter() - .map(|child| { - let mut node = child.widget.node(renderer); - - let mut style = node.0.style(); - style.margin.bottom = - stretch::style::Dimension::Points(f32::from(self.spacing)); - - node.0.set_style(style); - node - }) - .collect(); - - if let Some(node) = children.last_mut() { - let mut style = node.0.style(); - style.margin.bottom = stretch::style::Dimension::Undefined; - - node.0.set_style(style); - } - - let mut style = Style::default() - .width(self.width) - .height(self.height) - .max_width(self.max_width) - .max_height(self.max_height) - .padding(self.padding) - .align_self(self.align_self) - .align_items(self.align_items) - .justify_content(self.justify_content); - - style.0.flex_direction = stretch::style::FlexDirection::Column; - - Node::with_children(style, children) + 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 on_event( &mut self, event: Event, - layout: Layout<'_>, + layout: &Layout, cursor_position: Point, messages: &mut Vec, renderer: &Renderer, @@ -73,7 +45,7 @@ where fn draw( &self, renderer: &mut Renderer, - layout: Layout<'_>, + layout: &Layout, cursor_position: Point, ) -> Renderer::Output { renderer.draw(&self, layout, cursor_position) @@ -100,7 +72,7 @@ pub trait Renderer: crate::Renderer + Sized { fn draw( &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 6255a7b5..b503f95c 100644 --- a/native/src/widget/image.rs +++ b/native/src/widget/image.rs @@ -1,6 +1,6 @@ //! Display images in your user interface. -use crate::{Element, Hasher, Layout, Node, Point, Widget}; +use crate::{layout, Element, Hasher, Layout, Point, Widget}; use std::hash::Hash; @@ -10,14 +10,14 @@ impl Widget for Image where Renderer: self::Renderer, { - fn node(&self, renderer: &Renderer) -> Node { - renderer.node(&self) + fn layout(&self, renderer: &Renderer, limits: &layout::Limits) -> Layout { + 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 +44,12 @@ pub trait Renderer: crate::Renderer { /// /// [`Node`]: ../../struct.Node.html /// [`Image`]: struct.Image.html - fn node(&self, image: &Image) -> Node; + fn layout(&self, image: &Image, limits: &layout::Limits) -> Layout; /// 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 for Element<'a, Message, Renderer> diff --git a/native/src/widget/radio.rs b/native/src/widget/radio.rs index 626e6ffc..86d507da 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::{Element, Event, Hasher, Layout, Node, Point, Widget}; +use crate::{layout, Element, Event, Hasher, Layout, Point, Widget}; use std::hash::Hash; @@ -11,14 +11,14 @@ where Renderer: self::Renderer, Message: Clone + std::fmt::Debug, { - fn node(&self, renderer: &Renderer) -> Node { - renderer.node(&self) + fn layout(&self, renderer: &Renderer, limits: &layout::Limits) -> Layout { + renderer.layout(&self, limits) } fn on_event( &mut self, event: Event, - layout: Layout<'_>, + layout: &Layout, cursor_position: Point, messages: &mut Vec, _renderer: &Renderer, @@ -39,7 +39,7 @@ where fn draw( &self, renderer: &mut Renderer, - layout: Layout<'_>, + layout: &Layout, cursor_position: Point, ) -> Renderer::Output { renderer.draw(&self, layout, cursor_position) @@ -62,7 +62,11 @@ pub trait Renderer: crate::Renderer { /// /// [`Node`]: ../../struct.Node.html /// [`Radio`]: struct.Radio.html - fn node(&self, radio: &Radio) -> Node; + fn layout( + &self, + radio: &Radio, + limits: &layout::Limits, + ) -> Layout; /// Draws a [`Radio`] button. /// @@ -76,7 +80,7 @@ pub trait Renderer: crate::Renderer { fn draw( &mut self, radio: &Radio, - layout: Layout<'_>, + layout: &Layout, cursor_position: Point, ) -> Self::Output; } diff --git a/native/src/widget/row.rs b/native/src/widget/row.rs index 7dbfb92a..ca1cda23 100644 --- a/native/src/widget/row.rs +++ b/native/src/widget/row.rs @@ -1,6 +1,6 @@ use std::hash::Hash; -use crate::{Element, Event, Hasher, Layout, Node, Point, Style, Widget}; +use crate::{layout, Element, Event, Hasher, Layout, Point, Rectangle, Widget}; /// A container that distributes its contents horizontally. pub type Row<'a, Message, Renderer> = @@ -11,48 +11,20 @@ impl<'a, Message, Renderer> Widget where Renderer: self::Renderer, { - fn node(&self, renderer: &Renderer) -> Node { - let mut children: Vec = self - .children - .iter() - .map(|child| { - let mut node = child.widget.node(renderer); - - let mut style = node.0.style(); - style.margin.end = - stretch::style::Dimension::Points(f32::from(self.spacing)); - - node.0.set_style(style); - node - }) - .collect(); - - if let Some(node) = children.last_mut() { - let mut style = node.0.style(); - style.margin.end = stretch::style::Dimension::Undefined; - - node.0.set_style(style); - } - - let mut style = Style::default() - .width(self.width) - .height(self.height) - .max_width(self.max_width) - .max_height(self.max_height) - .padding(self.padding) - .align_self(self.align_self) - .align_items(self.align_items) - .justify_content(self.justify_content); - - style.0.flex_direction = stretch::style::FlexDirection::Row; - - Node::with_children(style, children) + 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 on_event( &mut self, event: Event, - layout: Layout<'_>, + layout: &Layout, cursor_position: Point, messages: &mut Vec, renderer: &Renderer, @@ -73,7 +45,7 @@ where fn draw( &self, renderer: &mut Renderer, - layout: Layout<'_>, + layout: &Layout, cursor_position: Point, ) -> Renderer::Output { renderer.draw(&self, layout, cursor_position) @@ -101,7 +73,7 @@ pub trait Renderer: crate::Renderer + Sized { fn draw( &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 de4c749c..a5eb2f01 100644 --- a/native/src/widget/scrollable.rs +++ b/native/src/widget/scrollable.rs @@ -1,7 +1,7 @@ use crate::{ column, input::{mouse, ButtonState}, - Element, Event, Hasher, Layout, Node, Point, Rectangle, Style, Widget, + layout, Element, Event, Hasher, Layout, Point, Rectangle, Widget, }; pub use iced_core::scrollable::State; @@ -19,32 +19,15 @@ impl<'a, Message, Renderer> Widget where Renderer: self::Renderer + column::Renderer, { - fn node(&self, renderer: &Renderer) -> Node { - let mut content = self.content.node(renderer); - - { - let mut style = content.0.style(); - style.flex_shrink = 0.0; - - content.0.set_style(style); - } - - let mut style = Style::default() - .width(self.content.width) - .max_width(self.content.max_width) - .height(self.height) - .max_height(self.max_height) - .align_self(self.align_self); - - style.0.flex_direction = stretch::style::FlexDirection::Column; - - Node::with_children(style, vec![content]) + fn layout(&self, renderer: &Renderer, limits: &layout::Limits) -> Layout { + // TODO + self.content.layout(renderer, limits) } fn on_event( &mut self, event: Event, - layout: Layout<'_>, + layout: &Layout, cursor_position: Point, messages: &mut Vec, renderer: &Renderer, @@ -147,7 +130,7 @@ where fn draw( &self, renderer: &mut Renderer, - layout: Layout<'_>, + layout: &Layout, cursor_position: Point, ) -> Renderer::Output { let bounds = layout.bounds(); @@ -185,7 +168,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 be2b9b22..be4ed564 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::{Element, Event, Hasher, Layout, Node, Point, Widget}; +use crate::{layout, Element, Event, Hasher, Layout, Point, Widget}; pub use iced_core::slider::*; @@ -15,14 +15,14 @@ impl<'a, Message, Renderer> Widget for Slider<'a, Message> where Renderer: self::Renderer, { - fn node(&self, renderer: &Renderer) -> Node { - renderer.node(&self) + fn layout(&self, renderer: &Renderer, limits: &layout::Limits) -> Layout { + renderer.layout(&self, limits) } fn on_event( &mut self, event: Event, - layout: Layout<'_>, + layout: &Layout, cursor_position: Point, messages: &mut Vec, _renderer: &Renderer, @@ -70,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) @@ -93,7 +93,11 @@ pub trait Renderer: crate::Renderer { /// /// [`Node`]: ../../struct.Node.html /// [`Radio`]: struct.Radio.html - fn node(&self, slider: &Slider<'_, Message>) -> Node; + fn layout( + &self, + slider: &Slider<'_, Message>, + limits: &layout::Limits, + ) -> Layout; /// Draws a [`Slider`]. /// @@ -110,7 +114,7 @@ pub trait Renderer: crate::Renderer { fn draw( &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 e389e1d9..da8563a4 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::{Element, Hasher, Layout, Node, Point, Widget}; +use crate::{layout, Element, Hasher, Layout, Point, Widget}; use std::hash::Hash; @@ -9,14 +9,14 @@ impl Widget for Text where Renderer: self::Renderer, { - fn node(&self, renderer: &Renderer) -> Node { - renderer.node(&self) + fn layout(&self, renderer: &Renderer, limits: &layout::Limits) -> Layout { + 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 +49,7 @@ pub trait Renderer: crate::Renderer { /// [`Style`]: ../../struct.Style.html /// [`Text`]: struct.Text.html /// [`Node::with_measure`]: ../../struct.Node.html#method.with_measure - fn node(&self, text: &Text) -> Node; + fn layout(&self, text: &Text, limits: &layout::Limits) -> Layout; /// Draws a [`Text`] fragment. /// @@ -64,7 +64,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 for Element<'a, Message, Renderer> diff --git a/native/src/widget/text_input.rs b/native/src/widget/text_input.rs index d9837b61..ca72801d 100644 --- a/native/src/widget/text_input.rs +++ b/native/src/widget/text_input.rs @@ -1,7 +1,6 @@ use crate::{ input::{keyboard, mouse, ButtonState}, - Element, Event, Hasher, Layout, Length, Node, Point, Rectangle, Style, - Widget, + layout, Element, Event, Hasher, Layout, Point, Rectangle, Widget, }; pub use iced_core::{text_input::State, TextInput}; @@ -11,25 +10,20 @@ where Renderer: self::Renderer, Message: Clone + std::fmt::Debug, { - fn node(&self, renderer: &Renderer) -> Node { - let text_bounds = - Node::new(Style::default().width(Length::Fill).height( - Length::Units(self.size.unwrap_or(renderer.default_size())), - )); - - Node::with_children( - Style::default() - .width(self.width) - .max_width(self.width) - .padding(self.padding), - vec![text_bounds], - ) + 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 on_event( &mut self, event: Event, - layout: Layout<'_>, + layout: &Layout, cursor_position: Point, messages: &mut Vec, _renderer: &Renderer, @@ -101,7 +95,7 @@ where fn draw( &self, renderer: &mut Renderer, - layout: Layout<'_>, + layout: &Layout, cursor_position: Point, ) -> Renderer::Output { let bounds = layout.bounds(); -- cgit From 0240c3981b716c82ecb3364945815335b420a63e Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Sun, 10 Nov 2019 06:05:20 +0100 Subject: Draft custom layout engine based on `druid` --- native/src/widget/button.rs | 16 ++++++++++------ native/src/widget/checkbox.rs | 14 +++++++++----- native/src/widget/column.rs | 41 +++++++++++++++++++++++++++++------------ native/src/widget/image.rs | 12 ++++++++---- native/src/widget/radio.rs | 20 ++++++++++++++------ native/src/widget/row.rs | 39 +++++++++++++++++++++++++++------------ native/src/widget/scrollable.rs | 32 +++++++++++++++++++++++++------- native/src/widget/slider.rs | 20 ++++++++++++++------ native/src/widget/text.rs | 18 +++++++++++++----- native/src/widget/text_input.rs | 33 ++++++++++++++++++++++----------- 10 files changed, 171 insertions(+), 74 deletions(-) (limited to 'native/src/widget') 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, _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( &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 Widget for Checkbox 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, _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, limits: &layout::Limits, - ) -> Layout; + ) -> layout::Node; /// Draws a [`Checkbox`]. /// @@ -81,7 +85,7 @@ pub trait Renderer: crate::Renderer { fn draw( &mut self, checkbox: &Checkbox, - 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 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, 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( &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 Widget 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 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, _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, limits: &layout::Limits, - ) -> Layout; + ) -> layout::Node; /// Draws a [`Radio`] button. /// @@ -80,7 +88,7 @@ pub trait Renderer: crate::Renderer { fn draw( &mut self, radio: &Radio, - 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 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, 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( &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 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, 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 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, _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( &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 Widget 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 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, _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(); -- cgit From ceb02f4a36769c488c2525db2fb73f092a6c2706 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Mon, 11 Nov 2019 05:26:08 +0100 Subject: Implement `Container` widget Remove `align_self` and `justify_content` methods --- native/src/widget/button.rs | 3 +- native/src/widget/column.rs | 7 +--- native/src/widget/container.rs | 93 +++++++++++++++++++++++++++++++++++++++++ native/src/widget/image.rs | 1 - native/src/widget/row.rs | 3 +- native/src/widget/scrollable.rs | 1 - 6 files changed, 97 insertions(+), 11 deletions(-) create mode 100644 native/src/widget/container.rs (limited to 'native/src/widget') diff --git a/native/src/widget/button.rs b/native/src/widget/button.rs index 980c2aae..15beaeba 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, Length, Point, Widget}; +use crate::{layout, Element, Event, Hasher, Layout, Point, Widget}; use std::hash::Hash; pub use iced_core::button::State; @@ -78,7 +78,6 @@ where fn hash_layout(&self, state: &mut Hasher) { self.width.hash(state); - self.align_self.hash(state); self.content.hash_layout(state); } } diff --git a/native/src/widget/column.rs b/native/src/widget/column.rs index ed8a2b89..7e7156a0 100644 --- a/native/src/widget/column.rs +++ b/native/src/widget/column.rs @@ -1,8 +1,6 @@ use std::hash::Hash; -use crate::{ - layout, Element, Event, Hasher, Layout, Length, Point, Size, Widget, -}; +use crate::{layout, Element, Event, Hasher, Layout, Length, Point, Widget}; /// A container that distributes its contents vertically. pub type Column<'a, Message, Renderer> = @@ -34,6 +32,7 @@ where &limits, self.padding as f32, self.spacing as f32, + self.align_items, &self.children, ) } @@ -74,9 +73,7 @@ where self.height.hash(state); self.max_width.hash(state); self.max_height.hash(state); - self.align_self.hash(state); self.align_items.hash(state); - self.justify_content.hash(state); self.spacing.hash(state); for child in &self.children { diff --git a/native/src/widget/container.rs b/native/src/widget/container.rs new file mode 100644 index 00000000..bb78a68c --- /dev/null +++ b/native/src/widget/container.rs @@ -0,0 +1,93 @@ +use std::hash::Hash; + +use crate::{ + layout, Element, Event, Hasher, Layout, Length, Point, Size, Widget, +}; + +/// A container that distributes its contents vertically. +pub type Container<'a, Message, Renderer> = + iced_core::Container>; + +impl<'a, Message, Renderer> Widget + for Container<'a, Message, Renderer> +where + Renderer: crate::Renderer, +{ + fn width(&self) -> Length { + self.width + } + + fn layout( + &self, + renderer: &Renderer, + limits: &layout::Limits, + ) -> layout::Node { + let limits = limits + .loose() + .max_width(self.max_width) + .max_height(self.max_height) + .width(self.width) + .height(self.height); + + let mut content = self.content.layout(renderer, &limits); + let size = limits.resolve(content.size()); + + content.align(self.horizontal_alignment, self.vertical_alignment, size); + + layout::Node::with_children(size, vec![content]) + } + + fn on_event( + &mut self, + event: Event, + layout: Layout<'_>, + cursor_position: Point, + messages: &mut Vec, + renderer: &Renderer, + ) { + self.content.widget.on_event( + event, + layout.children().next().unwrap(), + cursor_position, + messages, + renderer, + ) + } + + fn draw( + &self, + renderer: &mut Renderer, + layout: Layout<'_>, + cursor_position: Point, + ) -> Renderer::Output { + self.content.draw( + renderer, + layout.children().next().unwrap(), + cursor_position, + ) + } + + fn hash_layout(&self, state: &mut Hasher) { + 0.hash(state); + self.width.hash(state); + self.height.hash(state); + self.max_width.hash(state); + self.max_height.hash(state); + self.padding.hash(state); + + self.content.hash_layout(state); + } +} + +impl<'a, Message, Renderer> From> + for Element<'a, Message, Renderer> +where + Renderer: 'a + crate::Renderer, + Message: 'static, +{ + fn from( + column: Container<'a, Message, Renderer>, + ) -> Element<'a, Message, Renderer> { + Element::new(column) + } +} diff --git a/native/src/widget/image.rs b/native/src/widget/image.rs index abc45d6a..b2541b87 100644 --- a/native/src/widget/image.rs +++ b/native/src/widget/image.rs @@ -30,7 +30,6 @@ where fn hash_layout(&self, state: &mut Hasher) { self.width.hash(state); self.height.hash(state); - self.align_self.hash(state); } } diff --git a/native/src/widget/row.rs b/native/src/widget/row.rs index 7ea54a71..132479fd 100644 --- a/native/src/widget/row.rs +++ b/native/src/widget/row.rs @@ -32,6 +32,7 @@ where &limits, self.padding as f32, self.spacing as f32, + self.align_items, &self.children, ) } @@ -72,9 +73,7 @@ where self.height.hash(state); self.max_width.hash(state); self.max_height.hash(state); - self.align_self.hash(state); self.align_items.hash(state); - self.justify_content.hash(state); self.spacing.hash(state); self.spacing.hash(state); diff --git a/native/src/widget/scrollable.rs b/native/src/widget/scrollable.rs index 775c59db..091dac47 100644 --- a/native/src/widget/scrollable.rs +++ b/native/src/widget/scrollable.rs @@ -168,7 +168,6 @@ where self.height.hash(state); self.max_height.hash(state); - self.align_self.hash(state); self.content.hash_layout(state) } -- cgit From d4d14b68f47e9527554a728ebbba9b840832626a Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Mon, 11 Nov 2019 05:37:51 +0100 Subject: Remove `padding` from `Container` for now --- native/src/widget/container.rs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) (limited to 'native/src/widget') diff --git a/native/src/widget/container.rs b/native/src/widget/container.rs index bb78a68c..c616db2a 100644 --- a/native/src/widget/container.rs +++ b/native/src/widget/container.rs @@ -1,8 +1,6 @@ use std::hash::Hash; -use crate::{ - layout, Element, Event, Hasher, Layout, Length, Point, Size, Widget, -}; +use crate::{layout, Element, Event, Hasher, Layout, Length, Point, Widget}; /// A container that distributes its contents vertically. pub type Container<'a, Message, Renderer> = @@ -73,7 +71,6 @@ where self.height.hash(state); self.max_width.hash(state); self.max_height.hash(state); - self.padding.hash(state); self.content.hash_layout(state); } -- cgit