diff --git a/yazi-fm/src/lives/folder.rs b/yazi-fm/src/lives/folder.rs index 18a9bf7c..011d8842 100644 --- a/yazi-fm/src/lives/folder.rs +++ b/yazi-fm/src/lives/folder.rs @@ -1,4 +1,4 @@ -use std::ops::Deref; +use std::ops::{Deref, Range}; use mlua::{AnyUserData, Lua, UserDataFields}; use yazi_config::LAYOUT; @@ -7,7 +7,8 @@ use yazi_plugin::{bindings::Cast, url::Url}; use super::{File, Files, SCOPE}; pub(super) struct Folder { - inner: *const yazi_core::folder::Folder, + inner: *const yazi_core::folder::Folder, + window: Range, } impl Deref for Folder { @@ -18,20 +19,26 @@ impl Deref for Folder { impl Folder { #[inline] - pub(super) fn make(inner: &yazi_core::folder::Folder) -> mlua::Result> { - SCOPE.create_any_userdata(Self { inner }) + pub(super) fn make( + inner: &yazi_core::folder::Folder, + window: Option>, + ) -> mlua::Result> { + let window = match window { + Some(w) => w, + None => { + let limit = LAYOUT.load().preview.height as usize; + inner.offset..inner.files.len().min(inner.offset + limit) + } + }; + + SCOPE.create_any_userdata(Self { inner, window }) } pub(super) fn register(lua: &Lua) -> mlua::Result<()> { lua.register_userdata_type::(|reg| { reg.add_field_method_get("cwd", |lua, me| Url::cast(lua, me.cwd.clone())); reg.add_field_method_get("files", |_, me| Files::make(me, 0..me.files.len())); - reg.add_field_method_get("window", |_, me| { - Files::make( - me, - me.offset..me.files.len().min(me.offset + LAYOUT.load().preview.height as usize), - ) - }); + reg.add_field_method_get("window", |_, me| Files::make(me, me.window.clone())); reg.add_field_method_get("offset", |_, me| Ok(me.offset)); reg.add_field_method_get("cursor", |_, me| Ok(me.cursor)); diff --git a/yazi-fm/src/lives/preview.rs b/yazi-fm/src/lives/preview.rs index d81a9043..d6072ebf 100644 --- a/yazi-fm/src/lives/preview.rs +++ b/yazi-fm/src/lives/preview.rs @@ -1,6 +1,7 @@ use std::ops::Deref; use mlua::{AnyUserData, Lua, UserDataFields}; +use yazi_config::LAYOUT; use super::{Folder, SCOPE}; @@ -29,7 +30,10 @@ impl Preview { .hovered() .filter(|&f| f.is_dir()) .and_then(|f| me.tab().history(&f.url)) - .map(Folder::make) + .map(|f| { + let limit = LAYOUT.load().preview.height as usize; + Folder::make(f, Some(me.skip..f.files.len().min(me.skip + limit))) + }) .transpose() }); }) diff --git a/yazi-fm/src/lives/tab.rs b/yazi-fm/src/lives/tab.rs index 81f66aa1..fafb7f50 100644 --- a/yazi-fm/src/lives/tab.rs +++ b/yazi-fm/src/lives/tab.rs @@ -36,8 +36,10 @@ impl Tab { reg.add_field_method_get("mode", |_, me| Mode::make(&me.mode)); reg.add_field_method_get("conf", |_, me| Config::make(&me.conf)); - reg.add_field_method_get("parent", |_, me| me.parent.as_ref().map(Folder::make).transpose()); - reg.add_field_method_get("current", |_, me| Folder::make(&me.current)); + reg.add_field_method_get("parent", |_, me| { + me.parent.as_ref().map(|f| Folder::make(f, None)).transpose() + }); + reg.add_field_method_get("current", |_, me| Folder::make(&me.current, None)); reg.add_field_method_get("preview", |_, me| Preview::make(me)); })?;