mirror of
https://github.com/sxyazi/yazi.git
synced 2026-07-21 23:01:05 +00:00
feat: new ui.Text:scroll() API for setting text to scroll horizontally or vertically (#2589)
This commit is contained in:
parent
2e1156f267
commit
86f465902e
5 changed files with 36 additions and 24 deletions
32
Cargo.lock
generated
32
Cargo.lock
generated
|
|
@ -328,9 +328,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cc"
|
name = "cc"
|
||||||
version = "1.2.17"
|
version = "1.2.18"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "1fcb57c740ae1daf453ae85f16e37396f672b039e00d9d866e07ddb24e328e3a"
|
checksum = "525046617d8376e3db1deffb079e91cef90a89fc3ca5c185bbf8c9ecdd15cd5c"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"jobserver",
|
"jobserver",
|
||||||
"libc",
|
"libc",
|
||||||
|
|
@ -620,9 +620,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "deranged"
|
name = "deranged"
|
||||||
version = "0.4.1"
|
version = "0.4.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "28cfac68e08048ae1883171632c2aef3ebc555621ae56fbccce1cbf22dd7f058"
|
checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"powerfmt",
|
"powerfmt",
|
||||||
]
|
]
|
||||||
|
|
@ -991,9 +991,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "half"
|
name = "half"
|
||||||
version = "2.5.0"
|
version = "2.6.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "7db2ff139bba50379da6aa0766b52fdcb62cb5b263009b09ed58ba604e14bbd1"
|
checksum = "459196ed295495a68f7d7fe1d84f6c4b7ff0e21fe3017b2f283c6fac3ad803c9"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cfg-if",
|
"cfg-if",
|
||||||
"crunchy",
|
"crunchy",
|
||||||
|
|
@ -1085,9 +1085,9 @@ checksum = "d0263a3d970d5c054ed9312c0057b4f3bde9c0b33836d3637361d4a9e6e7a408"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "indexmap"
|
name = "indexmap"
|
||||||
version = "2.8.0"
|
version = "2.9.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "3954d50fe15b02142bf25d3b8bdadb634ec3948f103d04ffe3031bc8fe9d7058"
|
checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"equivalent",
|
"equivalent",
|
||||||
"hashbrown",
|
"hashbrown",
|
||||||
|
|
@ -1964,9 +1964,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "redox_syscall"
|
name = "redox_syscall"
|
||||||
version = "0.5.10"
|
version = "0.5.11"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "0b8c0c260b63a8219631167be35e6a988e9554dbd323f8bd08439c8ed1302bd1"
|
checksum = "d2f103c6d277498fbceb16e84d317e2a400f160f46904d5f5410848c829511a3"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags 2.9.0",
|
"bitflags 2.9.0",
|
||||||
]
|
]
|
||||||
|
|
@ -2239,9 +2239,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "smallvec"
|
name = "smallvec"
|
||||||
version = "1.14.0"
|
version = "1.15.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd"
|
checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "smawk"
|
name = "smawk"
|
||||||
|
|
@ -2460,9 +2460,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tokio"
|
name = "tokio"
|
||||||
version = "1.44.1"
|
version = "1.44.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f382da615b842244d4b8738c82ed1275e6c5dd90c459a30941cd07080b06c91a"
|
checksum = "e6b88822cbe49de4185e3a4cbf8321dd487cf5fe0c5c65695fef6346371e9c48"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"backtrace",
|
"backtrace",
|
||||||
"bytes",
|
"bytes",
|
||||||
|
|
@ -3116,9 +3116,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "winnow"
|
name = "winnow"
|
||||||
version = "0.7.4"
|
version = "0.7.6"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "0e97b544156e9bebe1a0ffbc03484fc1ffe3100cbce3ffb17eac35f7cdd7ab36"
|
checksum = "63d3fcd9bba44b03821e7d699eeee959f3126dcc4aa8e4ae18ec617c2a5cea10"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"memchr",
|
"memchr",
|
||||||
]
|
]
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,7 @@ dirs = "6.0.0"
|
||||||
foldhash = "0.1.5"
|
foldhash = "0.1.5"
|
||||||
futures = "0.3.31"
|
futures = "0.3.31"
|
||||||
globset = "0.4.16"
|
globset = "0.4.16"
|
||||||
indexmap = { version = "2.8.0", features = [ "serde" ] }
|
indexmap = { version = "2.9.0", features = [ "serde" ] }
|
||||||
libc = "0.2.171"
|
libc = "0.2.171"
|
||||||
lru = "0.13.0"
|
lru = "0.13.0"
|
||||||
md-5 = "0.10.6"
|
md-5 = "0.10.6"
|
||||||
|
|
@ -39,7 +39,7 @@ scopeguard = "1.2.0"
|
||||||
serde = { version = "1.0.219", features = [ "derive" ] }
|
serde = { version = "1.0.219", features = [ "derive" ] }
|
||||||
serde_json = "1.0.140"
|
serde_json = "1.0.140"
|
||||||
syntect = { version = "5.2.0", default-features = false, features = [ "parsing", "plist-load", "regex-onig" ] }
|
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-stream = "0.1.17"
|
||||||
tokio-util = "0.7.14"
|
tokio-util = "0.7.14"
|
||||||
toml = { version = "0.8.20" }
|
toml = { version = "0.8.20" }
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,14 @@ use std::{env, error::Error};
|
||||||
|
|
||||||
fn main() -> Result<(), Box<dyn Error>> {
|
fn main() -> Result<(), Box<dyn Error>> {
|
||||||
let dir = env::var("OUT_DIR").unwrap();
|
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!(
|
panic!(
|
||||||
"Unwinding must be enabled for Windows. Please use `cargo build --profile release-windows --locked` instead to build Yazi."
|
"Unwinding must be enabled for Windows. Please use `cargo build --profile release-windows --locked` instead to build Yazi."
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -23,9 +23,9 @@ pub struct Text {
|
||||||
pub area: Area,
|
pub area: Area,
|
||||||
|
|
||||||
// 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())
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -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)));
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue