1use crate::file_manager::FileEntry;
2use std::path::{Path, PathBuf};
3
4#[derive(Default)]
5pub struct ParentState {
6 entries: Vec<FileEntry>,
7 selected_idx: Option<usize>,
8 last_path: Option<PathBuf>,
9 request_id: u64,
10}
11
12impl ParentState {
13 pub fn request_id(&self) -> u64 {
14 self.request_id
15 }
16 pub fn entries(&self) -> &[FileEntry] {
17 &self.entries
18 }
19 pub fn selected_idx(&self) -> Option<usize> {
20 self.selected_idx
21 }
22
23 pub fn should_request(&self, parent_path: &Path) -> bool {
24 if self.entries.is_empty() {
25 return true;
26 }
27 Some(parent_path) != self.last_path.as_deref()
28 }
29
30 pub fn prepare_new_request(&mut self, path: PathBuf) -> u64 {
31 self.request_id += 1;
32 self.last_path = Some(path);
33 self.request_id
34 }
35
36 pub fn update_from_entries(
37 &mut self,
38 entries: Vec<FileEntry>,
39 current_name: &str,
40 req_id: u64,
41 ) {
42 if req_id < self.request_id {
43 return;
44 }
45 self.selected_idx = entries.iter().position(|e| e.name_str() == current_name);
47 self.entries = entries;
48 self.request_id = req_id;
49 }
50
51 pub fn clear(&mut self) {
52 self.entries.clear();
53 self.selected_idx = None;
54 self.last_path = None;
55 self.request_id += 1;
56 }
57}