Krolyxon
Commit fd371e8

rmptuisrcbrowser.rs

88 lines · 2.4 KB · Rust

1use crate::{app::AppResult, connection::Connection, song::RSong};
2
3#[derive(Debug)]
4pub struct FileBrowser {
5 pub filetree: Vec<(String, String)>,
6 pub selected: usize,
7 pub prev_selected: usize,
8 pub path: String,
9 pub prev_path: String,
10
11 pub rsongs: Vec<Option<RSong>>,
12}
13
14impl FileBrowser {
15 pub fn new() -> FileBrowser {
16 FileBrowser {
17 filetree: Vec::new(),
18 selected: 0,
19 prev_selected: 0,
20 path: ".".to_string(),
21 prev_path: ".".to_string(),
22 rsongs: Vec::new(),
23 }
24 }
25
26 pub fn update_directory(&mut self, conn: &mut Connection) -> AppResult<()> {
27 self.filetree.clear();
28 self.filetree = conn
29 .conn
30 .listfiles(self.path.as_str())?
31 .into_iter()
32 .filter(|(f, _)| f == "directory" || f == "file")
33 .collect::<Vec<(String, String)>>();
34
35 Ok(())
36 }
37
38 // read all songs into a vec of RSongs
39 pub fn get_all_rsongs(&mut self, conn: &mut Connection) -> AppResult<Vec<Option<RSong>>> {
40 for (t, s) in self.filetree.iter() {
41 if t == "file" {
42 let s = conn.get_full_path(s)?;
43 let s = RSong::new(&mut conn.conn, s);
44 self.rsongs.push(Some(s));
45 } else if t == "directory" {
46 self.rsongs.push(None)
47 }
48 }
49
50 Ok(self.rsongs.clone())
51 }
52
53 // Go to next item in filetree
54 pub fn next(&mut self) {
55 // if self.selected < self.filetree.len() - 1 {
56 // self.selected += 1;
57 // }
58
59 if self.selected == self.filetree.len() - 1 {
60 self.selected = 0;
61 } else {
62 self.selected += 1;
63 }
64 }
65
66 /// Go to previous item in filetree
67 pub fn prev(&mut self) {
68 if self.selected == 0 {
69 self.selected = self.filetree.len() - 1;
70 } else {
71 self.selected -= 1;
72 }
73 }
74
75 pub fn handle_go_back(&mut self, conn: &mut Connection) -> AppResult<()> {
76 if self.prev_path != "." {
77 let r = self.path.rfind("/").unwrap();
78 self.path = self.path.as_str()[..r].to_string();
79 self.update_directory(conn)?;
80 } else {
81 self.path = self.prev_path.clone();
82 self.update_directory(conn)?;
83 }
84
85 self.selected = self.prev_selected;
86 Ok(())
87 }
88}