feat: new ui.Text:scroll() API for setting text to scroll horizontally or vertically

This commit is contained in:
sxyazi 2025-04-08 15:33:23 +08:00
parent 2e1156f267
commit 53077f157c
No known key found for this signature in database
2 changed files with 10 additions and 5 deletions

View file

@ -25,7 +25,7 @@ pub struct Text {
// TODO: block // TODO: block
pub inner: ratatui::text::Text<'static>, pub inner: ratatui::text::Text<'static>,
pub wrap: u8, pub wrap: u8,
// TODO: scroll pub scroll: ratatui::layout::Position,
} }
impl Text { impl Text {
@ -58,7 +58,7 @@ impl Text {
trans: impl Fn(yazi_config::popup::Position) -> ratatui::layout::Rect, trans: impl Fn(yazi_config::popup::Position) -> ratatui::layout::Rect,
) { ) {
let rect = self.area.transform(trans); let rect = self.area.transform(trans);
if self.wrap == WRAP_NO { if self.wrap == WRAP_NO && self.scroll == Default::default() {
self.inner.render(rect, buf); self.inner.render(rect, buf);
} else { } else {
ratatui::widgets::Paragraph::from(self).render(rect, buf); ratatui::widgets::Paragraph::from(self).render(rect, buf);
@ -130,7 +130,7 @@ impl From<Text> for ratatui::widgets::Paragraph<'static> {
if value.wrap != WRAP_NO { if value.wrap != WRAP_NO {
p = p.wrap(ratatui::widgets::Wrap { trim: value.wrap == WRAP_TRIM }); p = p.wrap(ratatui::widgets::Wrap { trim: value.wrap == WRAP_TRIM });
} }
p p.scroll((value.scroll.y, value.scroll.x))
} }
} }
@ -155,6 +155,10 @@ impl UserData for Text {
}; };
Ok(ud) Ok(ud)
}); });
methods.add_function_mut("scroll", |_, (ud, x, y): (AnyUserData, u16, u16)| {
ud.borrow_mut::<Self>()?.scroll = ratatui::layout::Position { x, y };
Ok(ud)
});
methods.add_method("max_width", |_, me, ()| { methods.add_method("max_width", |_, me, ()| {
Ok(me.inner.lines.iter().take(me.area.size().height as usize).map(|l| l.width()).max()) Ok(me.inner.lines.iter().take(me.area.size().height as usize).map(|l| l.width()).max())
}); });

View file

@ -52,6 +52,7 @@ impl Utils {
area, area,
inner, inner,
wrap: if YAZI.preview.wrap == PreviewWrap::Yes { WRAP } else { WRAP_NO }, wrap: if YAZI.preview.wrap == PreviewWrap::Yes { WRAP } else { WRAP_NO },
scroll: Default::default(),
})]; })];
emit!(Call(Cmd::new("mgr:update_peeked").with_any("lock", lock))); emit!(Call(Cmd::new("mgr:update_peeked").with_any("lock", lock)));