Krolyxon
Commit 00c5c12

rmptuisrcui.rs

183 lines · 6.5 KB · Rust

1use crate::{
2 app::{App, AppResult, SelectedTab},
3 browser::FileBrowser,
4};
5use ratatui::{
6 prelude::*,
7 widgets::{block::Title, *},
8};
9
10/// Renders the user interface widgets
11pub fn render(app: &mut App, frame: &mut Frame) {
12 // This is where you add new widgets.
13 // See the following resources:
14 // - https://docs.rs/ratatui/latest/ratatui/widgets/index.html
15 // - https://github.com/ratatui-org/ratatui/tree/master/examples
16
17 // Layout
18 let layout = Layout::default()
19 .direction(Direction::Vertical)
20 .constraints(vec![
21 Constraint::Percentage(0),
22 // Constraint::Percentage(88),
23 Constraint::Percentage(93),
24 Constraint::Percentage(7),
25 ])
26 .split(frame.size());
27 //
28 // let outer_layout = Layout::default()
29 // .direction(Direction::Horizontal)
30 // .constraints(vec![Constraint::Percentage(50), Constraint::Percentage(50)])
31 // .split(main_layout[1]);
32 //
33 // let inner_layout = Layout::default()
34 // .direction(Direction::Vertical)
35 // .constraints(vec![Constraint::Percentage(50), Constraint::Percentage(50)])
36 // .split(outer_layout[1]);
37
38 // draw_song_list(frame, app, outer_layout[0]);
39 // draw_queue(frame, app, inner_layout[0]);
40 // draw_playlists(frame, app, inner_layout[1]);
41 draw_progress_bar(frame, app, layout[2]);
42
43 // let highlight_style = (Color::default(), tailwind::YELLOW.c700);
44 // let tab = Tabs::new(vec!["Songs List", "Play Queue", "Playlists"])
45 // .block(Block::default().title("Tabs").borders(Borders::ALL))
46 // .style(Style::default().white())
47 // .highlight_style(highlight_style)
48 // .divider(" ")
49 // .select(app.selected_tab.clone() as usize)
50 // .padding("", "");
51 // frame.render_widget(tab, layout[0]);
52
53 match app.selected_tab {
54 // SelectedTab::SongList => draw_song_list(frame, app, layout[1]),
55 SelectedTab::Queue => draw_queue(frame, app, layout[1]),
56 SelectedTab::Playlists => draw_playlists(frame, app, layout[1]),
57 SelectedTab::DirectoryBrowser => draw_directory_browser(frame, app, layout[1]),
58 }
59}
60
61/// draws list of songs
62fn draw_song_list(frame: &mut Frame, app: &mut App, size: Rect) {
63 let mut song_state = ListState::default();
64 let total_songs = app.conn.conn.stats().unwrap().songs.to_string();
65 let list = List::new(app.conn.songs_filenames.clone())
66 .block(
67 Block::default()
68 .title("Song List".green().bold())
69 .title(
70 Title::from(format!("Total Songs: {}", total_songs).bold().green())
71 .alignment(Alignment::Right),
72 )
73 .borders(Borders::ALL),
74 )
75 .highlight_style(Style::new().add_modifier(Modifier::REVERSED))
76 .highlight_symbol(">>")
77 .repeat_highlight_symbol(true);
78
79 song_state.select(Some(app.song_list.index));
80 frame.render_stateful_widget(list, size, &mut song_state);
81}
82
83/// draws playing queue
84fn draw_queue(frame: &mut Frame, app: &mut App, size: Rect) {
85 let mut queue_state = ListState::default();
86 let title = Block::default().title(Title::from("Play Queue".green().bold()));
87 let list = List::new(app.queue_list.list.clone())
88 .block(title.borders(Borders::ALL))
89 .highlight_style(Style::new().add_modifier(Modifier::REVERSED))
90 .highlight_symbol(">>")
91 .repeat_highlight_symbol(true);
92
93 queue_state.select(Some(app.queue_list.index));
94 frame.render_stateful_widget(list, size, &mut queue_state);
95}
96
97/// draws all playlists
98fn draw_playlists(frame: &mut Frame, app: &mut App, size: Rect) {
99 let mut state = ListState::default();
100
101 let title = Block::default().title(Title::from("Playlist".green().bold()));
102 let list = List::new(app.pl_list.list.clone())
103 .block(title.borders(Borders::ALL))
104 .highlight_style(Style::new().add_modifier(Modifier::REVERSED))
105 .highlight_symbol(">>")
106 .repeat_highlight_symbol(true);
107
108 state.select(Some(app.pl_list.index));
109 frame.render_stateful_widget(list, size, &mut state);
110}
111
112// Progress Bar
113fn draw_progress_bar(frame: &mut Frame, app: &mut App, size: Rect) {
114 let song = app
115 .conn
116 .now_playing()
117 .unwrap()
118 .unwrap_or_else(|| "No Title Found".to_string());
119
120 let state = &app.conn.state;
121 // let (elapsed, total) = app.conn.conn.status().unwrap().time.unwrap_or_default();
122
123 let title = Block::default()
124 .title(Title::from(format!("{}: ", state).red().bold()))
125 .title(Title::from(song.green().bold()))
126 .title(
127 Title::from(
128 format!(
129 "{}/{}",
130 app.conn.elapsed.as_secs(),
131 app.conn.total_duration.as_secs()
132 )
133 .cyan()
134 .bold(),
135 )
136 .alignment(Alignment::Right),
137 )
138 .borders(Borders::ALL);
139
140 // .title(Title::from(app.conn.conn.status().unwrap_or_default().volume.to_string().yellow())).title_alignment(Alignment::Right);
141 let progress_bar = LineGauge::default()
142 .block(title.borders(Borders::ALL))
143 .gauge_style(
144 Style::default()
145 .fg(Color::LightBlue)
146 .bg(Color::Gray)
147 .add_modifier(Modifier::BOLD),
148 )
149 .line_set(symbols::line::THICK)
150 .ratio(app.conn.get_progress_ratio());
151
152 frame.render_widget(progress_bar, size);
153}
154
155fn draw_directory_browser(frame: &mut Frame, app: &mut App, size: Rect) {
156 let mut song_state = ListState::default();
157 let total_songs = app.conn.conn.stats().unwrap().songs.to_string();
158 let mut list: Vec<String> = vec![];
159 for (t, s) in app.browser.filetree.iter() {
160 if t == "file" {
161 list.push(s.to_string());
162 } else {
163 list.push(format!("[{}]", *s));
164 }
165 }
166 let list = List::new(list)
167 .block(
168 Block::default()
169 .title(format!("File Browser: {}", app.browser.path.clone()).bold())
170 .title(
171 Title::from(format!("Total Songs: {}", total_songs).bold().green())
172 .alignment(Alignment::Right),
173 )
174 .borders(Borders::ALL),
175 )
176 .highlight_style(Style::new().add_modifier(Modifier::REVERSED))
177 .highlight_symbol(">>")
178 .repeat_highlight_symbol(true)
179 .scroll_padding(20);
180
181 song_state.select(Some(app.browser.selected));
182 frame.render_stateful_widget(list, size, &mut song_state);
183}