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