обновление
This commit is contained in:
@@ -1,3 +1,5 @@
|
||||
use ratatui::widgets::ListState;
|
||||
|
||||
use crate::track::Track;
|
||||
|
||||
#[derive(Clone)]
|
||||
@@ -25,6 +27,10 @@ pub struct Library {
|
||||
pub sort_mode: SortMode,
|
||||
/// Активный фильтр поиска (пусто — без фильтра)
|
||||
pub filter: String,
|
||||
/// Состояние скролла левой панели (сохраняется между кадрами)
|
||||
pub left_state: ListState,
|
||||
/// Состояние скролла правой панели
|
||||
pub right_state: ListState,
|
||||
}
|
||||
|
||||
impl Library {
|
||||
@@ -91,13 +97,25 @@ impl Library {
|
||||
});
|
||||
}
|
||||
|
||||
// Вычисляем right_selected ДО перемещения artists
|
||||
let right_selected = first_track_row_in(artists.first());
|
||||
|
||||
let mut left_state = ListState::default();
|
||||
let mut right_state = ListState::default();
|
||||
if !artists.is_empty() {
|
||||
left_state.select(Some(0));
|
||||
}
|
||||
right_state.select(Some(right_selected));
|
||||
|
||||
Library {
|
||||
all_tracks,
|
||||
artists,
|
||||
artist_selected: 0,
|
||||
right_selected: 0,
|
||||
right_selected,
|
||||
sort_mode: mode,
|
||||
filter,
|
||||
left_state,
|
||||
right_state,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -120,13 +138,22 @@ impl Library {
|
||||
rows,
|
||||
}];
|
||||
|
||||
let right_selected = first_track_row_in(artists.first());
|
||||
|
||||
let mut left_state = ListState::default();
|
||||
left_state.select(Some(0));
|
||||
let mut right_state = ListState::default();
|
||||
right_state.select(Some(right_selected));
|
||||
|
||||
Library {
|
||||
all_tracks,
|
||||
artists,
|
||||
artist_selected: 0,
|
||||
right_selected: 0,
|
||||
right_selected,
|
||||
sort_mode: mode,
|
||||
filter,
|
||||
left_state,
|
||||
right_state,
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -163,6 +190,10 @@ impl Library {
|
||||
}
|
||||
self.artist_selected = new as usize;
|
||||
self.right_selected = self.first_track_row();
|
||||
|
||||
// Синхронизируем ListState — иначе ratatui не знает о смене позиции
|
||||
self.left_state.select(Some(self.artist_selected));
|
||||
self.right_state.select(Some(self.right_selected));
|
||||
}
|
||||
|
||||
pub fn right_move(&mut self, delta: isize) {
|
||||
@@ -191,6 +222,7 @@ impl Library {
|
||||
}
|
||||
|
||||
self.right_selected = track_rows[new_pos as usize];
|
||||
self.right_state.select(Some(self.right_selected));
|
||||
}
|
||||
|
||||
pub fn right_goto_start(&mut self) {
|
||||
@@ -215,8 +247,20 @@ impl Library {
|
||||
}) {
|
||||
self.artist_selected = ai;
|
||||
self.right_selected = pos;
|
||||
self.left_state.select(Some(ai));
|
||||
self.right_state.select(Some(pos));
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn first_track_row_in(artist: Option<&ArtistView>) -> usize {
|
||||
artist
|
||||
.and_then(|a| {
|
||||
a.rows
|
||||
.iter()
|
||||
.position(|r| matches!(r, RightRow::Track { .. }))
|
||||
})
|
||||
.unwrap_or(0)
|
||||
}
|
||||
Reference in New Issue
Block a user