Fix split sizes getting out of sync with the terminal size, refs #69

pull/64/head
Blaž Hrastnik 3 years ago
parent 3c7729906c
commit c0332bd935

@ -122,11 +122,17 @@ impl Compositor {
} }
pub fn render(&mut self, cx: &mut Context) { pub fn render(&mut self, cx: &mut Context) {
self.terminal.autoresize().unwrap(); let area = self
let area = self.size(); .terminal
.autoresize()
.expect("Unable to determine terminal size");
// TODO: need to recalculate view tree if necessary
let surface = self.terminal.current_buffer_mut(); let surface = self.terminal.current_buffer_mut();
let area = surface.area().clone();
for layer in &self.layers { for layer in &self.layers {
layer.render(area, surface, cx) layer.render(area, surface, cx)
} }

@ -240,7 +240,7 @@ impl EditorView {
for selection in doc for selection in doc
.selection(view.id) .selection(view.id)
.iter() .iter()
.filter(|range| range.overlaps(&screen)) .filter(|range| screen.overlaps(&range))
{ {
// TODO: render also if only one of the ranges is in viewport // TODO: render also if only one of the ranges is in viewport
let mut start = view.screen_coords_at_pos(doc, text, selection.anchor); let mut start = view.screen_coords_at_pos(doc, text, selection.anchor);
@ -261,7 +261,7 @@ impl EditorView {
Rect::new( Rect::new(
viewport.x + start.col as u16, viewport.x + start.col as u16,
viewport.y + start.row as u16, viewport.y + start.row as u16,
(end.col - start.col) as u16 + 1, ((end.col - start.col) as u16 + 1).min(viewport.width),
1, 1,
), ),
selection_style, selection_style,
@ -633,6 +633,10 @@ impl Component for EditorView {
// clear with background color // clear with background color
surface.set_style(area, cx.editor.theme.get("ui.background")); surface.set_style(area, cx.editor.theme.get("ui.background"));
// if the terminal size suddenly changed, we need to trigger a resize
cx.editor
.resize(Rect::new(area.x, area.y, area.width, area.height - 1)); // - 1 to account for commandline
for (view, is_focused) in cx.editor.tree.views() { for (view, is_focused) in cx.editor.tree.views() {
let doc = cx.editor.document(view.doc).unwrap(); let doc = cx.editor.document(view.doc).unwrap();
self.render_view(doc, view, area, surface, &cx.editor.theme, is_focused); self.render_view(doc, view, area, surface, &cx.editor.theme, is_focused);

@ -160,7 +160,13 @@ impl Prompt {
if let Some(doc) = (self.doc_fn)(&self.line) { if let Some(doc) = (self.doc_fn)(&self.line) {
let text = ui::Text::new(doc.to_string()); let text = ui::Text::new(doc.to_string());
let area = Rect::new(completion_area.x, completion_area.y - 3, BASE_WIDTH * 3, 3); let viewport = area;
let area = viewport.intersection(Rect::new(
completion_area.x,
completion_area.y - 3,
BASE_WIDTH * 3,
3,
));
let background = theme.get("ui.help"); let background = theme.get("ui.help");
surface.clear_with(area, background); surface.clear_with(area, background);

@ -137,12 +137,12 @@ where
} }
/// Queries the backend for size and resizes if it doesn't match the previous size. /// Queries the backend for size and resizes if it doesn't match the previous size.
pub fn autoresize(&mut self) -> io::Result<()> { pub fn autoresize(&mut self) -> io::Result<Rect> {
let size = self.size()?; let size = self.size()?;
if size != self.viewport.area { if size != self.viewport.area {
self.resize(size)?; self.resize(size)?;
}; };
Ok(()) Ok(size)
} }
/// Synchronizes terminal size, calls the rendering closure, flushes the current internal state /// Synchronizes terminal size, calls the rendering closure, flushes the current internal state

@ -194,8 +194,9 @@ impl Editor {
} }
pub fn resize(&mut self, area: Rect) { pub fn resize(&mut self, area: Rect) {
self.tree.resize(area); if self.tree.resize(area) {
self._refresh(); self._refresh();
};
} }
pub fn focus_next(&mut self) { pub fn focus_next(&mut self) {

@ -293,9 +293,13 @@ impl Tree {
} }
} }
pub fn resize(&mut self, area: Rect) { pub fn resize(&mut self, area: Rect) -> bool {
self.area = area; if self.area != area {
self.recalculate(); self.area = area;
self.recalculate();
return true;
}
false
} }
pub fn recalculate(&mut self) { pub fn recalculate(&mut self) {

Loading…
Cancel
Save