92 lines
2.9 KiB
Rust
92 lines
2.9 KiB
Rust
use ratatui::{
|
|
layout::{Constraint, Direction, Layout, Rect},
|
|
style::{Color, Modifier, Style},
|
|
text::{Line, Span},
|
|
widgets::{Block, Borders, Paragraph},
|
|
Frame,
|
|
};
|
|
use crate::app::App;
|
|
use super::{chat_list, messages, footer};
|
|
|
|
/// Порог ширины для компактного режима (одна панель)
|
|
const COMPACT_WIDTH: u16 = 80;
|
|
|
|
pub fn render(f: &mut Frame, app: &mut App) {
|
|
let area = f.area();
|
|
let is_compact = area.width < COMPACT_WIDTH;
|
|
|
|
let chunks = Layout::default()
|
|
.direction(Direction::Vertical)
|
|
.constraints([
|
|
Constraint::Length(3), // Folders/tabs
|
|
Constraint::Min(0), // Main content
|
|
Constraint::Length(1), // Commands footer
|
|
])
|
|
.split(area);
|
|
|
|
render_folders(f, chunks[0], app);
|
|
|
|
if is_compact {
|
|
// Компактный режим: показываем либо список чатов, либо открытый чат
|
|
if app.selected_chat_id.is_some() {
|
|
// Чат открыт — показываем только сообщения
|
|
messages::render(f, chunks[1], app);
|
|
} else {
|
|
// Чат не открыт — показываем только список чатов
|
|
chat_list::render(f, chunks[1], app);
|
|
}
|
|
} else {
|
|
// Обычный режим: две панели
|
|
let main_chunks = Layout::default()
|
|
.direction(Direction::Horizontal)
|
|
.constraints([
|
|
Constraint::Percentage(30), // Chat list
|
|
Constraint::Percentage(70), // Messages area
|
|
])
|
|
.split(chunks[1]);
|
|
|
|
chat_list::render(f, main_chunks[0], app);
|
|
messages::render(f, main_chunks[1], app);
|
|
}
|
|
|
|
footer::render(f, chunks[2], app);
|
|
}
|
|
|
|
fn render_folders(f: &mut Frame, area: Rect, app: &App) {
|
|
let mut spans = vec![];
|
|
|
|
// "All" всегда первая (клавиша 1)
|
|
let all_style = if app.selected_folder_id.is_none() {
|
|
Style::default()
|
|
.fg(Color::Yellow)
|
|
.add_modifier(Modifier::BOLD)
|
|
} else {
|
|
Style::default().fg(Color::White)
|
|
};
|
|
spans.push(Span::styled(" 1:All ", all_style));
|
|
|
|
// Папки из TDLib (клавиши 2, 3, 4...)
|
|
for (i, folder) in app.td_client.folders.iter().enumerate() {
|
|
spans.push(Span::raw("│"));
|
|
|
|
let style = if app.selected_folder_id == Some(folder.id) {
|
|
Style::default()
|
|
.fg(Color::Yellow)
|
|
.add_modifier(Modifier::BOLD)
|
|
} else {
|
|
Style::default().fg(Color::White)
|
|
};
|
|
|
|
spans.push(Span::styled(format!(" {}:{} ", i + 2, folder.name), style));
|
|
}
|
|
|
|
let folders_line = Line::from(spans);
|
|
let folders_widget = Paragraph::new(folders_line).block(
|
|
Block::default()
|
|
.title(" TTUI ")
|
|
.borders(Borders::ALL),
|
|
);
|
|
|
|
f.render_widget(folders_widget, area);
|
|
}
|