pool and browser as devices
Some checks are pending
/ build (push) Waiting to run

This commit is contained in:
🪞👃🪞 2025-05-13 20:25:17 +03:00
parent b0ef0cfd21
commit fa73821a0b
29 changed files with 831 additions and 650 deletions

View file

@ -0,0 +1,90 @@
use crate::*;
#[tengri_proc::expose]
impl Browser {
}
#[tengri_proc::command(Browser)]
impl BrowserCommand {
//fn set_address (browser: &mut Browser, address: PathBuf) -> Perhaps<Self> {
//Ok(None)
//}
//fn set_search (browser: &mut Browser, filter: Arc<str>) -> Perhaps<Self> {
//Ok(None)
//}
//fn set_cursor (browser: &mut Browser, cursor: usize) -> Perhaps<Self> {
//Ok(None)
//}
}
// Commands supported by [Browser]
//#[derive(Debug, Clone, PartialEq)]
//pub enum BrowserCommand {
//Begin,
//Cancel,
//Confirm,
//Select(usize),
//Chdir(PathBuf),
//Filter(Arc<str>),
//}
//fn begin (browser: &mut Browser) -> Perhaps<Self> {
//unreachable!();
//}
//fn cancel (browser: &mut Browser) -> Perhaps<Self> {
//todo!()
////browser.mode = None;
////Ok(None)
//}
//fn confirm (browser: &mut Browser) -> Perhaps<Self> {
//todo!()
////Ok(match browser.mode {
////Some(PoolMode::Import(index, ref mut browser)) => {
////if browser.is_file() {
////let path = browser.path();
////browser.mode = None;
////let _undo = PoolClipCommand::import(browser, index, path)?;
////None
////} else if browser.is_dir() {
////browser.mode = Some(PoolMode::Import(index, browser.chdir()?));
////None
////} else {
////None
////}
////},
////Some(PoolMode::Export(index, ref mut browser)) => {
////todo!()
////},
////_ => unreachable!(),
////})
//}
//fn select (browser: &mut Browser, index: usize) -> Perhaps<Self> {
//todo!()
////Ok(match browser.mode {
////Some(PoolMode::Import(index, ref mut browser)) => {
////browser.index = index;
////None
////},
////Some(PoolMode::Export(index, ref mut browser)) => {
////browser.index = index;
////None
////},
////_ => unreachable!(),
////})
//}
//fn chdir (browser: &mut Browser, dir: PathBuf) -> Perhaps<Self> {
//todo!()
////Ok(match browser.mode {
////Some(PoolMode::Import(index, ref mut browser)) => {
////browser.mode = Some(PoolMode::Import(index, Browser::new(Some(dir))?));
////None
////},
////Some(PoolMode::Export(index, ref mut browser)) => {
////browser.mode = Some(PoolMode::Export(index, Browser::new(Some(dir))?));
////None
////},
////_ => unreachable!(),
////})
//}
//fn filter (browser: &mut Browser, filter: Arc<str>) -> Perhaps<Self> {
//todo!()
//}

View file

@ -0,0 +1,69 @@
use crate::*;
/// Browses for phrase to import/export
#[derive(Debug, Clone)]
pub struct Browser {
pub cwd: PathBuf,
pub dirs: Vec<(OsString, String)>,
pub files: Vec<(OsString, String)>,
pub filter: String,
pub index: usize,
pub scroll: usize,
pub size: Measure<TuiOut>,
}
impl Browser {
pub fn new (cwd: Option<PathBuf>) -> Usually<Self> {
let cwd = if let Some(cwd) = cwd { cwd } else { std::env::current_dir()? };
let mut dirs = vec![];
let mut files = vec![];
for entry in std::fs::read_dir(&cwd)? {
let entry = entry?;
let name = entry.file_name();
let decoded = name.clone().into_string().unwrap_or_else(|_|"<unreadable>".to_string());
let meta = entry.metadata()?;
if meta.is_dir() {
dirs.push((name, format!("📁 {decoded}")));
} else if meta.is_file() {
files.push((name, format!("📄 {decoded}")));
}
}
Ok(Self {
cwd,
dirs,
files,
filter: "".to_string(),
index: 0,
scroll: 0,
size: Measure::new(),
})
}
pub fn len (&self) -> usize {
self.dirs.len() + self.files.len()
}
pub fn is_dir (&self) -> bool {
self.index < self.dirs.len()
}
pub fn is_file (&self) -> bool {
self.index >= self.dirs.len()
}
pub fn path (&self) -> PathBuf {
self.cwd.join(if self.is_dir() {
&self.dirs[self.index].0
} else if self.is_file() {
&self.files[self.index - self.dirs.len()].0
} else {
unreachable!()
})
}
pub fn chdir (&self) -> Usually<Self> {
Self::new(Some(self.path()))
}
}

View file

@ -0,0 +1,19 @@
use crate::*;
content!(TuiOut: |self: Browser| /*Stack::down(|add|{
let mut i = 0;
for (_, name) in self.dirs.iter() {
if i >= self.scroll {
add(&Tui::bold(i == self.index, name.as_str()))?;
}
i += 1;
}
for (_, name) in self.files.iter() {
if i >= self.scroll {
add(&Tui::bold(i == self.index, name.as_str()))?;
}
i += 1;
}
add(&format!("{}/{i}", self.index))?;
Ok(())
})*/"todo");