Krolyxon
Commit a816152

rmptuisrcapp.rs

116 lines · 3.2 KB · Rust

1use std::time::Duration;
2
3use crate::browser::FileBrowser;
4use crate::connection::Connection;
5use crate::list::ContentList;
6use mpd::Client;
7
8// Application result type
9pub type AppResult<T> = std::result::Result<T, Box<dyn std::error::Error>>;
10
11/// Application
12#[derive(Debug)]
13pub struct App {
14 /// check if app is running
15 pub running: bool,
16 pub conn: Connection,
17 pub song_list: ContentList<String>,
18 pub queue_list: ContentList<String>,
19 pub pl_list: ContentList<String>,
20 pub selected_tab: SelectedTab,
21 pub browser: FileBrowser,
22}
23
24#[derive(Debug, PartialEq, Clone)]
25pub enum SelectedTab {
26 DirectoryBrowser,
27 Queue,
28 Playlists,
29}
30
31impl SelectedTab {
32 fn as_usize(&self) {
33 match self {
34 SelectedTab::Queue => 0,
35 SelectedTab::Playlists => 1,
36 SelectedTab::DirectoryBrowser => 2,
37 };
38 }
39}
40
41impl App {
42 pub fn builder(addrs: &str) -> AppResult<Self> {
43 let mut conn = Connection::new(addrs).unwrap();
44 let mut queue_list = ContentList::new();
45 let mut pl_list = ContentList::new();
46 pl_list.list = Self::get_playlist(&mut conn.conn)?;
47
48 Self::get_queue(&mut conn, &mut queue_list.list);
49
50 let mut song_list = ContentList::new();
51 song_list.list = conn.songs_filenames.clone();
52
53 let browser = FileBrowser::new();
54 Ok(Self {
55 running: true,
56 conn,
57 song_list,
58 queue_list,
59 pl_list,
60 selected_tab: SelectedTab::DirectoryBrowser,
61 browser,
62 })
63 }
64
65 pub fn tick(&mut self) {
66 self.conn.update_state();
67 self.conn.update_progress();
68 self.conn.update_volume();
69 self.update_queue();
70 self.browser.update_directory(&mut self.conn).unwrap();
71 }
72
73 pub fn quit(&mut self) {
74 self.running = false;
75 }
76
77 pub fn get_queue(conn: &mut Connection, vec: &mut Vec<String>) {
78 // conn.conn.queue().unwrap().into_iter().for_each(|x| {
79 // if let Some(title) = x.title {
80 // if let Some(artist) = x.artist {
81 // vec.push(format!("{} - {}", artist, title));
82 // } else {
83 // vec.push(title)
84 // }
85 // } else {
86 // vec.push(x.file)
87 // }
88 // });
89 conn.conn.queue().unwrap().into_iter().for_each(|x| {
90 vec.push(x.file);
91 });
92 }
93
94 pub fn update_queue(&mut self) {
95 self.queue_list.list.clear();
96 Self::get_queue(&mut self.conn, &mut self.queue_list.list);
97 }
98
99 pub fn get_playlist(conn: &mut Client) -> AppResult<Vec<String>> {
100 let list: Vec<String> = conn.playlists()?.iter().map(|p| p.clone().name).collect();
101 Ok(list)
102 }
103
104 pub fn update_playlist(&mut self) -> AppResult<()> {
105 Self::get_playlist(&mut self.conn.conn)?;
106 Ok(())
107 }
108
109 pub fn cycle_tabls(&mut self) {
110 self.selected_tab = match self.selected_tab {
111 SelectedTab::DirectoryBrowser => SelectedTab::Queue,
112 SelectedTab::Queue => SelectedTab::Playlists,
113 SelectedTab::Playlists => SelectedTab::DirectoryBrowser,
114 };
115 }
116}