Add libclide. #23

Open
shaunrd0 wants to merge 19 commits from shared-module into main
7 changed files with 24 additions and 12 deletions
Showing only changes of commit 2e67c01377 - Show all commits

1
Cargo.lock generated
View File

@@ -1170,6 +1170,7 @@ name = "libclide"
version = "0.1.0"
dependencies = [
"anyhow",
"devicons",
"log",
"strum",
]

View File

@@ -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.

View File

@@ -7,3 +7,4 @@ edition = "2024"
anyhow = { workspace = true }
strum = { workspace = true }
log = { workspace = true }
devicons = { workspace = true }

View File

@@ -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)
}

View File

@@ -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,
})
}
}

View File

@@ -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())
}
}

View File

@@ -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!(