From 17ef7901f1e602cb4ec539f0b46cbc884fbcb3aa Mon Sep 17 00:00:00 2001 From: sxyazi Date: Sat, 20 Apr 2024 15:36:43 +0800 Subject: [PATCH] .. --- yazi-config/src/theme/icon.rs | 23 ++++++++++++++++------- yazi-fm/src/lives/file.rs | 12 +++++++++++- yazi-plugin/src/bindings/icon.rs | 6 +++--- yazi-shared/src/fs/file.rs | 7 ++++--- yazi-shared/src/fs/icon.rs | 1 - yazi-shared/src/fs/mod.rs | 2 -- yazi-shared/src/theme/color.rs | 2 +- yazi-shared/src/theme/icon.rs | 15 +++++++++++++++ yazi-shared/src/theme/mod.rs | 2 ++ yazi-shared/src/theme/style.rs | 2 +- 10 files changed, 53 insertions(+), 19 deletions(-) delete mode 100644 yazi-shared/src/fs/icon.rs create mode 100644 yazi-shared/src/theme/icon.rs diff --git a/yazi-config/src/theme/icon.rs b/yazi-config/src/theme/icon.rs index e6530037..05f20552 100644 --- a/yazi-config/src/theme/icon.rs +++ b/yazi-config/src/theme/icon.rs @@ -1,13 +1,20 @@ +use std::ops::Deref; + use serde::{Deserialize, Deserializer}; -use yazi_shared::{fs::File, theme::{Color, Style, StyleShadow}}; +use yazi_shared::{fs::File, theme::{Color, StyleShadow}}; use crate::{preset::Preset, theme::Is, Pattern}; pub struct Icon { - is: Is, - name: Pattern, - pub text: String, - pub style: Style, + is: Is, + name: Pattern, + inner: yazi_shared::theme::Icon, +} + +impl Deref for Icon { + type Target = yazi_shared::theme::Icon; + + fn deref(&self) -> &Self::Target { &self.inner } } impl Icon { @@ -60,8 +67,10 @@ impl Icon { .map(|r| Icon { is: r.is, name: r.name, - text: r.text, - style: StyleShadow { fg: r.fg, ..Default::default() }.into(), + inner: yazi_shared::theme::Icon { + text: r.text, + style: StyleShadow { fg: r.fg, ..Default::default() }.into(), + }, }) .collect(), ) diff --git a/yazi-fm/src/lives/file.rs b/yazi-fm/src/lives/file.rs index a257d3a7..8037fd22 100644 --- a/yazi-fm/src/lives/file.rs +++ b/yazi-fm/src/lives/file.rs @@ -58,7 +58,17 @@ impl File { Some(lua.create_string(p.as_path().as_os_str().as_encoded_bytes())).transpose() }); reg.add_method("icon", |lua, me, ()| { - THEME.icons.iter().find(|&x| x.matches(me)).map(|x| Icon::cast(lua, x)).transpose() + use yazi_shared::theme::IconCache; + + match me.icon.get() { + IconCache::Missing => { + let matched = THEME.icons.iter().find(|&i| i.matches(me)); + me.icon.set(matched.map_or(IconCache::Undefined, |i| IconCache::Icon(i))); + matched.map(|i| Icon::cast(lua, i)).transpose() + } + IconCache::Undefined => Ok(None), + IconCache::Icon(cached) => Some(Icon::cast(lua, cached)).transpose(), + } }); reg.add_method("style", |lua, me, ()| { let cx = lua.named_registry_value::("cx")?; diff --git a/yazi-plugin/src/bindings/icon.rs b/yazi-plugin/src/bindings/icon.rs index 85674ff0..07382e0e 100644 --- a/yazi-plugin/src/bindings/icon.rs +++ b/yazi-plugin/src/bindings/icon.rs @@ -7,7 +7,7 @@ pub struct Icon; impl Icon { pub fn register(lua: &Lua) -> mlua::Result<()> { - lua.register_userdata_type::<&yazi_config::theme::Icon>(|reg| { + lua.register_userdata_type::<&yazi_shared::theme::Icon>(|reg| { reg.add_field_method_get("text", |lua, me| lua.create_string(&me.text)); reg.add_field_method_get("style", |_, me| Ok(Style::from(me.style))); })?; @@ -16,10 +16,10 @@ impl Icon { } } -impl Cast<&'static yazi_config::theme::Icon> for Icon { +impl Cast<&'static yazi_shared::theme::Icon> for Icon { fn cast<'lua>( lua: &'lua Lua, - data: &'static yazi_config::theme::Icon, + data: &'static yazi_shared::theme::Icon, ) -> mlua::Result> { lua.create_any_userdata(data) } diff --git a/yazi-shared/src/fs/file.rs b/yazi-shared/src/fs/file.rs index 2683ea47..90841bf5 100644 --- a/yazi-shared/src/fs/file.rs +++ b/yazi-shared/src/fs/file.rs @@ -1,15 +1,16 @@ -use std::{ffi::OsStr, fs::Metadata, ops::Deref}; +use std::{cell::Cell, ffi::OsStr, fs::Metadata, ops::Deref}; use anyhow::Result; use tokio::fs; -use crate::fs::{Cha, ChaKind, Url}; +use crate::{fs::{Cha, ChaKind, Url}, theme::IconCache}; #[derive(Clone, Debug, Default)] pub struct File { pub url: Url, pub cha: Cha, pub link_to: Option, + pub icon: Cell, } impl Deref for File { @@ -53,7 +54,7 @@ impl File { } } - Self { url, cha: Cha::from(meta).with_kind(ck), link_to } + Self { url, cha: Cha::from(meta).with_kind(ck), link_to, icon: Default::default() } } #[inline] diff --git a/yazi-shared/src/fs/icon.rs b/yazi-shared/src/fs/icon.rs deleted file mode 100644 index 25906715..00000000 --- a/yazi-shared/src/fs/icon.rs +++ /dev/null @@ -1 +0,0 @@ -pub struct Icon {} diff --git a/yazi-shared/src/fs/mod.rs b/yazi-shared/src/fs/mod.rs index 5f076f12..9cd7865e 100644 --- a/yazi-shared/src/fs/mod.rs +++ b/yazi-shared/src/fs/mod.rs @@ -1,7 +1,6 @@ mod cha; mod file; mod fns; -mod icon; mod op; mod path; mod url; @@ -9,7 +8,6 @@ mod url; pub use cha::*; pub use file::*; pub use fns::*; -pub use icon::*; pub use op::*; pub use path::*; pub use url::*; diff --git a/yazi-shared/src/theme/color.rs b/yazi-shared/src/theme/color.rs index 71c212c8..5cde2172 100644 --- a/yazi-shared/src/theme/color.rs +++ b/yazi-shared/src/theme/color.rs @@ -3,7 +3,7 @@ use std::str::FromStr; use anyhow::Result; use serde::{Deserialize, Serialize}; -#[derive(Clone, Copy, Deserialize)] +#[derive(Clone, Copy, Debug, Deserialize)] #[serde(try_from = "String")] pub struct Color(ratatui::style::Color); diff --git a/yazi-shared/src/theme/icon.rs b/yazi-shared/src/theme/icon.rs new file mode 100644 index 00000000..721d8445 --- /dev/null +++ b/yazi-shared/src/theme/icon.rs @@ -0,0 +1,15 @@ +use super::Style; + +#[derive(Clone, Debug)] +pub struct Icon { + pub text: String, + pub style: Style, +} + +#[derive(Clone, Copy, Debug, Default)] +pub enum IconCache { + #[default] + Missing, + Undefined, + Icon(&'static Icon), +} diff --git a/yazi-shared/src/theme/mod.rs b/yazi-shared/src/theme/mod.rs index b17c1de9..97ccb2e1 100644 --- a/yazi-shared/src/theme/mod.rs +++ b/yazi-shared/src/theme/mod.rs @@ -1,5 +1,7 @@ mod color; +mod icon; mod style; pub use color::*; +pub use icon::*; pub use style::*; diff --git a/yazi-shared/src/theme/style.rs b/yazi-shared/src/theme/style.rs index 5fe86deb..8054d4a4 100644 --- a/yazi-shared/src/theme/style.rs +++ b/yazi-shared/src/theme/style.rs @@ -3,7 +3,7 @@ use serde::{ser::SerializeMap, Deserialize, Serialize, Serializer}; use super::Color; -#[derive(Clone, Copy, Deserialize)] +#[derive(Clone, Copy, Debug, Deserialize)] #[serde(from = "StyleShadow")] pub struct Style { pub fg: Option,