From 66482f854b66cc261c2ed04546019b92eb1367f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Wiercho=C5=82a?= Date: Mon, 18 Sep 2023 22:53:33 +0200 Subject: [PATCH] add bufferline wrapping --- helix-term/src/ui/editor.rs | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/helix-term/src/ui/editor.rs b/helix-term/src/ui/editor.rs index 5179be4f4..d4ddf4b8f 100644 --- a/helix-term/src/ui/editor.rs +++ b/helix-term/src/ui/editor.rs @@ -592,8 +592,9 @@ impl EditorView { Vec::new() } - /// Render bufferline at the top - pub fn render_bufferline(editor: &Editor, viewport: Rect, surface: &mut Surface) { + /// Render bufferline at the top. Returns height of the bufferline so + /// that the editor area can be clipped accordingly. + pub fn render_bufferline(editor: &Editor, viewport: Rect, surface: &mut Surface) -> u16 { let scratch = PathBuf::from(SCRATCH_BUFFER_NAME); // default filename to use for scratch buffer surface.clear_with( viewport, @@ -616,6 +617,8 @@ impl EditorView { let mut x = viewport.x; let current_doc = view!(editor).doc; + let mut y = viewport.y; + for doc in editor.documents() { let fname = doc .path() @@ -635,14 +638,14 @@ impl EditorView { let used_width = viewport.x.saturating_sub(x); let rem_width = surface.area.width.saturating_sub(used_width); - x = surface - .set_stringn(x, viewport.y, text, rem_width as usize, style) - .0; - - if x >= surface.area.right() { - break; + if x + text.len() as u16 >= surface.area.right() { + x = 0; + y = y + 1; } + + x = surface.set_stringn(x, y, text, rem_width as usize, style).0; } + y + 1 } pub fn render_gutter<'d>( @@ -1487,19 +1490,20 @@ impl Component for EditorView { _ => false, }; - // -1 for commandline and -1 for bufferline + // -1 for commandline let mut editor_area = area.clip_bottom(1); if use_bufferline { - editor_area = editor_area.clip_top(1); + // -1 or more for the bufferline + editor_area = editor_area.clip_top(Self::render_bufferline( + cx.editor, + area.with_height(1), + surface, + )); } // if the terminal size suddenly changed, we need to trigger a resize cx.editor.resize(editor_area); - if use_bufferline { - Self::render_bufferline(cx.editor, area.with_height(1), surface); - } - for (view, is_focused) in cx.editor.tree.views() { let doc = cx.editor.document(view.doc).unwrap(); self.render_view(cx.editor, doc, view, area, surface, is_focused);