#egui #callback #views #async #messages #send-message #update

egui_inbox

将消息从异步函数、回调等发送到egui视图的工具,无需使用内部可变性。

7个版本 (4个破坏性更新)

0.5.0 2024年7月3日
0.4.1 2024年5月6日
0.4.0 2024年4月2日
0.3.0 2024年2月7日
0.1.0 2023年8月20日

#579 in 异步

Download history 160/week @ 2024-05-03 15/week @ 2024-05-10 52/week @ 2024-05-17 60/week @ 2024-05-24 214/week @ 2024-05-31 32/week @ 2024-06-07 15/week @ 2024-06-14 12/week @ 2024-06-21 112/week @ 2024-06-28 89/week @ 2024-07-05 66/week @ 2024-07-12 84/week @ 2024-07-19 22/week @ 2024-07-26 12/week @ 2024-08-02 15/week @ 2024-08-09 59/week @ 2024-08-16

每月111次下载
5 crates 中使用

MIT 许可证

41KB
490 代码行

egui_inbox

egui_ver Latest version Documentation unsafe forbidden License

用于从异步函数、回调等发送消息到egui视图的通道,无需使用内部可变性。当接收到消息时,将自动在request_repaint()上调用Ui

此crate的目标 是使从异步代码与egui交互尽可能简单。目前它没有针对性能进行优化,所以如果您预计每帧发送数千个更新,您可能想使用e.g. std::sync::mpsc。性能可能在将来还会得到改进。

示例

use eframe::egui;
use egui::CentralPanel;
use egui_inbox::UiInbox;

pub fn main() -> eframe::Result<()> {
    let inbox = UiInbox::new();
    let mut state = None;

    eframe::run_simple_native(
        "DnD Simple Example",
        Default::default(),
        move |ctx, _frame| {
            CentralPanel::default().show(ctx, |ui| {
                // `read` will return an iterator over all pending messages
                if let Some(last) = inbox.read(ui).last() {
                    state = last;
                }
                // There also is a `replace` method that you can use as a shorthand for the above:
                // inbox.replace(ui, &mut state);

                ui.label(format!("State: {:?}", state));
                if ui.button("Async Task").clicked() {
                    state = Some("Waiting for async task to complete".to_string());
                    let tx = inbox.sender();
                    std::thread::spawn(move || {
                        std::thread::sleep(std::time::Duration::from_secs(1));
                        // Send will return an error if the receiver has been dropped
                        // but unless you have a long running task that will send multiple messages
                        // you can just ignore the error
                        tx.send(Some("Hello from another thread!".to_string())).ok();
                    });
                }
            });
        },
    )
}

依赖关系

~4–12MB
~127K SLoC