From 86f465902ed7d96fcba6542d042d5bf507f4bf3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=92=B2=E9=9B=85=20=C2=B7=20Misaki=20Masa?= Date: Tue, 8 Apr 2025 15:42:33 +0800 Subject: [PATCH] feat: new `ui.Text:scroll()` API for setting text to scroll horizontally or vertically (#2589) --- Cargo.lock | 32 ++++++++++++++++---------------- Cargo.toml | 4 ++-- yazi-fm/build.rs | 9 ++++++++- yazi-plugin/src/elements/text.rs | 14 +++++++++----- yazi-plugin/src/utils/preview.rs | 1 + 5 files changed, 36 insertions(+), 24 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 111d1896..389f697f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -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", ] diff --git a/Cargo.toml b/Cargo.toml index 847509d2..3115d4af 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -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" } diff --git a/yazi-fm/build.rs b/yazi-fm/build.rs index ec41c9eb..9785ed08 100644 --- a/yazi-fm/build.rs +++ b/yazi-fm/build.rs @@ -2,7 +2,14 @@ use std::{env, error::Error}; fn main() -> Result<(), Box> { 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." ); diff --git a/yazi-plugin/src/elements/text.rs b/yazi-plugin/src/elements/text.rs index d9014dbe..5aa0b355 100644 --- a/yazi-plugin/src/elements/text.rs +++ b/yazi-plugin/src/elements/text.rs @@ -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 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::()?.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()) }); diff --git a/yazi-plugin/src/utils/preview.rs b/yazi-plugin/src/utils/preview.rs index 4452b4dd..2136d1c2 100644 --- a/yazi-plugin/src/utils/preview.rs +++ b/yazi-plugin/src/utils/preview.rs @@ -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)));