14 个版本

新版本 0.8.0 2024 年 8 月 12 日
0.6.0 2022 年 1 月 15 日
0.5.0 2021 年 3 月 3 日
0.4.0 2020 年 7 月 2 日
0.2.0 2019 年 10 月 5 日

#2 in #loading

Download history 32/week @ 2024-04-23 42/week @ 2024-04-30 48/week @ 2024-05-07 35/week @ 2024-05-14 41/week @ 2024-05-21 36/week @ 2024-05-28 26/week @ 2024-06-04 24/week @ 2024-06-11 31/week @ 2024-06-18 32/week @ 2024-06-25 1/week @ 2024-07-02 33/week @ 2024-07-09 31/week @ 2024-07-16 48/week @ 2024-07-23 38/week @ 2024-07-30 80/week @ 2024-08-06

203 个月下载量
3 crates 中使用

BSD-3-Clause

510KB
891

欢迎使用 cursive-async-view 👋

stable build nightly build crates.io Docs.rs GitHub PRs Welcome
gyscos/cursive 视图的加载界面包装器


本项目为 gyscos/cursive 视图提供带有加载界面的包装视图。加载界面将在包装视图完全加载后消失。这对于显示可能需要很长时间构建或依赖于网络等的视图非常有用。

它看起来是什么样子? demo terminalizer

展开查看 async-view-simple demo async-view-progress demo async-view-timeout demo async-view-progress-fail demo

用法

只需将其添加到您的 Cargo.toml

[dependencies]
cursive-async-view = "^0"

不带进度信息的异步视图加载

如果您无法在视图数据长时间准备期间显示进度,您可以将该视图的创建包装在 AsyncView 中。这将显示加载动画,直到内部视图准备好绘制。

use std::time::{Instant, Duration};
use cursive::{views::TextView, Cursive, CursiveExt};
use cursive_async_view::{AsyncView, AsyncState};

let mut siv = Cursive::default();
let instant = Instant::now();
let async_view = AsyncView::new(&mut siv, move || {
    if instant.elapsed() > Duration::from_secs(10) {
        AsyncState::Available(
            TextView::new("Yay!\n\nThe content has loaded!")
        )
    } else {
        AsyncState::Pending
    }
});

siv.add_layer(async_view);
// siv.run();

有关详细说明,请参阅 AsyncView 结构级别的文档,或查阅源代码存储库中的 simple 示例。

如果您需要在子视图构建期间执行阻塞操作,您可以查看备选的 new_with_bg_task 构造函数。

use std::thread;
use std::time::Duration;

use cursive::views::TextView;
use cursive::{Cursive, CursiveExt};
use cursive_async_view::AsyncView;

let mut siv = Cursive::default();
let async_view = AsyncView::new_with_bg_creator(&mut siv, move || {
    // this function is executed in a background thread, so we can block
    // here as long as we like
    thread::sleep(Duration::from_secs(10));

    // enough blocking, let's show the content
    Ok("Yeet! It worked 🖖")
}, TextView::new); // create a text view from the string

siv.add_layer(async_view);
// siv.run();

有关详细说明,请参阅 AsyncView 结构级别的文档,或查阅源代码存储库中的 bg_task 示例。

带有进度条的异步视图加载

如果您有关长时间视图创建进度的信息,您可以将创建包装在 AsyncProgressView 中。这将显示进度条,直到内部视图准备好绘制。

use cursive::{views::TextView, Cursive, CursiveExt};
use cursive_async_view::{AsyncProgressView, AsyncProgressState};

let mut siv = Cursive::default();
let start = std::time::Instant::now();
let async_view = AsyncProgressView::new(&mut siv, move || {
    if start.elapsed().as_secs() < 3 {
        AsyncProgressState::Pending(start.elapsed().as_secs() as f32 / 3f32)
    } else {
        AsyncProgressState::Available(TextView::new("Finally it loaded!"))
    }
});

siv.add_layer(async_view);
// siv.run();

变更日志

变更日志位于一个 单独的文件 中,包含即将推出的版本的更改和迁移提示。

故障排除

如果您发现任何错误/意外的行为,或者您对未来的更改有建议,请创建一个问题描述当前行为和您的期望。

开发 cargo test

待定

运行测试

只需运行

$ cargo test

即可执行所有可用的测试。

shields.io 端点

shields.io 端点生成在 ./target/shields 文件夹内。它们被用于本 README 文件。

作者

Fin Christensen

:octocat: @fin-ger
🐘 @fin_ger@weirder.earth
🐦 @fin_ger_github


Johannes Wünsche

:octocat: @jwuensche
🐘 @fredowald@mastodon.social
🐦 @Fredowald

显示您的支持

如果这个项目对您有帮助,请给一个 ⭐ 吧!

依赖

~6–12MB
~133K SLoC