summaryrefslogtreecommitdiffstats
path: root/native/src/widget
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2019-11-10 01:55:32 +0100
committerLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2019-11-10 01:55:32 +0100
commit2303111e09d806ef2a652bddc2b73be6dccf6ae2 (patch)
treeba57c5a2fe67d8a58d4f9b32c2b32fee32932f06 /native/src/widget
parent839e039dbf2fb89dcb8c141503740777d2af2eb3 (diff)
downloadiced-2303111e09d806ef2a652bddc2b73be6dccf6ae2.tar.gz
iced-2303111e09d806ef2a652bddc2b73be6dccf6ae2.tar.bz2
iced-2303111e09d806ef2a652bddc2b73be6dccf6ae2.zip
Draft new layout API
Diffstat (limited to 'native/src/widget')
-rw-r--r--native/src/widget/button.rs18
-rw-r--r--native/src/widget/checkbox.rs18
-rw-r--r--native/src/widget/column.rs52
-rw-r--r--native/src/widget/image.rs12
-rw-r--r--native/src/widget/radio.rs18
-rw-r--r--native/src/widget/row.rs52
-rw-r--r--native/src/widget/scrollable.rs31
-rw-r--r--native/src/widget/slider.rs18
-rw-r--r--native/src/widget/text.rs12
-rw-r--r--native/src/widget/text_input.rs28
10 files changed, 98 insertions, 161 deletions
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<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;
}
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<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;
}
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<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;
}
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<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>
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<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;
}
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<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;
}
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<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;
}
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<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;
}
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<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>
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<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();