fixes
This commit is contained in:
86
src/ui/components/modal.rs
Normal file
86
src/ui/components/modal.rs
Normal file
@@ -0,0 +1,86 @@
|
||||
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);
|
||||
}
|
||||
Reference in New Issue
Block a user