87 lines
2.7 KiB
Rust
87 lines
2.7 KiB
Rust
use ratatui::{
|
||
layout::{Alignment, Rect},
|
||
style::{Color, Modifier, Style},
|
||
text::Line,
|
||
widgets::{Block, Borders, Clear, Paragraph},
|
||
Frame,
|
||
};
|
||
|
||
/// Рендерит центрированную модалку с заданным содержимым
|
||
///
|
||
/// # Параметры
|
||
/// - `f`: Frame для рендеринга
|
||
/// - `area`: Область экрана
|
||
/// - `title`: Заголовок модалки
|
||
/// - `content`: Содержимое модалки (строки текста)
|
||
/// - `width`: Ширина модалки
|
||
/// - `height`: Высота модалки
|
||
/// - `border_color`: Цвет рамки
|
||
pub fn render_modal(
|
||
f: &mut Frame,
|
||
area: Rect,
|
||
title: &str,
|
||
content: Vec<Line>,
|
||
width: u16,
|
||
height: u16,
|
||
border_color: Color,
|
||
) {
|
||
// Центрируем модалку
|
||
let x = area.x + (area.width.saturating_sub(width)) / 2;
|
||
let y = area.y + (area.height.saturating_sub(height)) / 2;
|
||
|
||
let modal_area = Rect::new(x, y, width.min(area.width), height.min(area.height));
|
||
|
||
// Очищаем область под модалкой
|
||
f.render_widget(Clear, modal_area);
|
||
|
||
// Рендерим модалку
|
||
let modal = Paragraph::new(content)
|
||
.block(
|
||
Block::default()
|
||
.borders(Borders::ALL)
|
||
.border_style(Style::default().fg(border_color))
|
||
.title(format!(" {} ", title))
|
||
.title_style(
|
||
Style::default()
|
||
.fg(border_color)
|
||
.add_modifier(Modifier::BOLD),
|
||
),
|
||
)
|
||
.alignment(Alignment::Center);
|
||
|
||
f.render_widget(modal, modal_area);
|
||
}
|
||
|
||
/// Рендерит модалку подтверждения удаления
|
||
pub fn render_delete_confirm_modal(f: &mut Frame, area: Rect) {
|
||
use ratatui::text::Span;
|
||
|
||
let content = vec![
|
||
Line::from(""),
|
||
Line::from(Span::styled(
|
||
"Удалить сообщение?",
|
||
Style::default()
|
||
.fg(Color::White)
|
||
.add_modifier(Modifier::BOLD),
|
||
)),
|
||
Line::from(""),
|
||
Line::from(vec![
|
||
Span::styled(
|
||
" [y/Enter] ",
|
||
Style::default()
|
||
.fg(Color::Green)
|
||
.add_modifier(Modifier::BOLD),
|
||
),
|
||
Span::raw("Да"),
|
||
Span::raw(" "),
|
||
Span::styled(
|
||
" [n/Esc] ",
|
||
Style::default().fg(Color::Red).add_modifier(Modifier::BOLD),
|
||
),
|
||
Span::raw("Нет"),
|
||
]),
|
||
];
|
||
|
||
render_modal(f, area, "Подтверждение", content, 40, 7, Color::Red);
|
||
}
|