handle symlinks to folders separately
This commit is contained in:
parent
50f2c4255b
commit
cc0dfa4c06
1 changed files with 18 additions and 7 deletions
25
src/main.rs
25
src/main.rs
|
@ -1,4 +1,4 @@
|
||||||
use std::fs::DirEntry;
|
use std::fs::{read_link, DirEntry};
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
|
|
||||||
use eframe::{egui, Frame, NativeOptions};
|
use eframe::{egui, Frame, NativeOptions};
|
||||||
|
@ -31,7 +31,9 @@ struct Entry {
|
||||||
enum FileType {
|
enum FileType {
|
||||||
Dir,
|
Dir,
|
||||||
File,
|
File,
|
||||||
SymLink, // todo separate symlinks to directories and files
|
SymLinkFile,
|
||||||
|
SymLinkDir,
|
||||||
|
SymLinkMissing,
|
||||||
Unknown, // e.g. device files on linux
|
Unknown, // e.g. device files on linux
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -61,7 +63,7 @@ impl FileGui {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn enter_input(&mut self) {
|
fn enter_input(&mut self) {
|
||||||
let path = self.path_input.replace("~", &self.home).replace('\\', "/");
|
let path = self.path_input.replace('~', &self.home).replace('\\', "/");
|
||||||
self.current_dir = PathBuf::from(path);
|
self.current_dir = PathBuf::from(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -95,7 +97,7 @@ impl FileGui {
|
||||||
fn open(&mut self, index: usize) {
|
fn open(&mut self, index: usize) {
|
||||||
let entry = &self.entries[index];
|
let entry = &self.entries[index];
|
||||||
match entry.filetype {
|
match entry.filetype {
|
||||||
FileType::Dir => {
|
FileType::Dir | FileType::SymLinkDir => {
|
||||||
self.current_dir = entry.path.clone();
|
self.current_dir = entry.path.clone();
|
||||||
self.refresh_entries();
|
self.refresh_entries();
|
||||||
self.override_input();
|
self.override_input();
|
||||||
|
@ -145,7 +147,9 @@ impl eframe::App for FileGui {
|
||||||
ui.label(match entry.filetype {
|
ui.label(match entry.filetype {
|
||||||
FileType::Dir => "🗁",
|
FileType::Dir => "🗁",
|
||||||
FileType::File => "🗋",
|
FileType::File => "🗋",
|
||||||
FileType::SymLink => "⮩",
|
FileType::SymLinkFile => "⮩",
|
||||||
|
FileType::SymLinkDir => "⎆",
|
||||||
|
FileType::SymLinkMissing => "⚠",
|
||||||
FileType::Unknown => "?",
|
FileType::Unknown => "?",
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -173,7 +177,14 @@ impl Entry {
|
||||||
} else if filetype.is_file() {
|
} else if filetype.is_file() {
|
||||||
FileType::File
|
FileType::File
|
||||||
} else if filetype.is_symlink() {
|
} else if filetype.is_symlink() {
|
||||||
FileType::SymLink
|
let p = read_link(&path).ok()?;
|
||||||
|
if p.is_dir() {
|
||||||
|
FileType::SymLinkDir
|
||||||
|
} else if p.exists() {
|
||||||
|
FileType::SymLinkFile
|
||||||
|
} else {
|
||||||
|
FileType::SymLinkMissing
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
FileType::Unknown
|
FileType::Unknown
|
||||||
};
|
};
|
||||||
|
@ -186,6 +197,6 @@ impl Entry {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_dir(&self) -> bool {
|
fn is_dir(&self) -> bool {
|
||||||
self.filetype == FileType::Dir
|
self.filetype == FileType::Dir || self.filetype == FileType::SymLinkDir
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue