много правок и переработка библиотеки тревов
This commit is contained in:
102
src/ui.rs
102
src/ui.rs
@@ -1,6 +1,6 @@
|
||||
use ratatui::prelude::*;
|
||||
use ratatui::widgets::{
|
||||
Bar, BarChart, BarGroup, Block, Borders, Clear, List, ListItem, Paragraph,
|
||||
Bar, BarChart, BarGroup, Block, Borders, Clear, List, ListItem, Paragraph, Wrap,
|
||||
};
|
||||
|
||||
use crate::app::{App, InputMode, Panel};
|
||||
@@ -70,8 +70,8 @@ fn draw_left_panel(f: &mut Frame, app: &mut App, area: Rect) {
|
||||
SortMode::ByAlbum => " Альбомы ",
|
||||
SortMode::ByFilename => " Источник ",
|
||||
};
|
||||
let album_color = Color::Rgb(100, 149, 237);
|
||||
let title = Span::styled(title_text, Style::default().fg(album_color));
|
||||
let album_color = Color::Rgb(100, 149, 237);
|
||||
let title = Span::styled(title_text, Style::default().fg(album_color));
|
||||
|
||||
let list = List::new(items)
|
||||
.block(Block::default().borders(Borders::ALL).title(title))
|
||||
@@ -133,7 +133,7 @@ fn draw_right_panel(f: &mut Frame, app: &mut App, area: Rect) {
|
||||
}
|
||||
RightRow::Track { index_in_library } => {
|
||||
let is_playing = Some(*index_in_library) == app.playing_index;
|
||||
let marker = if is_playing { "* " } else { " " };
|
||||
let marker = if is_playing { "♪ " } else { " " };
|
||||
|
||||
let (title, num, dur) = match app.library.track(*index_in_library) {
|
||||
Some(t) => (
|
||||
@@ -151,15 +151,15 @@ fn draw_right_panel(f: &mut Frame, app: &mut App, area: Rect) {
|
||||
} else {
|
||||
Style::default()
|
||||
};
|
||||
|
||||
|
||||
let left = format!(" {}{}{}", marker, num, title);
|
||||
let inner_width = area.width.saturating_sub(4) as usize;
|
||||
|
||||
|
||||
let left_len = left.chars().count();
|
||||
let dur_len = dur.chars().count();
|
||||
let pad = inner_width
|
||||
.saturating_sub(left_len + dur_len)
|
||||
.max(1);
|
||||
.saturating_sub(left_len + dur_len)
|
||||
.max(1);
|
||||
|
||||
ListItem::new(Line::from(vec![
|
||||
Span::styled(left, style),
|
||||
@@ -206,8 +206,8 @@ fn draw_right_panel(f: &mut Frame, app: &mut App, area: Rect) {
|
||||
}
|
||||
}
|
||||
};
|
||||
let album_color = Color::Rgb(100, 149, 237);
|
||||
let title = Span::styled(title_text, Style::default().fg(album_color));
|
||||
let album_color = Color::Rgb(100, 149, 237);
|
||||
let title = Span::styled(title_text, Style::default().fg(album_color));
|
||||
|
||||
let highlight = if app.active_panel == Panel::Right {
|
||||
Style::default().add_modifier(Modifier::REVERSED)
|
||||
@@ -300,11 +300,11 @@ fn draw_status(f: &mut Frame, app: &App, area: Rect) {
|
||||
|
||||
let status = Paragraph::new(status_text)
|
||||
.block(
|
||||
Block::default()
|
||||
.borders(Borders::ALL)
|
||||
.title(status_title)
|
||||
.title_style(Style::default().fg(Color::Rgb(100, 149, 237)))
|
||||
);
|
||||
Block::default()
|
||||
.borders(Borders::ALL)
|
||||
.title(status_title)
|
||||
.title_style(Style::default().fg(Color::Rgb(100, 149, 237)))
|
||||
);
|
||||
f.render_widget(status, inner[0]);
|
||||
|
||||
let (pos, total) = app.progress();
|
||||
@@ -318,11 +318,11 @@ fn draw_status(f: &mut Frame, app: &App, area: Rect) {
|
||||
let time = Paragraph::new(time_text)
|
||||
.alignment(Alignment::Center)
|
||||
.block(
|
||||
Block::default()
|
||||
.borders(Borders::ALL)
|
||||
.title(" Время ")
|
||||
.title_style(Style::default().fg(Color::Rgb(100, 149, 237)))
|
||||
);
|
||||
Block::default()
|
||||
.borders(Borders::ALL)
|
||||
.title(" Время ")
|
||||
.title_style(Style::default().fg(Color::Rgb(100, 149, 237)))
|
||||
);
|
||||
f.render_widget(time, inner[1]);
|
||||
|
||||
let mode_str = match (app.repeat, app.shuffle) {
|
||||
@@ -338,7 +338,7 @@ fn draw_status(f: &mut Frame, app: &App, area: Rect) {
|
||||
.block(
|
||||
Block::default()
|
||||
.borders(Borders::ALL)
|
||||
.title(" Pежим ")
|
||||
.title(" Режим ")
|
||||
.title_style(Style::default().fg(Color::Rgb(100, 149, 237)))
|
||||
);
|
||||
f.render_widget(mode, inner[2]);
|
||||
@@ -356,13 +356,15 @@ fn draw_status(f: &mut Frame, app: &App, area: Rect) {
|
||||
}
|
||||
|
||||
fn draw_dirs(f: &mut Frame, app: &App, screen: Rect) {
|
||||
let width = 70u16.min(screen.width.saturating_sub(4));
|
||||
let total_lines = app.extra_dirs().len() + 8;
|
||||
let desired_height = (total_lines + 2) as u16; // +2 на рамки
|
||||
let count = app.sources().len();
|
||||
|
||||
// Ограничиваем высотой экрана
|
||||
let max_h = screen.height.saturating_sub(2);
|
||||
let height = desired_height.min(max_h).max(5); // минимум 5 строк
|
||||
// Строки: заголовок (1) + пустая (1) + "Список" (1) + N + пустая (1) + подсказка (1)
|
||||
let content_lines = 5 + count;
|
||||
let desired_height = (content_lines + 2) as u16;
|
||||
|
||||
let width = 70u16.min(screen.width.saturating_sub(4));
|
||||
let max_h = screen.height.saturating_sub(4);
|
||||
let height = desired_height.min(max_h).max(5);
|
||||
|
||||
let x = (screen.width.saturating_sub(width)) / 2;
|
||||
let y = (screen.height.saturating_sub(height)) / 2;
|
||||
@@ -378,40 +380,34 @@ fn draw_dirs(f: &mut Frame, app: &App, screen: Rect) {
|
||||
|
||||
let mut lines = vec![
|
||||
Line::from(Span::styled(
|
||||
" Директории библиотеки ",
|
||||
" Источники библиотеки ",
|
||||
title_color.add_modifier(Modifier::BOLD),
|
||||
)),
|
||||
Line::from(""),
|
||||
Line::from(Span::styled(" Базовые", header)),
|
||||
Line::from(vec![
|
||||
Span::styled(" [0] ", dim),
|
||||
Span::raw(app.base_dir()),
|
||||
]),
|
||||
Line::from(Span::styled(" Список", header)),
|
||||
];
|
||||
|
||||
if !app.extra_dirs().is_empty() {
|
||||
lines.push(Line::from(""));
|
||||
lines.push(Line::from(Span::styled(" Дополнительные (:add)", header)));
|
||||
for (i, dir) in app.extra_dirs().iter().enumerate() {
|
||||
lines.push(Line::from(vec![
|
||||
Span::styled(format!(" [{}] ", i + 1), dim),
|
||||
Span::raw(dir.clone()),
|
||||
]));
|
||||
}
|
||||
for (i, src) in app.sources().iter().enumerate() {
|
||||
lines.push(Line::from(vec![
|
||||
Span::styled(format!(" [{}] ", i), dim),
|
||||
Span::raw(src.clone()),
|
||||
]));
|
||||
}
|
||||
|
||||
lines.push(Line::from(""));
|
||||
lines.push(Line::from(Span::styled(
|
||||
" :rmdir <N> — удалить, :clear — очистить всё, Esc — закрыть",
|
||||
" :rm <N> — удалить, Esc — закрыть",
|
||||
dim,
|
||||
)));
|
||||
|
||||
let para = Paragraph::new(lines).block(
|
||||
Block::default()
|
||||
.borders(Borders::ALL)
|
||||
.border_style(title_color)
|
||||
.title(" Библиотека "),
|
||||
);
|
||||
let para = Paragraph::new(lines)
|
||||
.block(
|
||||
Block::default()
|
||||
.borders(Borders::ALL)
|
||||
.border_style(title_color)
|
||||
.title(" Библиотека "),
|
||||
)
|
||||
.wrap(Wrap { trim: false });
|
||||
|
||||
f.render_widget(para, area);
|
||||
}
|
||||
@@ -459,10 +455,14 @@ fn draw_help(f: &mut Frame, screen: Rect) {
|
||||
Line::from(" 1..9 перейти к 10%..90% трека"),
|
||||
Line::from(""),
|
||||
Line::from(Span::styled(" Команды", header)),
|
||||
Line::from(" :add <путь> добавить директорию"),
|
||||
Line::from(" :add <путь> добавить в сессию"),
|
||||
Line::from(" :load <путь> заменить сессию"),
|
||||
Line::from(" :reload пересканировать всё"),
|
||||
Line::from(" :save сохранить библиотеку"),
|
||||
Line::from(" :dirs управление директориями"),
|
||||
Line::from(" :savepl <файл> экспорт в M3U/PLS"),
|
||||
Line::from(" :dirs список источников"),
|
||||
Line::from(" :rm <N> удалить источник"),
|
||||
Line::from(" :clear очистить источники"),
|
||||
Line::from(" :help эта справка"),
|
||||
Line::from(" :q выход"),
|
||||
Line::from(""),
|
||||
|
||||
Reference in New Issue
Block a user