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/user_interface.rs | 33 ++++++++++++++------------------- 1 file changed, 14 insertions(+), 19 deletions(-) (limited to 'native/src/user_interface.rs') diff --git a/native/src/user_interface.rs b/native/src/user_interface.rs index 0760dd7e..7c166094 100644 --- a/native/src/user_interface.rs +++ b/native/src/user_interface.rs @@ -1,7 +1,6 @@ -use crate::{input::mouse, Element, Event, Layout, Point}; +use crate::{input::mouse, layout, Element, Event, Layout, Point, Rectangle}; use std::hash::Hasher; -use stretch::{geometry, result}; /// A set of interactive graphical elements with a specific [`Layout`]. /// @@ -15,7 +14,7 @@ use stretch::{geometry, result}; pub struct UserInterface<'a, Message, Renderer> { hash: u64, root: Element<'a, Message, Renderer>, - layout: result::Layout, + layout: Layout, cursor_position: Point, } @@ -110,7 +109,7 @@ where let layout = if hash == cache.hash { cache.layout } else { - root.compute_layout(renderer) + root.layout(renderer, &layout::Limits::NONE) }; UserInterface { @@ -210,7 +209,7 @@ where self.root.widget.on_event( event, - Layout::new(&self.layout), + &self.layout, self.cursor_position, &mut messages, renderer, @@ -299,11 +298,9 @@ where /// } /// ``` pub fn draw(&self, renderer: &mut Renderer) -> Renderer::Output { - self.root.widget.draw( - renderer, - Layout::new(&self.layout), - self.cursor_position, - ) + self.root + .widget + .draw(renderer, &self.layout, self.cursor_position) } /// Extract the [`Cache`] of the [`UserInterface`], consuming it in the @@ -326,7 +323,7 @@ where #[derive(Debug, Clone)] pub struct Cache { hash: u64, - layout: result::Layout, + layout: Layout, cursor_position: Point, } @@ -339,16 +336,14 @@ impl Cache { /// [`Cache`]: struct.Cache.html /// [`UserInterface`]: struct.UserInterface.html pub fn new() -> Cache { - use crate::{Node, Style}; - - let empty_node = Node::new(Style::default()); - Cache { hash: 0, - layout: empty_node - .0 - .compute_layout(geometry::Size::undefined()) - .unwrap(), + layout: Layout::new(Rectangle { + x: 0.0, + y: 0.0, + width: 0.0, + height: 0.0, + }), cursor_position: Point::new(-1.0, -1.0), } } -- 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/user_interface.rs | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) (limited to 'native/src/user_interface.rs') diff --git a/native/src/user_interface.rs b/native/src/user_interface.rs index 7c166094..4343086b 100644 --- a/native/src/user_interface.rs +++ b/native/src/user_interface.rs @@ -1,4 +1,4 @@ -use crate::{input::mouse, layout, Element, Event, Layout, Point, Rectangle}; +use crate::{input::mouse, layout, Element, Event, Layout, Point, Size}; use std::hash::Hasher; @@ -14,7 +14,7 @@ use std::hash::Hasher; pub struct UserInterface<'a, Message, Renderer> { hash: u64, root: Element<'a, Message, Renderer>, - layout: Layout, + layout: layout::Node, cursor_position: Point, } @@ -109,7 +109,11 @@ where let layout = if hash == cache.hash { cache.layout } else { - root.layout(renderer, &layout::Limits::NONE) + let layout_start = std::time::Instant::now(); + let layout = root.layout(renderer, &layout::Limits::NONE); + dbg!(std::time::Instant::now() - layout_start); + + layout }; UserInterface { @@ -209,7 +213,7 @@ where self.root.widget.on_event( event, - &self.layout, + Layout::new(&self.layout), self.cursor_position, &mut messages, renderer, @@ -298,9 +302,11 @@ where /// } /// ``` pub fn draw(&self, renderer: &mut Renderer) -> Renderer::Output { - self.root - .widget - .draw(renderer, &self.layout, self.cursor_position) + self.root.widget.draw( + renderer, + Layout::new(&self.layout), + self.cursor_position, + ) } /// Extract the [`Cache`] of the [`UserInterface`], consuming it in the @@ -323,7 +329,7 @@ where #[derive(Debug, Clone)] pub struct Cache { hash: u64, - layout: Layout, + layout: layout::Node, cursor_position: Point, } @@ -338,12 +344,7 @@ impl Cache { pub fn new() -> Cache { Cache { hash: 0, - layout: Layout::new(Rectangle { - x: 0.0, - y: 0.0, - width: 0.0, - height: 0.0, - }), + layout: layout::Node::new(Size::new(0.0, 0.0)), cursor_position: Point::new(-1.0, -1.0), } } -- cgit From 860a6923bbed57a21ce4b2cae331f6a3a51ca3fe Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Mon, 11 Nov 2019 06:07:31 +0100 Subject: Split text measurements cache from rendering cache This speeds up layouting in the most common scenario considerably! :tada: --- native/src/user_interface.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'native/src/user_interface.rs') diff --git a/native/src/user_interface.rs b/native/src/user_interface.rs index 4343086b..f031b090 100644 --- a/native/src/user_interface.rs +++ b/native/src/user_interface.rs @@ -97,7 +97,7 @@ where pub fn build>>( root: E, cache: Cache, - renderer: &Renderer, + renderer: &mut Renderer, ) -> Self { let root = root.into(); @@ -110,7 +110,7 @@ where cache.layout } else { let layout_start = std::time::Instant::now(); - let layout = root.layout(renderer, &layout::Limits::NONE); + let layout = renderer.layout(&root); dbg!(std::time::Instant::now() - layout_start); layout -- cgit