Add Renderer and Primitive concepts

This commit is contained in:
Héctor Ramón Jiménez 2019-10-05 03:56:18 +02:00
parent 5204cc8c8b
commit a7d1194403
15 changed files with 227 additions and 126 deletions

View file

@ -1,8 +1,6 @@
use std::hash::Hash;
use crate::{
Element, Event, Hasher, Layout, MouseCursor, Node, Point, Style, Widget,
};
use crate::{Element, Event, Hasher, Layout, Node, Point, Style, Widget};
/// A container that distributes its contents vertically.
pub type Column<'a, Message, Renderer> =
@ -10,6 +8,8 @@ pub type Column<'a, Message, Renderer> =
impl<'a, Message, Renderer> Widget<Message, Renderer>
for Column<'a, Message, Renderer>
where
Renderer: self::Renderer,
{
fn node(&self, renderer: &mut Renderer) -> Node {
let mut children: Vec<Node> = self
@ -70,21 +70,8 @@ impl<'a, Message, Renderer> Widget<Message, Renderer>
renderer: &mut Renderer,
layout: Layout<'_>,
cursor_position: Point,
) -> MouseCursor {
let mut cursor = MouseCursor::OutOfBounds;
self.children.iter().zip(layout.children()).for_each(
|(child, layout)| {
let new_cursor =
child.widget.draw(renderer, layout, cursor_position);
if new_cursor != MouseCursor::OutOfBounds {
cursor = new_cursor;
}
},
);
cursor
) -> Renderer::Primitive {
renderer.draw(&self, layout, cursor_position)
}
fn hash_layout(&self, state: &mut Hasher) {
@ -104,10 +91,19 @@ impl<'a, Message, Renderer> Widget<Message, Renderer>
}
}
pub trait Renderer: crate::Renderer + Sized {
fn draw<Message>(
&mut self,
row: &Column<'_, Message, Self>,
layout: Layout<'_>,
cursor_position: Point,
) -> Self::Primitive;
}
impl<'a, Message, Renderer> From<Column<'a, Message, Renderer>>
for Element<'a, Message, Renderer>
where
Renderer: 'a,
Renderer: 'a + self::Renderer,
Message: 'static,
{
fn from(