Krolyxon
Commit 04e5d2a

rmptuisrcapp.rs

99 lines · 2.7 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 queue_list: ContentList<String>,
18 pub pl_list: ContentList<String>,
19 pub selected_tab: SelectedTab,
20 pub browser: FileBrowser,
21}
22
23#[derive(Debug, PartialEq, Clone)]
24pub enum SelectedTab {
25 DirectoryBrowser,
26 Queue,
27 Playlists,
28}
29
30impl App {
31 pub fn builder(addrs: &str) -> AppResult<Self> {
32 let mut conn = Connection::new(addrs).unwrap();
33 let mut queue_list = ContentList::new();
34 let mut pl_list = ContentList::new();
35 pl_list.list = Self::get_playlist(&mut conn.conn)?;
36
37 Self::get_queue(&mut conn, &mut queue_list.list);
38
39 let browser = FileBrowser::new();
40 Ok(Self {
41 running: true,
42 conn,
43 queue_list,
44 pl_list,
45 selected_tab: SelectedTab::DirectoryBrowser,
46 browser,
47 })
48 }
49
50 pub fn tick(&mut self) {
51 self.conn.update_status();
52 self.update_queue();
53 // self.browser.update_directory(&mut self.conn).unwrap();
54 }
55
56 pub fn quit(&mut self) {
57 self.running = false;
58 }
59
60 pub fn get_queue(conn: &mut Connection, vec: &mut Vec<String>) {
61 // conn.conn.queue().unwrap().into_iter().for_each(|x| {
62 // if let Some(title) = x.title {
63 // if let Some(artist) = x.artist {
64 // vec.push(format!("{} - {}", artist, title));
65 // } else {
66 // vec.push(title)
67 // }
68 // } else {
69 // vec.push(x.file)
70 // }
71 // });
72 conn.conn.queue().unwrap().into_iter().for_each(|x| {
73 vec.push(x.file);
74 });
75 }
76
77 pub fn update_queue(&mut self) {
78 self.queue_list.list.clear();
79 Self::get_queue(&mut self.conn, &mut self.queue_list.list);
80 }
81
82 pub fn get_playlist(conn: &mut Client) -> AppResult<Vec<String>> {
83 let list: Vec<String> = conn.playlists()?.iter().map(|p| p.clone().name).collect();
84 Ok(list)
85 }
86
87 pub fn update_playlist(&mut self) -> AppResult<()> {
88 Self::get_playlist(&mut self.conn.conn)?;
89 Ok(())
90 }
91
92 pub fn cycle_tabls(&mut self) {
93 self.selected_tab = match self.selected_tab {
94 SelectedTab::DirectoryBrowser => SelectedTab::Queue,
95 SelectedTab::Queue => SelectedTab::Playlists,
96 SelectedTab::Playlists => SelectedTab::DirectoryBrowser,
97 };
98 }
99}