|
1 | 1 | use crate::config::Config; |
2 | 2 | use crate::plugins::AnimationFrame; |
3 | 3 | use crossterm::cursor::{Hide, MoveUp, Show}; |
| 4 | +use crossterm::terminal::size; |
4 | 5 | use crossterm::style::{Color, Print, ResetColor, SetForegroundColor}; |
5 | 6 | use crossterm::terminal::{Clear, ClearType}; |
6 | 7 | use crossterm::execute; |
@@ -72,17 +73,33 @@ pub fn print_animated_output( |
72 | 73 | let mut frame_index = 0; |
73 | 74 | let mut first_frame = true; |
74 | 75 |
|
| 76 | + let max_content_width = content_lines |
| 77 | + .iter() |
| 78 | + .map(|l| visible_width(l)) |
| 79 | + .max() |
| 80 | + .unwrap_or(0); |
| 81 | + let line_physical_width = max_logo_width + LOGO_INFO_GAP.len() + max_content_width; |
| 82 | + let term_width = size().map(|(w, _)| w as usize).unwrap_or(80); |
| 83 | + let wraps = (line_physical_width + term_width - 1) / term_width; |
| 84 | + let physical_lines = max_lines * std::cmp::max(1, wraps); |
| 85 | + let scroll_margin = physical_lines + 4; |
| 86 | + |
75 | 87 | let _ = execute!(out, Hide); |
76 | 88 |
|
| 89 | + for _ in 0..scroll_margin { |
| 90 | + let _ = execute!(out, Print("\n")); |
| 91 | + } |
| 92 | + let _ = execute!(out, MoveUp(scroll_margin as u16)); |
| 93 | + |
77 | 94 | loop { |
78 | 95 | let frame = &frames[frame_index]; |
79 | 96 |
|
80 | 97 | if !first_frame { |
81 | | - let _ = execute!(out, MoveUp(max_lines as u16)); |
| 98 | + let _ = execute!(out, MoveUp(scroll_margin as u16)); |
| 99 | + let _ = execute!(out, Clear(ClearType::FromCursorDown)); |
82 | 100 | } |
83 | 101 |
|
84 | 102 | for i in 0..max_lines { |
85 | | - let _ = execute!(out, Clear(ClearType::CurrentLine)); |
86 | 103 | let ascii_line = frame.lines.get(i).map(|line| line.as_str()).unwrap_or(""); |
87 | 104 | print_logo_line(&mut out, ascii_line, max_logo_width, config, force_plain_logo); |
88 | 105 | let _ = execute!(out, Print(LOGO_INFO_GAP)); |
|
0 commit comments