use crate::core::FileEntry;
use std::path::{Path, PathBuf};
#[derive(Default)]
pub(crate) struct ParentState {
entries: Vec<FileEntry>,
selected_idx: Option<usize>,
last_path: Option<PathBuf>,
request_id: u64,
}
impl ParentState {
#[inline]
pub(crate) fn request_id(&self) -> u64 {
self.request_id
}
#[inline]
pub(crate) fn entries(&self) -> &[FileEntry] {
&self.entries
}
#[inline]
pub(crate) fn selected_idx(&self) -> Option<usize> {
self.selected_idx
}
pub(crate) fn last_path(&self) -> Option<&Path> {
self.last_path.as_deref()
}
pub(crate) fn should_request(&self, parent_path: &Path) -> bool {
if self.entries.is_empty() {
return true;
}
Some(parent_path) != self.last_path.as_deref()
}
pub(crate) fn prepare_new_request(&mut self, path: &Path) -> u64 {
if Some(path) != self.last_path.as_deref() {
self.request_id = self.request_id.wrapping_add(1);
self.last_path = Some(path.to_path_buf());
}
self.request_id
}
pub(crate) fn update_from_entries(
&mut self,
entries: Vec<FileEntry>,
current_name: &str,
req_id: u64,
parent_path: &Path,
) {
if req_id < self.request_id {
return;
}
self.selected_idx = entries.iter().position(|e| e.name_str() == current_name);
self.entries = entries;
self.last_path = Some(parent_path.to_path_buf());
self.request_id = req_id;
}
pub(crate) fn clear(&mut self) {
self.entries.clear();
self.selected_idx = None;
self.last_path = None;
}
}