Fix space remaining (again) (#3377)

This commit was tested in a separate project
This commit is contained in:
Jonathan Kelley authored and GitHub committed 2024-12-17 13:42:09 -08:00
1 parent 95cde59606
commit fa48016d0c
1 file changed
+17 -26
+17 -26
View File
@@ -778,36 +778,32 @@ impl Output {
// The viewport might be clipped, but the math still needs to work out.
let actual_vh_height = self.viewport_current_height().min(term_size.height);
// We don't need to add any pushback if the frame is in the middle of the viewport
// We'll then add some pushback to ensure the log scrolls up above the viewport.
let max_scrollback = lines_printed.min(actual_vh_height.saturating_sub(1));
// Move the terminal's cursor down to the number of lines printed
let remaining_space = term_size
.height
.saturating_sub(frame_rect.y + frame_rect.height);
// Calculate how many lines we need to push back
// - to_push equals lines_printed when the frame is at the bottom
// - to_push is zero when the remaining space is greater/equal than the scrollback (the frame will get pushed naturally)
let mut padding = max_scrollback.saturating_sub(remaining_space);
// - padding equals lines_printed when the frame is at the bottom
// - padding is zero when the remaining space is greater/equal than the scrollback (the frame will get pushed naturally)
// Determine what extra padding is remaining after we've shifted the terminal down
// this will be the distance between the final line and the top of the frame, only if the
// final line has extended into the frame
let final_line = frame_rect.y + lines_printed;
let max_frame_top = term_size.height - actual_vh_height;
let padding = final_line
.saturating_sub(max_frame_top)
.clamp(0, actual_vh_height - 1);
// The only reliable way we can force the terminal downards is through "insert_before"
// The only reliable way we can force the terminal downards is through "insert_before".
//
// If we need to push the terminal down, we'll use this method with the number of lines
// Ratatui will handle this rest.
// FIXME(jon): eventuallay insert_before will get scroll regions, breaking this, but making the logic here simpler
if padding == 0 {
terminal.insert_before(remaining_space.min(lines_printed), |_| {})?;
// Determine what extra padding is remaining after we've shifted the terminal down
// this will be the distance between the final line and the top of the frame, only if the
// final line has extended into the frame
let frame_top = term_size.height - actual_vh_height;
let end_y = (frame_rect.y + lines_printed).min(term_size.height);
if end_y > frame_top {
padding = end_y.saturating_sub(frame_top);
}
}
//
// This also calls `.clear()` so we don't need to call clear at the end of this function.
//
// FIXME(jon): eventually insert_before will get scroll regions, breaking this, but making the logic here simpler
terminal.insert_before(remaining_space.min(lines_printed), |_| {})?;
// Wipe the viewport clean so it doesn't tear
crossterm::queue!(
@@ -838,11 +834,6 @@ impl Output {
)?;
}
// Force a clear
// Might've been triggered by insert_before already, but supposedly double-queuing is fine
// since this isn't a "real" synchronous clear
terminal.clear()?;
Ok(())
}