rmptuid0b76c3
add playlist viwer
+66 −3
1 file changed
- M src/ui.rs +66 −3
| @@ -32,7 +32,8 @@ pub fn render(app: &mut App, frame: &mut Frame) { | |||
| 32 | 32 | ||
| 33 | 33 | match app.selected_tab { | |
| 34 | 34 | SelectedTab::Queue => draw_queue(frame, app, layout[0]), | |
| 35 | − | SelectedTab::Playlists => draw_playlists(frame, app, layout[0]), | |
| 35 | + | // SelectedTab::Playlists => draw_playlists(frame, app, layout[0]), | |
| 36 | + | SelectedTab::Playlists => draw_playlist_viewer(frame, app, layout[0]), | |
| 36 | 37 | SelectedTab::DirectoryBrowser => draw_directory_browser(frame, app, layout[0]), | |
| 37 | 38 | } | |
| 38 | 39 | ||
| @@ -122,7 +123,7 @@ fn draw_directory_browser(frame: &mut Frame, app: &mut App, size: Rect) { | |||
| 122 | 123 | let table = Table::new( | |
| 123 | 124 | rows, | |
| 124 | 125 | [ | |
| 125 | − | Constraint::Percentage(20), | |
| 126 | + | Constraint::Percentage(34), | |
| 126 | 127 | Constraint::Percentage(3), | |
| 127 | 128 | Constraint::Min(30), | |
| 128 | 129 | Constraint::Percentage(30), | |
| @@ -220,7 +221,7 @@ fn draw_queue(frame: &mut Frame, app: &mut App, size: Rect) { | |||
| 220 | 221 | let table = Table::new( | |
| 221 | 222 | rows, | |
| 222 | 223 | [ | |
| 223 | − | Constraint::Percentage(20), | |
| 224 | + | Constraint::Percentage(34), | |
| 224 | 225 | Constraint::Percentage(3), | |
| 225 | 226 | Constraint::Min(30), | |
| 226 | 227 | Constraint::Percentage(30), | |
| @@ -379,6 +380,68 @@ fn draw_progress_bar(frame: &mut Frame, app: &mut App, size: Rect) { | |||
| 379 | 380 | frame.render_widget(progress_bar, size); | |
| 380 | 381 | } | |
| 381 | 382 | ||
| 383 | + | fn draw_playlist_viewer(frame: &mut Frame, app: &mut App, area: Rect) { | |
| 384 | + | let layouts = Layout::default() | |
| 385 | + | .direction(Direction::Horizontal) | |
| 386 | + | .constraints(vec![Constraint::Percentage(40), Constraint::Percentage(60)]) | |
| 387 | + | .split(area); | |
| 388 | + | ||
| 389 | + | // Draw list of playlists | |
| 390 | + | let mut state = ListState::default(); | |
| 391 | + | let title = Block::default().title(Title::from("Playlist".green().bold())); | |
| 392 | + | let list = List::new(app.pl_list.list.clone()) | |
| 393 | + | .block(title.borders(Borders::ALL)) | |
| 394 | + | .highlight_style( | |
| 395 | + | Style::new() | |
| 396 | + | .fg(Color::Cyan) | |
| 397 | + | .bg(Color::Black) | |
| 398 | + | .add_modifier(Modifier::BOLD) | |
| 399 | + | .add_modifier(Modifier::REVERSED), | |
| 400 | + | ) | |
| 401 | + | .highlight_symbol(">>") | |
| 402 | + | .repeat_highlight_symbol(true); | |
| 403 | + | state.select(Some(app.pl_list.index)); | |
| 404 | + | frame.render_stateful_widget(list, layouts[0], &mut state); | |
| 405 | + | ||
| 406 | + | // Playlist viewer | |
| 407 | + | let pl_name = app.pl_list.list.get(app.pl_list.index).unwrap(); | |
| 408 | + | let songs = app.conn.conn.playlist(pl_name).unwrap(); | |
| 409 | + | let rows = songs.iter().map(|song| { | |
| 410 | + | let title = song.clone().title.unwrap_or_default().cyan(); | |
| 411 | + | let artist = song.clone().artist.unwrap_or_else(|| song.clone().file); | |
| 412 | + | let time = App::format_time(song.clone().duration.unwrap_or_else(|| Duration::new(0, 0))); | |
| 413 | + | ||
| 414 | + | let row = Row::new(vec![ | |
| 415 | + | Cell::from(artist), | |
| 416 | + | Cell::from(title), | |
| 417 | + | Cell::from(time.to_string().green()), | |
| 418 | + | ]); | |
| 419 | + | row | |
| 420 | + | }); | |
| 421 | + | ||
| 422 | + | let title = Block::default() | |
| 423 | + | .title(format!("Content: ({} items)", songs.len()).bold()) | |
| 424 | + | .borders(Borders::ALL); | |
| 425 | + | let table = Table::new( | |
| 426 | + | rows, | |
| 427 | + | vec![ | |
| 428 | + | Constraint::Percentage(40), | |
| 429 | + | Constraint::Percentage(40), | |
| 430 | + | Constraint::Percentage(20), | |
| 431 | + | ], | |
| 432 | + | ) | |
| 433 | + | .block(title) | |
| 434 | + | .highlight_style( | |
| 435 | + | Style::default() | |
| 436 | + | .add_modifier(Modifier::REVERSED) | |
| 437 | + | .fg(Color::Cyan) | |
| 438 | + | .bg(Color::Black), | |
| 439 | + | ) | |
| 440 | + | .highlight_symbol(">>") | |
| 441 | + | .flex(layout::Flex::SpaceBetween); | |
| 442 | + | frame.render_widget(table, layouts[1]); | |
| 443 | + | } | |
| 444 | + | ||
| 382 | 445 | fn draw_add_to_playlist(frame: &mut Frame, app: &mut App, area: Rect) { | |
| 383 | 446 | let area = centered_rect(40, 50, area); | |
| 384 | 447 | let mut state = ListState::default(); | |