Fix split sizes getting out of sync with the terminal size, refs #69
This commit is contained in:
parent
3c7729906c
commit
c0332bd935
6 changed files with 33 additions and 12 deletions
|
@ -122,11 +122,17 @@ impl Compositor {
|
|||
}
|
||||
|
||||
pub fn render(&mut self, cx: &mut Context) {
|
||||
self.terminal.autoresize().unwrap();
|
||||
let area = self.size();
|
||||
let area = self
|
||||
.terminal
|
||||
.autoresize()
|
||||
.expect("Unable to determine terminal size");
|
||||
|
||||
// TODO: need to recalculate view tree if necessary
|
||||
|
||||
let surface = self.terminal.current_buffer_mut();
|
||||
|
||||
let area = surface.area().clone();
|
||||
|
||||
for layer in &self.layers {
|
||||
layer.render(area, surface, cx)
|
||||
}
|
||||
|
|
|
@ -240,7 +240,7 @@ impl EditorView {
|
|||
for selection in doc
|
||||
.selection(view.id)
|
||||
.iter()
|
||||
.filter(|range| range.overlaps(&screen))
|
||||
.filter(|range| screen.overlaps(&range))
|
||||
{
|
||||
// TODO: render also if only one of the ranges is in viewport
|
||||
let mut start = view.screen_coords_at_pos(doc, text, selection.anchor);
|
||||
|
@ -261,7 +261,7 @@ impl EditorView {
|
|||
Rect::new(
|
||||
viewport.x + start.col 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,
|
||||
),
|
||||
selection_style,
|
||||
|
@ -633,6 +633,10 @@ impl Component for EditorView {
|
|||
// clear with background color
|
||||
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() {
|
||||
let doc = cx.editor.document(view.doc).unwrap();
|
||||
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) {
|
||||
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");
|
||||
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.
|
||||
pub fn autoresize(&mut self) -> io::Result<()> {
|
||||
pub fn autoresize(&mut self) -> io::Result<Rect> {
|
||||
let size = self.size()?;
|
||||
if size != self.viewport.area {
|
||||
self.resize(size)?;
|
||||
};
|
||||
Ok(())
|
||||
Ok(size)
|
||||
}
|
||||
|
||||
/// 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) {
|
||||
self.tree.resize(area);
|
||||
self._refresh();
|
||||
if self.tree.resize(area) {
|
||||
self._refresh();
|
||||
};
|
||||
}
|
||||
|
||||
pub fn focus_next(&mut self) {
|
||||
|
|
|
@ -293,9 +293,13 @@ impl Tree {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn resize(&mut self, area: Rect) {
|
||||
self.area = area;
|
||||
self.recalculate();
|
||||
pub fn resize(&mut self, area: Rect) -> bool {
|
||||
if self.area != area {
|
||||
self.area = area;
|
||||
self.recalculate();
|
||||
return true;
|
||||
}
|
||||
false
|
||||
}
|
||||
|
||||
pub fn recalculate(&mut self) {
|
||||
|
|
Loading…
Add table
Reference in a new issue