Draft new layout API

This commit is contained in:
Héctor Ramón Jiménez 2019-11-10 01:55:32 +01:00
parent 839e039dbf
commit 2303111e09
30 changed files with 247 additions and 596 deletions

View file

@ -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<Message>,
_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<Message>(&self, button: &Button<'_, Message, Self>) -> Node;
fn layout<Message>(
&self,
button: &Button<'_, Message, Self>,
limits: &layout::Limits,
) -> Layout;
/// Draws a [`Button`].
///
@ -99,7 +103,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;
}

View file

@ -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<Message, Renderer> Widget<Message, Renderer> for Checkbox<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<Message>,
_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<Message>(&self, checkbox: &Checkbox<Message>) -> Node;
fn layout<Message>(
&self,
checkbox: &Checkbox<Message>,
limits: &layout::Limits,
) -> Layout;
/// Draws a [`Checkbox`].
///
@ -77,7 +81,7 @@ pub trait Renderer: crate::Renderer {
fn draw<Message>(
&mut self,
checkbox: &Checkbox<Message>,
layout: Layout<'_>,
layout: &Layout,
cursor_position: Point,
) -> Self::Output;
}

View file

@ -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<Message, Renderer>
where
Renderer: self::Renderer,
{
fn node(&self, renderer: &Renderer) -> Node {
let mut children: Vec<Node> = 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<Message>,
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<Message>(
&mut self,
row: &Column<'_, Message, Self>,
layout: Layout<'_>,
layout: &Layout,
cursor_position: Point,
) -> Self::Output;
}

View file

@ -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<Message, Renderer> Widget<Message, Renderer> 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<Image> for Element<'a, Message, Renderer>

View file

@ -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<Message>,
_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<Message>(&self, radio: &Radio<Message>) -> Node;
fn layout<Message>(
&self,
radio: &Radio<Message>,
limits: &layout::Limits,
) -> Layout;
/// Draws a [`Radio`] button.
///
@ -76,7 +80,7 @@ pub trait Renderer: crate::Renderer {
fn draw<Message>(
&mut self,
radio: &Radio<Message>,
layout: Layout<'_>,
layout: &Layout,
cursor_position: Point,
) -> Self::Output;
}

View file

@ -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<Message, Renderer>
where
Renderer: self::Renderer,
{
fn node(&self, renderer: &Renderer) -> Node {
let mut children: Vec<Node> = 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<Message>,
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<Message>(
&mut self,
row: &Row<'_, Message, Self>,
layout: Layout<'_>,
layout: &Layout,
cursor_position: Point,
) -> Self::Output;
}

View file

@ -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<Message, Renderer>
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<Message>,
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;
}

View file

@ -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<Message, Renderer> 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<Message>,
_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<Message>(&self, slider: &Slider<'_, Message>) -> Node;
fn layout<Message>(
&self,
slider: &Slider<'_, Message>,
limits: &layout::Limits,
) -> Layout;
/// Draws a [`Slider`].
///
@ -110,7 +114,7 @@ pub trait Renderer: crate::Renderer {
fn draw<Message>(
&mut self,
slider: &Slider<'_, Message>,
layout: Layout<'_>,
layout: &Layout,
cursor_position: Point,
) -> Self::Output;
}

View file

@ -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<Message, Renderer> Widget<Message, Renderer> 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<Text> for Element<'a, Message, Renderer>

View file

@ -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<Message>,
_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();