diff --git a/packages/native-core/Cargo.toml b/packages/native-core/Cargo.toml index 284a9394a..4e7112eb0 100644 --- a/packages/native-core/Cargo.toml +++ b/packages/native-core/Cargo.toml @@ -15,7 +15,7 @@ dioxus-core = { path = "../core", version = "^0.2.1" } dioxus-html = { path = "../html", version = "^0.2.1" } dioxus-core-macro = { path = "../core-macro", version = "^0.2.1" } -stretch2 = "0.4.2" +stretch2 = { git = "https://github.com/mockersf/stretch/", branch = "remove_round_layout_changes" } smallvec = "1.6" fxhash = "0.2" anymap = "0.12.1" diff --git a/packages/tui/Cargo.toml b/packages/tui/Cargo.toml index efa312772..d9ccb8584 100644 --- a/packages/tui/Cargo.toml +++ b/packages/tui/Cargo.toml @@ -23,7 +23,7 @@ crossterm = "0.23.0" anyhow = "1.0.42" tokio = { version = "1.15.0", features = ["full"] } futures = "0.3.19" -stretch2 = "0.4.2" +stretch2 = { git = "https://github.com/mockersf/stretch/", branch = "remove_round_layout_changes" } smallvec = "1.6" fxhash = "0.2" anymap = "0.12.1" diff --git a/packages/tui/src/lib.rs b/packages/tui/src/lib.rs index 012d92fed..3f647ffd1 100644 --- a/packages/tui/src/lib.rs +++ b/packages/tui/src/lib.rs @@ -17,7 +17,7 @@ use layout::StretchLayout; use std::cell::RefCell; use std::rc::Rc; use std::{io, time::Duration}; -use stretch2::{prelude::Size, Stretch}; +use stretch2::{geometry::Point, prelude::Size, Stretch}; use style_attributes::StyleModifier; use tui::{backend::CrosstermBackend, layout::Rect, Terminal}; @@ -166,7 +166,14 @@ fn render_vdom( // size is guaranteed to not change when rendering resize(frame.size(), &mut stretch.borrow_mut(), &rdom); let root = &rdom[0]; - render::render_vnode(frame, &stretch.borrow(), &rdom, root, cfg); + render::render_vnode( + frame, + &stretch.borrow(), + &rdom, + root, + cfg, + Point::zero(), + ); })?; } else { resize( diff --git a/packages/tui/src/render.rs b/packages/tui/src/render.rs index 3e75f3a5e..4df83f8b6 100644 --- a/packages/tui/src/render.rs +++ b/packages/tui/src/render.rs @@ -22,6 +22,7 @@ pub(crate) fn render_vnode( rdom: &Dom, node: &Node, cfg: Config, + parent_location: Point, ) { use dioxus_native_core::real_dom::NodeType; @@ -29,7 +30,11 @@ pub(crate) fn render_vnode( return; } - let Layout { location, size, .. } = layout.layout(node.state.layout.node.unwrap()).unwrap(); + let Layout { + mut location, size, .. + } = layout.layout(node.state.layout.node.unwrap()).unwrap(); + location.x += parent_location.x; + location.y += parent_location.y; let Point { x, y } = location; let Size { width, height } = size; @@ -57,7 +62,7 @@ pub(crate) fn render_vnode( text, style: node.state.style.core, }; - let area = Rect::new(*x as u16, *y as u16, *width as u16, *height as u16); + let area = Rect::new(x as u16, y as u16, *width as u16, *height as u16); // the renderer will panic if a node is rendered out of range even if the size is zero if area.width > 0 && area.height > 0 { @@ -65,7 +70,7 @@ pub(crate) fn render_vnode( } } NodeType::Element { children, .. } => { - let area = Rect::new(*x as u16, *y as u16, *width as u16, *height as u16); + let area = Rect::new(x as u16, y as u16, *width as u16, *height as u16); // the renderer will panic if a node is rendered out of range even if the size is zero if area.width > 0 && area.height > 0 { @@ -73,7 +78,7 @@ pub(crate) fn render_vnode( } for c in children { - render_vnode(frame, layout, rdom, &rdom[c.0], cfg); + render_vnode(frame, layout, rdom, &rdom[c.0], cfg, location); } } NodeType::Placeholder => unreachable!(),