From c70080dd686738ab6272dd0b3c421c6621e86e34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bla=C5=BE=20Hrastnik?= Date: Fri, 5 Feb 2021 14:42:56 +0900 Subject: [PATCH] Work around rendering errors for positions offscreen. --- helix-term/src/ui/editor.rs | 26 ++++++++++++++++++-------- helix-view/src/tree.rs | 19 +++++++++++++++---- 2 files changed, 33 insertions(+), 12 deletions(-) diff --git a/helix-term/src/ui/editor.rs b/helix-term/src/ui/editor.rs index 090f3d0bb..18e853f62 100644 --- a/helix-term/src/ui/editor.rs +++ b/helix-term/src/ui/editor.rs @@ -198,12 +198,16 @@ impl EditorView { // TODO: paint cursor heads except primary - surface.set_string( - viewport.x + visual_x, - viewport.y + line, - grapheme, - style, - ); + // HAXX: we don't render the char if it's offscreen. This should be + // skipped in a better way much earlier + if visual_x < viewport.width { + surface.set_string( + viewport.x + visual_x, + viewport.y + line, + grapheme, + style, + ); + } visual_x += width; } @@ -268,12 +272,18 @@ impl EditorView { if let Some(path) = doc.relative_path() { let path = path.to_string_lossy(); - surface.set_string(viewport.x + 6, viewport.y, path, text_color); + surface.set_stringn( + viewport.x + 6, + viewport.y, + path, + viewport.width.saturating_sub(6) as usize, + text_color, + ); // TODO: append [+] if modified } surface.set_string( - viewport.x + viewport.width - 10, + viewport.x + viewport.width.saturating_sub(10), viewport.y, format!("{}", doc.diagnostics.len()), text_color, diff --git a/helix-view/src/tree.rs b/helix-view/src/tree.rs index 100d8a549..784fea3f0 100644 --- a/helix-view/src/tree.rs +++ b/helix-view/src/tree.rs @@ -152,16 +152,27 @@ impl Tree { match container.layout { Layout::Vertical => unimplemented!(), Layout::Horizontal => { - let len = container.children.len() as u16; + let len = container.children.len(); - let width = area.width / len; + let width = area.width / len as u16; let mut child_x = area.x; - for (_i, child) in container.children.iter().enumerate() { - let area = Rect::new(child_x, area.y, width, area.height); + for (i, child) in container.children.iter().enumerate() { + let mut area = Rect::new( + child_x, + container.area.y, + width, + container.area.height, + ); child_x += width; + // last child takes the remaining width because we can get uneven + // space from rounding + if i == len - 1 { + area.width = container.area.x + container.area.width - area.x; + } + self.stack.push((*child, area)); } }