mirror of
https://codeberg.org/unspeaker/tek.git
synced 2025-12-06 03:36:41 +01:00
81 lines
2.1 KiB
Rust
81 lines
2.1 KiB
Rust
use crate::*;
|
|
use std::path::PathBuf;
|
|
use std::ffi::OsString;
|
|
|
|
#[derive(Clone, Debug)]
|
|
pub enum BrowserTarget {
|
|
SaveProject,
|
|
LoadProject,
|
|
ImportSample(Arc<RwLock<Option<Sample>>>),
|
|
ExportSample(Arc<RwLock<Option<Sample>>>),
|
|
ImportClip(Arc<RwLock<Option<MidiClip>>>),
|
|
ExportClip(Arc<RwLock<Option<MidiClip>>>),
|
|
}
|
|
|
|
/// Browses for phrase to import/export
|
|
#[derive(Debug, Clone, Default)]
|
|
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()))
|
|
}
|
|
|
|
}
|