fix: initialize window in Folder::make for folder preview

This commit is contained in:
sxyazi 2024-02-09 11:08:39 +08:00
parent 8851269585
commit 20b6f26247
No known key found for this signature in database
3 changed files with 26 additions and 13 deletions

View file

@ -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<usize>,
}
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<AnyUserData<'static>> {
SCOPE.create_any_userdata(Self { inner })
pub(super) fn make(
inner: &yazi_core::folder::Folder,
window: Option<Range<usize>>,
) -> mlua::Result<AnyUserData<'static>> {
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::<Self>(|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));

View file

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

View file

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