Add icons to TUI.
This commit is contained in:
1
Cargo.lock
generated
1
Cargo.lock
generated
@@ -1170,6 +1170,7 @@ name = "libclide"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"devicons",
|
||||
"log",
|
||||
"strum",
|
||||
]
|
||||
|
||||
@@ -11,6 +11,7 @@ members = [".", "libclide", "libclide-macros", ]
|
||||
anyhow = "1.0.100"
|
||||
strum = "0.27.2"
|
||||
log = { version = "0.4.27", features = [] }
|
||||
devicons = "0.6.12"
|
||||
|
||||
[dependencies]
|
||||
cxx = "1.0.95"
|
||||
@@ -23,12 +24,12 @@ ratatui = "0.30.0"
|
||||
tui-tree-widget = "0.24.0"
|
||||
tui-logger = "0.18.1"
|
||||
edtui = "0.11.1"
|
||||
devicons = "0.6.12"
|
||||
libclide = { path = "./libclide" }
|
||||
libclide-macros = { path = "./libclide-macros" }
|
||||
anyhow = { workspace = true }
|
||||
strum = { workspace = true }
|
||||
log = { workspace = true }
|
||||
devicons = { workspace = true }
|
||||
|
||||
[build-dependencies]
|
||||
# The link_qt_object_files feature is required for statically linking Qt 6.
|
||||
|
||||
@@ -7,3 +7,4 @@ edition = "2024"
|
||||
anyhow = { workspace = true }
|
||||
strum = { workspace = true }
|
||||
log = { workspace = true }
|
||||
devicons = { workspace = true }
|
||||
|
||||
@@ -3,3 +3,16 @@
|
||||
// SPDX-License-Identifier: GNU General Public License v3.0 or later
|
||||
|
||||
pub mod entry_meta;
|
||||
|
||||
use devicons::FileIcon;
|
||||
use std::path::Path;
|
||||
|
||||
pub fn icon<P: AsRef<str>>(p: P) -> FileIcon {
|
||||
let path = p.as_ref();
|
||||
if Path::new(&path).is_dir() {
|
||||
// Ensures directories are given a folder icon and not mistakenly resolved to a language.
|
||||
// For example, a directory named `cpp` would otherwise return a C++ icon.
|
||||
return FileIcon::from("dir/");
|
||||
}
|
||||
FileIcon::from(path)
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
// SPDX-License-Identifier: GNU General Public License v3.0 or later
|
||||
|
||||
use anyhow::{Context, Result};
|
||||
use devicons::FileIcon;
|
||||
use std::path::{Path, PathBuf};
|
||||
|
||||
#[derive(Debug)]
|
||||
@@ -10,6 +11,7 @@ pub struct EntryMeta {
|
||||
pub abs_path: String,
|
||||
pub file_name: String,
|
||||
pub is_dir: bool,
|
||||
pub icon: FileIcon,
|
||||
}
|
||||
|
||||
impl EntryMeta {
|
||||
@@ -41,10 +43,12 @@ impl EntryMeta {
|
||||
.context(format!("Failed to get file name for path: {abs_path:?}"))?
|
||||
.to_string_lossy()
|
||||
.to_string();
|
||||
let icon = crate::fs::icon(&abs_path);
|
||||
Ok(EntryMeta {
|
||||
abs_path,
|
||||
file_name,
|
||||
is_dir,
|
||||
icon,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
// SPDX-License-Identifier: GNU General Public License v3.0 or later
|
||||
|
||||
use cxx_qt_lib::{QModelIndex, QString};
|
||||
use devicons::FileIcon;
|
||||
use dirs;
|
||||
use std::fs;
|
||||
use std::path::Path;
|
||||
@@ -142,13 +141,6 @@ impl qobject::FileSystem {
|
||||
}
|
||||
|
||||
fn icon(self: std::pin::Pin<&mut Self>, path: &QString) -> QString {
|
||||
let str = path.to_string();
|
||||
if Path::new(&str).is_dir() {
|
||||
// Ensures directories are given a folder icon and not mistakenly resolved to a language.
|
||||
// For example, a directory named `cpp` would otherwise return a C++ icon.
|
||||
return QString::from(FileIcon::from("dir/").to_string());
|
||||
}
|
||||
let icon = FileIcon::from(str);
|
||||
QString::from(icon.to_string())
|
||||
QString::from(libclide::fs::icon(path.to_string().as_str()).to_string())
|
||||
}
|
||||
}
|
||||
|
||||
@@ -63,7 +63,7 @@ impl<'a> Explorer<'a> {
|
||||
} else {
|
||||
children.push(TreeItem::new_leaf(
|
||||
entry_meta.abs_path.clone(),
|
||||
entry_meta.file_name.clone(),
|
||||
format!("{} {}", entry_meta.icon.icon, entry_meta.file_name.as_str()),
|
||||
));
|
||||
}
|
||||
}
|
||||
@@ -73,7 +73,7 @@ impl<'a> Explorer<'a> {
|
||||
// For a file tree this is fine because we shouldn't list the same object twice.
|
||||
TreeItem::new(
|
||||
path_meta.abs_path.clone(),
|
||||
path_meta.file_name.clone(),
|
||||
format!("{} {}", path_meta.icon.icon, path_meta.file_name.as_str()),
|
||||
children,
|
||||
)
|
||||
.context(format!(
|
||||
|
||||
Reference in New Issue
Block a user