use crate::graphics::menus::retro_parameter_table::generic_logic::RowData;
use crate::graphics::menus::retro_parameter_table::generic_style::DEFAULT_ITEM_HEIGHT;
use ratatui::layout::{Constraint, Direction, Layout, Rect};
use ratatui::prelude::{Color, Style};
use ratatui::widgets::{Block, Paragraph};
use ratatui::Frame;
use unicode_segmentation::UnicodeSegmentation;
#[must_use]
pub fn frame_vertically_centered_rect(area: Rect, lines: usize) -> Rect {
Layout::default()
.direction(Direction::Vertical)
.constraints([
Constraint::Fill(1), Constraint::Length(u16::try_from(lines).unwrap_or(u16::MAX)), Constraint::Fill(1), ])
.split(area)[1]
}
pub fn render_full_centered_paragraph(frame: &mut Frame, text: &'static str, color: Option<Color>) {
let area = frame_vertically_centered_rect(frame.area(), text.lines().count());
frame.render_widget(
Paragraph::new(text)
.alignment(ratatui::layout::Alignment::Center),
area,
);
if let Some(color) = color {
frame.render_widget(
Block::default().style(Style::default().fg(color)),
frame.area(),
);
}
}
#[must_use]
pub fn constraint_length_from_widths(column_widths: &[u16]) -> Vec<Constraint> {
let mut constraints = vec![];
let mut iter = column_widths.iter().peekable();
while let Some(&size) = iter.next() {
if iter.peek().is_some() {
constraints.push(Constraint::Length(size));
} else {
constraints.push(Constraint::Length(size + 1));
}
}
constraints
}
#[allow(clippy::cast_possible_truncation)]
#[must_use]
pub fn calculate_max_column_widths(rows: &[RowData], headers: &[String]) -> Vec<u16> {
let mut column_widths: Vec<u16> = headers
.iter()
.map(|h| h.as_str().graphemes(true).count() as u16 + 1)
.collect();
let column_len = column_widths.len();
for row in rows {
let cell_widths = row.get_cell_widths();
for (i, &width) in cell_widths.iter().enumerate() {
if width as u16 > column_widths[i] {
column_widths[i % column_len] = width as u16;
}
}
}
column_widths
}
#[must_use]
pub fn calculate_sum_inner_row_heights(rows: &[RowData]) -> usize {
rows.iter()
.map(|r| {
r.get_cell_heights()
.iter()
.max()
.copied() .unwrap_or(DEFAULT_ITEM_HEIGHT) })
.sum::<usize>()
}