diff --git a/Cargo.lock b/Cargo.lock index 66bc7b2..5b269ed 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -981,7 +981,7 @@ dependencies = [ [[package]] name = "rumus" -version = "0.1.0" +version = "0.5.0" dependencies = [ "bincode", "crossterm", diff --git a/Cargo.toml b/Cargo.toml index f2c172d..6ac1b55 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "rumus" version = "0.5.0" -edition = "2026" +edition = "2024" [dependencies] ratatui = "0.29" diff --git a/src/ui.rs b/src/ui.rs index f2c60cd..932fa66 100644 --- a/src/ui.rs +++ b/src/ui.rs @@ -8,24 +8,34 @@ use crate::library::{RightRow, SortMode}; use crate::state::RepeatMode; pub fn draw(f: &mut Frame, app: &mut App) { + // Вертикально: верхняя часть (панели + эквалайзер) и статус let chunks = Layout::default() .direction(Direction::Vertical) .constraints([ Constraint::Min(1), - Constraint::Length(6), // эквалайзер Constraint::Length(3), // статус + время + mode + vol ]) .split(f.area()); + // Горизонтально: левая колонка (исполнители + эквалайзер) и правая (треки) let top = Layout::default() .direction(Direction::Horizontal) .constraints([Constraint::Percentage(30), Constraint::Percentage(70)]) .split(chunks[0]); - draw_left_panel(f, app, top[0]); + // Левая колонка делится вертикально: список сверху, эквалайзер снизу + let left_col = Layout::default() + .direction(Direction::Vertical) + .constraints([ + Constraint::Min(1), + Constraint::Length(8), // эквалайзер + ]) + .split(top[0]); + + draw_left_panel(f, app, left_col[0]); + draw_equalizer(f, app, left_col[1]); draw_right_panel(f, app, top[1]); - draw_equalizer(f, app, chunks[1]); - draw_status(f, app, chunks[2]); + draw_status(f, app, chunks[1]); if app.show_help { draw_help(f, f.area()); @@ -210,14 +220,29 @@ fn draw_right_panel(f: &mut Frame, app: &mut App, area: Rect) { } fn draw_equalizer(f: &mut Frame, app: &App, area: Rect) { + // Внутренняя ширина панели (минус 2 символа рамки) + let inner_width = area.width.saturating_sub(2) as usize; + if inner_width == 0 { + return; + } + + // Каждый столбик занимает 2 ячейки: 1 символ + 1 gap. + // Значит число столбиков = ширина / 2. + let num_bars = (inner_width / 2).max(4); + let bars_data = app.player.spectrum.bars(); - let num_bars = 32; + let step = (bars_data.len() / num_bars).max(1); let mut display: Vec = Vec::with_capacity(num_bars); for i in 0..num_bars { - let a = bars_data[i * 2]; - let b = bars_data[i * 2 + 1]; - display.push((a + b) / 2.0); + let start = i * step; + let end = (start + step).min(bars_data.len()); + if start >= bars_data.len() { + display.push(0.0); + continue; + } + let sum: f32 = bars_data[start..end].iter().sum(); + display.push(sum / (end - start).max(1) as f32); } let bars: Vec = display