fixes
This commit is contained in:
@@ -352,10 +352,17 @@ pub fn render(f: &mut Frame, area: Rect, app: &App) {
|
||||
|
||||
// ID выбранного сообщения для подсветки
|
||||
let selected_msg_id = app.get_selected_message().map(|m| m.id);
|
||||
// Номер строки, где начинается выбранное сообщение (для автоскролла)
|
||||
let mut selected_msg_line: Option<usize> = None;
|
||||
|
||||
for msg in &app.td_client.current_chat_messages {
|
||||
// Проверяем, выбрано ли это сообщение
|
||||
let is_selected = selected_msg_id == Some(msg.id);
|
||||
|
||||
// Запоминаем строку начала выбранного сообщения
|
||||
if is_selected {
|
||||
selected_msg_line = Some(lines.len());
|
||||
}
|
||||
// Проверяем, нужно ли добавить разделитель даты
|
||||
let msg_day = get_day(msg.date);
|
||||
if last_day != Some(msg_day) {
|
||||
@@ -590,13 +597,33 @@ pub fn render(f: &mut Frame, area: Rect, app: &App) {
|
||||
let visible_height = message_chunks[1].height.saturating_sub(2) as usize;
|
||||
let total_lines = lines.len();
|
||||
|
||||
// Базовый скролл (показываем последние сообщения)
|
||||
let base_scroll = if total_lines > visible_height {
|
||||
total_lines - visible_height
|
||||
} else {
|
||||
0
|
||||
};
|
||||
|
||||
let scroll_offset = base_scroll.saturating_sub(app.message_scroll_offset) as u16;
|
||||
// Если выбрано сообщение, автоскроллим к нему
|
||||
let scroll_offset = if app.is_selecting_message() {
|
||||
if let Some(selected_line) = selected_msg_line {
|
||||
// Вычисляем нужный скролл, чтобы выбранное сообщение было видно
|
||||
if selected_line < visible_height / 2 {
|
||||
// Сообщение в начале — скроллим к началу
|
||||
0
|
||||
} else if selected_line > total_lines.saturating_sub(visible_height / 2) {
|
||||
// Сообщение в конце — скроллим к концу
|
||||
base_scroll
|
||||
} else {
|
||||
// Центрируем выбранное сообщение
|
||||
selected_line.saturating_sub(visible_height / 2)
|
||||
}
|
||||
} else {
|
||||
base_scroll.saturating_sub(app.message_scroll_offset)
|
||||
}
|
||||
} else {
|
||||
base_scroll.saturating_sub(app.message_scroll_offset)
|
||||
} as u16;
|
||||
|
||||
let messages_widget = Paragraph::new(lines)
|
||||
.block(Block::default().borders(Borders::ALL))
|
||||
|
||||
Reference in New Issue
Block a user