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

This commit is contained in:
三咲雅 · Misaki Masa 2025-04-08 15:42:33 +08:00 committed by sxyazi
parent 2e1156f267
commit 86f465902e
No known key found for this signature in database
5 changed files with 36 additions and 24 deletions

32
Cargo.lock generated
View file

@ -328,9 +328,9 @@ dependencies = [
[[package]]
name = "cc"
version = "1.2.17"
version = "1.2.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1fcb57c740ae1daf453ae85f16e37396f672b039e00d9d866e07ddb24e328e3a"
checksum = "525046617d8376e3db1deffb079e91cef90a89fc3ca5c185bbf8c9ecdd15cd5c"
dependencies = [
"jobserver",
"libc",
@ -620,9 +620,9 @@ dependencies = [
[[package]]
name = "deranged"
version = "0.4.1"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "28cfac68e08048ae1883171632c2aef3ebc555621ae56fbccce1cbf22dd7f058"
checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e"
dependencies = [
"powerfmt",
]
@ -991,9 +991,9 @@ dependencies = [
[[package]]
name = "half"
version = "2.5.0"
version = "2.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7db2ff139bba50379da6aa0766b52fdcb62cb5b263009b09ed58ba604e14bbd1"
checksum = "459196ed295495a68f7d7fe1d84f6c4b7ff0e21fe3017b2f283c6fac3ad803c9"
dependencies = [
"cfg-if",
"crunchy",
@ -1085,9 +1085,9 @@ checksum = "d0263a3d970d5c054ed9312c0057b4f3bde9c0b33836d3637361d4a9e6e7a408"
[[package]]
name = "indexmap"
version = "2.8.0"
version = "2.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3954d50fe15b02142bf25d3b8bdadb634ec3948f103d04ffe3031bc8fe9d7058"
checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e"
dependencies = [
"equivalent",
"hashbrown",
@ -1964,9 +1964,9 @@ dependencies = [
[[package]]
name = "redox_syscall"
version = "0.5.10"
version = "0.5.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b8c0c260b63a8219631167be35e6a988e9554dbd323f8bd08439c8ed1302bd1"
checksum = "d2f103c6d277498fbceb16e84d317e2a400f160f46904d5f5410848c829511a3"
dependencies = [
"bitflags 2.9.0",
]
@ -2239,9 +2239,9 @@ dependencies = [
[[package]]
name = "smallvec"
version = "1.14.0"
version = "1.15.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd"
checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9"
[[package]]
name = "smawk"
@ -2460,9 +2460,9 @@ dependencies = [
[[package]]
name = "tokio"
version = "1.44.1"
version = "1.44.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f382da615b842244d4b8738c82ed1275e6c5dd90c459a30941cd07080b06c91a"
checksum = "e6b88822cbe49de4185e3a4cbf8321dd487cf5fe0c5c65695fef6346371e9c48"
dependencies = [
"backtrace",
"bytes",
@ -3116,9 +3116,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
[[package]]
name = "winnow"
version = "0.7.4"
version = "0.7.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0e97b544156e9bebe1a0ffbc03484fc1ffe3100cbce3ffb17eac35f7cdd7ab36"
checksum = "63d3fcd9bba44b03821e7d699eeee959f3126dcc4aa8e4ae18ec617c2a5cea10"
dependencies = [
"memchr",
]

View file

@ -25,7 +25,7 @@ dirs = "6.0.0"
foldhash = "0.1.5"
futures = "0.3.31"
globset = "0.4.16"
indexmap = { version = "2.8.0", features = [ "serde" ] }
indexmap = { version = "2.9.0", features = [ "serde" ] }
libc = "0.2.171"
lru = "0.13.0"
md-5 = "0.10.6"
@ -39,7 +39,7 @@ scopeguard = "1.2.0"
serde = { version = "1.0.219", features = [ "derive" ] }
serde_json = "1.0.140"
syntect = { version = "5.2.0", default-features = false, features = [ "parsing", "plist-load", "regex-onig" ] }
tokio = { version = "1.44.1", features = [ "full" ] }
tokio = { version = "1.44.2", features = [ "full" ] }
tokio-stream = "0.1.17"
tokio-util = "0.7.14"
toml = { version = "0.8.20" }

View file

@ -2,7 +2,14 @@ use std::{env, error::Error};
fn main() -> Result<(), Box<dyn Error>> {
let dir = env::var("OUT_DIR").unwrap();
if dir.contains("\\target\\release\\build\\yazi-fm-") {
// cargo build
// C:\Users\Ika\Desktop\yazi\target\release\build\yazi-fm-cfc94820f71daa30\out
// cargo install
// C:\Users\Ika\AppData\Local\Temp\cargo-installTFU8cj\release\build\
// yazi-fm-45dffef2500eecd0\out
if dir.contains("\\release\\build\\yazi-fm-") {
panic!(
"Unwinding must be enabled for Windows. Please use `cargo build --profile release-windows --locked` instead to build Yazi."
);

View file

@ -23,9 +23,9 @@ pub struct Text {
pub area: Area,
// TODO: block
pub inner: ratatui::text::Text<'static>,
pub wrap: u8,
// TODO: scroll
pub inner: ratatui::text::Text<'static>,
pub wrap: u8,
pub scroll: ratatui::layout::Position,
}
impl Text {
@ -58,7 +58,7 @@ impl Text {
trans: impl Fn(yazi_config::popup::Position) -> ratatui::layout::Rect,
) {
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);
} else {
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 {
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)
});
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, ()| {
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,
inner,
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)));