egui_inbox

Channel to send messages to egui views from async functions, callbacks, etc. without having to use interior mutability.
Will automatically call request_repaint()
on the Ui
when a message is received.
The goal of this crate is to make interfacing with egui from asynchronous code as easy as possible.
Currently it is not optimized for performance, so if you expect to send 1000s of updates per frame you might want to use
e.g. std::sync::mpsc instead. Performance might still be improved in the future though.
Example:
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| {
if let Some(last) = inbox.read(ui).last() {
state = last;
}
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));
tx.send(Some("Hello from another thread!".to_string())).ok();
});
}
});
},
)
}